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/07/23 07:06:41 UTC

[camel-quarkus] 01/03: Salesforce - Mock existing integration tests Fixes #2667

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 c92c1e0eb9674a2567c9ceee1eca4f76d62e5cc8
Author: Zineb Bendhiba <be...@gmail.com>
AuthorDate: Thu Jul 1 10:11:19 2021 +0200

    Salesforce - Mock existing integration tests
    Fixes #2667
---
 integration-tests/salesforce/pom.xml               |  7 +++
 .../component/salesforce/SalesforceRoutes.java     | 57 ++++++++++++++++++++-
 .../src/main/resources/application.properties      |  4 --
 .../quarkus/component/salesforce/SalesforceIT.java |  5 --
 ...esforceIT.java => SalesforceIntegrationIT.java} |  5 +-
 ...rceTest.java => SalesforceIntegrationTest.java} | 57 +--------------------
 .../component/salesforce/SalesforceTest.java       | 54 ++------------------
 .../salesforce/SalesforceTestResource.java         | 59 ++++++++++++++++++++++
 .../test/resources/mappings/bulApi-abortJob.json   | 18 +++++++
 .../test/resources/mappings/bulkApi-createJob.json | 18 +++++++
 .../src/test/resources/mappings/getAccount.json    | 18 +++++++
 .../src/test/resources/mappings/getDocument.json   | 18 +++++++
 .../src/test/resources/mappings/handshake.json     | 19 +++++++
 .../src/test/resources/mappings/oauth2.json        | 19 +++++++
 .../src/test/resources/mappings/revokeToken.json   | 17 +++++++
 15 files changed, 254 insertions(+), 121 deletions(-)

diff --git a/integration-tests/salesforce/pom.xml b/integration-tests/salesforce/pom.xml
index 612f97e..3f1faca 100644
--- a/integration-tests/salesforce/pom.xml
+++ b/integration-tests/salesforce/pom.xml
@@ -55,6 +55,13 @@
             <scope>test</scope>
         </dependency>
 
+        <!-- dependencies needed to mock Salesforce API -->
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-wiremock-support</artifactId>
+            <scope>test</scope>
+        </dependency>
+
 
         <!-- The following dependencies guarantee that this module is built after them. You can update them by running `mvn process-resources -Pformat -N` from the source tree root directory -->
         <dependency>
diff --git a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
index 016fbab..581f8e6 100644
--- a/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
+++ b/integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/SalesforceRoutes.java
@@ -16,13 +16,66 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
+import java.util.Optional;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Named;
+import javax.ws.rs.Produces;
+
+import io.quarkus.arc.Unremovable;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.salesforce.AuthenticationType;
+import org.apache.camel.component.salesforce.SalesforceComponent;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
 
+@ApplicationScoped
 public class SalesforceRoutes extends RouteBuilder {
 
+    @ConfigProperty(name = "SALESFORCE_USERNAME", defaultValue = "username")
+    String username;
+
+    @ConfigProperty(name = "SALESFORCE_PASSWORD", defaultValue = "password")
+    String password;
+
+    @ConfigProperty(name = "SALESFORCE_CLIENTID", defaultValue = "clientId")
+    String clientId;
+
+    @ConfigProperty(name = "SALESFORCE_CLIENTSECRET", defaultValue = "clientSecret")
+    String clientSecret;
+
+    @Produces
+    @ApplicationScoped
+    @Unremovable
+    @Named("salesforce")
+    SalesforceComponent salesforceComponent() {
+        // check if wiremock URL exists
+        Optional<String> wireMockUrl = ConfigProvider.getConfig().getOptionalValue("wiremock.url", String.class);
+
+        SalesforceComponent salesforceComponent = new SalesforceComponent();
+        salesforceComponent.setClientId(clientId);
+        salesforceComponent.setClientSecret(clientSecret);
+        salesforceComponent.setUserName(username);
+        salesforceComponent.setPassword(password);
+
+        // Set URL depending if mock is enabled
+        if (wireMockUrl.isPresent()) {
+            salesforceComponent.setAuthenticationType(AuthenticationType.USERNAME_PASSWORD);
+            salesforceComponent.setRefreshToken("refreshToken");
+            salesforceComponent.setLoginUrl(wireMockUrl.get());
+        } else {
+            salesforceComponent.setLoginUrl("https://login.salesforce.com");
+        }
+        return salesforceComponent;
+    }
+
     @Override
     public void configure() throws Exception {
-        from("salesforce:/data/AccountChangeEvent?replayId=-1").routeId("cdc").autoStartup(false)
-                .to("seda:events");
+        Optional<String> wireMockUrl = ConfigProvider.getConfig().getOptionalValue("wiremock.url", String.class);
+        // Wiremock used only with Templates - this Route is used only with Salesforce credentials
+        if (!wireMockUrl.isPresent()) {
+            from("salesforce:/data/AccountChangeEvent?replayId=-1").routeId("cdc").autoStartup(false)
+                    .to("seda:events");
+        }
     }
 }
