You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2021/08/09 12:19:26 UTC

[camel-quarkus] 01/02: Salesforce : Expand producer test coverage

This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit fee5e52cbff074f8200c8e7e2d82dcce3a1c2c78
Author: Zineb Bendhiba <be...@gmail.com>
AuthorDate: Fri Aug 6 12:02:24 2021 +0200

    Salesforce : Expand producer test coverage
---
 .../component/salesforce/SalesforceResource.java   |  84 +++++++++++++
 .../component/salesforce/generated/Account.java    |  63 ++++------
 .../salesforce/model/GlobalObjectsAndHeaders.java  |  62 ++++++++++
 .../salesforce/SalesforceIntegrationIT.java        |   2 +
 .../component/salesforce/SalesforceTest.java       | 136 +++++++++++++++++++++
 .../src/test/resources/mappings/deleteAccount.json |  14 +++
 .../resources/mappings/getAccountBasicInfo.json    |  18 +++
 .../test/resources/mappings/getAccountById.json    |  18 +++
 .../resources/mappings/getAccountDescription.json  |  18 +++
 .../resources/mappings/getAccountLongQuery.json    |  18 +++
 .../src/test/resources/mappings/getLimits.json     |  19 +++
 .../test/resources/mappings/getListOfObjects.json  |  19 +++
 .../test/resources/mappings/getRestResources.json  |  19 +++
 .../src/test/resources/mappings/getVersions.json   |  19 +++
 .../src/test/resources/mappings/setAccount.json    |  18 +++
 15 files changed, 491 insertions(+), 36 deletions(-)

diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
index f20f1aa..0520bdd 100644
--- a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceResource.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -36,14 +38,23 @@ import javax.ws.rs.core.Response;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.Exchange;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.api.dto.CreateSObjectResult;
+import org.apache.camel.component.salesforce.api.dto.GlobalObjects;
+import org.apache.camel.component.salesforce.api.dto.Limits;
+import org.apache.camel.component.salesforce.api.dto.RestResources;
+import org.apache.camel.component.salesforce.api.dto.SObjectBasicInfo;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.Version;
 import org.apache.camel.component.salesforce.api.dto.bulk.ContentType;
 import org.apache.camel.component.salesforce.api.dto.bulk.JobInfo;
 import org.apache.camel.component.salesforce.api.dto.bulk.OperationEnum;
+import org.apache.camel.component.salesforce.api.utils.QueryHelper;
 import org.apache.camel.quarkus.component.salesforce.generated.Account;
 import org.apache.camel.quarkus.component.salesforce.generated.QueryRecordsAccount;
+import org.apache.camel.quarkus.component.salesforce.model.GlobalObjectsAndHeaders;
 import org.apache.camel.spi.RouteController;
 
 @Path("/salesforce")
@@ -80,6 +91,19 @@ public class SalesforceResource {
         return request.getRecords().get(0);
     }
 
+    @Path("/account/query")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Account getAccountByQueryHelper() {
+        String generatedQuery = QueryHelper.queryToFetchAllFieldsOf(new Account());
+        QueryRecordsAccount request = template
+                .toF("salesforce:query?sObjectQuery=%s LIMIT 1&sObjectClass=%s",
+                        generatedQuery,
+                        QueryRecordsAccount.class.getName())
+                .request(QueryRecordsAccount.class);
+        return request.getRecords().get(0);
+    }
+
     @Path("/account")
     @POST
     @Consumes(MediaType.TEXT_PLAIN)
@@ -108,6 +132,17 @@ public class SalesforceResource {
         return Response.noContent().build();
     }
 
+    @Path("/account/{id}")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Account getAccountById(@PathParam("id") String accountId) {
+        Account account = template
+                .to("salesforce:getSObjectWithId?sObjectName=Account&sObjectIdName=Id&sObjectClass=" + Account.class.getName())
+                .withBody(accountId)
+                .request(Account.class);
+        return account;
+    }
+
     @Path("/bulk")
     @POST
     @Produces(MediaType.APPLICATION_JSON)
@@ -165,4 +200,53 @@ public class SalesforceResource {
         objectBuilder.add("state", jobInfo.getState().value().toUpperCase(Locale.US));
         return objectBuilder.build();
     }
