leap_salesforce 1.0.1 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d80eff87ab1c75f73d0f99c2556837698e418c3be87ba611fc044602c262add
4
- data.tar.gz: 3a6090439223eeaafdc9194e7e19649ab805abd52885071ddbacc54d9bfd7431
3
+ metadata.gz: 50460046dd520df2e2b92b0384733e4b7785109d55f42c88d5dd9c81faad23c0
4
+ data.tar.gz: 1124dc04f4dea935ac48e21b1fccfb8b498b6675f1936164087cd35d75152f4d
5
5
  SHA512:
6
- metadata.gz: 247b89d8a5059f353cee60834a25aa9c7d480df6a71bf2d262fe99023cdc536e44b670ff874793478e55a75ddf9443a62445e124b138c44d9ec772efd613fbbc
7
- data.tar.gz: e05ae5ffee8f34badabdda8a1cb8814ba336df63848ccdb662e85439a1e85c44a59ce179354ea2d9790f7b79afb6ce035dabd8fd5d215b0f70393cfbf6ffe253
6
+ metadata.gz: 9674782b9b65f4c60fbac4e376594e7ff626c0a538f1f9e1b3ca745d2905bf9ef420a10f7c93d34ab433304cc3989d9329446efa30e2152923e7d07811f0f42c
7
+ data.tar.gz: f35b3686b4404083210e07cf71ab5ec7c21e132e04bb013dc9aadad245c9538f1152037b64995844b3323431e23bb0070f1195083424757377bf09c3b8d72f4f
data/.gitlab-ci.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  include:
2
2
  - template: Code-Quality.gitlab-ci.yml
3
3
 
4
- image: ruby:2.7
4
+ image: ruby:3.0
5
5
 
6
6
  stages:
7
7
  - test
@@ -18,7 +18,7 @@ variables:
18
18
  pages:
19
19
  stage: deploy
20
20
  dependencies:
21
- - test_2.7
21
+ - test
22
22
  script:
23
23
  - mv coverage/ public
24
24
  artifacts:
@@ -612,18 +612,8 @@ pages:
612
612
  sfdx force:auth:jwt:grant --clientid "$SF_CONSUMER_KEY" --jwtkeyfile assets/server.key --username "$SF_USERNAME" --setdefaultdevhubusername --setalias HubOrg
613
613
  }
614
614
 
615
- test_2.6:
616
- image: ruby:2.6
617
- stage: test
618
- script:
619
- - *sfdx_helpers
620
- - setup_integration_env
621
- - bundle exec rake check_oauth # Check OAuth
622
- - bundle exec rake leaps:create_soql_objects
623
- - bundle exec rake leaps:create_enums
624
- - bundle exec rspec
625
-
626
- test_2.7:
615
+ test:
616
+ image: ruby:3.0
627
617
  script:
628
618
  # Decrypt server key
629
619
  - *sfdx_helpers
@@ -635,14 +625,3 @@ test_2.7:
635
625
  artifacts:
636
626
  paths:
637
627
  - coverage/
638
-
639
- test_3.0:
640
- image: ruby:3.0
641
- script:
642
- # Decrypt server key
643
- - *sfdx_helpers
644
- - setup_integration_env
645
- - bundle exec rake check_oauth # Check OAuth
646
- - bundle exec rake leaps:create_soql_objects
647
- - bundle exec rake leaps:create_enums
648
- - bundle exec rspec
data/ChangeLog CHANGED
@@ -1,3 +1,21 @@
1
+ Version 1.0.5
2
+ * Fix
3
+ * Stabilize using of active record by fixing version
4
+
5
+ Version 1.0.4
6
+ * Enhancement
7
+ * Strip out ':' from user key for when it is accidentally added
8
+
9
+ Version 1.0.3
10
+ * Enhancement
11
+ * Allow templates to be sourced from external gems for generator
12
+
13
+ Version 1.0.2
14
+ * Enhancement
15
+ * Only load sub folders of leap_salesforce.lib_folder that are needed by this gem, allowing room for UI
16
+ and other gems to use other folders independently
17
+ * New method 'accessors' on object to make it easy to pass list of fields for an object
18
+
1
19
  Version 1.0.1
2
20
  * Bug fix
3
21
  * Fix #28 allowing !nil for query by non null values
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Welcome to LeapSalesforce gem. This gem helps ones to perform integration tests on Salesforce. It reads the Metadata
4
4
  from Salesforce and creates the foundation for API tests.
5
5
 
