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