+
+    @Path("sobjects/force-limit")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public GlobalObjectsAndHeaders getSObjectsWithForceLimitInfo() {
+        // Testing producer with headers
+        Exchange exchange = template.to("salesforce:getGlobalObjects")
+                .withHeader("Sforce-Limit-Info", Collections.singletonList("api-usage")).send();
+        GlobalObjectsAndHeaders objectsAndHeaders = new GlobalObjectsAndHeaders(
+                exchange.getMessage().getBody(GlobalObjects.class))
+                        .withHeader("Sforce-Limit-Info", exchange.getMessage().getHeader("Sforce-Limit-Info", String.class));
+        return objectsAndHeaders;
+    }
+
+    @Path("versions")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public List<Version> getListVersions() {
+        return template.to("salesforce:getVersions").request(List.class);
+    }
+
+    @Path("resources")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public RestResources getListResources() {
+        return template.to("salesforce:getResources").request(RestResources.class);
+    }
+
+    @Path("basic-info/account")
+    @GET
+    public SObjectBasicInfo getAccountBasicInfo() {
+        return template.to("salesforce:getBasicInfo?sObjectName=Account")
+                .request(SObjectBasicInfo.class);
+    }
+
+    @Path("describe/account")
+    @GET
+    public SObjectDescription getAccountDescription() {
+        return template.to("salesforce:getDescription?sObjectName=Account")
+                .request(SObjectDescription.class);
+    }
+
+    @Path("limits")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Limits getLimits() {
+        return template.to("salesforce:limits").request(Limits.class);
+    }
+
 }
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java
index 8c4c7a7..4eb999d 100644
--- a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/generated/Account.java
@@ -22,13 +22,8 @@ import java.util.List;
 import javax.annotation.Generated;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import com.thoughtworks.xstream.annotations.XStreamConverter;
-import org.apache.camel.component.salesforce.api.MultiSelectPicklistConverter;
-import org.apache.camel.component.salesforce.api.MultiSelectPicklistDeserializer;
-import org.apache.camel.component.salesforce.api.MultiSelectPicklistSerializer;
 import org.apache.camel.component.salesforce.api.PicklistEnumConverter;
 import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
 import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
@@ -634,6 +629,18 @@ public class Account extends AbstractDescribedSObjectBase {
         this.DandbCompanyId = DandbCompanyId;
     }
 
+    private String OperatingHoursId;
+
+    @JsonProperty("OperatingHoursId")
+    public String getOperatingHoursId() {
+        return this.OperatingHoursId;
+    }
+
+    @JsonProperty("OperatingHoursId")
+    public void setOperatingHoursId(String OperatingHoursId) {
+        this.OperatingHoursId = OperatingHoursId;
+    }
+
     @XStreamConverter(PicklistEnumConverter.class)
     private Account_CustomerPriorityEnum CustomerPriority__c;
 
@@ -722,21 +729,6 @@ public class Account extends AbstractDescribedSObjectBase {
         this.SLAExpirationDate__c = SLAExpirationDate__c;
     }
 
-    @XStreamConverter(MultiSelectPicklistConverter.class)
-    private Account_MyMultiselectEnum[] MyMultiselect__c;
-
-    @JsonProperty("MyMultiselect__c")
-    @JsonSerialize(using = MultiSelectPicklistSerializer.class)
-    public Account_MyMultiselectEnum[] getMyMultiselect__c() {
-        return this.MyMultiselect__c;
-    }
-
-    @JsonProperty("MyMultiselect__c")
-    @JsonDeserialize(using = MultiSelectPicklistDeserializer.class)
-    public void setMyMultiselect__c(Account_MyMultiselectEnum[] MyMultiselect__c) {
-        this.MyMultiselect__c = MyMultiselect__c;
-    }
-
     private QueryRecordsAccount ChildAccounts;
 
     @JsonProperty("ChildAccounts")
