knapsack_pro 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f27ac674f611af638b9d0ea3dd1d3441a9e680e70296738ff5b93d5d18f9741
4
- data.tar.gz: 79bdc380a1c882178b4a3cde626de7e2db1d30ae64ae1a301f023a5ff5d71623
3
+ metadata.gz: 832322e0370ece75c8c2e53870b526e6bc4cd3f43214d4ee893a48cef6b209af
4
+ data.tar.gz: a3847464969d15278d84d00d9638c9e6e2cecea0190be5f773c70da0117c0d44
5
5
  SHA512:
6
- metadata.gz: 75bf722c575fce515b8a1a79f7e05ad5ed8ce6f69c05f4ff7cff8fdd570e5eb3e170cbf83765c66b2d1a187a5c076235637188ef9e7bd9d3d703fa37d1bf989c
7
- data.tar.gz: 1a355724b69bd0d62b23dd32b6e995dbdd882d0fcb0299d5cddb42c3b4c0635a588839c7194cfb2af83504d91ba4db192a68cc393a8380713450b44971c682bf
6
+ metadata.gz: d3648e3a7f77b8acfac104dc32a6f99cca7d86456cadd2127ff3b8e6d0a874df452398b5a266a887d54c9c239bf28727501a524cc3351adbb676b8887e272014
7
+ data.tar.gz: c7212ef6b958a7bb7aec2add6e6dc9d02e753936401f8d7705b4799c4ef1bb2b20c3456d1ad165b9e8ece86873b7393ee7afe1aa260c798b8644e6ace039fb17
data/.gitignore CHANGED
@@ -36,5 +36,5 @@ Gemfile.lock
36
36
  .rvmrc
37
37
 
38
38
  # dynamically generated specs
39
- spec/knapsack_pro/formatters/time_tracker*_spec.rb
39
+ spec/knapsack_pro/formatters/tmp_time_tracker*_spec.rb
40
40
  spec_integration/
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ### 7.1.0
4
+
5
+ * [RSpec] [Queue Mode] Log error message and backtrace when unexpected failure is raised
6
+
7
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/249
8
+
9
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v7.0.1...v7.1.0
10
+
11
+ ### 7.0.1
12
+
13
+ * fix(RSpec): conditionally adds `--require rails_helper` to cli arguments of `KnapsackPro::Runners::Queue::RSpecRunner`. Version 7.0.0 introduced some fundamental changes, namely fetching, loading and running batches of specs **after** executing suite hooks, so that such hooks are only ran once, not before every batch. As a result, if `rails_helper` is only required in spec files, which is the RSpec default, instead of e.g. in `.rspec`, then some `before(:suite)` hooks, e.g. defined by gems, are registered after suite hooks had already been executed by the test suite. By comparison, RSpec loads all the spec files **before** executing `before(:suite)` hooks.
14
+
15
+ PR with the above changes: https://github.com/KnapsackPro/knapsack_pro-ruby/pull/243
16
+
17
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v7.0.0...v7.0.1
18
+
3
19
  ### 7.0.0
4
20
 
5
21
  * __(breaking change)__ RSpec in Queue Mode:
data/README.md CHANGED
@@ -74,30 +74,32 @@ Scripted tests can be found in the [Rails App With Knapsack Pro repository](http
74
74
 
75
75
  ### Publishing
76
76
 
77
- Update the version in `lib/knapsack_pro/version.rb` and `CHANGELOG.md`:
77
+ 1. Update the `CHANGELOG.md` as part of your PR.
78
+
79
+ 2. After your PR has been merged, update the gem version in `lib/knapsack_pro/version.rb` directly on the `master` branch:
78
80
 
79
81
  ```bash
80
82
  git commit -m "Bump version X.X.X"
81
83
  git push origin master
82
84
  ```
83
85
 
84
- Create a git tag for the release:
86
+ 3. Create a git tag for the release:
85
87
 
86
88
  ```bash
87
89
  git tag -a vX.X.X -m "Release vX.X.X"
88
90
  git push --tags
89
91
  ```
90
92
 
91
- Build the gem and publish it to RubyGems:
93
+ 4. Build the gem and publish it to RubyGems:
92
94
 
93
95
  ```bash
94
96
  gem build knapsack_pro.gemspec
95
97
  gem push knapsack_pro-X.X.X.gem
96
98
  ```
97
99
 
98
- Update the latest available gem version in `TestSuiteClientVersionChecker` for the Knapsack Pro API repository.
100
+ 5. Update the latest available gem version in `TestSuiteClientVersionChecker` for the Knapsack Pro API repository.
99
101
 
100
- Update the `knapsack_pro` gem version in:
102
+ 6. Update the `knapsack_pro` gem version in:
101
103
 
102
104
  - [Rails App With Knapsack Pro repository](https://github.com/KnapsackPro/rails-app-with-knapsack_pro)
103
105
  - Knapsack Pro API internal repository
@@ -52,6 +52,10 @@ module KnapsackPro
52
52
  !!parsed_options(cli_args)&.[](:formatters)
53
53
  end
54
54
 
55
+ def self.has_require_rails_helper_option?(cli_args)
56
+ (parsed_options(cli_args)&.[](:requires) || []).include?("rails_helper")
57
+ end
58
+
55
59
  def self.order_option(cli_args)
56
60
  parsed_options(cli_args)&.[](:order)
57
61
  end
@@ -76,6 +80,10 @@ module KnapsackPro
76
80
  id.match(/\A(.*?)(?:\[([\d\s:,]+)\])?\z/).captures.first
77
81
  end
78
82
 
83
+ def self.rails_helper_exists?(test_dir)
84
+ File.exist?("#{test_dir}/rails_helper.rb")
85
+ end
86
+
79
87
  # private
80
88
  def self.top_level_group(example)
81
89
  group = example.metadata[:example_group]
@@ -34,9 +34,10 @@ module KnapsackPro
34
34
  args + ['--seed', seed.value]
35
35
  end
36
36
 
37
- def prepare_cli_args(args, has_format_option, test_dir)
37
+ def prepare_cli_args(args, has_format_option, has_require_rails_helper_option, rails_helper_exists, test_dir)
38
38
  (args || '').split
39
39
  .yield_self { args_with_at_least_one_formatter(_1, has_format_option) }
40
+ .yield_self { args_with_require_rails_helper_if_needed(_1, has_require_rails_helper_option, rails_helper_exists) }
40
41
  .yield_self { args_with_default_options(_1, test_dir) }
41
42
  end
42
43
 
@@ -75,6 +76,13 @@ module KnapsackPro
75
76
  cli_args + ['--format', 'progress']
76
77
  end
77
78
 
79
+ def args_with_require_rails_helper_if_needed(cli_args, has_require_rails_helper_option, rails_helper_exists)
80
+ return cli_args if has_require_rails_helper_option
81
+ return cli_args unless rails_helper_exists
82
+
83
+ cli_args + ['--require', 'rails_helper']
84
+ end
85
+
78
86
  def args_with_default_options(cli_args, test_dir)
79
87
  new_cli_args = cli_args + [
80
88
  '--default-path', test_dir,
@@ -24,8 +24,11 @@ module KnapsackPro
24
24
  super(adapter_class)
25
25
  @adapter_class = adapter_class
26
26
  @rspec_pure = rspec_pure
27
- has_format_option = @adapter_class.has_format_option?((args || '').split)
28
- @cli_args = rspec_pure.prepare_cli_args(args, has_format_option, test_dir)
27
+ args_array = (args || '').split
28
+ has_format_option = @adapter_class.has_format_option?(args_array)
29
+ has_require_rails_helper_option = @adapter_class.has_require_rails_helper_option?(args_array)
30
+ rails_helper_exists = @adapter_class.rails_helper_exists?(test_dir)
31
+ @cli_args = rspec_pure.prepare_cli_args(args, has_format_option, has_require_rails_helper_option, rails_helper_exists, test_dir)
29
32
  @stream_error = stream_error
30
33
  @stream_out = stream_out
31
34
  @node_test_file_paths = []
@@ -53,6 +56,8 @@ module KnapsackPro
53
56
  Kernel.exit(exit_code)
54
57
  rescue Exception => exception
55
58
  KnapsackPro.logger.error("An unexpected exception happened. RSpec cannot handle it. The exception: #{exception.inspect}")
59
+ KnapsackPro.logger.error("Exception message: #{exception.message}")
60
+ KnapsackPro.logger.error("Exception backtrace: #{exception.backtrace.join("\n")}")
56
61
 
57
62
  message = @rspec_pure.exit_summary(unexecuted_test_files)
58
63
  KnapsackPro.logger.warn(message) if message
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KnapsackPro
4
- VERSION = '7.0.0'
4
+ VERSION = '7.1.0'
5
5
  end
@@ -26,7 +26,7 @@ module KnapsackProExtensions
26
26
  @batch_index += 1
27
27
 
28
28
  if SHOW_DEBUG_LOG
29
- IntegrationTestLogger.log("Mocked tests from the Queue API: #{tests.inspect}")
29
+ IntegrationTestLogger.log("Stubbed tests from the Queue API: #{tests.inspect}")
30
30
  end
31
31
 
32
32
  tests
@@ -41,13 +41,13 @@ module KnapsackProExtensions
41
41
  end
42
42
 
43
43
  return unless SHOW_DEBUG_LOG
44
- IntegrationTestLogger.log("Mocked the #{__method__} method")
44
+ IntegrationTestLogger.log("Stubbed the #{__method__} method")
45
45
  end
46
46
  end
47
47
 
48
48
  module RSpecAdapter
49
49
  def test_file_cases_for(slow_test_files)
50
- IntegrationTestLogger.log("Mocked test file cases for slow test files: #{slow_test_files}")
50
+ IntegrationTestLogger.log("Stubbed test file cases for slow test files: #{slow_test_files}")
51
51
 
52
52
  test_file_paths = JSON.load(ENV.fetch('TEST__TEST_FILE_CASES_FOR_SLOW_TEST_FILES'))
53
53
  test_file_paths.map do |path|
@@ -32,13 +32,18 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
32
32
  )
33
33
  end
34
34
 
35
+ def create_rails_helper_file(rails_helper)
36
+ rails_helper_path = "#{SPEC_DIRECTORY}/rails_helper.rb"
37
+ File.open(rails_helper_path, 'w') { |file| file.write(rails_helper) }
38
+ end
39
+
35
40
  def stub_spec_batches(batched_tests)
36
41
  ENV['TEST__SPEC_BATCHES'] = batched_tests.to_json
37
42
  end
38
43
 
39
44
  # @param test_file_paths Array[String]
40
45
  # Example: ['spec_integration/a_spec.rb[1:1]']
41
- def mock_test_cases_for_slow_test_files(test_file_paths)
46
+ def stub_test_cases_for_slow_test_files(test_file_paths)
42
47
  ENV['TEST__TEST_FILE_CASES_FOR_SLOW_TEST_FILES'] = test_file_paths.to_json
43
48
  end
44
49
 
@@ -327,6 +332,174 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
327
332
  end
328
333
  end
329
334
 
335
+ context 'when rails_helper file does not exist' do
336
+ it 'does not require the rails_helper file when running RSpec' do
337
+ rspec_options = ''
338
+
339
+ spec_helper = <<~SPEC
340
+ require 'knapsack_pro'
341
+ KnapsackPro::Adapters::RSpecAdapter.bind
342
+ SPEC
343
+
344
+ spec_a = Spec.new('a_spec.rb', <<~SPEC)
345
+ describe 'A_describe' do
346
+ it 'A1 test example' do
347
+ expect(1).to eq 1
348
+ end
349
+ end
350
+ SPEC
351
+
352
+ spec_b = Spec.new('b_spec.rb', <<~SPEC)
353
+ describe 'B_describe' do
354
+ it 'B1 test example' do
355
+ expect(1).to eq 1
356
+ end
357
+ end
358
+ SPEC
359
+
360
+ spec_c = Spec.new('c_spec.rb', <<~SPEC)
361
+ describe 'C_describe' do
362
+ it 'C1 test example' do
363
+ expect(1).to eq 1
364
+ end
365
+ end
366
+ SPEC
367
+
368
+ generate_specs(spec_helper, rspec_options, [
369
+ [spec_a, spec_b],
370
+ [spec_c],
371
+ ])
372
+
373
+ actual = subject
374
+
375
+ expect(actual.stdout).to_not include('--require rails_helper')
376
+
377
+ expect(actual.exit_code).to eq 0
378
+ end
379
+ end
380
+
381
+ context 'when rails_helper file exists' do
382
+ it 'requires the rails_helper file when running RSpec and runs hooks defined within it' do
383
+ rspec_options = ''
384
+
385
+ spec_helper = <<~SPEC
386
+ require 'knapsack_pro'
387
+ KnapsackPro::Adapters::RSpecAdapter.bind
388
+ SPEC
389
+
390
+ spec_a = Spec.new('a_spec.rb', <<~SPEC)
391
+ describe 'A_describe' do
392
+ it 'A1 test example' do
393
+ expect(1).to eq 1
394
+ end
395
+ end
396
+ SPEC
397
+
398
+ spec_b = Spec.new('b_spec.rb', <<~SPEC)
399
+ describe 'B_describe' do
400
+ it 'B1 test example' do
401
+ expect(1).to eq 1
402
+ end
403
+ end
404
+ SPEC
405
+
406
+ spec_c = Spec.new('c_spec.rb', <<~SPEC)
407
+ describe 'C_describe' do
408
+ it 'C1 test example' do
409
+ expect(1).to eq 1
410
+ end
411
+ end
412
+ SPEC
413
+
414
+ generate_specs(spec_helper, rspec_options, [
415
+ [spec_a, spec_b],
416
+ [spec_c],
417
+ ])
418
+
419
+ rails_helper = <<~SPEC
420
+ RSpec.configure do |config|
421
+ config.before(:suite) do
422
+ puts 'RSpec_before_suite_hook_from_rails_helper'
423
+ end
424
+ config.after(:suite) do
425
+ puts 'RSpec_after_suite_hook_from_rails_helper'
426
+ end
427
+ end
428
+ SPEC
429
+
430
+ create_rails_helper_file(rails_helper)
431
+
432
+ actual = subject
433
+
434
+ expect(actual.stdout).to include('--require rails_helper')
435
+ expect(actual.stdout.scan(/RSpec_before_suite_hook_from_rails_helper/).size).to eq 1
436
+ expect(actual.stdout.scan(/RSpec_after_suite_hook_from_rails_helper/).size).to eq 1
437
+
438
+ expect(actual.exit_code).to eq 0
439
+ end
440
+
441
+ it 'runs suite hooks defined in rails_helper only once, even if file is required multiple times' do
442
+ rspec_options = ''
443
+
444
+ spec_helper = <<~SPEC
445
+ require 'knapsack_pro'
446
+ KnapsackPro::Adapters::RSpecAdapter.bind
447
+ SPEC
448
+
449
+ spec_a = Spec.new('a_spec.rb', <<~SPEC)
450
+ require 'rails_helper'
451
+ describe 'A_describe' do
452
+ it 'A1 test example' do
453
+ expect(1).to eq 1
454
+ end
455
+ end
456
+ SPEC
457
+
458
+ spec_b = Spec.new('b_spec.rb', <<~SPEC)
459
+ require 'rails_helper'
460
+ describe 'B_describe' do
461
+ it 'B1 test example' do
462
+ expect(1).to eq 1
463
+ end
464
+ end
465
+ SPEC
466
+
467
+ spec_c = Spec.new('c_spec.rb', <<~SPEC)
468
+ require 'rails_helper'
469
+ describe 'C_describe' do
470
+ it 'C1 test example' do
471
+ expect(1).to eq 1
472
+ end
473
+ end
474
+ SPEC
475
+
476
+ generate_specs(spec_helper, rspec_options, [
477
+ [spec_a, spec_b],
478
+ [spec_c],
479
+ ])
480
+
481
+ rails_helper = <<~SPEC
482
+ RSpec.configure do |config|
483
+ config.before(:suite) do
484
+ puts 'RSpec_before_suite_hook_from_rails_helper'
485
+ end
486
+ config.after(:suite) do
487
+ puts 'RSpec_after_suite_hook_from_rails_helper'
488
+ end
489
+ end
490
+ SPEC
491
+
492
+ create_rails_helper_file(rails_helper)
493
+
494
+ actual = subject
495
+
496
+ expect(actual.stdout.scan(/RSpec_before_suite_hook_from_rails_helper/).size).to eq 1
497
+ expect(actual.stdout.scan(/RSpec_after_suite_hook_from_rails_helper/).size).to eq 1
498
+
499
+ expect(actual.exit_code).to eq 0
500
+ end
501
+ end
502
+
330
503
  context 'when hooks are defined' do
331
504
  it 'calls RSpec before/after hooks only once for multiple batches of tests' do
332
505
  rspec_options = ''
@@ -942,6 +1115,8 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
942
1115
 
943
1116
  expect(actual.stdout).to include('B_describe')
944
1117
  expect(actual.stdout).to include('An unexpected exception happened. RSpec cannot handle it. The exception: #<NoMemoryError: NoMemoryError>')
1118
+ expect(actual.stdout).to include('Exception message: ')
1119
+ expect(actual.stdout).to include('Exception backtrace: ')
945
1120
  expect(actual.stdout).to_not include('B1 test example')
946
1121
 
947
1122
  expect(actual.stdout).to_not include('C1 test example')
@@ -1640,7 +1815,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1640
1815
  before do
1641
1816
  ENV['KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES'] = 'true'
1642
1817
 
1643
- # remember to mock Queue API batches to include test examples (example: a_spec.rb[1:1])
1818
+ # remember to stub Queue API batches to include test examples (example: a_spec.rb[1:1])
1644
1819
  # for the following slow test files
1645
1820
  ENV['KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN'] = "#{SPEC_DIRECTORY}/a_spec.rb"
1646
1821
  end
@@ -1688,7 +1863,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1688
1863
  generate_specs(spec_helper_with_knapsack, rspec_options, [
1689
1864
  [spec_a, spec_b, spec_c]
1690
1865
  ])
1691
- mock_test_cases_for_slow_test_files([
1866
+ stub_test_cases_for_slow_test_files([
1692
1867
  "#{spec_a.path}[1:1]",
1693
1868
  "#{spec_a.path}[1:2]",
1694
1869
  ])
@@ -1736,7 +1911,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1736
1911
  before do
1737
1912
  ENV['KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES'] = 'true'
1738
1913
 
1739
- # remember to mock Queue API batches to include test examples (example: a_spec.rb[1:1])
1914
+ # remember to stub Queue API batches to include test examples (example: a_spec.rb[1:1])
1740
1915
  # for the following slow test files
1741
1916
  ENV['KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN'] = "#{SPEC_DIRECTORY}/a_spec.rb"
1742
1917
  end
@@ -1784,7 +1959,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1784
1959
  generate_specs(spec_helper_with_knapsack, rspec_options, [
1785
1960
  [spec_a, spec_b, spec_c]
1786
1961
  ])
1787
- mock_test_cases_for_slow_test_files([
1962
+ stub_test_cases_for_slow_test_files([
1788
1963
  "#{spec_a.path}[1:1]",
1789
1964
  "#{spec_a.path}[1:2]",
1790
1965
  ])
@@ -1814,7 +1989,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1814
1989
  before do
1815
1990
  ENV['KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES'] = 'true'
1816
1991
 
1817
- # remember to mock Queue API batches to include test examples (example: a_spec.rb[1:1])
1992
+ # remember to stub Queue API batches to include test examples (example: a_spec.rb[1:1])
1818
1993
  # for the following slow test files
1819
1994
  ENV['KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN'] = "#{SPEC_DIRECTORY}/a_spec.rb"
1820
1995
  end
@@ -1862,7 +2037,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1862
2037
  generate_specs(spec_helper_with_knapsack, rspec_options, [
1863
2038
  [spec_a, spec_b, spec_c]
1864
2039
  ])
1865
- mock_test_cases_for_slow_test_files([
2040
+ stub_test_cases_for_slow_test_files([
1866
2041
  "#{spec_a.path}[1:1]",
1867
2042
  "#{spec_a.path}[1:2]",
1868
2043
  ])
@@ -1913,7 +2088,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1913
2088
  before do
1914
2089
  ENV['KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES'] = 'true'
1915
2090
 
1916
- # remember to mock Queue API batches to include test examples (example: a_spec.rb[1:1])
2091
+ # remember to stub Queue API batches to include test examples (example: a_spec.rb[1:1])
1917
2092
  # for the following slow test files
1918
2093
  ENV['KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN'] = "#{SPEC_DIRECTORY}/a_spec.rb"
1919
2094
  end
@@ -1961,7 +2136,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
1961
2136
  generate_specs(spec_helper_with_knapsack, rspec_options, [
1962
2137
  [spec_a, spec_b, spec_c]
1963
2138
  ])
1964
- mock_test_cases_for_slow_test_files([
2139
+ stub_test_cases_for_slow_test_files([
1965
2140
  "#{spec_a.path}[1:1]",
1966
2141
  "#{spec_a.path}[1:2]",
1967
2142
  ])
@@ -2010,7 +2185,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
2010
2185
  before do
2011
2186
  ENV['KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES'] = 'true'
2012
2187
 
2013
- # remember to mock Queue API batches to include test examples (example: a_spec.rb[1:1])
2188
+ # remember to stub Queue API batches to include test examples (example: a_spec.rb[1:1])
2014
2189
  # for the following slow test files
2015
2190
  ENV['KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN'] = "#{SPEC_DIRECTORY}/a_spec.rb"
2016
2191
  end
@@ -2068,7 +2243,7 @@ describe "#{KnapsackPro::Runners::Queue::RSpecRunner} - Integration tests", :cle
2068
2243
  generate_specs(spec_helper, rspec_options, [
2069
2244
  [spec_a, spec_b, spec_c]
2070
2245
  ])
2071
- mock_test_cases_for_slow_test_files([
2246
+ stub_test_cases_for_slow_test_files([
2072
2247
  "#{spec_a.path}[1:1]",
2073
2248
  "#{spec_a.path}[1:2]",
2074
2249
  ])
@@ -187,6 +187,60 @@ describe KnapsackPro::Adapters::RSpecAdapter do
187
187
  end
188
188
  end
189
189
 
190
+ describe '.has_require_rails_helper_option?' do
191
+ subject { described_class.has_require_rails_helper_option?(cli_args) }
192
+
193
+ context 'when require option is provided as -r' do
194
+ let(:cli_args) { ['-r', 'rails_helper'] }
195
+
196
+ it { expect(subject).to be true }
197
+ end
198
+
199
+ context 'when require option is provided as --require' do
200
+ let(:cli_args) { ['--require', 'rails_helper'] }
201
+
202
+ it { expect(subject).to be true }
203
+ end
204
+
205
+ context 'when require option is provided without delimiter' do
206
+ let(:cli_args) { ['-rrails_helper'] }
207
+
208
+ it { expect(subject).to be true }
209
+ end
210
+
211
+ context 'when require option is not provided' do
212
+ let(:cli_args) { ['--fake', 'value'] }
213
+
214
+ it { expect(subject).to be false }
215
+ end
216
+ end
217
+
218
+ describe '.rails_helper_exists?' do
219
+ subject { described_class.rails_helper_exists?(test_dir) }
220
+
221
+ let(:test_dir) { 'spec_fake' }
222
+
223
+ context 'when rails_helper exists' do
224
+ before do
225
+ File.open("#{test_dir}/rails_helper.rb", 'w')
226
+ end
227
+
228
+ after do
229
+ FileUtils.rm("#{test_dir}/rails_helper.rb")
230
+ end
231
+
232
+ it { expect(subject).to be true }
233
+ end
234
+
235
+ context 'when rails_helper does not exist' do
236
+ before do
237
+ FileUtils.rm_f("#{test_dir}/rails_helper.rb")
238
+ end
239
+
240
+ it { expect(subject).to be false }
241
+ end
242
+ end
243
+
190
244
  describe '.order_option' do
191
245
  subject { described_class.order_option(cli_args) }
192
246
 
@@ -0,0 +1,30 @@
1
+ require(KnapsackPro.root + '/lib/knapsack_pro/formatters/time_tracker')
2
+
3
+ describe KnapsackPro::Formatters::TimeTrackerFetcher do
4
+ describe '.unexecuted_test_files' do
5
+ subject { described_class.unexecuted_test_files(scheduled_paths) }
6
+
7
+ context 'when the time tracker formatter not found' do
8
+ let(:scheduled_paths) { ['a_spec.rb'] }
9
+
10
+ it do
11
+ expect(subject).to eq []
12
+ end
13
+ end
14
+
15
+ context 'when the time tracker formatter is found' do
16
+ let(:time_tracker) { instance_double(KnapsackPro::Formatters::TimeTracker) }
17
+ let(:scheduled_paths) { ['a_spec.rb', 'b_spec.rb'] }
18
+ let(:unexecuted_test_files) { double(:unexecuted_test_files) }
19
+
20
+ before do
21
+ expect(described_class).to receive(:call).and_return(time_tracker)
22
+ expect(time_tracker).to receive(:unexecuted_test_files).with(scheduled_paths).and_return(unexecuted_test_files)
23
+ end
24
+
25
+ it do
26
+ expect(subject).to eq unexecuted_test_files
27
+ end
28
+ end
29
+ end
30
+ end
@@ -382,7 +382,7 @@ class TestTimeTracker
382
382
 
383
383
  def run_specs(specs)
384
384
  files = Array(specs).map.with_index do |spec, i|
385
- file = Tempfile.new(["time_tracker_#{i}", "_spec.rb"], "./spec/knapsack_pro/formatters/")
385
+ file = Tempfile.new(["tmp_time_tracker_#{i}", "_spec.rb"], "./spec/knapsack_pro/formatters/")
386
386
  file.write(spec)
387
387
  file.rewind
388
388
  file
@@ -117,31 +117,52 @@ describe KnapsackPro::Pure::Queue::RSpecPure do
117
117
  end
118
118
 
119
119
  describe '#prepare_cli_args' do
120
- subject { rspec_pure.prepare_cli_args(args, has_format_option, test_dir) }
120
+ subject { rspec_pure.prepare_cli_args(args, has_format_option, has_require_rails_helper_option, rails_helper_exists, test_dir) }
121
121
 
122
122
  context 'when no args' do
123
123
  let(:args) { nil }
124
124
  let(:has_format_option) { false }
125
+ let(:has_require_rails_helper_option) { false }
125
126
  let(:test_dir) { 'spec' }
126
127
 
127
- it 'adds the default progress formatter and the default path and the time tracker formatter' do
128
- expect(subject).to eq [
129
- '--format', 'progress',
130
- '--default-path', 'spec',
131
- '--format', 'KnapsackPro::Formatters::TimeTracker',
132
- ]
128
+ context 'when rails_helper does not exist' do
129
+ let(:rails_helper_exists) { false }
130
+
131
+ it 'adds the default progress formatter, the default path and the time tracker formatter, does not add require rails_helper' do
132
+ expect(subject).to eq [
133
+ '--format', 'progress',
134
+ '--default-path', 'spec',
135
+ '--format', 'KnapsackPro::Formatters::TimeTracker',
136
+ ]
137
+ end
138
+ end
139
+
140
+ context 'when rails_helper exists' do
141
+ let(:rails_helper_exists) { true }
142
+
143
+ it 'adds the default progress formatter, require rails_helper, the default path and the time tracker formatter' do
144
+ expect(subject).to eq [
145
+ '--format', 'progress',
146
+ '--require', 'rails_helper',
147
+ '--default-path', 'spec',
148
+ '--format', 'KnapsackPro::Formatters::TimeTracker',
149
+ ]
150
+ end
133
151
  end
134
152
  end
135
153
 
136
154
  context 'when args are present and a custom test directory is set' do
137
- let(:args) { '--color --profile' }
155
+ let(:args) { '--color --profile --require rails_helper' }
138
156
  let(:has_format_option) { false }
157
+ let(:has_require_rails_helper_option) { true }
158
+ let(:rails_helper_exists) { true }
139
159
  let(:test_dir) { 'custom_spec_dir' }
140
160
 
141
161
  it do
142
162
  expect(subject).to eq [
143
163
  '--color',
144
164
  '--profile',
165
+ '--require', 'rails_helper',
145
166
  '--format', 'progress',
146
167
  '--default-path', 'custom_spec_dir',
147
168
  '--format', 'KnapsackPro::Formatters::TimeTracker',
@@ -150,8 +171,10 @@ describe KnapsackPro::Pure::Queue::RSpecPure do
150
171
  end
151
172
 
152
173
  context 'when args are present and has format option' do
153
- let(:args) { '--color --profile --format d' }
174
+ let(:args) { '--color --profile --format d --require rails_helper' }
154
175
  let(:has_format_option) { true }
176
+ let(:has_require_rails_helper_option) { true }
177
+ let(:rails_helper_exists) { true }
155
178
  let(:test_dir) { 'spec' }
156
179
 
157
180
  it 'uses the format option from args instead of the default formatter' do
@@ -159,6 +182,7 @@ describe KnapsackPro::Pure::Queue::RSpecPure do
159
182
  '--color',
160
183
  '--profile',
161
184
  '--format', 'd',
185
+ '--require', 'rails_helper',
162
186
  '--default-path', 'spec',
163
187
  '--format', 'KnapsackPro::Formatters::TimeTracker',
164
188
  ]
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: 7.0.0
4
+ version: 7.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ArturT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-23 00:00:00.000000000 Z
11
+ date: 2024-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -340,6 +340,7 @@ files:
340
340
  - spec/knapsack_pro/crypto/decryptor_spec.rb
341
341
  - spec/knapsack_pro/crypto/digestor_spec.rb
342
342
  - spec/knapsack_pro/crypto/encryptor_spec.rb
343
+ - spec/knapsack_pro/formatters/time_tracker_fetcher_spec.rb
343
344
  - spec/knapsack_pro/formatters/time_tracker_specs.rb
344
345
  - spec/knapsack_pro/hooks/queue_spec.rb
345
346
  - spec/knapsack_pro/logger_wrapper_spec.rb
@@ -462,6 +463,7 @@ test_files:
462
463
  - spec/knapsack_pro/crypto/decryptor_spec.rb
463
464
  - spec/knapsack_pro/crypto/digestor_spec.rb
464
465
  - spec/knapsack_pro/crypto/encryptor_spec.rb
466
+ - spec/knapsack_pro/formatters/time_tracker_fetcher_spec.rb
465
467
  - spec/knapsack_pro/formatters/time_tracker_specs.rb
466
468
  - spec/knapsack_pro/hooks/queue_spec.rb
467
469
  - spec/knapsack_pro/logger_wrapper_spec.rb