6
- In the future it will also planned to be used to create page objects based on metadata to support UI testing.
6
+ Support for UI testing is being worked on in another gem [leap_salesforce_ui](https://gitlab.com/leap-dojo/leap_salesforce_ui)
7
7
 
8
8
  ## Is this for you?
9
9
 
@@ -27,7 +27,7 @@ The benefits of an open source tool like this are:
27
27
  and can add extra unit tests if you need more confidence
28
28
  * Built with and for CI in Gitlab. Designed to work within Docker containers
29
29
  * Will integrate with `sfdx` leveraging all of it's benefits
30
- * Supported by [IntegrationQA](www.integrationqa.com) who can provide
30
+ * Supported by [Sentify](https://www.sentify.co/) who can provide
31
31
  [support and training](https://gitlab.com/leap-dojo/leap_salesforce/wikis/SupportModel)
32
32
  to help you get started and overcome challenges
33
33
 
@@ -260,7 +260,19 @@ The value of request body can be interrogated with `entity.request_parameters.bo
260
260
 
261
261
  ##### Logging
262
262
 
263
- By default, API traffic will be logged in a log file in a `logs` folder.
263
+ By default, API traffic will be logged in a log file in a `logs` folder. The gem `soaspec` is
264
+ used to log this traffic.
265
+
266
+ Following is an example of changing some of the default logging.
267
+
268
+ ```ruby
269
+ # Turn this true if you need debug authentication
270
+ Soaspec::OAuth2.debug_oauth = true
271
+ # Turn this to true if you want to see API traffic on the terminal
272
+ Soaspec::SpecLogger.output_to_terminal = true
273
+ ```
274
+
275
+ See more configuration parameters in the [Soaspec repo](https://gitlab.com/samuel-garratt/soaspec#logging)
264
276
 
265
277
  ### CRUD of data
266
278
 
@@ -565,4 +577,5 @@ Everyone interacting in the LeapSalesforce project’s codebases, issue trackers
565
577
  * Presentation on this library [here](https://gitpitch.com/leap-dojo/leap_salesforce?grs=gitlab)
566
578
  * Example of this library within a CI/CD pipeline [here](https://gitlab.com/iqa_public/labs/salesforce_cicd_demo)
567
579
  * Using `leap_salesforce` to download event log files [here](https://gitlab.com/samuel-garratt/leap_salesforce_event_log_files)
580
+ * Video walking through setting up automation using this [here](https://youtu.be/Xvj0mAnDKfA)
568
581
 
@@ -32,7 +32,7 @@ It reads the Metadata from Salesforce and creates the foundation for API tests.'
32
32
  spec.add_development_dependency 'semaphore_test_boosters'
33
33
  spec.add_development_dependency 'topoisomerase'
34
34
  spec.add_development_dependency 'yard-doctest'
35
- spec.add_dependency 'activerecord'
35
+ spec.add_dependency 'activerecord', '6.1'
36
36
  spec.add_dependency 'colorize'
37
37
  spec.add_dependency 'factory_bot'
38
38
  spec.add_dependency 'faker', '>= 2.0'
@@ -3,12 +3,16 @@
3
3
  module LeapSalesforce
4
4
  # Any error specific to LeapSalesforce
5
5
  class Error < StandardError; end
6
+
6
7
  # Error related to handling a request
7
8
  class RequestError < StandardError; end
9
+
8
10
  # Error related to handling a response
9
11
  class ResponseError < StandardError; end
12
+
10
13
  # Error related to setup of test automation suite
11
14
  class SetupError < Error; end
15
+
12
16
  # Error related to Test Users
13
17
  class UserError < Error; end
14
18
  end
@@ -27,8 +27,8 @@ class String
27
27
  def to_ruby_friendly
28
28
  tr('&|=', '_').gsub('<', '_lt_').gsub('>', '_gt_')
29
29
  .remove_macrons
30
- .gsub(/[\s]+/, '_')
31
- .gsub(/[\W]/, '') # Remove any other special characters
30
+ .gsub(/\s+/, '_')
31
+ .gsub(/\W/, '') # Remove any other special characters
32
32
  .handle_initial_characters # Previous step could have removed all characters
33
33
  .humanize_numbered_string
34
34
  end
@@ -23,7 +23,7 @@ module LeapSalesforce
23
23
  when 'boolean' then set('true')
24
24
  when 'picklist' then set("#{class_name}::#{field['label'].to_class_name}.sample")
25
25
  when 'reference'
26
- return set('User.find(CreatedDate: "<#{0.days.ago}").id') if field['name'] == 'OwnerId'
26
+ return set(%{User.find(CreatedDate: "<#{0.days.ago}").id}) if field['name'] == 'OwnerId'
27
27
 
28
28
  soql_obj = LeapSalesforce.soql_objects.find { |so| so.backend_name == field['relationshipName'] }&.reference
29
29
  if soql_obj
@@ -34,8 +34,8 @@ module LeapSalesforce
34
34
  def verify_oauth
35
35
  unless LeapSalesforce.sfdx
36
36
  LeapSalesforce.client_id = options[:client_id] || input_for('Client id (Customer Id)')
37
- LeapSalesforce.client_secret = options[:client_secret] || STDIN.getpass('Client secret (Consumer Secret)')
38
- LeapSalesforce.password = options[:password] || STDIN.getpass('Password (Recommendation is that 1 password' \
37
+ LeapSalesforce.client_secret = options[:client_secret] || $stdin.getpass('Client secret (Consumer Secret)')
38
+ LeapSalesforce.password = options[:password] || $stdin.getpass('Password (Recommendation is that 1 password' \
39
39
  ' be shared across all test users to be easier to manage):')
40
40
  end
41
41
  LeapSalesforce.api_user = ERB.new(options[:username] || input_for('Salesforce username. It is ideal to start with a System admin' \
@@ -50,7 +50,7 @@ module LeapSalesforce
50
50
  ' leap_salesforce testing repo'.colorize(:green)
51
51
  verify_environment
52
52
  verify_oauth
53
- @user_key = options[:user_key] || input_for('Enter a key to refer to this user (This will be stored as a Symbol)')
53
+ @user_key = options[:user_key] || input_for('Enter a key to refer to this user (This will be stored as a Symbol)').delete(':')
54
54
  end
55
55
  end
56
56
  end
@@ -8,11 +8,20 @@ require 'colorize'
8
8
  module LeapSalesforce
9
9
  # Generators for creating code
10
10
  module Generator
11
+ # @param [String] filename Relative filename to this file
12
+ # @param [String] folder Folder where templates are stored (for external gems)
13
+ # @return [String] Location of template file
14
+ def template_loc(filename, folder: nil)
15
+ template_dir = folder || __dir__
16
+ File.join(template_dir, 'templates', filename)
17
+ end
18
+
11
19
  # @param [String] filename Relative filename to this file
12
20
  # @param [Binding] binding Binding object used for ERB variables
21
+ # @param [String] folder Folder where templates are stored (for external gems)
13
22
  # @return [String] Interpreted file after calculating ERB for template file passed
14
- def read_template(filename, binding)
15
- ERB.new(File.read(File.join(__dir__, 'templates', filename))).result(binding)
23
+ def read_template(filename, binding, folder: nil)
24
+ ERB.new(File.read(template_loc(filename, folder: folder))).result(binding)
16
25
  end
17
26
 
18
27
  # Generate file creating necessary folder if necessary
@@ -70,7 +70,7 @@ module LeapSalesforce
70
70
 
71
71
  # Clean up files generated for all picklists
72
72
  def cleanup_files_created
73
- `rubocop -a #{ENUM_FOLDER} --display-only-fail-level-offenses --enable-pending-cops`
73
+ `rubocop -A #{ENUM_FOLDER} --display-only-fail-level-offenses --enable-pending-cops`
74
74
  end
75
75
  end
76
76
  end
@@ -62,8 +62,8 @@ module LeapSalesforce
62
62
  generate_field_module
63
63
  generate_factory
64
64
  end
65
- `rubocop -a #{SOQL_OBJECT_FOLDER} --enable-pending-cops`
66
- `rubocop -a #{FACTORY_FOLDER} --enable-pending-cops`
65
+ `rubocop -A #{SOQL_OBJECT_FOLDER} --enable-pending-cops`
66
+ `rubocop -A #{FACTORY_FOLDER} --enable-pending-cops`
67
67
  end
68
68
 
69
69
  private
@@ -17,7 +17,7 @@ module LeapSalesforce
17
17
  @client_secret = ENV['client_secret']
18
18
  @password = ENV['password']
19
19
  @environment = nil
20
- @logger = Logger.new STDOUT
20
+ @logger = Logger.new $stdout
21
21
  @sfdx = false
22
22
  # @access_token = nil
23
23
  @instance_url = nil
@@ -98,7 +98,7 @@ module LeapSalesforce
98
98
  else
99
99
  LeapSalesforce::Users.where(user)&.username
100
100
  end
101
- Soaspec::SpecLogger.info "Using user '#{@api_user}'"
101
+ Soaspec::SpecLogger.info "Using user '#{@api_user}' for API"
102
102
  end
103
103
 
104
104
  # @return [String] Salesforce username used to execute API tests. This can be changed during tests
@@ -128,6 +128,7 @@ module LeapSalesforce
128
128
  attr_reader :soql_objects
129
129
  # @return [Logger] Logger used by LeapSalesforce
130
130
  attr_accessor :logger
131
+
131
132
  # @return [Array] list_of_soql_objects Array describing Soql objects taken from .leap_salesforce.yml
132
133
  def soql_objects=(list_of_soql_objects)
133
134
  @soql_objects = list_of_soql_objects.collect do |soql_object_desc|
@@ -72,13 +72,13 @@ module SoqlGlobalObjectData
72
72
  # @param [Hash] lookup Key value pair unique to Salesforce to query for
73
73
  # @yield [id] Perform block for each id returned. The 'id' parameter in a block represents an id matching the query
74
74
  # @return [Array] List of ids matching criteria. Only used if no block given
75
- def ids_where(lookup = {})
75
+ def ids_where(lookup = {}, &block)
76
76
  lookup[:limit] ||= nil # Don't limit results returned
77
77
  SoqlHandler.new("Each Id where #{self}").use
78
78
  results = soql.query soql.soql_id(lookup), wait: false
79
79
  ids = results.ids
80
80
  if block_given?
81
- ids.each { |id| yield(id) }
81
+ ids.each(&block)
82
82
  else
83
83
  ids
84
84
  end
@@ -98,4 +98,27 @@ module SoqlObjectDescribe
98
98
  def field_names
99
99
  fields.collect { |field| field['name'] }
100
100
  end
101
+
102
+ # @return [Hash] List of accessors for an object and what they relate to
103
+ def accessors
104
+ return @attr_hash if @attr_hash
105
+
106
+ @attr_hash = {}
107
+ fields.each do |field|
108
+ @attr_hash[field['label'].unused_ruby_name.to_sym] = important_attributes_for(field)
109
+ end
110
+ @attr_hash
111
+ end
112
+
113
+ private
114
+
115
+ # @return [Hash] Important attributes for a field
116
+ def important_attributes_for(field)
117
+ important_attributes = { backend: field['name'],
118
+ label: field['label'],
119
+ type: field['type'] }
120
+ relationship_name = field['relationshipName']
121
+ important_attributes[:related_object] = relationship_name if relationship_name
122
+ important_attributes
123
+ end
101
124
  end
@@ -85,11 +85,9 @@ module LeapSalesforce
85
85
  private
86
86
 
87
87
  # Execute block as admin user, raising error if User class is not defined
88
- def admin_query_user
88
+ def admin_query_user(&block)
89
89
  if defined? ::User
90
- Users.execute_as_if_present key: :admin do
91
- yield
92
- end
90
+ Users.execute_as_if_present key: :admin, &block
93
91
  else
94
92
  raise LeapSalesforce::SetupError, "'User' class must be defined " \
95
93
  " to check presence of user in environment #{LeapSalesforce.environment}"
@@ -60,11 +60,11 @@ module LeapSalesforce
60
60
  alias [] where
61
61
 
62
62
  # Iterate through each user, narrowing on filter if provided
63
- def each(filter = nil)
63
+ def each(filter = nil, &block)
64
64
  if filter
65
- where({**filter, all: true}).each { yield }
65
+ where({ **filter, all: true }).each(&block)
66
66
  else
67
- list.each { yield }
67
+ list.each(&block)
68
68
  end
69
69
  end
70
70
 
@@ -92,11 +92,11 @@ module LeapSalesforce
92
92
  # Execute block as user matching filter if that user is present
93
93
  # If user is not present the current user will be used
94
94
  # @return [Object] Result of block
95
- def execute_as_if_present(user_filter)
95
+ def execute_as_if_present(user_filter, &block)
96
96
  raise ArgumentError, 'Pass block to :execute_as_if_present method' unless block_given?
97
97
 
98
98
  if any? user_filter
99
- execute_as(user_filter) { yield }
99
+ execute_as(user_filter, &block)
100
100
  else
101
101
  LeapSalesforce.logger.warn "No user found user filter #{user_filter}, using '#{LeapSalesforce.api_user}'"
102
102
  yield
@@ -2,5 +2,5 @@
2
2
 
3
3
  module LeapSalesforce
4
4
  # @return [String] Version of leap salesforce
5
- VERSION = '1.0.1'
5
+ VERSION = '1.0.5'
6
6
  end
@@ -74,7 +74,10 @@ module LeapSalesforce
74
74
  require 'leap_salesforce/limits'
75
75
 
76
76
  FileUtils.mkdir_p lib_folder unless Dir.exist? lib_folder
77
- require_all lib_folder
77
+ %w[factories metadata soql_data].each do |folder|
78
+ sub_folder = File.join(lib_folder, folder)
79
+ require_all sub_folder if Dir.exist? sub_folder
80
+ end
78
81
 
79
82
  self.objects_to_verify = SoqlData.descendants if objects_to_verify.empty?
80
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leap_salesforce
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - IQA
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-01-26 00:00:00.000000000 Z
12
+ date: 2022-01-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -99,16 +99,16 @@ dependencies:
99
99
  name: activerecord
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ">="
102
+ - - '='
103
103
  - !ruby/object:Gem::Version
104
- version: '0'
104
+ version: '6.1'
105
105
  type: :runtime
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ">="
109
+ - - '='
110
110
  - !ruby/object:Gem::Version
111
- version: '0'
111
+ version: '6.1'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: colorize
114
114
  requirement: !ruby/object:Gem::Requirement