You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by je...@apache.org on 2025/12/15 18:43:15 UTC
(camel) branch main updated: CAMEL-22782: camel-salesforce: Modernize integration test setup with SF CLI
This is an automated email from the ASF dual-hosted git repository.
jeremyross pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new cc4790f0e724 CAMEL-22782: camel-salesforce: Modernize integration test setup with SF CLI
cc4790f0e724 is described below
commit cc4790f0e724cf145c37ee159edc692d6074e80c
Author: Jeremy Ross <je...@gmail.com>
AuthorDate: Sun Dec 14 13:34:07 2025 -0600
CAMEL-22782: camel-salesforce: Modernize integration test setup with SF CLI
Migrate from Ant-based deployment to Salesforce CLI with improved
authentication, automatic environment setup, and better credential management.
Key changes:
Authentication:
- Use refresh token flow with SF CLI's built-in PlatformCLI connected app
- Automatically extract refresh token from SF CLI's stored authentication
- No security token required for scratch orgs
Credential Management:
- Store credentials in git-ignored .local/ directory
- Separate version-controlled config/ from user-specific .local/ files
- Auto-generate connected app credentials on first deployment
Automatic Setup:
- Assign Hard_Delete_Permission_Set during deployment
- Deactivate standard duplicate rules (Account, Contact, Lead)
- Enable username/password OAuth flow in scratch org definition
---
.../camel-salesforce-component/pom.xml | 107 +++-----
.../salesforce/SalesforceLoginConfig.java | 4 +-
.../salesforce/internal/SalesforceSession.java | 4 +-
.../component/salesforce/BulkApiJobManualIT.java | 11 -
.../component/salesforce/LoginConfigHelper.java | 128 ++++++++--
.../component/salesforce/RestApiManualIT.java | 32 ++-
.../camel-salesforce/it/resources/.gitignore | 13 +
components/camel-salesforce/it/resources/README.md | 193 +++++++++++++++
.../it/resources/migration-tool/.gitignore | 1 -
.../salesforce/applications/Warehouse.app | 27 --
.../classes/MerchandiseRestResource.cls-meta.xml | 23 --
.../MerchandiseRestResourceTests.cls-meta.xml | 23 --
.../resources/salesforce/classes/UpdateProfile.cls | 37 ---
.../salesforce/classes/UpdateProfile.cls-meta.xml | 23 --
.../resources/salesforce/connectedApps/.gitignore | 1 -
.../Test_Documents/Test_Document.txt-meta.xml | 24 --
.../it/resources/salesforce/objects/Account.object | 41 ---
.../salesforce/objects/CamelEventMessage__e.object | 36 ---
.../salesforce/objects/CamelEventNote__e.object | 36 ---
.../salesforce/objects/Line_Item__c.object | 117 ---------
.../salesforce/objects/Merchandise__c.object | 119 ---------
.../salesforce/objects/TestEvent__e.object | 35 ---
.../it/resources/salesforce/package.xml | 92 -------
...s_AccountChangeEvent.platformEventChannelMember | 21 --
.../salesforce/reports/Test_Reports-meta.xml | 22 --
.../it/resources/salesforce/tabs/Invoice__c.tab | 21 --
.../resources/salesforce/tabs/Merchandise__c.tab | 21 --
.../it/resources/setup-salesforce.sh | 275 +++++++++++++++++++++
...orceIntegrationTests.connectedApp-template.xml} | 16 +-
.../sfdx-project/config/scratch-org-def.json | 21 ++
.../default/applications/Warehouse.app-meta.xml | 11 +
....Test_Account_Process.approvalProcess-meta.xml} | 16 --
.../default}/classes/MerchandiseRestResource.cls | 0
.../classes/MerchandiseRestResource.cls-meta.xml | 5 +
.../classes/MerchandiseRestResourceTests.cls | 0
.../MerchandiseRestResourceTests.cls-meta.xml | 5 +
.../Test_Documents.documentFolder-meta.xml | 6 +
.../Test_Documents/Test_Document.document-meta.xml | 6 +
.../documents/Test_Documents/Test_Document.txt | 0
...d_Account_Duplicate_Rule.duplicateRule-meta.xml | 20 ++
...d_Contact_Duplicate_Rule.duplicateRule-meta.xml | 20 ++
...dard_Lead_Duplicate_Rule.duplicateRule-meta.xml | 20 ++
.../Invoice__c-Invoice Layout.layout-meta.xml} | 16 --
.../Line_Item__c-Line Item Layout.layout-meta.xml} | 16 --
...chandise__c-Merchandise Layout.layout-meta.xml} | 16 --
.../objects/Account/Account.object-meta.xml | 4 +
.../Account/fields/External_Id__c.field-meta.xml | 12 +
.../fields/Shipping_Location__c.field-meta.xml | 11 +
.../CamelEventMessage__e.object-meta.xml | 8 +
.../fields/Message__c.field-meta.xml | 13 +
.../CamelEventNote__e.object-meta.xml | 8 +
.../fields/Note__c.field-meta.xml | 13 +
.../objects/Invoice__c/Invoice__c.object-meta.xml} | 54 +---
.../Invoice__c/fields/Status__c.field-meta.xml | 32 +++
.../Invoice__c/listViews/All.listView-meta.xml | 6 +
.../Line_Item__c/Line_Item__c.object-meta.xml | 63 +++++
.../fields/Merchandise__c.field-meta.xml | 13 +
.../fields/Unit_Price__c.field-meta.xml | 11 +
.../fields/Units_Sold__c.field-meta.xml | 12 +
.../Test_Record_Type.recordType-meta.xml | 6 +
.../Merchandise__c/Merchandise__c.object-meta.xml | 64 +++++
.../fields/Description__c.field-meta.xml | 12 +
.../Merchandise__c/fields/Price__c.field-meta.xml | 12 +
.../fields/Total_Inventory__c.field-meta.xml | 13 +
.../Merchandise__c/listViews/All.listView-meta.xml | 6 +
.../TestEvent__e/TestEvent__e.object-meta.xml | 7 +
.../fields/Test_Field__c.field-meta.xml | 13 +
...d_Delete_Permission_Set.permissionset-meta.xml} | 40 +--
...ChangeEvent.platformEventChannelMember-meta.xml | 5 +
.../reports/Test_Reports.reportFolder-meta.xml | 4 +
.../Test_Reports/Test_Report.report-meta.xml} | 16 --
.../main/default/tabs/Invoice__c.tab-meta.xml | 5 +
.../main/default/tabs/Merchandise__c.tab-meta.xml | 5 +
.../it/resources/sfdx-project/sfdx-project.json | 12 +
.../ROOT/pages/camel-4x-upgrade-guide-4_17.adoc | 21 ++
pom.xml | 3 +
76 files changed, 1171 insertions(+), 1014 deletions(-)
diff --git a/components/camel-salesforce/camel-salesforce-component/pom.xml b/components/camel-salesforce/camel-salesforce-component/pom.xml
index 8a053bbafb14..0d6a24710f97 100644
--- a/components/camel-salesforce/camel-salesforce-component/pom.xml
+++ b/components/camel-salesforce/camel-salesforce-component/pom.xml
@@ -335,28 +335,29 @@
<requireFilesExist>
<files>
<file>
- ${salesforce.component.root}/it/resources/migration-tool/ant-salesforce.jar
+ ${salesforce.component.root}/it/resources/setup-salesforce.sh
</file>
</files>
- <message><![CDATA[Salesforce Migration Tool required
+ <message><![CDATA[Salesforce CLI Setup Script required
-You need to download the Salesforce Migration Tool (ZIP file) and
-extract the `ant-salesforce.jar` out of it to:
+The integration tests require the Salesforce CLI (sf) to be installed.
-${salesforce.component.root}/it/resources/migration-tool/ant-salesforce.jar
+For information about the Salesforce CLI:
+https://developer.salesforce.com/tools/salesforcecli
-It's needed by the integration tests to setup the Salesforce instance
-with custom sObjects/fields that are required by the tests.
+EASIEST OPTION - Auto Scratch Org:
+1. Authenticate to Dev Hub (one-time):
+ sf org login web --set-default-dev-hub
-Have a look at:
+2. Run tests (scratch org auto-created):
+ mvn clean verify -Pintegration
-${salesforce.component.root}/it/resources/salesforce
+ALTERNATIVE - Traditional Org:
+ - Set SALESFORCE_USERNAME, SALESFORCE_PASSWORD, and SALESFORCE_LOGIN_URL
+ - Or configure in test-salesforce-login.properties
-To see what will be done.
-
-For information and download of the Salesforce Migration Tool consult:
-
-https://developer.salesforce.com/page/Force.com_Migration_Tool]]></message>
+Source metadata location:
+${salesforce.component.root}/it/resources/salesforce-source]]></message>
</requireFilesExist>
</rules>
<fail>true</fail>
@@ -385,79 +386,35 @@ https://developer.salesforce.com/page/Force.com_Migration_Tool]]></message>
</resources>
</configuration>
</execution>
- <execution>
- <id>set-connected-app-client-id</id>
- <phase>generate-test-resources</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>
- ${salesforce.component.root}/it/resources/salesforce/connectedApps
- </outputDirectory>
- <overwrite>true</overwrite>
- <filters>
- <filter>${salesforce.component.root}/test-salesforce-login.properties</filter>
- </filters>
- <resources>
- <resource>
- <directory>${salesforce.component.root}/it/resources/</directory>
- <include>CamelSalesforceIntegrationTests.connectedApp</include>
- <filtering>true</filtering>
- </resource>
- </resources>
- </configuration>
- </execution>
</executions>
</plugin>
<plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>setup-salesforce-instance</id>
+ <phase>pre-integration-test</phase>
<goals>
- <goal>run</goal>
+ <goal>exec</goal>
</goals>
- <phase>pre-integration-test</phase>
<configuration>
- <target xmlns:if="ant:if" xmlns:unless="ant:unless">
- <taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">
- <classpath>
- <pathelement location="${salesforce.component.root}/it/resources/migration-tool/ant-salesforce.jar" />
- </classpath>
- </taskdef>
-
- <property prefix="prop" file="${project.build.directory}/test-classes/test-salesforce-login.properties" />
- <property environment="env" />
-
- <property name="username" value="${prop.salesforce.username}" if:set="prop.salesforce.username" />
- <property name="username" value="${env.SALESFORCE_USERNAME}" if:set="env.SALESFORCE_USERNAME" />
-
- <property name="password" value="${prop.salesforce.password}" if:set="prop.salesforce.password" />
- <property name="password" value="${env.SALESFORCE_PASSWORD}" if:set="env.SALESFORCE_PASSWORD" />
-
- <property name="serverurl" value="${prop.salesforce.login.url}" if:set="prop.salesforce.login.url" />
- <property name="serverurl" value="${env.SALESFORCE_LOGIN_URL}" if:set="env.SALESFORCE_LOGIN_URL" />
-
- <fail unless:set="username" message="To run the migrations you need to specify either `salesforce.username` in: ${project.build.directory}/generated-resources/test-salesforce-login.properties or set SALESFORCE_USERNAME environment variable" />
-
- <fail unless:set="password" message="To run the migrations you need to specify either `salesforce.password` in: ${project.build.directory}/generated-resources/test-salesforce-login.properties or set SALESFORCE_PASSWORD environment variable" />
-
- <fail unless:set="serverurl" message="To run the migrations you need to specify either `salesforce.login.url` in: ${project.build.directory}/generated-resources/test-salesforce-login.properties or set SALESFORCE_LOGIN_URL environment variable" />
-
- <sf:deploy xmlns:sf="antlib:com.salesforce" username="${username}" password="${password}" deployRoot="${salesforce.component.root}/it/resources/salesforce" rollbackOnError="true" serverurl="${serverurl}" />
- </target>
+ <executable>bash</executable>
+ <workingDirectory>${salesforce.component.root}/it/resources</workingDirectory>
+ <arguments>
+ <argument>setup-salesforce.sh</argument>
+ </arguments>
+ <environmentVariables>
+ <SALESFORCE_USERNAME>${env.SALESFORCE_USERNAME}</SALESFORCE_USERNAME>
+ <SALESFORCE_PASSWORD>${env.SALESFORCE_PASSWORD}</SALESFORCE_PASSWORD>
+ <SALESFORCE_LOGIN_URL>${env.SALESFORCE_LOGIN_URL}</SALESFORCE_LOGIN_URL>
+ <SALESFORCE_DEV_HUB>${env.SALESFORCE_DEV_HUB}</SALESFORCE_DEV_HUB>
+ <SALESFORCE_DEPLOY_SOURCE>${env.SALESFORCE_DEPLOY_SOURCE}</SALESFORCE_DEPLOY_SOURCE>
+ <SALESFORCE_SCRATCH_ORG_DURATION>${env.SALESFORCE_SCRATCH_ORG_DURATION}</SALESFORCE_SCRATCH_ORG_DURATION>
+ </environmentVariables>
</configuration>
</execution>
</executions>
- <dependencies>
- <dependency>
- <groupId>org.apache.ant</groupId>
- <artifactId>ant</artifactId>
- <version>1.10.15</version>
- </dependency>
- </dependencies>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java
index cc036e43b1f8..e1e68ab2cfc5 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java
@@ -193,7 +193,7 @@ public class SalesforceLoginConfig {
throw new IllegalArgumentException(
"You must specify parameters aligned with one of the supported authentication methods:"
+ " for username and password authentication: userName, password, clientSecret;"
- + " for refresh token authentication: refreshToken, clientSecret;"
+ + " for refresh token authentication: refreshToken (clientSecret optional);"
+ " for JWT: userName, keystore. And for every one of those loginUrl and clientId must be specified also.");
}
@@ -252,7 +252,7 @@ public class SalesforceLoginConfig {
break;
case REFRESH_TOKEN:
ObjectHelper.notNull(refreshToken, "refreshToken (authentication with refresh token)");
- ObjectHelper.notNull(clientSecret, "clientSecret (authentication with refresh token)");
+ // clientSecret can be optional for refresh token flow
break;
case JWT:
ObjectHelper.notNull(userName, "userName (JWT authentication)");
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
index 12c7c9dddafe..c94f686af54f 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
@@ -220,7 +220,9 @@ public class SalesforceSession extends ServiceSupport {
fields.put("password", config.getPassword());
break;
case REFRESH_TOKEN:
- fields.put("client_secret", config.getClientSecret());
+ if (ObjectHelper.isNotEmpty(config.getClientSecret())) {
+ fields.put("client_secret", config.getClientSecret());
+ }
fields.put("grant_type", "refresh_token");
fields.put("refresh_token", config.getRefreshToken());
break;
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiJobManualIT.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiJobManualIT.java
index 516de281bd67..6cd41b25fa4f 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiJobManualIT.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiJobManualIT.java
@@ -16,7 +16,6 @@
*/
package org.apache.camel.component.salesforce;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -26,7 +25,6 @@ import org.apache.camel.component.salesforce.api.dto.bulk.JobInfo;
import org.apache.camel.component.salesforce.api.dto.bulk.JobStateEnum;
import org.apache.camel.component.salesforce.api.dto.bulk.OperationEnum;
import org.apache.camel.component.salesforce.dto.generated.Merchandise__c;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -34,15 +32,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
public class BulkApiJobManualIT extends AbstractBulkApiTestBase {
- @BeforeEach
- public void setupProfileWithHardDelete() throws IOException {
- final SalesforceLoginConfig loginConfig = LoginConfigHelper.getLoginConfig();
-
- template().requestBodyAndHeader("salesforce:apexCall/UpdateProfile?apexMethod=PATCH&sObjectClass=java.lang.String",
- null,
- SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "username", loginConfig.getUserName());
- }
-
@ParameterizedTest
@MethodSource("getJobs")
public void testJobLifecycle(JobInfo jobInfo, String operationName) throws Exception {
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
index cf148a1636e4..bd0489951b37 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java
@@ -16,11 +16,17 @@
*/
package org.apache.camel.component.salesforce;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.support.jsse.KeyStoreParameters;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
@@ -33,10 +39,25 @@ public final class LoginConfigHelper {
private static final Logger LOG = LoggerFactory.getLogger(LoginConfigHelper.class);
private static final LoginConfigHelper INSTANCE = new LoginConfigHelper();
+ private static final String SF_CREDENTIALS_PATH = "it/resources/sfdx-project/.local/test-credentials.json";
+
private final Map<String, String> configuration;
private LoginConfigHelper() {
configuration = new HashMap<>();
+ loadConfiguration();
+ }
+
+ public static void reloadCredentials() {
+ INSTANCE.configuration.clear();
+ INSTANCE.loadConfiguration();
+ }
+
+ private void loadConfiguration() {
+ // 1. First, try to load from SF CLI credentials file (lowest priority, can be overridden)
+ loadFromSfCliCredentials();
+
+ // 2. Load from properties file (overrides SF CLI)
try {
final ResourceBundle properties = ResourceBundle.getBundle("test-salesforce-login");
properties.keySet().forEach(k -> configuration.put(k, properties.getString(k)));
@@ -44,14 +65,84 @@ public final class LoginConfigHelper {
// ignoring if missing
}
+ // 3. Environment variables (overrides properties file)
System.getenv().keySet().stream()//
.filter(k -> k.startsWith("SALESFORCE_") && isNotEmpty(System.getenv(k)))
.forEach(k -> configuration.put(fromEnvName(k), System.getenv(k)));
+
+ // 4. System properties (highest priority)
System.getProperties().keySet().stream().map(String.class::cast)
.filter(k -> k.startsWith("salesforce.") && isNotEmpty(System.getProperty(k)))
.forEach(k -> configuration.put(k, System.getProperty(k)));
}
+ private void loadFromSfCliCredentials() {
+ Path credentialsPath = findCredentialsFile();
+
+ if (credentialsPath == null || !Files.exists(credentialsPath)) {
+ LOG.debug("SF CLI credentials file not found");
+ return;
+ }
+
+ try {
+ LOG.info("Loading credentials from SF CLI: {}", credentialsPath);
+
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode root = mapper.readTree(credentialsPath.toFile());
+
+ setIfPresent(root, "clientId", "salesforce.client.id");
+ setIfPresent(root, "clientSecret", "salesforce.client.secret");
+ setIfPresent(root, "refreshToken", "salesforce.refresh.token");
+ setIfPresent(root, "username", "salesforce.username");
+ setIfPresent(root, "password", "salesforce.password");
+ setIfPresent(root, "instanceUrl", "salesforce.login.url");
+
+ } catch (IOException e) {
+ LOG.debug("Failed to read SF CLI credentials file: {}", e.getMessage());
+ }
+ }
+
+ private void setIfPresent(JsonNode root, String jsonKey, String configKey) {
+ JsonNode node = root.get(jsonKey);
+ if (node != null && !node.isNull() && isNotEmpty(node.asText())) {
+ configuration.put(configKey, node.asText());
+ }
+ }
+
+ private Path findCredentialsFile() {
+ // First, try the direct path from current directory
+ Path direct = Paths.get(SF_CREDENTIALS_PATH);
+ if (Files.exists(direct)) {
+ return direct;
+ }
+
+ // Try to find from camel-salesforce directory
+ Path current = Paths.get("").toAbsolutePath();
+ while (current != null) {
+ Path candidate = current.resolve(SF_CREDENTIALS_PATH);
+ if (Files.exists(candidate)) {
+ return candidate;
+ }
+ // Also check if we're in a subdirectory of camel-salesforce
+ if (current.endsWith("camel-salesforce") || current.endsWith("camel-salesforce-component")) {
+ candidate = current.getParent() != null
+ ? current.getParent().resolve(SF_CREDENTIALS_PATH)
+ : current.resolve(SF_CREDENTIALS_PATH);
+ if (Files.exists(candidate)) {
+ return candidate;
+ }
+ // If we're in camel-salesforce directly
+ candidate = current.resolve(SF_CREDENTIALS_PATH);
+ if (Files.exists(candidate)) {
+ return candidate;
+ }
+ }
+ current = current.getParent();
+ }
+
+ return null;
+ }
+
private String fromEnvName(final String envVariable) {
return envVariable.replace('_', '.').toLowerCase();
}
@@ -69,6 +160,7 @@ public final class LoginConfigHelper {
}
loginConfig.setClientId(configuration.get("salesforce.client.id"));
loginConfig.setClientSecret(configuration.get("salesforce.client.secret"));
+ loginConfig.setRefreshToken(configuration.get("salesforce.refresh.token"));
loginConfig.setUserName(configuration.get("salesforce.username"));
loginConfig.setPassword(configuration.get("salesforce.password"));
@@ -90,20 +182,21 @@ public final class LoginConfigHelper {
} catch (final IllegalArgumentException e) {
LOG.info("To run integration tests Salesforce Authentication information is");
LOG.info("needed.");
- LOG.info("You need to specify the configuration for running tests by either");
- LOG.info("specifying environment variables, Maven properties or create a Java");
- LOG.info("properties file at:");
LOG.info("");
- LOG.info("camel/components/camel-salesforce/test-salesforce-login.properties");
+ LOG.info("RECOMMENDED: Use the SF CLI setup script to automatically configure");
+ LOG.info("a scratch org with all required credentials:");
LOG.info("");
- LOG.info("With authentication information to access a Salesforce instance.");
- LOG.info("You can use:");
+ LOG.info(" cd camel/components/camel-salesforce/it/resources");
+ LOG.info(" ./setup-salesforce.sh");
LOG.info("");
- LOG.info("camel/components/camel-salesforce/test-salesforce-login.sample.properties");
+ LOG.info("This will create a scratch org, deploy the test metadata, and store");
+ LOG.info("credentials that are automatically loaded by the tests.");
LOG.info("");
- LOG.info("as reference. A free Salesforce developer account can be obtained at:");
+ LOG.info("ALTERNATIVE: You can specify configuration manually by either");
+ LOG.info("specifying environment variables, Maven properties or create a Java");
+ LOG.info("properties file at:");
LOG.info("");
- LOG.info("https://developer.salesforce.com");
+ LOG.info("camel/components/camel-salesforce/test-salesforce-login.properties");
LOG.info("");
LOG.info("Properties that you need to set:");
LOG.info("");
@@ -124,23 +217,6 @@ public final class LoginConfigHelper {
LOG.info("* RT - when using refresh token flow");
LOG.info("* JWT - when using JWT flow");
LOG.info("");
- LOG.info("You can force authentication type to be one of USERNAME_PASSWORD,");
- LOG.info("REFRESH_TOKEN or JWT by setting `salesforce.auth.type` (or ");
- LOG.info("`SALESFORCE_AUTH_TYPE` for environment variables).");
- LOG.info("");
- LOG.info("Examples:");
- LOG.info("");
- LOG.info("Using environment:");
- LOG.info("");
- LOG.info("$ export SALESFORCE_CLIENT_ID=...");
- LOG.info("$ export SALESFORCE_CLIENT_SECRET=...");
- LOG.info("$ export ...others...");
- LOG.info("");
- LOG.info("or using Maven properties:");
- LOG.info("");
- LOG.info("$ mvn -Pintegration -Dsalesforce.client.id=... \\");
- LOG.info(" -Dsalesforce.client.secret=... ...");
- LOG.info("");
}
}
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
index 136466cc3994..a71dee5fa347 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
@@ -161,7 +161,7 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
Line_Item__c lineItem = new Line_Item__c();
final String lineItemId = String.valueOf(TEST_LINE_ITEM_ID.incrementAndGet());
lineItem.setName(lineItemId);
- template().requestBody("direct:createLineItem", lineItem, CreateSObjectResult.class);
+ CreateSObjectResult result = template().requestBody("direct:createLineItem", lineItem, CreateSObjectResult.class);
}
private void createLineItems(int count) {
@@ -720,10 +720,11 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
final ClientConnector connector = new ClientConnector();
connector.setSslContextFactory(sslContextFactory);
final HttpClientTransport transport = new HttpClientTransportOverHTTP(connector);
- try (final HttpClient httpClient = new HttpClient(transport)) {
- httpClient.setConnectTimeout(60000);
- httpClient.start();
+ final HttpClient httpClient = new HttpClient(transport);
+ httpClient.setConnectTimeout(60000);
+ httpClient.start();
+ try {
final String uri = sf.getLoginConfig().getLoginUrl() + "/services/oauth2/revoke?token=" + accessToken;
final Request logoutGet = httpClient.newRequest(uri).method(HttpMethod.GET).timeout(1, TimeUnit.MINUTES);
@@ -731,6 +732,8 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
assertEquals(HttpStatus.OK_200, response.getStatus());
testGetGlobalObjects();
+ } finally {
+ httpClient.stop();
}
}
@@ -744,10 +747,11 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
final ClientConnector connector = new ClientConnector();
connector.setSslContextFactory(sslContextFactory);
final HttpClientTransport transport = new HttpClientTransportOverHTTP(connector);
- try (final HttpClient httpClient = new HttpClient(transport)) {
- httpClient.setConnectTimeout(60000);
- httpClient.start();
+ final HttpClient httpClient = new HttpClient(transport);
+ httpClient.setConnectTimeout(60000);
+ httpClient.start();
+ try {
final String uri = sf.getLoginConfig().getLoginUrl() + "/services/oauth2/revoke?token=" + accessToken;
final Request logoutGet = httpClient.newRequest(uri).method(HttpMethod.GET).timeout(1, TimeUnit.MINUTES);
@@ -755,9 +759,14 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
assertEquals(HttpStatus.OK_200, response.getStatus());
// set component config to bad password to cause relogin attempts to
- // fail
+ // fail. Also clear refresh token and set explicit auth type to avoid ambiguous config.
+ // Important: save password and refreshToken first, then clear refreshToken before
+ // doing anything else - getType() throws if both password and refreshToken are set.
final String password = sf.getLoginConfig().getPassword();
+ final String refreshToken = sf.getLoginConfig().getRefreshToken();
+ sf.getLoginConfig().setRefreshToken(null);
sf.getLoginConfig().setPassword("bad_password");
+ sf.getLoginConfig().setType(AuthenticationType.USERNAME_PASSWORD);
try {
testGetGlobalObjects();
@@ -771,9 +780,14 @@ public class RestApiManualIT extends AbstractSalesforceTestBase {
fail("Expected SalesforceException!");
}
} finally {
- // reset password and retries to allow other tests to pass
+ // reset config to allow other tests to pass
+ // restore refreshToken first, then password, then clear type to let it auto-determine
+ sf.getLoginConfig().setRefreshToken(refreshToken);
sf.getLoginConfig().setPassword(password);
+ sf.getLoginConfig().setType(null);
}
+ } finally {
+ httpClient.stop();
}
}
diff --git a/components/camel-salesforce/it/resources/.gitignore b/components/camel-salesforce/it/resources/.gitignore
new file mode 100644
index 000000000000..5d15c101666e
--- /dev/null
+++ b/components/camel-salesforce/it/resources/.gitignore
@@ -0,0 +1,13 @@
+# Salesforce CLI generated files (within sfdx-project)
+sfdx-project/.sfdx/
+sfdx-project/.sf/
+
+# Salesforce org auth files
+*.json.bak
+.sfdx-url
+
+# Generated connected app (created from .template file by setup script)
+sfdx-project/salesforce-source/main/default/connectedApps/CamelSalesforceIntegrationTests.connectedApp-meta.xml
+
+# User-specific local files (created by setup script)
+sfdx-project/.local/
diff --git a/components/camel-salesforce/it/resources/README.md b/components/camel-salesforce/it/resources/README.md
new file mode 100644
index 000000000000..ccd8c39ad9a9
--- /dev/null
+++ b/components/camel-salesforce/it/resources/README.md
@@ -0,0 +1,193 @@
+# Salesforce Integration Test Setup
+
+This directory contains the Salesforce configuration and setup scripts for the Camel Salesforce component integration tests.
+
+## Overview
+
+The integration tests use the **Salesforce CLI (sf)** to deploy metadata to a Salesforce org. The metadata is stored in **source format** (not metadata API format) for easier version control and compatibility with modern Salesforce development tools.
+
+## Prerequisites
+
+1. **Salesforce CLI** must be installed
+
+ **Install via npm (recommended):**
+ ```bash
+ npm install -g @salesforce/cli
+ ```
+
+ **Or download installer:**
+ - Download from: https://developer.salesforce.com/tools/salesforcecli
+
+ **Verify installation:**
+ ```bash
+ sf --version
+ ```
+
+2. **jq** (JSON processor) - **Required** for parsing SF CLI JSON output
+
+ **Installation:**
+ ```bash
+ # macOS
+ brew install jq
+
+ # Ubuntu/Debian
+ sudo apt-get install jq
+
+ # RHEL/CentOS
+ sudo yum install jq
+ ```
+
+ Download: https://jqlang.github.io/jq/download/
+
+## Running Integration Tests
+
+When integration tests are run via maven, `setup-salesforce.sh` is executed and automatically detects which mode to use with the following priority:
+
+1. **Existing Scratch Org**: If a `target-org` is configured locally (in `sfdx-project/.sf/config.json`), it will be reused. You can run this command to see the current local target-org:
+ ```bash
+ sf config get target-org --verbose
+ ```
+2. **Auto-Create Scratch Org**: If no credentials provided and no local org exists, a new scratch org is created
+3. **Traditional Org**: If username/password credentials are provided, authenticate with those
+
+All operations use the **Salesforce CLI's local default org** mechanism, scoped to the project directory.
+
+To reset and create a fresh org:
+```bash
+sf config unset target-org
+```
+
+### Option A: Scratch Orgs
+
+If you have a Dev Hub authenticated and don't provide any credentials, a scratch org is automatically created on the first run and reused on subsequent runs:
+
+```bash
+# One-time setup: Authenticate to Dev Hub
+sf org login web --set-default-dev-hub
+
+# First run - scratch org is automatically created and set as local default
+mvn clean verify -Pintegration
+
+# Subsequent runs - reuses the same org (no new org creation)
+mvn clean verify -Pintegration
+```
+
+**How it works:**
+- **First run**: Creates a new scratch org with a unique name (e.g., `camel-sf-test-1733123456`)
+- Sets it as the **local default org** (stored in `sfdx-project/.sf/config.json`)
+- Deploys the source metadata to the org
+- Extracts the **refresh token** from SF CLI and stores it for test authentication
+- Runs the integration tests
+- **Subsequent runs**: Detects existing local target-org and reuses it (skips org creation)
+- The scratch org remains available for 7 days by default
+
+**Authentication:**
+The integration tests use the **refresh token flow** with `PlatformCLI` (SF CLI's built-in connected app). This approach:
+- Uses the refresh token already stored by SF CLI (no additional OAuth flow needed)
+- Does not require a security token
+- Does not require username/password
+- Works immediately after scratch org creation
+
+**After tests run:**
+The scratch org is configured as the local default. You can:
+- View org details: `sf org display`
+- Open in browser: `sf org open`
+- List all orgs: `sf org list`
+- Delete when done: `sf org delete scratch --target-org <alias> --no-prompt`
+- Reset to create a new org: `sf config unset target-org`
+
+### Option B: Traditional Salesforce Orgs
+
+**Important:** Before using username-password authentication, you must enable this OAuth flow in your Salesforce org:
+
+1. Go to **Setup** → **OAuth and OIDC Settings**
+ - Direct URL: `/lightning/setup/OauthOidcSettings/home`
+2. Enable **"Allow OAuth Username-Password Flows"**
+3. Save your changes
+
+This setting is disabled by default in newer Salesforce orgs for security reasons. Scratch orgs created by the setup script have this setting enabled automatically via the scratch org definition.
+
+Set the following environment variables:
+
+```bash
+export SALESFORCE_USERNAME="your-username@example.com"
+export SALESFORCE_PASSWORD="your-password-and-security-token"
+export SALESFORCE_LOGIN_URL="https://login.salesforce.com" # or https://test.salesforce.com for sandbox
+
+mvn clean verify -Pintegration
+```
+
+**How it works:**
+- **First run**: Authenticates to your org with username/password
+- Sets it as the **local default org** (alias: `camel-sf-integration`)
+- Deploys the source metadata
+- Runs the integration tests
+- **Subsequent runs**: Detects existing local target-org and reuses it (skips authentication)
+
+### Additional Configuration Options
+
+#### Custom Scratch Org Duration
+```bash
+export SALESFORCE_SCRATCH_ORG_DURATION=14 # Default: 7 days (max: 30)
+mvn clean verify -Pintegration
+```
+
+#### Skip Source Deployment (Reuse Existing Org)
+If the org already has the metadata deployed:
+```bash
+export SALESFORCE_DEPLOY_SOURCE=false
+mvn clean verify -Pintegration
+```
+
+#### Specify Dev Hub Explicitly
+If you want to specify which Dev Hub to use (instead of the default):
+```bash
+export SALESFORCE_DEV_HUB="mydevhub@example.com"
+mvn clean verify -Pintegration
+```
+
+#### Use a Specific Existing Org
+Set any org as the default before running tests:
+```bash
+# Login to a new org and set as default
+sf org login web --alias my-test-org --set-default
+
+# Or set an already-authenticated org as default
+sf config set target-org my-existing-org
+
+mvn clean verify -Pintegration
+```
+
+## Environment Variables
+
+| Variable | Description | Default | Required |
+|----------|-------------|---------|----------|
+| `SALESFORCE_USERNAME` | Username for traditional org | - | No* |
+| `SALESFORCE_PASSWORD` | Password + security token for traditional org | - | No* |
+| `SALESFORCE_LOGIN_URL` | Login URL for traditional org | `https://login.salesforce.com` | No |
+| `SALESFORCE_DEV_HUB` | Dev Hub username (skips auto-detection) | Auto-detected | No |
+| `SALESFORCE_DEPLOY_SOURCE` | Deploy source to org | `true` | No |
+| `SALESFORCE_SCRATCH_ORG_DURATION` | Scratch org lifetime in days (1-30) | `7` | No |
+
+**How SF CLI Tracks Orgs:**
+- All org authentication is stored **locally** in `sfdx-project/.sf/` directory (git-ignored)
+- The script sets the authenticated/created org as the **local default** (not global)
+- Subsequent runs automatically detect and reuse the local target-org
+- This keeps the project isolated from other SF CLI usage on your machine
+- Use `sf org display` to see which org is currently the local default
+- Use `sf config get target-org` to see where the org is configured (Local vs Global)
+
+## Manual Setup Script Execution
+
+You can run the setup script manually, outside of a maven execution:
+
+```bash
+cd it/resources
+./setup-salesforce.sh
+```
+
+## Additional Resources
+
+- [Salesforce CLI Documentation](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/)
+- [Salesforce DX Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/)
+- [Scratch Orgs](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_scratch_orgs.htm)
diff --git a/components/camel-salesforce/it/resources/migration-tool/.gitignore b/components/camel-salesforce/it/resources/migration-tool/.gitignore
deleted file mode 100644
index 62a9cd6c375b..000000000000
--- a/components/camel-salesforce/it/resources/migration-tool/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/ant-salesforce.jar
diff --git a/components/camel-salesforce/it/resources/salesforce/applications/Warehouse.app b/components/camel-salesforce/it/resources/salesforce/applications/Warehouse.app
deleted file mode 100644
index 0293342e040f..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/applications/Warehouse.app
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
- <defaultLandingTab>Merchandise__c</defaultLandingTab>
- <label>Warehouse</label>
- <tabs>standard-Chatter</tabs>
- <tabs>standard-File</tabs>
- <tabs>standard-report</tabs>
- <tabs>standard-Dashboard</tabs>
- <tabs>Invoice__c</tabs>
- <tabs>Merchandise__c</tabs>
-</CustomApplication>
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls-meta.xml b/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls-meta.xml
deleted file mode 100644
index a6fdf1399a6e..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls-meta.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
- <apiVersion>38.0</apiVersion>
- <status>Active</status>
-</ApexClass>
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResourceTests.cls-meta.xml b/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResourceTests.cls-meta.xml
deleted file mode 100644
index a6fdf1399a6e..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResourceTests.cls-meta.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
- <apiVersion>38.0</apiVersion>
- <status>Active</status>
-</ApexClass>
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls b/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls
deleted file mode 100644
index 1b12942d914a..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * 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.
- */
-@RestResource(urlMapping='/UpdateProfile/*')
-global without sharing class UpdateProfile {
-
- @HttpPatch
- global static String perform() {
- String username = RestContext.request.params.get('username');
-
- PermissionSet bulkDelete = [SELECT Id FROM PermissionSet WHERE Name = 'Hard_Delete_Permission_Set' LIMIT 1];
- User user = [SELECT Id FROM USER WHERE Username = :username LIMIT 1];
-
- List<PermissionSetAssignment> previous = [SELECT Id FROM PermissionSetAssignment WHERE PermissionSetId = :bulkDelete.Id AND AssigneeId = :user.Id];
-
- if (previous.isEmpty()) {
- PermissionSetAssignment assignment = new PermissionSetAssignment(PermissionSetId = bulkDelete.Id, AssigneeId = user.Id);
- upsert assignment;
- }
-
- return 'success';
- }
-
-}
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls-meta.xml b/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls-meta.xml
deleted file mode 100644
index a6fdf1399a6e..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/classes/UpdateProfile.cls-meta.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
- <apiVersion>38.0</apiVersion>
- <status>Active</status>
-</ApexClass>
diff --git a/components/camel-salesforce/it/resources/salesforce/connectedApps/.gitignore b/components/camel-salesforce/it/resources/salesforce/connectedApps/.gitignore
deleted file mode 100644
index 464cef48d41f..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/connectedApps/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-CamelSalesforceIntegrationTests.connectedApp
diff --git a/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents/Test_Document.txt-meta.xml b/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents/Test_Document.txt-meta.xml
deleted file mode 100644
index 3db663b0e81f..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents/Test_Document.txt-meta.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<Document xmlns="http://soap.sforce.com/2006/04/metadata">
- <internalUseOnly>false</internalUseOnly>
- <name>Test Document</name>
- <public>false</public>
-</Document>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/Account.object b/components/camel-salesforce/it/resources/salesforce/objects/Account.object
deleted file mode 100644
index 85daa86f8a4c..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/Account.object
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <fields>
- <fullName>External_Id__c</fullName>
- <caseSensitive>false</caseSensitive>
- <externalId>true</externalId>
- <label>External Id</label>
- <length>255</length>
- <required>false</required>
- <trackFeedHistory>false</trackFeedHistory>
- <type>Text</type>
- <unique>true</unique>
- </fields>
- <fields>
- <fullName>Shipping_Location__c</fullName>
- <displayLocationInDecimal>false</displayLocationInDecimal>
- <externalId>false</externalId>
- <label>Shipping_Location</label>
- <required>false</required>
- <scale>3</scale>
- <trackFeedHistory>false</trackFeedHistory>
- <type>Location</type>
- </fields>
- <visibility>Public</visibility>
-</CustomObject>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/CamelEventMessage__e.object b/components/camel-salesforce/it/resources/salesforce/objects/CamelEventMessage__e.object
deleted file mode 100644
index d29546571531..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/CamelEventMessage__e.object
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <deploymentStatus>Deployed</deploymentStatus>
- <eventType>HighVolume</eventType>
- <fields>
- <fullName>Message__c</fullName>
- <externalId>false</externalId>
- <isFilteringDisabled>false</isFilteringDisabled>
- <isNameField>false</isNameField>
- <isSortingDisabled>false</isSortingDisabled>
- <label>Message</label>
- <length>255</length>
- <required>false</required>
- <type>Text</type>
- <unique>false</unique>
- </fields>
- <label>Camel Event Message</label>
- <pluralLabel>Camel Event Messages</pluralLabel>
- <publishBehavior>PublishAfterCommit</publishBehavior>
-</CustomObject>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/CamelEventNote__e.object b/components/camel-salesforce/it/resources/salesforce/objects/CamelEventNote__e.object
deleted file mode 100644
index 2569f719a503..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/CamelEventNote__e.object
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <deploymentStatus>Deployed</deploymentStatus>
- <eventType>HighVolume</eventType>
- <fields>
- <fullName>Note__c</fullName>
- <externalId>false</externalId>
- <isFilteringDisabled>false</isFilteringDisabled>
- <isNameField>false</isNameField>
- <isSortingDisabled>false</isSortingDisabled>
- <label>Note</label>
- <length>255</length>
- <required>false</required>
- <type>Text</type>
- <unique>false</unique>
- </fields>
- <label>Camel Event Note</label>
- <pluralLabel>Camel Events Notes</pluralLabel>
- <publishBehavior>PublishAfterCommit</publishBehavior>
-</CustomObject>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/Line_Item__c.object b/components/camel-salesforce/it/resources/salesforce/objects/Line_Item__c.object
deleted file mode 100644
index a09ee5499448..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/Line_Item__c.object
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <actionOverrides>
- <actionName>Accept</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>CancelEdit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Clone</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Delete</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Edit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>List</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>New</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>SaveEdit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Tab</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>View</actionName>
- <type>Default</type>
- </actionOverrides>
- <allowInChatterGroups>false</allowInChatterGroups>
- <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
- <deploymentStatus>Deployed</deploymentStatus>
- <enableActivities>false</enableActivities>
- <enableBulkApi>true</enableBulkApi>
- <enableFeeds>false</enableFeeds>
- <enableHistory>false</enableHistory>
- <enableReports>true</enableReports>
- <enableSearch>true</enableSearch>
- <enableSharing>true</enableSharing>
- <enableStreamingApi>true</enableStreamingApi>
- <fields>
- <fullName>Merchandise__c</fullName>
- <deleteConstraint>SetNull</deleteConstraint>
- <externalId>false</externalId>
- <label>Merchandise</label>
- <referenceTo>Merchandise__c</referenceTo>
- <relationshipLabel>Line Items</relationshipLabel>
- <relationshipName>Line_Items</relationshipName>
- <required>false</required>
- <trackTrending>false</trackTrending>
- <type>Lookup</type>
- </fields>
- <fields>
- <fullName>Unit_Price__c</fullName>
- <externalId>false</externalId>
- <label>Unit Price</label>
- <precision>18</precision>
- <required>false</required>
- <scale>2</scale>
- <trackTrending>false</trackTrending>
- <type>Currency</type>
- </fields>
- <fields>
- <fullName>Units_Sold__c</fullName>
- <externalId>false</externalId>
- <label>Units Sold</label>
- <precision>18</precision>
- <required>false</required>
- <scale>0</scale>
- <trackTrending>false</trackTrending>
- <type>Number</type>
- <unique>false</unique>
- </fields>
- <label>Line Item</label>
- <nameField>
- <label>Line Item Number</label>
- <type>Text</type>
- </nameField>
- <pluralLabel>Line Items</pluralLabel>
- <recordTypes>
- <fullName>Test_Record_Type</fullName>
- <active>true</active>
- <label>Test Record Type</label>
- </recordTypes>
- <searchLayouts/>
- <sharingModel>ReadWrite</sharingModel>
- <visibility>Public</visibility>
-</CustomObject>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/Merchandise__c.object b/components/camel-salesforce/it/resources/salesforce/objects/Merchandise__c.object
deleted file mode 100644
index 0e23cd6fce50..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/Merchandise__c.object
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <actionOverrides>
- <actionName>Accept</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>CancelEdit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Clone</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Delete</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Edit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>List</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>New</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>SaveEdit</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>Tab</actionName>
- <type>Default</type>
- </actionOverrides>
- <actionOverrides>
- <actionName>View</actionName>
- <type>Default</type>
- </actionOverrides>
- <allowInChatterGroups>false</allowInChatterGroups>
- <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
- <deploymentStatus>Deployed</deploymentStatus>
- <enableActivities>true</enableActivities>
- <enableBulkApi>true</enableBulkApi>
- <enableFeeds>true</enableFeeds>
- <enableHistory>false</enableHistory>
- <enableReports>true</enableReports>
- <enableSearch>true</enableSearch>
- <enableSharing>true</enableSharing>
- <enableStreamingApi>true</enableStreamingApi>
- <fields>
- <fullName>Description__c</fullName>
- <externalId>false</externalId>
- <label>Description</label>
- <length>100</length>
- <required>false</required>
- <trackFeedHistory>false</trackFeedHistory>
- <trackTrending>false</trackTrending>
- <type>Text</type>
- <unique>false</unique>
- </fields>
- <fields>
- <fullName>Price__c</fullName>
- <externalId>false</externalId>
- <label>Price</label>
- <precision>18</precision>
- <required>true</required>
- <scale>2</scale>
- <trackFeedHistory>false</trackFeedHistory>
- <trackTrending>false</trackTrending>
- <type>Currency</type>
- </fields>
- <fields>
- <fullName>Total_Inventory__c</fullName>
- <externalId>false</externalId>
- <label>Total_Inventory</label>
- <precision>18</precision>
- <required>true</required>
- <scale>0</scale>
- <trackFeedHistory>false</trackFeedHistory>
- <trackTrending>false</trackTrending>
- <type>Number</type>
- <unique>false</unique>
- </fields>
- <label>Merchandise</label>
- <listViews>
- <fullName>All</fullName>
- <filterScope>Everything</filterScope>
- <label>All</label>
- </listViews>
- <nameField>
- <label>Merchandise Name</label>
- <trackFeedHistory>true</trackFeedHistory>
- <type>Text</type>
- </nameField>
- <pluralLabel>Merchandise</pluralLabel>
- <searchLayouts/>
- <sharingModel>ReadWrite</sharingModel>
- <visibility>Public</visibility>
-</CustomObject>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/TestEvent__e.object b/components/camel-salesforce/it/resources/salesforce/objects/TestEvent__e.object
deleted file mode 100644
index bab35f9c8f05..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/objects/TestEvent__e.object
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
- <deploymentStatus>Deployed</deploymentStatus>
- <eventType>StandardVolume</eventType>
- <fields>
- <fullName>Test_Field__c</fullName>
- <externalId>false</externalId>
- <isFilteringDisabled>false</isFilteringDisabled>
- <isNameField>false</isNameField>
- <isSortingDisabled>false</isSortingDisabled>
- <label>Test Field</label>
- <length>20</length>
- <required>false</required>
- <type>Text</type>
- <unique>false</unique>
- </fields>
- <label>Test Event</label>
- <pluralLabel>Test Event</pluralLabel>
-</CustomObject>
\ No newline at end of file
diff --git a/components/camel-salesforce/it/resources/salesforce/package.xml b/components/camel-salesforce/it/resources/salesforce/package.xml
deleted file mode 100644
index abf7309126a0..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/package.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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 xmlns="http://soap.sforce.com/2006/04/metadata">
- <apiAccessLevel>Unrestricted</apiAccessLevel>
- <description>Package used in integration test of Apache Camel Salesforce component.</description>
- <types>
- <members>MerchandiseRestResource</members>
- <members>MerchandiseRestResourceTests</members>
- <members>UpdateProfile</members>
- <name>ApexClass</name>
- </types>
- <types>
- <members>Warehouse</members>
- <name>CustomApplication</name>
- </types>
- <types>
- <members>Account.Shipping_Location__c</members>
- <members>Account.External_Id__c</members>
- <members>Invoice__c.Status__c</members>
- <members>Line_Item__c.Merchandise__c</members>
- <members>Line_Item__c.Unit_Price__c</members>
- <members>Line_Item__c.Units_Sold__c</members>
- <members>Merchandise__c.Description__c</members>
- <members>Merchandise__c.Price__c</members>
- <members>Merchandise__c.Total_Inventory__c</members>
- <name>CustomField</name>
- </types>
- <types>
- <members>*</members>
- <name>CustomObject</name>
- </types>
- <types>
- <members>Invoice__c</members>
- <members>Merchandise__c</members>
- <name>CustomTab</name>
- </types>
- <types>
- <members>Test_Documents</members>
- <members>Test_Documents/Test_Document.txt</members>
- <name>Document</name>
- </types>
- <types>
- <members>Invoice__c-Invoice Layout</members>
- <members>Line_Item__c-Line Item Layout</members>
- <members>Merchandise__c-Merchandise Layout</members>
- <name>Layout</name>
- </types>
- <types>
- <members>Invoice__c.All</members>
- <members>Merchandise__c.All</members>
- <name>ListView</name>
- </types>
- <types>
- <members>*</members>
- <name>PermissionSet</name>
- </types>
- <types>
- <members>Test_Reports</members>
- <members>Test_Reports/Test_Report</members>
- <name>Report</name>
- </types>
- <types>
- <members>Account.Test_Account_Process</members>
- <name>ApprovalProcess</name>
- </types>
- <types>
- <members>CamelSalesforceIntegrationTests</members>
- <name>ConnectedApp</name>
- </types>
- <types>
- <members>ChangeEvents_AccountChangeEvent</members>
- <name>PlatformEventChannelMember</name>
- </types>
- <version>55.0</version>
-</Package>
diff --git a/components/camel-salesforce/it/resources/salesforce/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember b/components/camel-salesforce/it/resources/salesforce/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember
deleted file mode 100644
index fbf27136af10..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<PlatformEventChannelMember xmlns="http://soap.sforce.com/2006/04/metadata">
- <eventChannel>ChangeEvents</eventChannel>
- <selectedEntity>AccountChangeEvent</selectedEntity>
-</PlatformEventChannelMember>
diff --git a/components/camel-salesforce/it/resources/salesforce/reports/Test_Reports-meta.xml b/components/camel-salesforce/it/resources/salesforce/reports/Test_Reports-meta.xml
deleted file mode 100644
index 3d2426224a1e..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/reports/Test_Reports-meta.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- 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.
-
--->
-<ReportFolder xmlns="http://soap.sforce.com/2006/04/metadata">
- <name>Test Reports</name>
-</ReportFolder>
diff --git a/components/camel-salesforce/it/resources/salesforce/tabs/Invoice__c.tab b/components/camel-salesforce/it/resources/salesforce/tabs/Invoice__c.tab
deleted file mode 100644
index 9c82dab8d8a5..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/tabs/Invoice__c.tab
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomTab xmlns="http://soap.sforce.com/2006/04/metadata">
- <customObject>true</customObject>
- <motif>Custom18: Form</motif>
-</CustomTab>
diff --git a/components/camel-salesforce/it/resources/salesforce/tabs/Merchandise__c.tab b/components/camel-salesforce/it/resources/salesforce/tabs/Merchandise__c.tab
deleted file mode 100644
index 1f15667a97e4..000000000000
--- a/components/camel-salesforce/it/resources/salesforce/tabs/Merchandise__c.tab
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<CustomTab xmlns="http://soap.sforce.com/2006/04/metadata">
- <customObject>true</customObject>
- <motif>Custom21: Computer</motif>
-</CustomTab>
diff --git a/components/camel-salesforce/it/resources/setup-salesforce.sh b/components/camel-salesforce/it/resources/setup-salesforce.sh
new file mode 100755
index 000000000000..b8607178dcac
--- /dev/null
+++ b/components/camel-salesforce/it/resources/setup-salesforce.sh
@@ -0,0 +1,275 @@
+#!/bin/bash
+
+#
+# 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.
+#
+
+set -e
+
+# Script to setup Salesforce environment for Camel Salesforce component integration tests
+# This script supports two modes:
+# 1. Scratch org creation and deployment
+# 2. Traditional org with username/password authentication
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_DIR="$SCRIPT_DIR/sfdx-project"
+
+echo "=== Salesforce Integration Test Setup ==="
+echo ""
+
+# Check if SF CLI is installed
+if ! command -v sf &> /dev/null; then
+ echo "ERROR: Salesforce CLI (sf) is not installed or not in PATH"
+ echo "Please install from: https://developer.salesforce.com/tools/salesforcecli"
+ exit 1
+fi
+
+echo "✓ Salesforce CLI found: $(sf version --json | grep '"cliVersion"' | cut -d'"' -f4)"
+echo ""
+
+# Check if jq is available for JSON parsing (required for org detection)
+if ! command -v jq >/dev/null 2>&1; then
+ echo "ERROR: jq is required for JSON parsing but not found in PATH"
+ echo ""
+ echo "Please install jq:"
+ echo " - macOS: brew install jq"
+ echo " - Ubuntu/Debian: apt-get install jq"
+ echo " - RHEL/CentOS: yum install jq"
+ echo ""
+ echo "Download: https://jqlang.github.io/jq/download/"
+ exit 1
+fi
+
+echo "✓ jq found: $(jq --version)"
+echo ""
+
+# Determine mode of operation based on provided credentials
+DEPLOY_SOURCE="${SALESFORCE_DEPLOY_SOURCE:-true}"
+USERNAME="${SALESFORCE_USERNAME}"
+PASSWORD="${SALESFORCE_PASSWORD}"
+
+# Change to project directory to check for local target-org
+cd "$PROJECT_DIR"
+
+# Check if there's already a target-org configured locally (not globally)
+EXISTING_TARGET_ORG=$(sf config get target-org --json 2>/dev/null | jq -r '.result[] | select(.location == "Local") | .value // empty')
+
+if [ -n "$EXISTING_TARGET_ORG" ]; then
+ echo "Mode: Using Existing Target Org"
+ echo "--------------------------------"
+ echo "✓ Found existing local target-org: $EXISTING_TARGET_ORG"
+ echo ""
+ # Skip org creation, proceed to deployment
+
+# Auto-detect mode: if no username/password, try creating a scratch org
+elif [ -z "$USERNAME" ] && [ -z "$PASSWORD" ]; then
+ echo "Mode: Auto-Create Scratch Org (no credentials provided)"
+ echo "------------------------------------------------"
+
+ # Get Dev Hub username - check if explicitly provided first
+ DEV_HUB="${SALESFORCE_DEV_HUB}"
+
+ if [ -z "$DEV_HUB" ]; then
+ # Get default Dev Hub username from SF CLI
+ DEV_HUB=$(sf org list --json 2>/dev/null | jq -r '(.result.devHubs // []) + (.result.nonScratchOrgs // []) + (.result.scratchOrgs // []) + (.result.sandboxes // []) + (.result.other // []) | .[] | select(.isDefaultDevHubUsername == true) | .username' | head -1)
+ fi
+
+ if [ -z "$DEV_HUB" ]; then
+ echo "ERROR: No credentials or scratch org alias provided, and no default Dev Hub set"
+ echo ""
+ echo "To run integration tests, you must either:"
+ echo ""
+ echo "1. Provide traditional org credentials:"
+ echo " export SALESFORCE_USERNAME=\"your-username@example.com\""
+ echo " export SALESFORCE_PASSWORD=\"your-password-and-token\""
+ echo ""
+ echo "2. Authenticate to a Dev Hub and set it as default (for automatic scratch org creation):"
+ echo " sf org login web --set-default-dev-hub"
+ exit 1
+ fi
+ echo "✓ Using Dev Hub: $DEV_HUB"
+
+ # Generate unique scratch org alias
+ SCRATCH_ORG_ALIAS="camel-sf-test-$(date +%s)"
+ SCRATCH_ORG_DURATION="${SALESFORCE_SCRATCH_ORG_DURATION:-7}"
+
+ echo "Creating scratch org: $SCRATCH_ORG_ALIAS (${SCRATCH_ORG_DURATION} days)..."
+
+ sf org create scratch \
+ --definition-file "config/scratch-org-def.json" \
+ --alias "$SCRATCH_ORG_ALIAS" \
+ --duration-days "$SCRATCH_ORG_DURATION" \
+ --set-default \
+ --target-dev-hub "$DEV_HUB"
+
+ echo "✓ Scratch org created: $SCRATCH_ORG_ALIAS"
+ echo ""
+
+ # SF CLI automatically sets the created scratch org as default, no need to specify TARGET_ORG
+
+else
+ echo "Mode: Traditional Org"
+ echo "--------------------"
+
+ LOGIN_URL="${SALESFORCE_LOGIN_URL:-https://login.salesforce.com}"
+
+ if [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then
+ echo "ERROR: SALESFORCE_USERNAME and SALESFORCE_PASSWORD environment variables must be set"
+ echo ""
+ echo "Set environment variables:"
+ echo " export SALESFORCE_USERNAME=\"your-username@example.com\""
+ echo " export SALESFORCE_PASSWORD=\"your-password-and-token\""
+ exit 1
+ fi
+
+ echo "Authenticating to: $LOGIN_URL"
+ echo "Username: $USERNAME"
+
+ # Authenticate using username/password
+ ORG_ALIAS="camel-sf-integration"
+
+ # Use sfdx auth command for username/password flow
+ sf org login sfdx-url \
+ --sfdx-url-stdin \
+ --alias "$ORG_ALIAS" \
+ --set-default <<< "force://$USERNAME:$PASSWORD@$(echo $LOGIN_URL | sed 's|https://||')"
+
+ echo "✓ Authenticated successfully"
+ echo ""
+fi
+
+# Deploy source if requested
+if [ "$DEPLOY_SOURCE" = "true" ]; then
+ echo "Deploying source to org..."
+ echo "-------------------------"
+
+ # Generate OAuth credentials for the connected app from template
+ CONNECTED_APP_TEMPLATE="config/CamelSalesforceIntegrationTests.connectedApp-template.xml"
+ CONNECTED_APP_FILE="salesforce-source/main/default/connectedApps/CamelSalesforceIntegrationTests.connectedApp-meta.xml"
+ CONNECTED_APP_CREDENTIALS=".local/connected-app-credentials.json"
+
+ # Ensure .local directory exists
+ mkdir -p .local
+
+ # Check if we have existing valid connected app credentials (separate from auth credentials)
+ EXISTING_CLIENT_ID=""
+ EXISTING_CLIENT_SECRET=""
+ if [ -f "$CONNECTED_APP_CREDENTIALS" ]; then
+ EXISTING_CLIENT_ID=$(jq -r '.clientId // empty' "$CONNECTED_APP_CREDENTIALS")
+ EXISTING_CLIENT_SECRET=$(jq -r '.clientSecret // empty' "$CONNECTED_APP_CREDENTIALS")
+ fi
+
+ if [ -n "$EXISTING_CLIENT_ID" ] && [ -n "$EXISTING_CLIENT_SECRET" ]; then
+ # Valid credentials exist - connected app was previously created
+ # Deploy without consumerKey/consumerSecret (can't update these)
+ echo "Existing connected app credentials found - deploying without regenerating keys..."
+
+ # Generate connected app file without credentials (for update)
+ sed -e '/{{CONSUMER_KEY}}/d' \
+ -e '/{{CONSUMER_SECRET}}/d' \
+ "$CONNECTED_APP_TEMPLATE" > "$CONNECTED_APP_FILE"
+
+ echo "✓ Using existing connected app credentials"
+
+ elif [ -f "$CONNECTED_APP_TEMPLATE" ]; then
+ # First time setup - generate new credentials
+ echo "Generating OAuth credentials for connected app..."
+
+ # Generate random credentials using /dev/urandom
+ # Consumer Key: alphanumeric only (per Salesforce docs)
+ CONSUMER_KEY=$(head -c 48 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 64)
+ # Consumer Secret: uppercase hex (matching Salesforce's own format)
+ CONSUMER_SECRET=$(head -c 32 /dev/urandom | xxd -p | tr -d '\n' | tr 'a-f' 'A-F' | head -c 64)
+
+ # Generate connected app file from template with credentials
+ sed -e "s|{{CONSUMER_KEY}}|${CONSUMER_KEY}|g" \
+ -e "s|{{CONSUMER_SECRET}}|${CONSUMER_SECRET}|g" \
+ "$CONNECTED_APP_TEMPLATE" > "$CONNECTED_APP_FILE"
+
+ # Save connected app credentials for future deployments
+ cat > "$CONNECTED_APP_CREDENTIALS" << EOF
+{
+ "clientId": "$CONSUMER_KEY",
+ "clientSecret": "$CONSUMER_SECRET"
+}
+EOF
+
+ echo "✓ OAuth credentials generated and saved"
+ else
+ echo "ERROR: Connected app template not found: $CONNECTED_APP_TEMPLATE"
+ exit 1
+ fi
+
+ # Deploy the source (SF CLI uses the default org automatically)
+ sf project deploy start \
+ --source-dir salesforce-source \
+ --wait 10
+
+ echo "✓ Source deployed successfully"
+
+ # Assign permission set to the current user (ignore if already assigned)
+ echo "Assigning permission set to user..."
+ sf org assign permset --name Hard_Delete_Permission_Set 2>&1 || true
+ echo "✓ Permission set assigned"
+else
+ echo "Skipping source deployment (SALESFORCE_DEPLOY_SOURCE=false)"
+fi
+
+# Get org information including refresh token
+echo ""
+echo "Retrieving org information..."
+ORG_INFO=$(sf org display --verbose --json)
+INSTANCE_URL=$(echo "$ORG_INFO" | jq -r '.result.instanceUrl')
+ORG_USERNAME=$(echo "$ORG_INFO" | jq -r '.result.username')
+SFDX_AUTH_URL=$(echo "$ORG_INFO" | jq -r '.result.sfdxAuthUrl // empty')
+
+# Extract refresh token from sfdxAuthUrl (format: force://clientId::refreshToken@instanceUrl)
+if [ -n "$SFDX_AUTH_URL" ]; then
+ REFRESH_TOKEN=$(echo "$SFDX_AUTH_URL" | sed -n 's|force://[^:]*::\([^@]*\)@.*|\1|p')
+fi
+
+echo "✓ Instance URL: $INSTANCE_URL"
+echo "✓ Username: $ORG_USERNAME"
+if [ -n "$REFRESH_TOKEN" ]; then
+ echo "✓ Refresh token available"
+fi
+
+# Store credentials for integration tests
+# Using refresh token flow with PlatformCLI (SF CLI's built-in connected app)
+CREDENTIALS_FILE="$PROJECT_DIR/.local/test-credentials.json"
+
+# Ensure .local directory exists
+mkdir -p "$PROJECT_DIR/.local"
+echo ""
+echo "Storing credentials for integration tests..."
+
+cat > "$CREDENTIALS_FILE" << EOF
+{
+ "clientId": "PlatformCLI",
+ "refreshToken": "${REFRESH_TOKEN:-}",
+ "instanceUrl": "$INSTANCE_URL"
+}
+EOF
+
+echo "✓ Credentials stored in: $CREDENTIALS_FILE"
+
+echo ""
+echo "=== Setup Complete ==="
+
+# Display org info (uses default org)
+echo ""
+echo "Default Org Information:"
+sf org display
diff --git a/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/config/CamelSalesforceIntegrationTests.connectedApp-template.xml
similarity index 63%
rename from components/camel-salesforce/it/resources/salesforce/documents/Test_Documents-meta.xml
rename to components/camel-salesforce/it/resources/sfdx-project/config/CamelSalesforceIntegrationTests.connectedApp-template.xml
index 438899e9e5f9..1fdddf513740 100644
--- a/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents-meta.xml
+++ b/components/camel-salesforce/it/resources/sfdx-project/config/CamelSalesforceIntegrationTests.connectedApp-template.xml
@@ -17,8 +17,14 @@
limitations under the License.
-->
-<DocumentFolder xmlns="http://soap.sforce.com/2006/04/metadata">
- <accessType>Public</accessType>
- <name>Test Documents</name>
- <publicFolderAccess>ReadOnly</publicFolderAccess>
-</DocumentFolder>
+<ConnectedApp xmlns="http://soap.sforce.com/2006/04/metadata">
+ <contactEmail>camel@example.com</contactEmail>
+ <label>CamelSalesforceIntegrationTests</label>
+ <oauthConfig>
+ <callbackUrl>https://login.salesforce.com/services/oauth2/success</callbackUrl>
+ <consumerKey>{{CONSUMER_KEY}}</consumerKey>
+ <consumerSecret>{{CONSUMER_SECRET}}</consumerSecret>
+ <scopes>Api</scopes>
+ <scopes>RefreshToken</scopes>
+ </oauthConfig>
+</ConnectedApp>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/config/scratch-org-def.json b/components/camel-salesforce/it/resources/sfdx-project/config/scratch-org-def.json
new file mode 100644
index 000000000000..c8ad0fde1757
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/config/scratch-org-def.json
@@ -0,0 +1,21 @@
+{
+ "orgName": "Camel Salesforce Integration Test Org",
+ "edition": "Developer",
+ "features": ["API", "AuthorApex", "ContactsToMultipleAccounts"],
+ "settings": {
+ "lightningExperienceSettings": {
+ "enableS1DesktopEnabled": true
+ },
+ "mobileSettings": {
+ "enableS1EncryptedStoragePref2": false
+ },
+ "oauthOidcSettings": {
+ "blockOAuthUnPwFlow": false
+ },
+ "securitySettings": {
+ "sessionSettings": {
+ "forceRelogin": false
+ }
+ }
+ }
+}
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/applications/Warehouse.app-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/applications/Warehouse.app-meta.xml
new file mode 100644
index 000000000000..a49e8e365304
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/applications/Warehouse.app-meta.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
+ <defaultLandingTab>Merchandise__c</defaultLandingTab>
+ <label>Warehouse</label>
+ <tabs>standard-Chatter</tabs>
+ <tabs>standard-File</tabs>
+ <tabs>standard-report</tabs>
+ <tabs>standard-Dashboard</tabs>
+ <tabs>Invoice__c</tabs>
+ <tabs>Merchandise__c</tabs>
+</CustomApplication>
diff --git a/components/camel-salesforce/it/resources/salesforce/approvalProcesses/Account.Test_Account_Process.approvalProcess b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/approvalProcesses/Account.Test_Account_Process.approvalProcess-meta.xml
similarity index 55%
rename from components/camel-salesforce/it/resources/salesforce/approvalProcesses/Account.Test_Account_Process.approvalProcess
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/approvalProcesses/Account.Test_Account_Process.approvalProcess-meta.xml
index 48359a541c70..c266d7dd71dd 100644
--- a/components/camel-salesforce/it/resources/salesforce/approvalProcesses/Account.Test_Account_Process.approvalProcess
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/approvalProcesses/Account.Test_Account_Process.approvalProcess-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<ApprovalProcess xmlns="http://soap.sforce.com/2006/04/metadata">
<active>true</active>
<allowRecall>false</allowRecall>
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResource.cls
similarity index 100%
rename from components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResource.cls
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResource.cls-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResource.cls-meta.xml
new file mode 100644
index 000000000000..cbddff8c3590
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResource.cls-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
+ <apiVersion>38.0</apiVersion>
+ <status>Active</status>
+</ApexClass>
diff --git a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResourceTests.cls b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResourceTests.cls
similarity index 100%
rename from components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResourceTests.cls
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResourceTests.cls
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResourceTests.cls-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResourceTests.cls-meta.xml
new file mode 100644
index 000000000000..cbddff8c3590
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/classes/MerchandiseRestResourceTests.cls-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
+ <apiVersion>38.0</apiVersion>
+ <status>Active</status>
+</ApexClass>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents.documentFolder-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents.documentFolder-meta.xml
new file mode 100644
index 000000000000..dc795a680b78
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents.documentFolder-meta.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DocumentFolder xmlns="http://soap.sforce.com/2006/04/metadata">
+ <accessType>Public</accessType>
+ <name>Test Documents</name>
+ <publicFolderAccess>ReadOnly</publicFolderAccess>
+</DocumentFolder>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents/Test_Document.document-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents/Test_Document.document-meta.xml
new file mode 100644
index 000000000000..e7054adfb6f9
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents/Test_Document.document-meta.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Document xmlns="http://soap.sforce.com/2006/04/metadata">
+ <internalUseOnly>false</internalUseOnly>
+ <name>Test Document</name>
+ <public>false</public>
+</Document>
diff --git a/components/camel-salesforce/it/resources/salesforce/documents/Test_Documents/Test_Document.txt b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents/Test_Document.txt
similarity index 100%
rename from components/camel-salesforce/it/resources/salesforce/documents/Test_Documents/Test_Document.txt
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/documents/Test_Documents/Test_Document.txt
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Account.Standard_Account_Duplicate_Rule.duplicateRule-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Account.Standard_Account_Duplicate_Rule.duplicateRule-meta.xml
new file mode 100644
index 000000000000..cbf8a35121da
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Account.Standard_Account_Duplicate_Rule.duplicateRule-meta.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DuplicateRule xmlns="http://soap.sforce.com/2006/04/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <actionOnInsert>Allow</actionOnInsert>
+ <actionOnUpdate>Allow</actionOnUpdate>
+ <alertText>Duplicate Alert</alertText>
+ <description>Duplicate rule for account records.</description>
+ <duplicateRuleFilter xsi:nil="true"/>
+ <duplicateRuleMatchRules>
+ <matchRuleSObjectType>Account</matchRuleSObjectType>
+ <matchingRule>Standard_Account_Match_Rule_v1_0</matchingRule>
+ <objectMapping xsi:nil="true"/>
+ </duplicateRuleMatchRules>
+ <isActive>false</isActive>
+ <masterLabel>Standard Account Duplicate Rule</masterLabel>
+ <operationsOnInsert>Alert</operationsOnInsert>
+ <operationsOnInsert>Report</operationsOnInsert>
+ <operationsOnUpdate>Report</operationsOnUpdate>
+ <securityOption>EnforceSharingRules</securityOption>
+ <sortOrder>1</sortOrder>
+</DuplicateRule>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Contact.Standard_Contact_Duplicate_Rule.duplicateRule-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Contact.Standard_Contact_Duplicate_Rule.duplicateRule-meta.xml
new file mode 100644
index 000000000000..648b558e281b
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Contact.Standard_Contact_Duplicate_Rule.duplicateRule-meta.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DuplicateRule xmlns="http://soap.sforce.com/2006/04/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <actionOnInsert>Allow</actionOnInsert>
+ <actionOnUpdate>Allow</actionOnUpdate>
+ <alertText>Duplicate Alert</alertText>
+ <description>Duplicate rule for contact records.</description>
+ <duplicateRuleFilter xsi:nil="true"/>
+ <duplicateRuleMatchRules>
+ <matchRuleSObjectType>Contact</matchRuleSObjectType>
+ <matchingRule>Standard_Contact_Match_Rule_v1_1</matchingRule>
+ <objectMapping xsi:nil="true"/>
+ </duplicateRuleMatchRules>
+ <isActive>false</isActive>
+ <masterLabel>Standard Contact Duplicate Rule</masterLabel>
+ <operationsOnInsert>Alert</operationsOnInsert>
+ <operationsOnInsert>Report</operationsOnInsert>
+ <operationsOnUpdate>Report</operationsOnUpdate>
+ <securityOption>EnforceSharingRules</securityOption>
+ <sortOrder>1</sortOrder>
+</DuplicateRule>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Lead.Standard_Lead_Duplicate_Rule.duplicateRule-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Lead.Standard_Lead_Duplicate_Rule.duplicateRule-meta.xml
new file mode 100644
index 000000000000..3c1e2a93f775
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/duplicateRules/Lead.Standard_Lead_Duplicate_Rule.duplicateRule-meta.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DuplicateRule xmlns="http://soap.sforce.com/2006/04/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <actionOnInsert>Allow</actionOnInsert>
+ <actionOnUpdate>Allow</actionOnUpdate>
+ <alertText>Duplicate Alert</alertText>
+ <description>Duplicate rule for lead records.</description>
+ <duplicateRuleFilter xsi:nil="true"/>
+ <duplicateRuleMatchRules>
+ <matchRuleSObjectType>Lead</matchRuleSObjectType>
+ <matchingRule>Standard_Lead_Match_Rule_v1_0</matchingRule>
+ <objectMapping xsi:nil="true"/>
+ </duplicateRuleMatchRules>
+ <isActive>false</isActive>
+ <masterLabel>Standard Lead Duplicate Rule</masterLabel>
+ <operationsOnInsert>Alert</operationsOnInsert>
+ <operationsOnInsert>Report</operationsOnInsert>
+ <operationsOnUpdate>Report</operationsOnUpdate>
+ <securityOption>EnforceSharingRules</securityOption>
+ <sortOrder>1</sortOrder>
+</DuplicateRule>
diff --git a/components/camel-salesforce/it/resources/salesforce/layouts/Invoice__c-Invoice Layout.layout b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Invoice__c-Invoice Layout.layout-meta.xml
similarity index 75%
rename from components/camel-salesforce/it/resources/salesforce/layouts/Invoice__c-Invoice Layout.layout
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Invoice__c-Invoice Layout.layout-meta.xml
index d89f76b36a22..f435946a2938 100644
--- a/components/camel-salesforce/it/resources/salesforce/layouts/Invoice__c-Invoice Layout.layout
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Invoice__c-Invoice Layout.layout-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<Layout xmlns="http://soap.sforce.com/2006/04/metadata">
<excludeButtons>Submit</excludeButtons>
<layoutSections>
diff --git a/components/camel-salesforce/it/resources/salesforce/layouts/Line_Item__c-Line Item Layout.layout b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Line_Item__c-Line Item Layout.layout-meta.xml
similarity index 73%
rename from components/camel-salesforce/it/resources/salesforce/layouts/Line_Item__c-Line Item Layout.layout
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Line_Item__c-Line Item Layout.layout-meta.xml
index 005fe3893607..a501b558c2f5 100644
--- a/components/camel-salesforce/it/resources/salesforce/layouts/Line_Item__c-Line Item Layout.layout
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Line_Item__c-Line Item Layout.layout-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<Layout xmlns="http://soap.sforce.com/2006/04/metadata">
<layoutSections>
<customLabel>false</customLabel>
diff --git a/components/camel-salesforce/it/resources/salesforce/layouts/Merchandise__c-Merchandise Layout.layout b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Merchandise__c-Merchandise Layout.layout-meta.xml
similarity index 79%
rename from components/camel-salesforce/it/resources/salesforce/layouts/Merchandise__c-Merchandise Layout.layout
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Merchandise__c-Merchandise Layout.layout-meta.xml
index 6c6d8dd95a4b..0b576ebce9b0 100644
--- a/components/camel-salesforce/it/resources/salesforce/layouts/Merchandise__c-Merchandise Layout.layout
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/layouts/Merchandise__c-Merchandise Layout.layout-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<Layout xmlns="http://soap.sforce.com/2006/04/metadata">
<layoutSections>
<customLabel>false</customLabel>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/Account.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/Account.object-meta.xml
new file mode 100644
index 000000000000..b79dd44a1ec1
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/Account.object-meta.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <visibility>Public</visibility>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/External_Id__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/External_Id__c.field-meta.xml
new file mode 100644
index 000000000000..8ef80476376e
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/External_Id__c.field-meta.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>External_Id__c</fullName>
+ <caseSensitive>false</caseSensitive>
+ <externalId>true</externalId>
+ <label>External Id</label>
+ <length>255</length>
+ <required>false</required>
+ <trackFeedHistory>false</trackFeedHistory>
+ <type>Text</type>
+ <unique>true</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/Shipping_Location__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/Shipping_Location__c.field-meta.xml
new file mode 100644
index 000000000000..ce1de82fc97d
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Account/fields/Shipping_Location__c.field-meta.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Shipping_Location__c</fullName>
+ <displayLocationInDecimal>false</displayLocationInDecimal>
+ <externalId>false</externalId>
+ <label>Shipping_Location</label>
+ <required>false</required>
+ <scale>3</scale>
+ <trackFeedHistory>false</trackFeedHistory>
+ <type>Location</type>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/CamelEventMessage__e.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/CamelEventMessage__e.object-meta.xml
new file mode 100644
index 000000000000..eb37120356fe
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/CamelEventMessage__e.object-meta.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <deploymentStatus>Deployed</deploymentStatus>
+ <eventType>HighVolume</eventType>
+ <label>Camel Event Message</label>
+ <pluralLabel>Camel Event Messages</pluralLabel>
+ <publishBehavior>PublishAfterCommit</publishBehavior>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/fields/Message__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/fields/Message__c.field-meta.xml
new file mode 100644
index 000000000000..b9877bafe1df
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventMessage__e/fields/Message__c.field-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Message__c</fullName>
+ <externalId>false</externalId>
+ <isFilteringDisabled>false</isFilteringDisabled>
+ <isNameField>false</isNameField>
+ <isSortingDisabled>false</isSortingDisabled>
+ <label>Message</label>
+ <length>255</length>
+ <required>false</required>
+ <type>Text</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/CamelEventNote__e.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/CamelEventNote__e.object-meta.xml
new file mode 100644
index 000000000000..3d83be31e67a
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/CamelEventNote__e.object-meta.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <deploymentStatus>Deployed</deploymentStatus>
+ <eventType>HighVolume</eventType>
+ <label>Camel Event Note</label>
+ <pluralLabel>Camel Events Notes</pluralLabel>
+ <publishBehavior>PublishAfterCommit</publishBehavior>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/fields/Note__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/fields/Note__c.field-meta.xml
new file mode 100644
index 000000000000..7f2d603d7d00
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/CamelEventNote__e/fields/Note__c.field-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Note__c</fullName>
+ <externalId>false</externalId>
+ <isFilteringDisabled>false</isFilteringDisabled>
+ <isNameField>false</isNameField>
+ <isSortingDisabled>false</isSortingDisabled>
+ <label>Note</label>
+ <length>255</length>
+ <required>false</required>
+ <type>Text</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/salesforce/objects/Invoice__c.object b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/Invoice__c.object-meta.xml
similarity index 50%
rename from components/camel-salesforce/it/resources/salesforce/objects/Invoice__c.object
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/Invoice__c.object-meta.xml
index 78822d8cc79f..feeddc27a83b 100644
--- a/components/camel-salesforce/it/resources/salesforce/objects/Invoice__c.object
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/Invoice__c.object-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
<actionOverrides>
<actionName>Accept</actionName>
@@ -67,43 +51,7 @@
<enableSearch>true</enableSearch>
<enableSharing>true</enableSharing>
<enableStreamingApi>true</enableStreamingApi>
- <fields>
- <fullName>Status__c</fullName>
- <externalId>false</externalId>
- <inlineHelpText>Choose a value from the drop-down list</inlineHelpText>
- <label>Status</label>
- <required>false</required>
- <trackFeedHistory>true</trackFeedHistory>
- <trackTrending>false</trackTrending>
- <type>Picklist</type>
- <valueSet>
- <valueSetDefinition>
- <sorted>false</sorted>
- <value>
- <fullName>Open</fullName>
- <default>true</default>
- </value>
- <value>
- <fullName>Closed</fullName>
- <default>false</default>
- </value>
- <value>
- <fullName>Negotiating</fullName>
- <default>false</default>
- </value>
- <value>
- <fullName>Pending</fullName>
- <default>false</default>
- </value>
- </valueSetDefinition>
- </valueSet>
- </fields>
<label>Invoice</label>
- <listViews>
- <fullName>All</fullName>
- <filterScope>Everything</filterScope>
- <label>All</label>
- </listViews>
<nameField>
<displayFormat>INV-{0000}</displayFormat>
<label>Invoice Number</label>
@@ -111,7 +59,7 @@
<type>AutoNumber</type>
</nameField>
<pluralLabel>Invoices</pluralLabel>
- <searchLayouts/>
+ <searchLayouts></searchLayouts>
<sharingModel>ReadWrite</sharingModel>
<visibility>Public</visibility>
</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/fields/Status__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/fields/Status__c.field-meta.xml
new file mode 100644
index 000000000000..5754459dc219
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/fields/Status__c.field-meta.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Status__c</fullName>
+ <externalId>false</externalId>
+ <inlineHelpText>Choose a value from the drop-down list</inlineHelpText>
+ <label>Status</label>
+ <required>false</required>
+ <trackFeedHistory>true</trackFeedHistory>
+ <trackTrending>false</trackTrending>
+ <type>Picklist</type>
+ <valueSet>
+ <valueSetDefinition>
+ <sorted>false</sorted>
+ <value>
+ <fullName>Open</fullName>
+ <default>true</default>
+ </value>
+ <value>
+ <fullName>Closed</fullName>
+ <default>false</default>
+ </value>
+ <value>
+ <fullName>Negotiating</fullName>
+ <default>false</default>
+ </value>
+ <value>
+ <fullName>Pending</fullName>
+ <default>false</default>
+ </value>
+ </valueSetDefinition>
+ </valueSet>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/listViews/All.listView-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/listViews/All.listView-meta.xml
new file mode 100644
index 000000000000..d50585125d97
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Invoice__c/listViews/All.listView-meta.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ListView xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>All</fullName>
+ <filterScope>Everything</filterScope>
+ <label>All</label>
+</ListView>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/Line_Item__c.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/Line_Item__c.object-meta.xml
new file mode 100644
index 000000000000..dd0c46e6252c
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/Line_Item__c.object-meta.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <actionOverrides>
+ <actionName>Accept</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>CancelEdit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Clone</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Delete</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Edit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>List</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>New</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>SaveEdit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Tab</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>View</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <allowInChatterGroups>false</allowInChatterGroups>
+ <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
+ <deploymentStatus>Deployed</deploymentStatus>
+ <enableActivities>false</enableActivities>
+ <enableBulkApi>true</enableBulkApi>
+ <enableFeeds>false</enableFeeds>
+ <enableHistory>false</enableHistory>
+ <enableReports>true</enableReports>
+ <enableSearch>true</enableSearch>
+ <enableSharing>true</enableSharing>
+ <enableStreamingApi>true</enableStreamingApi>
+ <label>Line Item</label>
+ <nameField>
+ <label>Line Item Number</label>
+ <type>Text</type>
+ </nameField>
+ <pluralLabel>Line Items</pluralLabel>
+ <searchLayouts></searchLayouts>
+ <sharingModel>ReadWrite</sharingModel>
+ <visibility>Public</visibility>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Merchandise__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Merchandise__c.field-meta.xml
new file mode 100644
index 000000000000..5cc97a3af299
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Merchandise__c.field-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Merchandise__c</fullName>
+ <deleteConstraint>SetNull</deleteConstraint>
+ <externalId>false</externalId>
+ <label>Merchandise</label>
+ <referenceTo>Merchandise__c</referenceTo>
+ <relationshipLabel>Line Items</relationshipLabel>
+ <relationshipName>Line_Items</relationshipName>
+ <required>false</required>
+ <trackTrending>false</trackTrending>
+ <type>Lookup</type>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Unit_Price__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Unit_Price__c.field-meta.xml
new file mode 100644
index 000000000000..a7c038dfdd5c
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Unit_Price__c.field-meta.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Unit_Price__c</fullName>
+ <externalId>false</externalId>
+ <label>Unit Price</label>
+ <precision>18</precision>
+ <required>false</required>
+ <scale>2</scale>
+ <trackTrending>false</trackTrending>
+ <type>Currency</type>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Units_Sold__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Units_Sold__c.field-meta.xml
new file mode 100644
index 000000000000..0a60df6f972a
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/fields/Units_Sold__c.field-meta.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Units_Sold__c</fullName>
+ <externalId>false</externalId>
+ <label>Units Sold</label>
+ <precision>18</precision>
+ <required>false</required>
+ <scale>0</scale>
+ <trackTrending>false</trackTrending>
+ <type>Number</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/recordTypes/Test_Record_Type.recordType-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/recordTypes/Test_Record_Type.recordType-meta.xml
new file mode 100644
index 000000000000..1f2f2c5352fb
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Line_Item__c/recordTypes/Test_Record_Type.recordType-meta.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RecordType xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Test_Record_Type</fullName>
+ <active>true</active>
+ <label>Test Record Type</label>
+</RecordType>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/Merchandise__c.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/Merchandise__c.object-meta.xml
new file mode 100644
index 000000000000..e61326249455
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/Merchandise__c.object-meta.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <actionOverrides>
+ <actionName>Accept</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>CancelEdit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Clone</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Delete</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Edit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>List</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>New</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>SaveEdit</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>Tab</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <actionOverrides>
+ <actionName>View</actionName>
+ <type>Default</type>
+ </actionOverrides>
+ <allowInChatterGroups>false</allowInChatterGroups>
+ <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
+ <deploymentStatus>Deployed</deploymentStatus>
+ <enableActivities>true</enableActivities>
+ <enableBulkApi>true</enableBulkApi>
+ <enableFeeds>true</enableFeeds>
+ <enableHistory>false</enableHistory>
+ <enableReports>true</enableReports>
+ <enableSearch>true</enableSearch>
+ <enableSharing>true</enableSharing>
+ <enableStreamingApi>true</enableStreamingApi>
+ <label>Merchandise</label>
+ <nameField>
+ <label>Merchandise Name</label>
+ <trackFeedHistory>true</trackFeedHistory>
+ <type>Text</type>
+ </nameField>
+ <pluralLabel>Merchandise</pluralLabel>
+ <searchLayouts></searchLayouts>
+ <sharingModel>ReadWrite</sharingModel>
+ <visibility>Public</visibility>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Description__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Description__c.field-meta.xml
new file mode 100644
index 000000000000..dfacd6dfe652
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Description__c.field-meta.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Description__c</fullName>
+ <externalId>false</externalId>
+ <label>Description</label>
+ <length>100</length>
+ <required>false</required>
+ <trackFeedHistory>false</trackFeedHistory>
+ <trackTrending>false</trackTrending>
+ <type>Text</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Price__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Price__c.field-meta.xml
new file mode 100644
index 000000000000..1622a0636636
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Price__c.field-meta.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Price__c</fullName>
+ <externalId>false</externalId>
+ <label>Price</label>
+ <precision>18</precision>
+ <required>true</required>
+ <scale>2</scale>
+ <trackFeedHistory>false</trackFeedHistory>
+ <trackTrending>false</trackTrending>
+ <type>Currency</type>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Total_Inventory__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Total_Inventory__c.field-meta.xml
new file mode 100644
index 000000000000..59234df3c188
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/fields/Total_Inventory__c.field-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Total_Inventory__c</fullName>
+ <externalId>false</externalId>
+ <label>Total_Inventory</label>
+ <precision>18</precision>
+ <required>true</required>
+ <scale>0</scale>
+ <trackFeedHistory>false</trackFeedHistory>
+ <trackTrending>false</trackTrending>
+ <type>Number</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/listViews/All.listView-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/listViews/All.listView-meta.xml
new file mode 100644
index 000000000000..d50585125d97
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/Merchandise__c/listViews/All.listView-meta.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ListView xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>All</fullName>
+ <filterScope>Everything</filterScope>
+ <label>All</label>
+</ListView>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/TestEvent__e.object-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/TestEvent__e.object-meta.xml
new file mode 100644
index 000000000000..70fb165679df
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/TestEvent__e.object-meta.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
+ <deploymentStatus>Deployed</deploymentStatus>
+ <eventType>StandardVolume</eventType>
+ <label>Test Event</label>
+ <pluralLabel>Test Event</pluralLabel>
+</CustomObject>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/fields/Test_Field__c.field-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/fields/Test_Field__c.field-meta.xml
new file mode 100644
index 000000000000..3b6206fbe282
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/objects/TestEvent__e/fields/Test_Field__c.field-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
+ <fullName>Test_Field__c</fullName>
+ <externalId>false</externalId>
+ <isFilteringDisabled>false</isFilteringDisabled>
+ <isNameField>false</isNameField>
+ <isSortingDisabled>false</isSortingDisabled>
+ <label>Test Field</label>
+ <length>20</length>
+ <required>false</required>
+ <type>Text</type>
+ <unique>false</unique>
+</CustomField>
diff --git a/components/camel-salesforce/it/resources/salesforce/permissionsets/Hard_Delete_Permission_Set.permissionset b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/permissionsets/Hard_Delete_Permission_Set.permissionset-meta.xml
similarity index 95%
rename from components/camel-salesforce/it/resources/salesforce/permissionsets/Hard_Delete_Permission_Set.permissionset
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/permissionsets/Hard_Delete_Permission_Set.permissionset-meta.xml
index 06d2b392001a..aed3ee2006c7 100644
--- a/components/camel-salesforce/it/resources/salesforce/permissionsets/Hard_Delete_Permission_Set.permissionset
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/permissionsets/Hard_Delete_Permission_Set.permissionset-meta.xml
@@ -1,26 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
<label>Hard Delete Permission Set</label>
- <applicationVisibilities>
- <application>Chatter_Answers_Moderator</application>
- <visible>false</visible>
- </applicationVisibilities>
<applicationVisibilities>
<application>Warehouse</application>
<visible>true</visible>
@@ -33,10 +13,6 @@
<apexClass>MerchandiseRestResourceTests</apexClass>
<enabled>false</enabled>
</classAccesses>
- <classAccesses>
- <apexClass>UpdateProfile</apexClass>
- <enabled>true</enabled>
- </classAccesses>
<fieldPermissions>
<editable>true</editable>
<field>Account.AccountNumber</field>
@@ -451,10 +427,6 @@
<enabled>true</enabled>
<name>ManageAnalyticSnapshots</name>
</userPermissions>
- <userPermissions>
- <enabled>true</enabled>
- <name>ManageAuthProviders</name>
- </userPermissions>
<userPermissions>
<enabled>true</enabled>
<name>ManageBusinessHourHolidays</name>
@@ -599,10 +571,6 @@
<enabled>true</enabled>
<name>ManageUnlistedGroups</name>
</userPermissions>
- <userPermissions>
- <enabled>true</enabled>
- <name>ManageUsers</name>
- </userPermissions>
<userPermissions>
<enabled>true</enabled>
<name>MassInlineEdit</name>
@@ -619,6 +587,14 @@
<enabled>true</enabled>
<name>ModifyAllData</name>
</userPermissions>
+ <userPermissions>
+ <enabled>true</enabled>
+ <name>ViewDataLeakageEvents</name>
+ </userPermissions>
+ <userPermissions>
+ <enabled>true</enabled>
+ <name>ViewPlatformEvents</name>
+ </userPermissions>
<userPermissions>
<enabled>true</enabled>
<name>ModifyMetadata</name>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember-meta.xml
new file mode 100644
index 000000000000..fb2459804e72
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/platformEventChannelMembers/ChangeEvents_AccountChangeEvent.platformEventChannelMember-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PlatformEventChannelMember xmlns="http://soap.sforce.com/2006/04/metadata">
+ <eventChannel>ChangeEvents</eventChannel>
+ <selectedEntity>AccountChangeEvent</selectedEntity>
+</PlatformEventChannelMember>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports.reportFolder-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports.reportFolder-meta.xml
new file mode 100644
index 000000000000..70abca177291
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports.reportFolder-meta.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ReportFolder xmlns="http://soap.sforce.com/2006/04/metadata">
+ <name>Test Reports</name>
+</ReportFolder>
diff --git a/components/camel-salesforce/it/resources/salesforce/reports/Test_Reports/Test_Report.report b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports/Test_Report.report-meta.xml
similarity index 54%
rename from components/camel-salesforce/it/resources/salesforce/reports/Test_Reports/Test_Report.report
rename to components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports/Test_Report.report-meta.xml
index 1016d983bbf1..9276d2b0c1c5 100644
--- a/components/camel-salesforce/it/resources/salesforce/reports/Test_Reports/Test_Report.report
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/reports/Test_Reports/Test_Report.report-meta.xml
@@ -1,20 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
<Report xmlns="http://soap.sforce.com/2006/04/metadata">
<columns>
<field>USERS.NAME</field>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Invoice__c.tab-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Invoice__c.tab-meta.xml
new file mode 100644
index 000000000000..d344eac8af67
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Invoice__c.tab-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomTab xmlns="http://soap.sforce.com/2006/04/metadata">
+ <customObject>true</customObject>
+ <motif>Custom18: Form</motif>
+</CustomTab>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Merchandise__c.tab-meta.xml b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Merchandise__c.tab-meta.xml
new file mode 100644
index 000000000000..4981c3a935ba
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/salesforce-source/main/default/tabs/Merchandise__c.tab-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CustomTab xmlns="http://soap.sforce.com/2006/04/metadata">
+ <customObject>true</customObject>
+ <motif>Custom21: Computer</motif>
+</CustomTab>
diff --git a/components/camel-salesforce/it/resources/sfdx-project/sfdx-project.json b/components/camel-salesforce/it/resources/sfdx-project/sfdx-project.json
new file mode 100644
index 000000000000..1aa9dbb5b20b
--- /dev/null
+++ b/components/camel-salesforce/it/resources/sfdx-project/sfdx-project.json
@@ -0,0 +1,12 @@
+{
+ "packageDirectories": [
+ {
+ "path": "salesforce-source",
+ "default": true
+ }
+ ],
+ "name": "camel-salesforce-integration-tests",
+ "namespace": "",
+ "sfdcLoginUrl": "https://login.salesforce.com",
+ "sourceApiVersion": "63.0"
+}
diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
index 2869feef0c07..7cfa6b93d04d 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
@@ -64,3 +64,24 @@ The `camel-stomp` component is deprecated.
=== TestContainers updated to 2.0.2
TestContainers (TC) is updated to 2.0.2, see the https://github.com/testcontainers/testcontainers-java/releases[TC release notes since 2.0.0] and CAMEL-22720, noteworthy are: Removed JUnit 4 support, All modules are now prefixed with testcontainers-. For example, org.testcontainers:mysql is now org.testcontainers:testcontainers-mysql. Update docker image version to 25.0.5. Set default docker API version to 1.44.
+
+=== camel-salesforce
+
+==== clientSecret now optional for refresh token authentication
+
+The `clientSecret` parameter is now optional when using refresh token authentication (`authenticationType=REFRESH_TOKEN`).
+This enables use of Salesforce connected apps that don't require a client secret, such as the Salesforce CLI's built-in `PlatformCLI` connected app.
+
+If you were previously providing a `clientSecret` with refresh token authentication, no changes are required - it will continue to work.
+
+==== Integration test infrastructure changes
+
+The integration test setup has been modernized to use Salesforce CLI instead of the deprecated Ant-based deployment.
+If you are a developer running or contributing to the Salesforce component integration tests:
+
+* **Prerequisites**: Install https://developer.salesforce.com/tools/salesforcecli[Salesforce CLI] and https://jqlang.github.io/jq/[jq]
+* **Scratch org support**: Tests can now automatically create and use scratch orgs (requires Dev Hub authentication)
+* **Refresh token authentication**: Tests use refresh token flow with SF CLI's `PlatformCLI` connected app - no security token required
+* **Legacy directory removed**: `it/resources/salesforce/` has been removed; metadata is now in `it/resources/sfdx-project/salesforce-source/`
+
+See `components/camel-salesforce/it/resources/README.md` for detailed setup instructions.
diff --git a/pom.xml b/pom.xml
index 07abc03f1734..74a0ebcf658f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -327,6 +327,9 @@
<exclude>**/ignite/**</exclude>
<exclude>**/it/resources/*.connectedApp</exclude>
<exclude>**/it/resources/salesforce/**</exclude>
+ <exclude>**/it/resources/sfdx-project/.sf/**</exclude>
+ <exclude>**/it/resources/sfdx-project/.sfdx/**</exclude>
+ <exclude>**/it/resources/sfdx-project/salesforce-source/**</exclude>
<exclude>**/javamail.default.*</exclude>
<exclude>**/kafka*.config</exclude>
<exclude>**/known_hosts*</exclude>