knapsack_pro 1.22.1 → 2.1.1

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: 1ff5e0f88a008abb13c1ca010f4b430be290ecf4e349719cac39611eebc575a4
4
- data.tar.gz: 83650913e5d6cd21201ebce5ae48c731d61a0bc27bb37f566fcdc3d96a9b0598
3
+ metadata.gz: 653a964b0c75547cec30531146adeb0075f251e6bc6511d4d85d710b778cf539
4
+ data.tar.gz: 21bb3baafa53c8dcc609d87e8fd8adb2b700df40f3275908968dee74f4186921
5
5
  SHA512:
6
- metadata.gz: 3b3d2dc24c6592040f559f77f59168502bb949b135406a06f59c836494902412e202a28bc781760e0862f416ccaa2d2c9a246269fee87e9fd3d9120ba803f4ab
7
- data.tar.gz: 9d4005922f963d765b494ab2b35642fa3be85787a6deb8b490ed3e1f64e5055d474d4cdae5b1bba4d4668b4c63fd59d9063102baf7036830e53d409ba8cf016a
6
+ metadata.gz: a09a6f1318b285910c1db3eb8828a2d79034cfd7a1cf23926995b91b89d68f768bdab003f33ee4fc1480c1431fd22cffe6236bc69413494147bc9d12619ee73e
7
+ data.tar.gz: 1aa7010f7a371a8dca1f333a1254261341bfec1143e101dc2e6a717aa0dac43f31f4382050da248bb87a387268bd2ef39eeeb64ed76f348293dd5efafe9607e3
@@ -1,5 +1,51 @@
1
1
  # Change Log
2
2
 
3
+ ### 2.1.1
4
+
5
+ * Explicitly call root test runner class to avoid a confusing error when test runner gem is not loaded
6
+
7
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/120
8
+
9
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v2.1.0...v2.1.1
10
+
11
+ ### 2.1.0
12
+
13
+ * Add `KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX` to customize prefix for generating test examples report when using RSpec split by test examples
14
+
15
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/118
16
+
17
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v2.0.0...v2.1.0
18
+
19
+ ### 2.0.0
20
+
21
+ * Add support for CI build ID for Github Actions
22
+
23
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/116
24
+
25
+ __Migration path for Github Actions users - required__
26
+
27
+ If you use Github Actions and Knapsack Pro Queue Mode then you must set in Github Actions environment variable: `KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true`. Thanks to that when you retry CI build then tests will run based on previously recorded tests. This solves problem mentioned in the [PR](https://github.com/KnapsackPro/knapsack_pro-ruby/pull/116).
28
+
29
+ __Migration path for other users__ - just update `knapsack_pro` gem. Nothing to change in your code :)
30
+
31
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.3...v2.0.0
32
+
33
+ ### 1.22.3
34
+
35
+ * Support for non-delimited formatting params of RSpec like `-fMyCustomFormatter`
36
+
37
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/115
38
+
39
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.2...v1.22.3
40
+
41
+ ### 1.22.2
42
+
43
+ * Log when next retry request to Knapsack Pro API happens before starting Fallback Mode
44
+
45
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/114
46
+
47
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.1...v1.22.2
48
+
3
49
  ### 1.22.1
4
50
 
5
51
  * Fix for an auto split of slow RSpec test files by test examples when using `KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true` and `parallel_tests` gem. Save the JSON reports with unique file names with the CI node index in the name to avoid accidentally overriding the files on the same disk.