diff --git a/integration-tests/salesforce/src/main/resources/application.properties b/integration-tests/salesforce/src/main/resources/application.properties
index b180e3a..ca368ac 100644
--- a/integration-tests/salesforce/src/main/resources/application.properties
+++ b/integration-tests/salesforce/src/main/resources/application.properties
@@ -19,7 +19,3 @@
 # Camel :: Salesforce
 #
 camel.component.salesforce.loginUrl = https://login.salesforce.com
-camel.component.salesforce.userName = {{env:SALESFORCE_USERNAME}}
-camel.component.salesforce.password = {{env:SALESFORCE_PASSWORD}}
-camel.component.salesforce.clientId = {{env:SALESFORCE_CLIENTID}}
-camel.component.salesforce.clientSecret = {{env:SALESFORCE_CLIENTSECRET}}
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java
index dadbe10..729fc4e 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java
@@ -17,12 +17,7 @@
 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
 class SalesforceIT extends SalesforceTest {
 
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
similarity index 92%
copy from integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java
copy to integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
index dadbe10..afecad8 100644
--- a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationIT.java
@@ -16,14 +16,11 @@
  */
 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
-class SalesforceIT extends SalesforceTest {
-
+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/SalesforceIntegrationTest.java
similarity index 61%
copy from integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java
copy to integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIntegrationTest.java
index 1de2906..91c68d8 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/SalesforceIntegrationTest.java
@@ -20,72 +20,17 @@ import java.util.UUID;
 
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
-import io.restassured.path.json.JsonPath;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
-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.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_USERNAME", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_PASSWORD", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTID", matches = ".+")
 @EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTSECRET", matches = ".+")
 @QuarkusTest
-class SalesforceTest {
-
-    @Test
-    public void testGetDocumentRaw() {
-        RestAssured.get("/salesforce/document/test")
-                .then()
-                .statusCode(200)
-                .body("attributes.type", is("Document"));
-    }
-
-    @Test
-    public void testGetAccountDTO() {
-        RestAssured.get("/salesforce/account")
-                .then()
-                .statusCode(200)
-                .body(
-                        "id", not(emptyString()),
-                        "accountNumber", not(emptyString()));
-    }
-
-    @Test
-    public void testBulkJobApi() {
-        // Create bulk job
-        JsonPath jobInfo = RestAssured.given()
-                .post("/salesforce/bulk")
-                .then()
-                .statusCode(200)
-                .extract()
-                .body()
-                .jsonPath();
-
-        String id = jobInfo.getString("id");
-        String state = jobInfo.getString("state");
-        assertNotNull(id);
-        assertTrue(id.length() > 0);
-        assertEquals("OPEN", state);
-
-        // Abort bulk job
-        jobInfo = RestAssured.given()
-                .queryParam("jobId", id)
-                .delete("/salesforce/bulk")
-                .then()
-                .statusCode(200)
-                .extract()
-                .body()
-                .jsonPath();
-
-        state = jobInfo.getString("state");
-        assertEquals("ABORTED", state);
-    }
+public class SalesforceIntegrationTest {
 
     @Test
     public void testChangeDataCaptureEvents() {
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 1de2906..4acd09f 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,13 +16,11 @@
  */
 package org.apache.camel.quarkus.component.salesforce;
 
-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.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
 import static org.hamcrest.Matchers.emptyString;
 import static org.hamcrest.Matchers.is;
@@ -31,11 +29,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_USERNAME", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_PASSWORD", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTID", matches = ".+")
-@EnabledIfEnvironmentVariable(named = "SALESFORCE_CLIENTSECRET", matches = ".+")
 @QuarkusTest
+@QuarkusTestResource(SalesforceTestResource.class)
 class SalesforceTest {
 
     @Test
@@ -52,8 +47,8 @@ class SalesforceTest {
                 .then()
                 .statusCode(200)
                 .body(
-                        "id", not(emptyString()),
-                        "accountNumber", not(emptyString()));
+                        "Id", not(emptyString()),
+                        "AccountNumber", not(emptyString()));
     }
 
     @Test
@@ -86,45 +81,4 @@ class SalesforceTest {
         state = jobInfo.getString("state");
         assertEquals("ABORTED", state);
     }
-
-    @Test
-    public void testChangeDataCaptureEvents() {
-        String accountId = null;
-        try {
-            // Start the Salesforce CDC consumer
-            RestAssured.post("/salesforce/cdc/start")
-                    .then()
-                    .statusCode(200);
-
-            // Create an account
-            String accountName = "Camel Quarkus Account Test: " + UUID.randomUUID().toString();
-            accountId = RestAssured.given()
-                    .body(accountName)
-                    .post("/salesforce/account")
-                    .then()
-                    .statusCode(200)
-                    .extract()
-                    .body()
-                    .asString();
-
-            // Verify we captured the account creation event
-            RestAssured.given()
-                    .get("/salesforce/cdc")
-                    .then()
-                    .statusCode(200)
-                    .body("Name", is(accountName));
-        } finally {
-            // Shut down the CDC consumer
-            RestAssured.post("/salesforce/cdc/stop")
-                    .then()
-                    .statusCode(200);
-
-            // Clean up
-            if (accountId != null) {
-                RestAssured.delete("/salesforce/account/" + accountId)
-                        .then()
-                        .statusCode(204);
-            }
-        }
-    }
 }
diff --git a/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTestResource.java b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTestResource.java
new file mode 100644
index 0000000..9d47e8c
--- /dev/null
+++ b/integration-tests/salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTestResource.java
@@ -0,0 +1,59 @@
+/*
+ * 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;
+
+import java.util.Map;
+
+import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
+import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer;
+import org.apache.camel.quarkus.test.wiremock.WireMockTestResourceLifecycleManager;
+
+public class SalesforceTestResource extends WireMockTestResourceLifecycleManager {
+    private static final String SALESFORCE_BASE_URL = "login.salesforce.com";
+    private static final String SALESFORCE_CLIENT_ID = "SALESFORCE_CLIENTID";
+    private static final String SALESFORCE_CLIENT_SECRET = "SALESFORCE_CLIENTSECRET";
+    private static final String SALESFORCE_USERNAME = "SALESFORCE_USERNAME";
+    private static final String SALESFORCE_PASSWORD = "SALESFORCE_PASSWORD";
+
+    @Override
+    protected String getRecordTargetBaseUrl() {
+        return SALESFORCE_BASE_URL;
+    }
+
+    @Override
+    protected boolean isMockingEnabled() {
+        return !envVarsPresent(SALESFORCE_CLIENT_ID, SALESFORCE_CLIENT_SECRET, SALESFORCE_USERNAME, SALESFORCE_PASSWORD);
+    }
+
+    @Override
+    public Map<String, String> start() {
+        Map<String, String> options = super.start();
+        if (options.containsKey("wiremock.url")) {
+            options.put("camel.component.salesforce.loginUrl", options.get("wiremock.url"));
+            options.put("camel.component.salesforce.userName", "username");
+            options.put("camel.component.salesforce.password", "password");
+            options.put("camel.component.salesforce.clientId", "clientId");
+        }
+        return options;
+    }
+
+    @Override
+    protected void customizeWiremockConfiguration(WireMockConfiguration config) {
+        config.extensions(new ResponseTemplateTransformer(false));
+    }
+
+}
diff --git a/integration-tests/salesforce/src/test/resources/mappings/bulApi-abortJob.json b/integration-tests/salesforce/src/test/resources/mappings/bulApi-abortJob.json
new file mode 100644
index 0000000..0230ce0
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/bulApi-abortJob.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/async/50.0/job/750x0000000005LAAQ",
+    "method": "POST"
+  },
+  "response": {
+    "status": 200,
+    "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jobInfo\n   xmlns=\"http://www.force.com/2009/06/asyncapi/dataload\">\n  <id>750x0000000005LAAQ</id>\n  <operation>insert</operation>\n  <object>Contact</object>\n  <createdById>005x0000000wPWdAAM</createdById>\n  <createdDate>2009-09-01T16:42:46.000Z</createdDate>\n  <systemModstamp>2009-09-01T16:42:46.000Z</systemModstamp>\n  <state>Aborted</state>\n  <concurrencyMode>Parallel</concurrencyMode>\n  <contentType>CSV</contentType>\ [...]
+    "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/bulkApi-createJob.json b/integration-tests/salesforce/src/test/resources/mappings/bulkApi-createJob.json
new file mode 100644
index 0000000..3b5e29e
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/bulkApi-createJob.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/async/50.0/job",
+    "method": "POST"
+  },
+  "response": {
+    "status": 200,
+    "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jobInfo\n   xmlns=\"http://www.force.com/2009/06/asyncapi/dataload\">\n  <id>750x0000000005LAAQ</id>\n  <operation>insert</operation>\n  <object>Contact</object>\n  <createdById>005x0000000wPWdAAM</createdById>\n  <createdDate>2009-09-01T16:42:46.000Z</createdDate>\n  <systemModstamp>2009-09-01T16:42:46.000Z</systemModstamp>\n  <state>Open</state>\n  <concurrencyMode>Parallel</concurrencyMode>\n  <contentType>CSV</contentType>\n   [...]
+    "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/getAccount.json b/integration-tests/salesforce/src/test/resources/mappings/getAccount.json
new file mode 100644
index 0000000..a2c85fa
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getAccount.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%2CAccountNumber%20from%20Account%20LIMIT%201",
+    "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/getDocument.json b/integration-tests/salesforce/src/test/resources/mappings/getDocument.json
new file mode 100644
index 0000000..aac6d77
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/getDocument.json
@@ -0,0 +1,18 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/data/v50.0/sobjects/Document/Name/test",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "body" : "{\"attributes\": {\"type\" : \"Document\"}}",
+    "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/handshake.json b/integration-tests/salesforce/src/test/resources/mappings/handshake.json
new file mode 100644
index 0000000..e619cba
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/handshake.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/cometd/50.0/handshake",
+    "method": "POST"
+  },
+  "response": {
+    "status": 200,
+    "body": "[\"ext\": {\"replay\": true,\"payload.format\": true}, \"minimumVersion\": \"1.0\", \"clientId\": \"clientId\",\"supportedConnectionTypes\": [ \"long-polling\" ], \"channel\": \"/meta/handshake\", \"id\": \"{{jsonPath request.body '$[0].id'}}\",\"version\": \"1.0\",\"successful\": \"true\" }]",
+    "transformers": ["response-template"],
+    "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/oauth2.json b/integration-tests/salesforce/src/test/resources/mappings/oauth2.json
new file mode 100644
index 0000000..0623ea6
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/oauth2.json
@@ -0,0 +1,19 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/oauth2/token",
+    "method": "POST"
+  },
+  "response": {
+    "status": 200,
+    "body": "{\"instance_url\":\"{{request.baseUrl}}\",\"access_token\":\"token\"}",
+    "transformers": ["response-template"],
+    "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/revokeToken.json b/integration-tests/salesforce/src/test/resources/mappings/revokeToken.json
new file mode 100644
index 0000000..984cc76
--- /dev/null
+++ b/integration-tests/salesforce/src/test/resources/mappings/revokeToken.json
@@ -0,0 +1,17 @@
+{
+  "id": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "name": "salesforce_api_json",
+  "request": {
+    "url": "/services/oauth2/revoke?token=token",
+    "method": "GET"
+  },
+  "response": {
+    "status": 200,
+    "headers": {
+      "Content-Type": "application/json; charset=UTF-8"
+    }
+  },
+  "uuid": "09aa79df-8a19-41df-8655-e414d390d6ed",
+  "persistent": true,
+  "insertionIndex": 2
+}
\ No newline at end of file