@@ -934,29 +926,29 @@ public class Account extends AbstractDescribedSObjectBase {
         final SObjectField sObjectField58 = createField("DandbCompanyId", "D&B Company ID", "reference", "tns:ID", 18, false,
                 true, false, false, false, false, false);
         fields1.add(sObjectField58);
-        final SObjectField sObjectField59 = createField("CustomerPriority__c", "Customer Priority", "picklist", "xsd:string",
-                255, false, true, false, false, true, false, false);
+        final SObjectField sObjectField59 = createField("OperatingHoursId", "Operating Hour ID", "reference", "tns:ID", 18,
+                false, true, false, false, false, false, false);
         fields1.add(sObjectField59);
-        final SObjectField sObjectField60 = createField("SLA__c", "SLA", "picklist", "xsd:string", 255, false, true, false,
-                false, true, false, false);
+        final SObjectField sObjectField60 = createField("CustomerPriority__c", "Customer Priority", "picklist", "xsd:string",
+                255, false, true, false, false, true, false, false);
         fields1.add(sObjectField60);
-        final SObjectField sObjectField61 = createField("Active__c", "Active", "picklist", "xsd:string", 255, false, true,
-                false, false, true, false, false);
+        final SObjectField sObjectField61 = createField("SLA__c", "SLA", "picklist", "xsd:string", 255, false, true, false,
+                false, true, false, false);
         fields1.add(sObjectField61);
-        final SObjectField sObjectField62 = createField("NumberofLocations__c", "Number of Locations", "double", "xsd:double",
-                0, false, true, false, false, true, false, false);
+        final SObjectField sObjectField62 = createField("Active__c", "Active", "picklist", "xsd:string", 255, false, true,
+                false, false, true, false, false);
         fields1.add(sObjectField62);
-        final SObjectField sObjectField63 = createField("UpsellOpportunity__c", "Upsell Opportunity", "picklist", "xsd:string",
-                255, false, true, false, false, true, false, false);
+        final SObjectField sObjectField63 = createField("NumberofLocations__c", "Number of Locations", "double", "xsd:double",
+                0, false, true, false, false, true, false, false);
         fields1.add(sObjectField63);
-        final SObjectField sObjectField64 = createField("SLASerialNumber__c", "SLA Serial Number", "string", "xsd:string", 10,
-                false, true, false, false, true, false, false);
+        final SObjectField sObjectField64 = createField("UpsellOpportunity__c", "Upsell Opportunity", "picklist", "xsd:string",
+                255, false, true, false, false, true, false, false);
         fields1.add(sObjectField64);
-        final SObjectField sObjectField65 = createField("SLAExpirationDate__c", "SLA Expiration Date", "date", "xsd:date", 0,
+        final SObjectField sObjectField65 = createField("SLASerialNumber__c", "SLA Serial Number", "string", "xsd:string", 10,
                 false, true, false, false, true, false, false);
         fields1.add(sObjectField65);
-        final SObjectField sObjectField66 = createField("MyMultiselect__c", "MyMultiselect", "multipicklist", "xsd:string",
-                4099, false, true, false, false, true, false, false);
+        final SObjectField sObjectField66 = createField("SLAExpirationDate__c", "SLA Expiration Date", "date", "xsd:date", 0,
+                false, true, false, false, true, false, false);
         fields1.add(sObjectField66);
 
         description.setLabel("Account");
@@ -966,7 +958,6 @@ public class Account extends AbstractDescribedSObjectBase {
         final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
         sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v50.0/sobjects/Account/describe/approvalLayouts");
         sObjectDescriptionUrls1.setCompactLayouts("/services/data/v50.0/sobjects/Account/describe/compactLayouts");
-        sObjectDescriptionUrls1.setDefaultValues("/services/data/v50.0/sobjects/Account/defaultValues?recordTypeId&fields");
         sObjectDescriptionUrls1.setDescribe("/services/data/v50.0/sobjects/Account/describe");
         sObjectDescriptionUrls1.setLayouts("/services/data/v50.0/sobjects/Account/describe/layouts");
         sObjectDescriptionUrls1.setListviews("/services/data/v50.0/sobjects/Account/listviews");
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/model/GlobalObjectsAndHeaders.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/model/GlobalObjectsAndHeaders.java
new file mode 100644
index 0000000..0c6d86b
--- /dev/null
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/model/GlobalObjectsAndHeaders.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.salesforce.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.component.salesforce.api.dto.GlobalObjects;
+
+public class GlobalObjectsAndHeaders {
+    private GlobalObjects globalObjects;
+    private Map<String, String> headers;
+
+    public GlobalObjectsAndHeaders() {
+    }
+
+    public GlobalObjectsAndHeaders(GlobalObjects globalObjects) {
+        this.globalObjects = globalObjects;
+    }
+
+    public GlobalObjects getGlobalObjects() {
+        return globalObjects;
+    }
+
+    public void setGlobalObjects(GlobalObjects globalObjects) {
+        this.globalObjects = globalObjects;
+    }
+
+    public GlobalObjectsAndHeaders withHeader(String key, String value) {
+        if (headers == null) {
+            headers = new HashMap<>();
+        }
+        headers.put(key, value);
+        return this;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
+
+    public void setHeaders(Map<String, String> headers) {
+        this.headers = headers;
+    }
+
+    public String getHeader(String key) {
+        return headers != null ? headers.get(key) : null;
+    }
+}
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
index afecad8..650a832 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
@@ -16,11 +16,13 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import io.quarkus.test.junit.NativeImageTest;
 import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_USERNAME", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_PASSWORD", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTID", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTSECRET", matches = ".+")
+@NativeImageTest
 public class SalesforceIntegrationIT extends SalesforceIntegrationTest {
 }
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
index 4acd09f..f545ec2 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
@@ -16,16 +16,27 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
 import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.path.json.JsonPath;
+import org.apache.camel.component.salesforce.api.dto.RecentItem;
+import org.apache.camel.component.salesforce.api.dto.RestResources;
+import org.apache.camel.component.salesforce.api.dto.SObjectBasicInfo;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.Versions;
+import org.apache.camel.quarkus.component.salesforce.model.GlobalObjectsAndHeaders;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.emptyString;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -52,6 +63,16 @@ class SalesforceTest {
     }
 
     @Test
+    public void testGetAccountByQueryHelper() {
+        RestAssured.get("/salesforce/account/query")
+                .then()
+                .statusCode(200)
+                .body(
+                        "Id", not(emptyString()),
+                        "AccountNumber", not(emptyString()));
+    }
+
+    @Test
     public void testBulkJobApi() {
         // Create bulk job
         JsonPath jobInfo = RestAssured.given()
@@ -81,4 +102,119 @@ class SalesforceTest {
         state = jobInfo.getString("state");
         assertEquals("ABORTED", state);
     }
+
+    @Test
+    void testGlobalObjectsWithHeaders() {
+        GlobalObjectsAndHeaders globalObjectsAndHeaders = RestAssured.given()
+                .get("/salesforce/sobjects/force-limit")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .as(GlobalObjectsAndHeaders.class);
+
+        assertNotNull(globalObjectsAndHeaders);
+        assertNotNull(globalObjectsAndHeaders.getGlobalObjects());
+        assertTrue(globalObjectsAndHeaders.getHeader("Sforce-Limit-Info").contains("api-usage="));
+    }
+
+    @Test
+    void testGetVersions() {
+        List<Versions> versions = RestAssured.given()
+                .get("/salesforce/versions")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .as(List.class);
+        assertNotNull(versions);
+        assertNotEquals(0, versions.size());
+    }
+
+    @Test
+    void testGetRestResources() {
+        RestResources restResources = RestAssured.given()
+                .get("/salesforce/resources")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .as(RestResources.class);
+        assertNotNull(restResources);
+    }
+
+    @Test
+    void testAccountWithBasicInfo() {
+        // create an object of type Account
+        String accountName = "Camel Quarkus Account Test: " + UUID.randomUUID().toString();
+        final String accountId = RestAssured.given()
+                .body(accountName)
+                .post("/salesforce/account")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .asString();
+
+        if (accountId != null) {
+            // get Account basic info
+            SObjectBasicInfo accountBasicInfo = RestAssured.given()
+                    .get("/salesforce/basic-info/account")
+                    .then()
+                    .statusCode(200)
+                    .extract()
+                    .body()
+                    .as(SObjectBasicInfo.class);
+            assertNotNull(accountBasicInfo);
+            List<RecentItem> recentItems = accountBasicInfo.getRecentItems();
+            assertNotNull(recentItems);
+            // make sure the created account is referenced
+            assertTrue(recentItems.stream().anyMatch(recentItem -> recentItem.getAttributes().getUrl().contains(accountId)));
+
+            // Get Account - querying Sobject by ID
+            RestAssured.get("/salesforce/account/" + accountId)
+                    .then()
+                    .statusCode(200)
+                    .body(
+                            "Id", not(emptyString()),
+                            "AccountNumber", not(emptyString()));
+
+            // delete the account
+            // Clean up
+            RestAssured.delete("/salesforce/account/" + accountId)
+                    .then()
+                    .statusCode(204);
+        }
+    }
+
+    @Test
+    void testGetAccountDescription() {
+        SObjectDescription accountDescription = RestAssured.given()
+                .get("/salesforce/describe/account")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .as(SObjectDescription.class);
+        assertNotNull(accountDescription);
+    }
+
+    @Test
+    void testLimits() {
+        final Map<String, Object> limits = RestAssured.given()
+                .get("/salesforce/limits")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .as(Map.class);
+
+        assertNotNull(limits, "Should fetch limits from Salesforce REST API");
+        assertNotNull(limits.get("concurrentAsyncGetReportInstances"));
+        assertNotNull(limits.get("concurrentSyncReportRuns"));
+        assertNotNull(limits.get("dailyApiRequests"));
+        assertNotNull(limits.get("dailyAsyncApexExecutions"));
+        assertNotNull(limits.get("dailyBulkApiRequests"));
+    }
+
 }
diff --git a/integration-tests/salesforce/src/test/resources/mappings/deleteAccount.json b/integration-tests/salesforce/src/test/resources/mappings/deleteAccount.json
new file mode 100644
index 0000000..70aa443
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/deleteAccount.json
@@ -0,0 +1,14 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v52.0/sobjects/Account/001D000000IqhSLIAZ",
+    "method": "DELETE"
+  },
+  "response": {
+    "status": 200
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getAccountBasicInfo.json b/integration-tests/salesforce/src/test/resources/mappings/getAccountBasicInfo.json
new file mode 100644
index 0000000..0bd6d7f
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getAccountBasicInfo.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/Account/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"objectDescribe\":{\"name\":\"Account\",\"updateable\":true,\"label\":\"Account\",\"keyPrefix\":\"001\",\"replicateable\":true,\"retrieveable\":true,\"undeletable\":true,\"triggerable\":true},\"recentItems\":[{\"attributes\":{\"type\":\"Account\",\"url\":\"\/services\/data\/v50.0\/sobjects\/Account\/001D000000IqhSLIAZ\"},\"Id\":\"001D000000IqhSLIAZ\",\"Name\":\"asdasdasd\"}]}",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getAccountById.json b/integration-tests/salesforce/src/test/resources/mappings/getAccountById.json
new file mode 100644
index 0000000..91df379
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getAccountById.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/Account/Id/001D000000IqhSLIAZ",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"Id\":\"001D000000IqhSLIAZ\", \"AccountNumber\":\"11233\", \"attributes\": {\"type\" : \"Account\"}}",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getAccountDescription.json b/integration-tests/salesforce/src/test/resources/mappings/getAccountDescription.json
new file mode 100644
index 0000000..114ddf0
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getAccountDescription.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/Account/describe/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body": "{\"name\":\"Account\",\"fields\":[{\"length\":18,\"name\":\"Id\",\"type\":\"id\",\"updateable\":false,\"label\":\"Account ID\"}],\"updateable\":true,\"label\":\"Account\",\"keyPrefix\":\"001\",\"custom\":false,\"urls\":{\"uiEditTemplate\":\"https:\/\/yourInstance.salesforce.com\/{ID}\/e\",\"sobject\":\"\/services\/data\/v50.0\/sobjects\/Account\",\"uiDetailTemplate\":\"https:\/\/yourInstance.salesforce.com\/{ID}\"},\"childRelationships\":[{\"field\":\"ParentId\",\"deprecated [...]
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getAccountLongQuery.json b/integration-tests/salesforce/src/test/resources/mappings/getAccountLongQuery.json
new file mode 100644
index 0000000..156d64b
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getAccountLongQuery.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/query/?q=SELECT%20Id%2C%20IsDeleted%2C%20MasterRecordId%2C%20Name%2C%20Type%2C%20ParentId%2C%20BillingStreet%2C%20BillingCity%2C%20BillingState%2C%20BillingPostalCode%2C%20BillingCountry%2C%20BillingLatitude%2C%20BillingLongitude%2C%20BillingGeocodeAccuracy%2C%20BillingAddress%2C%20ShippingStreet%2C%20ShippingCity%2C%20ShippingState%2C%20ShippingPostalCode%2C%20ShippingCountry%2C%20ShippingLatitude%2C%20ShippingLongitude%2C%20ShippingGeocodeAccuracy%2C%20 [...]
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"records\":[{\"Id\":\"someFakeId\", \"AccountNumber\":\"11233\", \"attributes\": {\"type\" : \"Account\"}}]}",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getLimits.json b/integration-tests/salesforce/src/test/resources/mappings/getLimits.json
new file mode 100644
index 0000000..6c33e5c
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getLimits.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/limits/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body": "{\"ConcurrentAsyncGetReportInstances\":{\"Max\":200,\"Remaining\":200},\"ConcurrentSyncReportRuns\":{\"Max\":20,\"Remaining\":20},\"DailyApiRequests\":{\"Max\":15000,\"Remaining\":14998},\"DailyAsyncApexExecutions\":{\"Max\":250000,\"Remaining\":250000},\"DailyBulkApiBatches\":{\"Max\":15000,\"Remaining\":15000},\"DailyBulkV2QueryFileStorageMB\":{\"Max\":976562,\"Remaining\":976562},\"DailyBulkV2QueryJobs\":{\"Max\":10000,\"Remaining\":10000},\"DailyDurableGenericStreamingAp [...]
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8",
+      "Sforce-Limit-Info": "api-usage=18/5000"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getListOfObjects.json b/integration-tests/salesforce/src/test/resources/mappings/getListOfObjects.json
new file mode 100644
index 0000000..cc4e909
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getListOfObjects.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"encoding\":\"UTF-8\",\"maxBatchSize\":200,\"sobjects\":[{\"activateable\":false,\"custom\":false,\"customSetting\":false,\"createable\":true,\"deletable\":true,\"deprecatedAndHidden\":false,\"feedEnabled\":true,\"keyPrefix\":\"001\",\"label\":\"Account\",\"labelPlural\":\"Accounts\",\"layoutable\":true,\"mergeable\":true,\"mruEnabled\":true,\"name\":\"Account\",\"queryable\":true,\"replicateable\":true,\"retrieveable\":true,\"searchable\":true,\"triggerable\":true,\"unde [...]
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8",
+      "Sforce-Limit-Info": "api-usage=18/5000"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getRestResources.json b/integration-tests/salesforce/src/test/resources/mappings/getRestResources.json
new file mode 100644
index 0000000..b023116
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getRestResources.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body": "{\"sobjects\":\"\/services\/data\/v50.0\/sobjects\",\"licensing\":\"\/services\/data\/v50.0\/licensing\",\"connect\":\"\/services\/data\/v50.0\/connect\",\"search\":\"\/services\/data\/v50.0\/search\",\"query\":\"\/services\/data\/v50.0\/query\",\"tooling\":\"\/services\/data\/v50.0\/tooling\",\"chatter\":\"\/services\/data\/v50.0\/chatter\",\"recent\":\"\/services\/data\/v50.0\/recent\"}",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8",
+      "Sforce-Limit-Info": "api-usage=18/5000"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/getVersions.json b/integration-tests/salesforce/src/test/resources/mappings/getVersions.json
new file mode 100644
index 0000000..31b95d2
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getVersions.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body": "[{\"label\":\"Spring '11\",\"url\":\"\/services\/data\/v21.0\",\"version\":\"21.0\"},{\"label\":\"Summer '11\",\"url\":\"\/services\/data\/v22.0\",\"version\":\"22.0\"},{\"label\":\"Winter '12\",\"url\":\"\/services\/data\/v23.0\",\"version\":\"23.0\"}]",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8",
+      "Sforce-Limit-Info": "api-usage=18/5000"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file
diff --git a/integration-tests/salesforce/src/test/resources/mappings/setAccount.json b/integration-tests/salesforce/src/test/resources/mappings/setAccount.json
new file mode 100644
index 0000000..a52281f
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/setAccount.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/Account",
+    "method": "POST"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"id\":\"001D000000IqhSLIAZ\",\"errors\":[],\"success\":true}",
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file