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>