data/README.md CHANGED
@@ -84,6 +84,7 @@ We keep this old FAQ in README to not break old links spread across the web. You
84
84
  - [Supported test runners in queue mode](#supported-test-runners-in-queue-mode)
85
85
  - [Split test files by test cases](#split-test-files-by-test-cases)
86
86
  - [RSpec split test files by test examples (by individual `it`s)](#rspec-split-test-files-by-test-examples-by-individual-its)
87
+ - [Why I see error: Don't know how to build task 'knapsack_pro:rspec_test_example_detector'?](#why-i-see-error-dont-know-how-to-build-task-knapsack_prorspec_test_example_detector)
87
88
  - [How to manually define a list of slow test files to be split by test cases](#how-to-manually-define-a-list-of-slow-test-files-to-be-split-by-test-cases)
88
89
  - [Extra configuration for CI server](#extra-configuration-for-ci-server)
89
90
  - [Info about ENV variables](#info-about-env-variables)
@@ -618,6 +619,16 @@ KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
618
619
 
619
620
  Thanks to that your CI build speed can be faster. We recommend using this feature with [Queue Mode](https://youtu.be/hUEB1XDKEFY) to ensure parallel CI nodes finish work at a similar time which gives you the shortest CI build time.
620
621
 
622
+ #### Why I see error: Don't know how to build task 'knapsack_pro:rspec_test_example_detector'?
623
+
624
+ If you will see error like:
625
+
626
+ ```
627
+ Don't know how to build task 'knapsack_pro:rspec_test_example_detector' (See the list of available tasks with `rake --tasks`)
628
+ ```
629
+
630
+ It probably means bundler can't find the rake task. You can try to remove the default prefix `bundle exec` used by knapsack_pro gem by setting `KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX=""`.
631
+
621
632
  ### How to manually define a list of slow test files to be split by test cases
622
633
 
623
634
  If you don't want to rely on a list of test files from Knapsack Pro API to determine slow test files that should be split by test cases then you can define your own list of slow test files.
@@ -1639,6 +1650,9 @@ jobs:
1639
1650
  KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: ${{ secrets.KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC }}
1640
1651
  KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }}
1641
1652
  KNAPSACK_PRO_CI_NODE_INDEX: ${{ matrix.ci_node_index }}
1653
+ # if you use Knapsack Pro Queue Mode you must set below env variable
1654
+ # to be able to retry CI build and run previously recorded tests
1655
+ KNAPSACK_PRO_FIXED_QUEUE_SPLIT: true
1642
1656
  run: |
1643
1657
  # run tests in Knapsack Pro Regular Mode
1644
1658
  bundle exec rake knapsack_pro:rspec
@@ -4,7 +4,7 @@ module KnapsackPro
4
4
  TEST_DIR_PATTERN = 'features/**{,/*/**}/*.feature'
5
5
 
6
6
  def self.test_path(object)
7
- if Cucumber::VERSION.to_i >= 2
7
+ if ::Cucumber::VERSION.to_i >= 2
8
8
  test_case = object
9
9
  test_case.location.file
10
10
  else
@@ -85,10 +85,10 @@ module KnapsackPro
85
85
  private
86
86
 
87
87
  def add_post_run_callback(&block)
88
- if Minitest.respond_to?(:after_run)
89
- Minitest.after_run { block.call }
88
+ if ::Minitest.respond_to?(:after_run)
89
+ ::Minitest.after_run { block.call }
90
90
  else
91
- Minitest::Unit.after_tests { block.call }
91
+ ::Minitest::Unit.after_tests { block.call }
92
92
  end
93
93
  end
94
94
  end
@@ -4,7 +4,7 @@ module KnapsackPro
4
4
  TEST_DIR_PATTERN = 'spec/**{,/*/**}/*_spec.rb'
5
5
 
6
6
  def self.test_path(example_group)
7
- if defined?(Turnip) && Turnip::VERSION.to_i < 2
7
+ if defined?(::Turnip) && ::Turnip::VERSION.to_i < 2
8
8
  unless example_group[:turnip]
9
9
  until example_group[:parent_example_group].nil?
10
10
  example_group = example_group[:parent_example_group]
@@ -42,7 +42,7 @@ module KnapsackPro
42
42
  end
43
43
 
44
44
  def bind_time_tracker
45
- Test::Unit::TestSuite.send(:prepend, BindTimeTrackerTestUnitPlugin)
45
+ ::Test::Unit::TestSuite.send(:prepend, BindTimeTrackerTestUnitPlugin)
46
46
 
47
47
  add_post_run_callback do
48
48
  KnapsackPro.logger.debug(KnapsackPro::Presenter.global_time)
@@ -63,7 +63,7 @@ module KnapsackPro
63
63
  private
64
64
 
65
65
  def add_post_run_callback(&block)
66
- Test::Unit.at_exit do
66
+ ::Test::Unit.at_exit do
67
67
  block.call
68
68
  end
69
69
  end
@@ -34,7 +34,7 @@ module KnapsackPro
34
34
  test_files_to_run = all_test_files_to_run
35
35
 
36
36
  if adapter_class == KnapsackPro::Adapters::RSpecAdapter && KnapsackPro::Config::Env.rspec_split_by_test_examples?
37
- unless Gem::Version.new(RSpec::Core::Version::STRING) >= Gem::Version.new('3.3.0')
37
+ unless Gem::Version.new(::RSpec::Core::Version::STRING) >= Gem::Version.new('3.3.0')
38
38
  raise 'RSpec >= 3.3.0 is required to split test files by test examples. Learn more: https://github.com/KnapsackPro/knapsack_pro-ruby#split-test-files-by-test-cases'
39
39
  end
40
40
 
@@ -43,7 +43,12 @@ module KnapsackPro
43
43
  KnapsackPro.logger.info("Generating RSpec test examples JSON report for slow test files to prepare it to be split by test examples (by individual 'it's. Thanks to that a single slow test file can be split across parallel CI nodes). Analyzing #{slow_test_files.size} slow test files.")
44
44
 
45
45
  # generate RSpec JSON report in separate process to not pollute RSpec state
46
- cmd = 'RACK_ENV=test RAILS_ENV=test bundle exec rake knapsack_pro:rspec_test_example_detector'
46
+ cmd = [
47
+ 'RACK_ENV=test',
48
+ 'RAILS_ENV=test',
49
+ KnapsackPro::Config::Env.rspec_test_example_detector_prefix,
50
+ 'rake knapsack_pro:rspec_test_example_detector',
51
+ ].join(' ')
47
52
  unless Kernel.system(cmd)
48
53
  raise "Could not generate JSON report for RSpec. Rake task failed when running #{cmd}"
49
54
  end
@@ -121,7 +121,11 @@ module KnapsackPro
121
121
  if retries < MAX_RETRY.call
122
122
  wait = retries * REQUEST_RETRY_TIMEBOX
123
123
  logger.warn("Wait #{wait}s and retry request to Knapsack Pro API.")
124
- Kernel.sleep(wait)
124
+ print_every = 2 # seconds
125
+ (wait / print_every).ceil.times do |i|
126
+ logger.warn("Next request in #{wait - i * print_every}s...")
127
+ Kernel.sleep(print_every)
128
+ end
125
129
  retry
126
130
  else
127
131
  response_body
@@ -1,4 +1,4 @@
1
- # https://help.github.com/en/articles/virtual-environments-for-github-actions#environment-variables
1
+ # https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables
2
2
  module KnapsackPro
3
3
  module Config
4
4
  module CI
@@ -12,7 +12,8 @@ module KnapsackPro
12
12
  end
13
13
 
14
14
  def node_build_id
15
- # not provided
15
+ # A unique number for each run within a repository. This number does not change if you re-run the workflow run.
16
+ ENV['GITHUB_RUN_ID']
16
17
  end
17
18
 
18
19
  def commit_hash
@@ -179,6 +179,10 @@ module KnapsackPro
179
179
  rspec_split_by_test_examples.to_s == 'true'
180
180
  end
181
181
 
182
+ def rspec_test_example_detector_prefix
183
+ ENV.fetch('KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX', 'bundle exec')
184
+ end
185
+
182
186
  def test_suite_token
183
187
  env_name = 'KNAPSACK_PRO_TEST_SUITE_TOKEN'
184
188
  ENV[env_name] || raise("Missing environment variable #{env_name}. You should set environment variable like #{env_name}_RSPEC (note there is suffix _RSPEC at the end). knapsack_pro gem will set #{env_name} based on #{env_name}_RSPEC value. If you use other test runner than RSpec then use proper suffix.")
@@ -3,8 +3,8 @@ RSpec::Support.require_rspec_core('formatters/json_formatter')
3
3
  # based on https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/json_formatter.rb
4
4
  module KnapsackPro
5
5
  module Formatters
6
- class RSpecJsonFormatter < RSpec::Core::Formatters::JsonFormatter
7
- RSpec::Core::Formatters.register self
6
+ class RSpecJsonFormatter < ::RSpec::Core::Formatters::JsonFormatter
7
+ ::RSpec::Core::Formatters.register self
8
8
 
9
9
  private
10
10
 
@@ -5,7 +5,7 @@ module KnapsackPro
5
5
  module RSpecQueueProfileFormatterExtension
6
6
  def self.print_summary
7
7
  return unless KnapsackPro::Config::Env.modify_default_rspec_formatters?
8
- RSpec::Core::Formatters::ProfileFormatter.print_profile_summary
8
+ ::RSpec::Core::Formatters::ProfileFormatter.print_profile_summary
9
9
  end
10
10
 
11
11
  def initialize(output)
@@ -9,8 +9,8 @@ module KnapsackPro
9
9
  def dump_summary(summary); end
10
10
  end
11
11
 
12
- class RSpecQueueSummaryFormatter < RSpec::Core::Formatters::BaseFormatter
13
- RSpec::Core::Formatters.register self, :dump_summary, :dump_failures, :dump_pending
12
+ class RSpecQueueSummaryFormatter < ::RSpec::Core::Formatters::BaseFormatter
13
+ ::RSpec::Core::Formatters.register self, :dump_summary, :dump_failures, :dump_pending
14
14
 
15
15
  def self.registered_output=(output)
16
16
  @registered_output = {
@@ -15,7 +15,7 @@ module KnapsackPro
15
15
  Rake::Task[task_name].clear
16
16
  end
17
17
 
18
- Cucumber::Rake::Task.new(task_name) do |t|
18
+ ::Cucumber::Rake::Task.new(task_name) do |t|
19
19
  t.cucumber_opts = "#{args} --require #{runner.test_dir} -- #{runner.stringify_test_file_paths}"
20
20
  end
21
21
  Rake::Task[task_name].invoke
@@ -89,9 +89,9 @@ module KnapsackPro
89
89
  end
90
90
 
91
91
  # duplicate args because Minitest modifies args
92
- result = Minitest.run(args.dup)
92
+ result = ::Minitest.run(args.dup)
93
93
 
94
- Minitest::Runnable.reset
94
+ ::Minitest::Runnable.reset
95
95
 
96
96
  result
97
97
  end
@@ -16,7 +16,7 @@ module KnapsackPro
16
16
  cli_args = (args || '').split
17
17
  # if user didn't provide the format then use explicitly default progress formatter
18
18
  # in order to avoid KnapsackPro::Formatters::RSpecQueueSummaryFormatter being the only default formatter
19
- if !cli_args.include?('--format') && !cli_args.include?('-f')
19
+ if !cli_args.any? { |arg| arg.start_with?('-f') || arg.start_with?('--format')}
20
20
  cli_args += ['--format', 'progress']
21
21
  end
22
22
  cli_args += [
@@ -79,8 +79,8 @@ module KnapsackPro
79
79
 
80
80
  log_rspec_command(args, test_file_paths, :subset_queue)
81
81
 
82
- options = RSpec::Core::ConfigurationOptions.new(cli_args)
83
- exit_code = RSpec::Core::Runner.new(options).run($stderr, $stdout)
82
+ options = ::RSpec::Core::ConfigurationOptions.new(cli_args)
83
+ exit_code = ::RSpec::Core::Runner.new(options).run($stderr, $stdout)
84
84
  exitstatus = exit_code if exit_code != 0
85
85
 
86
86
  rspec_clear_examples
@@ -124,26 +124,26 @@ module KnapsackPro
124
124
  #
125
125
  # Keep formatters and report to accumulate info about failed/pending tests
126
126
  def self.rspec_clear_examples
127
- if RSpec::ExampleGroups.respond_to?(:remove_all_constants)
128
- RSpec::ExampleGroups.remove_all_constants
127
+ if ::RSpec::ExampleGroups.respond_to?(:remove_all_constants)
128
+ ::RSpec::ExampleGroups.remove_all_constants
129
129
  else
130
- RSpec::ExampleGroups.constants.each do |constant|
131
- RSpec::ExampleGroups.__send__(:remove_const, constant)
130
+ ::RSpec::ExampleGroups.constants.each do |constant|
131
+ ::RSpec::ExampleGroups.__send__(:remove_const, constant)
132
132
  end
133
133
  end
134
- RSpec.world.example_groups.clear
135
- RSpec.configuration.start_time = ::RSpec::Core::Time.now
134
+ ::RSpec.world.example_groups.clear
135
+ ::RSpec.configuration.start_time = ::RSpec::Core::Time.now
136
136
 
137
137
  if KnapsackPro::Config::Env.rspec_split_by_test_examples?
138
138
  # Reset example group counts to ensure scoped example ids in metadata
139
139
  # have correct index (not increased by each subsequent run).
140
140
  # Solves this problem: https://github.com/rspec/rspec-core/issues/2721
141
- RSpec.world.instance_variable_set(:@example_group_counts_by_spec_file, Hash.new(0))
141
+ ::RSpec.world.instance_variable_set(:@example_group_counts_by_spec_file, Hash.new(0))
142
142
  end
143
143
 
144
144
  # skip reset filters for old RSpec versions
145
- if RSpec.configuration.respond_to?(:reset_filters)
146
- RSpec.configuration.reset_filters
145
+ if ::RSpec.configuration.respond_to?(:reset_filters)
146
+ ::RSpec.configuration.reset_filters
147
147
  end
148
148
  end
149
149
  end
@@ -15,7 +15,7 @@ module KnapsackPro
15
15
  Rake::Task[task_name].clear
16
16
  end
17
17
 
18
- RSpec::Core::RakeTask.new(task_name) do |t|
18
+ ::RSpec::Core::RakeTask.new(task_name) do |t|
19
19
  # we cannot pass runner.test_file_paths array to t.pattern
20
20
  # because pattern does not accept test example path like spec/a_spec.rb[1:2]
21
21
  # instead we pass test files and test example paths to t.rspec_opts
@@ -16,7 +16,7 @@ module KnapsackPro
16
16
  File.expand_path(f)
17
17
  end
18
18
 
19
- exit Test::Unit::AutoRunner.run(
19
+ exit ::Test::Unit::AutoRunner.run(
20
20
  true,
21
21
  runner.test_dir,
22
22
  cli_args
@@ -7,7 +7,7 @@ module KnapsackPro
7
7
  require 'rspec/core'
8
8
 
9
9
  cli_format =
10
- if Gem::Version.new(RSpec::Core::Version::STRING) < Gem::Version.new('3.6.0')
10
+ if Gem::Version.new(::RSpec::Core::Version::STRING) < Gem::Version.new('3.6.0')
11
11
  require_relative '../formatters/rspec_json_formatter'
12
12
  ['--format', KnapsackPro::Formatters::RSpecJsonFormatter.to_s]
13
13
  else
@@ -30,8 +30,8 @@ module KnapsackPro
30
30
  '--out', report_path,
31
31
  '--default-path', test_dir,
32
32
  ] + KnapsackPro::TestFilePresenter.paths(test_file_entities)
33
- options = RSpec::Core::ConfigurationOptions.new(cli_args)
34
- exit_code = RSpec::Core::Runner.new(options).run($stderr, $stdout)
33
+ options = ::RSpec::Core::ConfigurationOptions.new(cli_args)
34
+ exit_code = ::RSpec::Core::Runner.new(options).run($stderr, $stdout)
35
35
  if exit_code != 0
36
36
  raise 'There was problem to generate test examples for test suite'
37
37
  end
@@ -1,3 +1,3 @@
1
1
  module KnapsackPro
2
- VERSION = '1.22.1'
2
+ VERSION = '2.1.1'
3
3
  end
@@ -87,9 +87,20 @@ shared_examples 'when retry request' do
87
87
  expect(logger).to receive(:warn).exactly(3).with(server_error.inspect)
88
88
 
89
89
  expect(logger).to receive(:warn).with("Wait 8s and retry request to Knapsack Pro API.")
90
+ expect(logger).to receive(:warn).with("Next request in 8s...")
91
+ expect(logger).to receive(:warn).with("Next request in 6s...")
92
+ expect(logger).to receive(:warn).with("Next request in 4s...")
93
+ expect(logger).to receive(:warn).with("Next request in 2s...")
90
94
  expect(logger).to receive(:warn).with("Wait 16s and retry request to Knapsack Pro API.")
91
- expect(Kernel).to receive(:sleep).with(8)
92
- expect(Kernel).to receive(:sleep).with(16)
95
+ expect(logger).to receive(:warn).with("Next request in 16s...")
96
+ expect(logger).to receive(:warn).with("Next request in 14s...")
97
+ expect(logger).to receive(:warn).with("Next request in 12s...")
98
+ expect(logger).to receive(:warn).with("Next request in 10s...")
99
+ expect(logger).to receive(:warn).with("Next request in 8s...")
100
+ expect(logger).to receive(:warn).with("Next request in 6s...")
101
+ expect(logger).to receive(:warn).with("Next request in 4s...")
102
+ expect(logger).to receive(:warn).with("Next request in 2s...")
103
+ expect(Kernel).to receive(:sleep).exactly(12).with(2)
93
104
 
94
105
  expect(subject).to eq(parsed_response)
95
106
 
@@ -115,15 +126,37 @@ shared_examples 'when retry request' do
115
126
  expect(logger).to receive(:warn).exactly(6).with(server_error.inspect)
116
127
 
117
128
  expect(logger).to receive(:warn).with("Wait 8s and retry request to Knapsack Pro API.")
129
+ expect(logger).to receive(:warn).with("Next request in 8s...")
130
+ expect(logger).to receive(:warn).with("Next request in 6s...")
131
+ expect(logger).to receive(:warn).with("Next request in 4s...")
132
+ expect(logger).to receive(:warn).with("Next request in 2s...")
133
+
118
134
  expect(logger).to receive(:warn).with("Wait 16s and retry request to Knapsack Pro API.")
135
+ expect(logger).to receive(:warn).with("Next request in 16s...")
136
+ expect(logger).to receive(:warn).with("Next request in 14s...")
137
+ expect(logger).to receive(:warn).with("Next request in 12s...")
138
+ expect(logger).to receive(:warn).with("Next request in 10s...")
139
+ expect(logger).to receive(:warn).with("Next request in 8s...")
140
+ expect(logger).to receive(:warn).with("Next request in 6s...")
141
+ expect(logger).to receive(:warn).with("Next request in 4s...")
142
+ expect(logger).to receive(:warn).with("Next request in 2s...")
143
+
119
144
  expect(logger).to receive(:warn).with("Wait 24s and retry request to Knapsack Pro API.")
145
+ 12.times do |i|
146
+ expect(logger).to receive(:warn).with("Next request in #{(i+1)*2}s...")
147
+ end
148
+
120
149
  expect(logger).to receive(:warn).with("Wait 32s and retry request to Knapsack Pro API.")
150
+ 16.times do |i|
151
+ expect(logger).to receive(:warn).with("Next request in #{(i+1)*2}s...")
152
+ end
153
+
121
154
  expect(logger).to receive(:warn).with("Wait 40s and retry request to Knapsack Pro API.")
122
- expect(Kernel).to receive(:sleep).with(8)
123
- expect(Kernel).to receive(:sleep).with(16)
124
- expect(Kernel).to receive(:sleep).with(24)
125
- expect(Kernel).to receive(:sleep).with(32)
126
- expect(Kernel).to receive(:sleep).with(40)
155
+ 20.times do |i|
156
+ expect(logger).to receive(:warn).with("Next request in #{(i+1)*2}s...")
157
+ end
158
+
159
+ expect(Kernel).to receive(:sleep).exactly(60).with(2)
127
160
 
128
161
  expect(subject).to eq(parsed_response)
129
162
 
@@ -22,7 +22,14 @@ describe KnapsackPro::Config::CI::GithubActions do
22
22
  describe '#node_build_id' do
23
23
  subject { described_class.new.node_build_id }
24
24
 
25
- it { should be nil }
25
+ context 'when environment exists' do
26
+ let(:env) { { 'GITHUB_RUN_ID' => 2706 } }
27
+ it { should eql 2706 }
28
+ end
29
+
30
+ context "when environment doesn't exist" do
31
+ it { should be nil }
32
+ end
26
33
  end
27
34
 
28
35
  describe '#commit_hash' do
@@ -658,6 +658,20 @@ describe KnapsackPro::Config::Env do
658
658
  end
659
659
  end
660
660
 
661
+ describe '.rspec_test_example_detector_prefix' do
662
+ subject { described_class.rspec_test_example_detector_prefix }
663
+
664
+ context 'when ENV exists' do
665
+ before { stub_const("ENV", { 'KNAPSACK_PRO_RSPEC_TEST_EXAMPLE_DETECTOR_PREFIX' => '' }) }
666
+ it { should eq '' }
667
+ end
668
+
669
+ context "when ENV doesn't exist" do
670
+ before { stub_const("ENV", {}) }
671
+ it { should eq 'bundle exec' }
672
+ end
673
+ end
674
+
661
675
  describe '.test_suite_token' do
662
676
  subject { described_class.test_suite_token }
663
677
 
@@ -104,6 +104,31 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
104
104
  subject
105
105
  end
106
106
  end
107
+
108
+ context 'when format param is provided without a delimiter' do
109
+ let(:args) { '-fMyCustomFormatter' }
110
+
111
+ it 'uses provided format param instead of default formatter progress' do
112
+ expected_exitstatus = 0
113
+ expected_accumulator = {
114
+ status: :completed,
115
+ exitstatus: expected_exitstatus
116
+ }
117
+ accumulator = {
118
+ status: :next,
119
+ runner: runner,
120
+ can_initialize_queue: true,
121
+ args: ['-fMyCustomFormatter', '--format', 'KnapsackPro::Formatters::RSpecQueueSummaryFormatter', '--default-path', 'fake-test-dir'],
122
+ exitstatus: 0,
123
+ all_test_file_paths: [],
124
+ }
125
+ expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
126
+
127
+ expect(Kernel).to receive(:exit).with(expected_exitstatus)
128
+
129
+ subject
130
+ end
131
+ end
107
132
  end
108
133
 
109
134
  context 'when args not provided' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knapsack_pro
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.22.1
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ArturT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-31 00:00:00.000000000 Z
11
+ date: 2020-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake