## ---------------------------------------------------------------------------
## 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.
## ---------------------------------------------------------------------------

# In order to run the integration tests you need a Salesforce Developer
# account. You can get a Salesforce Developer account by visiting 
# https://developer.salesforce.com and sign up for one.
#
# The connected application can be created for you by running the
# migrations from Maven, run:
#
#     $ mvn -Pintegration antrun:run@setup-salesforce-instance
#
# from camel-salesforce-component directory, or you can setup your own
# connected application by going to your Salesforce Developer account 
# and under Apps in Build and Create sections click New in Connected
# Apps section. Fill in the required fields and in the API (Enable OAuth
# Settings) section thick Enable OAuth Settings and move all scopes from
# Available OAuth Scopes to Selected OAuth Scopes.
#
# For Callback URL you can use:
# https://login.salesforce.com/services/oauth2/success
# it's not needed by the REST API used by the Camel Salesforce 
# component but it makes it easier to obtain the refresh token.
# From there make note of the parameters and fill in below:

# You can leave the authentication type undefined the component
# auto-determines the type by the specified properties, or you can force
# the authentication type to be of certain type if you have specified
# properties that conform to multiple authenticationt types and the
# aut-determination does not make sense
# salesforce.auth.type = USERNAME_PASSWORD

# This is the Consumer Key of the connected application
# This `salesforce.client.id` is setup by the migration run at the start of 
# integration tests (when run from Maven):
# salesforce.client.id = 3MVG9HxRZv05HarQ5D2to.ylPaUg7uaFqGqE2wN6_RRaHM9PTa3SWT8UwKJzXAyCujHrfObkUy7oZqiBUyfGl
#
salesforce.client.id = <Your Consumer Key>

# This is Consumer Secret of the connected application
# If you use the above clientId (3MV...Gl) get the Consumer Secret from
# your Salesforce instance after migration run, access your Salesforce
# instance and get the Consumer Secret from there for 
# CamelSalesforceIntegrationTests connected application
salesforce.client.secret = <Your Consumer Secret>

# This is the username for the Salesforce account, you can use your own
# developer account, or add another user to your Salesforce instance,
# but make sure that it has administrative rights
salesforce.username = <Your Salesforce username>

# You can use refresh token instead of username and password parameters
salesforce.refreshToken = <Your Refresh token>

# Password of the user above, if you're using security tokens, generate
# one and append it to the end of the password
salesforce.password = <Your Salesforce password>[Your security token, if used]

# For JWT OAuth flow don't specify password and refreshToken and specify
# the following properties:

# path to the keystore
salesforce.keystore.resource=

# type of the keystore
salesforce.keystore.type=

# password of the keystore
salesforce.keystore.password=

# JCE provider of the keystore
salesforce.keystore.provider=

# This should be https://login.salesforce.com/, change if appropriate
salesforce.login.url = https://login.salesforce.com/
