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