knapsack_pro 9.0.0 → 9.2.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.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/lib/knapsack_pro/adapters/base_adapter.rb +1 -17
  3. data/lib/knapsack_pro/adapters/minitest_adapter.rb +8 -13
  4. data/lib/knapsack_pro/adapters/rspec_adapter.rb +11 -9
  5. data/lib/knapsack_pro/build_distribution_fetcher.rb +22 -18
  6. data/lib/knapsack_pro/client/api/v1/build_distributions.rb +2 -7
  7. data/lib/knapsack_pro/client/api/v1/queues.rb +27 -0
  8. data/lib/knapsack_pro/client/connection.rb +1 -1
  9. data/lib/knapsack_pro/config/env.rb +9 -32
  10. data/lib/knapsack_pro/queue_allocator.rb +2 -1
  11. data/lib/knapsack_pro/queue_initializer.rb +21 -0
  12. data/lib/knapsack_pro/regular_allocator.rb +2 -1
  13. data/lib/knapsack_pro/rspec_slow_test_file_finder.rb +20 -0
  14. data/lib/knapsack_pro/slow_test_file_determiner.rb +0 -22
  15. data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +43 -69
  16. data/lib/knapsack_pro/test_case_mergers/rspec_merger.rb +19 -31
  17. data/lib/knapsack_pro/test_file_finder.rb +15 -42
  18. data/lib/knapsack_pro/test_file_presenter.rb +4 -0
  19. data/lib/knapsack_pro/test_suite.rb +8 -35
  20. data/lib/knapsack_pro/version.rb +1 -1
  21. data/lib/knapsack_pro.rb +1 -3
  22. data/lib/tasks/queue/rspec.rake +12 -0
  23. data/lib/tasks/rspec.rake +8 -4
  24. metadata +9 -204
  25. data/.circleci/config.yml +0 -468
  26. data/.github/assets/install-button.png +0 -0
  27. data/.github/assets/knapsack-diamonds.png +0 -0
  28. data/.github/dependabot.yml +0 -11
  29. data/.github/pull_request_template.md +0 -11
  30. data/.gitignore +0 -39
  31. data/.rspec +0 -5
  32. data/CHANGELOG.md +0 -1995
  33. data/Gemfile +0 -13
  34. data/LICENSE +0 -22
  35. data/README.md +0 -90
  36. data/Rakefile +0 -2
  37. data/knapsack_pro.gemspec +0 -43
  38. data/lib/knapsack_pro/slow_test_file_finder.rb +0 -29
  39. data/lib/knapsack_pro/test_case_mergers/base_merger.rb +0 -31
  40. data/lib/knapsack_pro/test_files_with_test_cases_composer.rb +0 -24
  41. data/spec/fixtures/test_file_list_source_file.txt +0 -6
  42. data/spec/fixtures/vcr_cassettes/api/v1/build_distributions/subset/invalid_test_suite_token.yml +0 -59
  43. data/spec/fixtures/vcr_cassettes/api/v1/build_distributions/subset/success.yml +0 -61
  44. data/spec/fixtures/vcr_cassettes/api/v1/build_subsets/create/invalid_test_suite_token.yml +0 -50
  45. data/spec/fixtures/vcr_cassettes/api/v1/build_subsets/create/success.yml +0 -50
  46. data/spec/integration/api/build_distributions_subset_spec.rb +0 -77
  47. data/spec/integration/api/build_subsets_create_spec.rb +0 -77
  48. data/spec/integration/runners/fallback_spec.rb +0 -131
  49. data/spec/integration/runners/queue/cucumber_runner_fallback_spec.rb +0 -129
  50. data/spec/integration/runners/queue/minitest_runner_fallback_spec.rb +0 -129
  51. data/spec/integration/runners/queue/rspec_runner.rb +0 -80
  52. data/spec/integration/runners/queue/rspec_runner_fallback_spec.rb +0 -137
  53. data/spec/integration/runners/queue/rspec_runner_spec.rb +0 -2672
  54. data/spec/knapsack_pro/adapters/base_adapter_spec.rb +0 -221
  55. data/spec/knapsack_pro/adapters/cucumber_adapter_spec.rb +0 -216
  56. data/spec/knapsack_pro/adapters/minitest_adapter_spec.rb +0 -189
  57. data/spec/knapsack_pro/adapters/rspec_adapter_spec.rb +0 -427
  58. data/spec/knapsack_pro/adapters/spinach_adapter_spec.rb +0 -61
  59. data/spec/knapsack_pro/adapters/test_unit_adapter_spec.rb +0 -86
  60. data/spec/knapsack_pro/base_allocator_builder_spec.rb +0 -102
  61. data/spec/knapsack_pro/build_distribution_fetcher_spec.rb +0 -89
  62. data/spec/knapsack_pro/client/api/action_spec.rb +0 -17
  63. data/spec/knapsack_pro/client/api/v1/base_spec.rb +0 -2
  64. data/spec/knapsack_pro/client/api/v1/build_distributions_spec.rb +0 -95
  65. data/spec/knapsack_pro/client/api/v1/build_subsets_spec.rb +0 -35
  66. data/spec/knapsack_pro/client/api/v1/queues_spec.rb +0 -83
  67. data/spec/knapsack_pro/client/connection_spec.rb +0 -581
  68. data/spec/knapsack_pro/config/ci/app_veyor_spec.rb +0 -87
  69. data/spec/knapsack_pro/config/ci/base_spec.rb +0 -10
  70. data/spec/knapsack_pro/config/ci/buildkite_spec.rb +0 -135
  71. data/spec/knapsack_pro/config/ci/circle_spec.rb +0 -122
  72. data/spec/knapsack_pro/config/ci/cirrus_ci_spec.rb +0 -87
  73. data/spec/knapsack_pro/config/ci/codefresh_spec.rb +0 -81
  74. data/spec/knapsack_pro/config/ci/codeship_spec.rb +0 -80
  75. data/spec/knapsack_pro/config/ci/github_actions_spec.rb +0 -140
  76. data/spec/knapsack_pro/config/ci/gitlab_ci_spec.rb +0 -137
  77. data/spec/knapsack_pro/config/ci/heroku_spec.rb +0 -87
  78. data/spec/knapsack_pro/config/ci/semaphore2_spec.rb +0 -133
  79. data/spec/knapsack_pro/config/ci/semaphore_spec.rb +0 -87
  80. data/spec/knapsack_pro/config/ci/travis_spec.rb +0 -73
  81. data/spec/knapsack_pro/config/env_generator_spec.rb +0 -52
  82. data/spec/knapsack_pro/config/env_spec.rb +0 -1291
  83. data/spec/knapsack_pro/config/temp_files_spec.rb +0 -25
  84. data/spec/knapsack_pro/crypto/branch_encryptor_spec.rb +0 -53
  85. data/spec/knapsack_pro/crypto/decryptor_spec.rb +0 -83
  86. data/spec/knapsack_pro/crypto/digestor_spec.rb +0 -13
  87. data/spec/knapsack_pro/crypto/encryptor_spec.rb +0 -58
  88. data/spec/knapsack_pro/formatters/time_tracker_fetcher_spec.rb +0 -27
  89. data/spec/knapsack_pro/formatters/time_tracker_spec.rb +0 -448
  90. data/spec/knapsack_pro/hooks/queue_spec.rb +0 -199
  91. data/spec/knapsack_pro/presenter_spec.rb +0 -57
  92. data/spec/knapsack_pro/pure/queue/rspec_pure_spec.rb +0 -248
  93. data/spec/knapsack_pro/queue_spec.rb +0 -35
  94. data/spec/knapsack_pro/report_spec.rb +0 -232
  95. data/spec/knapsack_pro/repository_adapter_initiator_spec.rb +0 -21
  96. data/spec/knapsack_pro/repository_adapters/base_adapter_spec.rb +0 -13
  97. data/spec/knapsack_pro/repository_adapters/env_adapter_spec.rb +0 -27
  98. data/spec/knapsack_pro/repository_adapters/git_adapter_spec.rb +0 -106
  99. data/spec/knapsack_pro/runners/base_runner_spec.rb +0 -87
  100. data/spec/knapsack_pro/runners/cucumber_runner_spec.rb +0 -92
  101. data/spec/knapsack_pro/runners/minitest_runner_spec.rb +0 -57
  102. data/spec/knapsack_pro/runners/queue/base_runner_spec.rb +0 -73
  103. data/spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb +0 -209
  104. data/spec/knapsack_pro/runners/queue/minitest_runner_spec.rb +0 -203
  105. data/spec/knapsack_pro/runners/rspec_runner_spec.rb +0 -111
  106. data/spec/knapsack_pro/runners/spinach_runner_spec.rb +0 -56
  107. data/spec/knapsack_pro/runners/test_unit_runner_spec.rb +0 -62
  108. data/spec/knapsack_pro/slow_test_file_determiner_spec.rb +0 -119
  109. data/spec/knapsack_pro/slow_test_file_finder_spec.rb +0 -42
  110. data/spec/knapsack_pro/task_loader_spec.rb +0 -14
  111. data/spec/knapsack_pro/test_case_detectors/rspec_test_example_detector_spec.rb +0 -217
  112. data/spec/knapsack_pro/test_case_mergers/base_merger_spec.rb +0 -27
  113. data/spec/knapsack_pro/test_case_mergers/rspec_merger_spec.rb +0 -81
  114. data/spec/knapsack_pro/test_file_cleaner_spec.rb +0 -11
  115. data/spec/knapsack_pro/test_file_finder_spec.rb +0 -176
  116. data/spec/knapsack_pro/test_file_pattern_spec.rb +0 -49
  117. data/spec/knapsack_pro/test_file_presenter_spec.rb +0 -22
  118. data/spec/knapsack_pro/test_files_with_test_cases_composer_spec.rb +0 -41
  119. data/spec/knapsack_pro/test_flat_distributor_spec.rb +0 -60
  120. data/spec/knapsack_pro/tracker_spec.rb +0 -184
  121. data/spec/knapsack_pro/utils_spec.rb +0 -55
  122. data/spec/knapsack_pro_spec.rb +0 -116
  123. data/spec/spec_helper.rb +0 -47
  124. data/spec/support/.gitkeep +0 -0
  125. data/spec/support/fakes/cucumber.rb +0 -25
  126. data/spec/support/fakes/minitest.rb +0 -18
  127. data/spec/support/shared_examples/adapter.rb +0 -17
  128. data/spec_fake/controllers/users_controller_spec.rb +0 -0
  129. data/spec_fake/models/admin_spec.rb +0 -0
  130. data/spec_fake/models/user_spec.rb +0 -0
  131. data/spec_fake/spec_helper.rb +0 -0
  132. data/spec_time_tracker/spec_helper.rb +0 -29
  133. data/test_fake/a_test.rb +0 -0
  134. data/test_fake/b_test.rb +0 -0
@@ -1,73 +0,0 @@
1
- describe KnapsackPro::Runners::Queue::BaseRunner do
2
- describe '.run' do
3
- it do
4
- expect {
5
- described_class.run(nil)
6
- }.to raise_error NotImplementedError
7
- end
8
- end
9
-
10
- describe '.run_tests' do
11
- it do
12
- expect {
13
- described_class.run_tests(nil, nil, nil, nil)
14
- }.to raise_error NotImplementedError
15
- end
16
- end
17
-
18
- describe 'instance methods' do
19
- let(:adapter_class) { double }
20
- let(:runner) do
21
- described_class.new(adapter_class)
22
- end
23
- let(:allocator) { instance_double(KnapsackPro::QueueAllocator) }
24
- let(:allocator_builder) { instance_double(KnapsackPro::QueueAllocatorBuilder) }
25
-
26
- before do
27
- expect(KnapsackPro::QueueAllocatorBuilder).to receive(:new).with(adapter_class).and_return(allocator_builder)
28
- expect(allocator_builder).to receive(:allocator).and_return(allocator)
29
- end
30
-
31
- describe '#test_file_paths' do
32
- subject { runner.test_file_paths(args) }
33
-
34
- context 'when can_initialize_queue flag has value' do
35
- let(:can_initialize_queue) { double }
36
- let(:executed_test_files) { double }
37
- let(:args) do
38
- {
39
- can_initialize_queue: can_initialize_queue,
40
- executed_test_files: executed_test_files,
41
- }
42
- end
43
- let(:test_file_paths) { double }
44
-
45
- before do
46
- expect(allocator).to receive(:test_file_paths).with(can_initialize_queue, executed_test_files).and_return(test_file_paths)
47
- end
48
-
49
- it { should eq test_file_paths }
50
- end
51
-
52
- context 'when can_initialize_queue flag has no value' do
53
- let(:args) { {} }
54
-
55
- it do
56
- expect { subject }.to raise_error(KeyError)
57
- end
58
- end
59
- end
60
-
61
- describe '#test_dir' do
62
- let(:test_dir) { double }
63
-
64
- subject { runner.test_dir }
65
-
66
- before do
67
- expect(allocator_builder).to receive(:test_dir).and_return(test_dir)
68
- end
69
-
70
- it { should eq test_dir }
71
- end
72
- end
73
- end
@@ -1,209 +0,0 @@
1
- describe KnapsackPro::Runners::Queue::CucumberRunner do
2
- describe '.run' do
3
- let(:test_suite_token_cucumber) { 'fake-token' }
4
- let(:queue_id) { 'fake-queue-id' }
5
- let(:test_dir) { 'fake-features-dir' }
6
- let(:runner) do
7
- instance_double(described_class, test_dir: test_dir)
8
- end
9
-
10
- subject { described_class.run(args) }
11
-
12
- before do
13
- expect(described_class).to receive(:require).with('cucumber/rake/task')
14
-
15
- expect(KnapsackPro::Config::Env).to receive(:test_suite_token_cucumber).and_return(test_suite_token_cucumber)
16
- expect(KnapsackPro::Config::EnvGenerator).to receive(:set_queue_id).and_return(queue_id)
17
-
18
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_TEST_SUITE_TOKEN', test_suite_token_cucumber)
19
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_QUEUE_MODE_ENABLED', 'true')
20
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_QUEUE_ID', queue_id)
21
-
22
- expect(KnapsackPro::Config::Env).to receive(:set_test_runner_adapter).with(KnapsackPro::Adapters::CucumberAdapter)
23
-
24
- expect(described_class).to receive(:new).with(KnapsackPro::Adapters::CucumberAdapter).and_return(runner)
25
- end
26
-
27
- context 'when args are provided' do
28
- let(:args) { '--retry 5 --no-strict-flaky' }
29
-
30
- it do
31
- expected_exitstatus = 0
32
- expected_accumulator = {
33
- status: :completed,
34
- exitstatus: expected_exitstatus
35
- }
36
- accumulator = {
37
- status: :next,
38
- runner: runner,
39
- can_initialize_queue: true,
40
- args: args,
41
- exitstatus: 0,
42
- node_test_file_paths: [],
43
- }
44
- expect(described_class).to receive(:handle_signal!)
45
- expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
46
-
47
- expect(Kernel).to receive(:exit).with(expected_exitstatus)
48
-
49
- subject
50
- end
51
- end
52
-
53
- context 'when args are not provided' do
54
- let(:args) { nil }
55
-
56
- it do
57
- expected_exitstatus = 0
58
- expected_accumulator = {
59
- status: :completed,
60
- exitstatus: expected_exitstatus
61
- }
62
- accumulator = {
63
- status: :next,
64
- runner: runner,
65
- can_initialize_queue: true,
66
- args: nil,
67
- exitstatus: 0,
68
- node_test_file_paths: [],
69
- }
70
- expect(described_class).to receive(:handle_signal!)
71
- expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
72
-
73
- expect(Kernel).to receive(:exit).with(expected_exitstatus)
74
-
75
- subject
76
- end
77
- end
78
- end
79
-
80
- describe '.run_tests' do
81
- let(:test_dir) { 'fake-features-dir' }
82
- let(:runner) do
83
- instance_double(described_class, test_dir: test_dir)
84
- end
85
- let(:can_initialize_queue) { double(:can_initialize_queue) }
86
- let(:args) { '--retry 5 --no-strict-flaky' }
87
- let(:exitstatus) { 0 }
88
- let(:node_test_file_paths) { [] }
89
- let(:accumulator) do
90
- {
91
- runner: runner,
92
- can_initialize_queue: can_initialize_queue,
93
- args: args,
94
- exitstatus: exitstatus,
95
- node_test_file_paths: node_test_file_paths,
96
- }
97
- end
98
-
99
- subject { described_class.run_tests(accumulator) }
100
-
101
- before do
102
- expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files: node_test_file_paths).and_return(test_file_paths)
103
- end
104
-
105
- context 'when test files exist' do
106
- let(:test_file_paths) { ['features/a.feature', 'features/b.feature'] }
107
- let(:child_status) { double }
108
-
109
- before do
110
- subset_queue_id = 'fake-subset-queue-id'
111
- expect(KnapsackPro::Config::EnvGenerator).to receive(:set_subset_queue_id).and_return(subset_queue_id)
112
-
113
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_SUBSET_QUEUE_ID', subset_queue_id)
114
-
115
- tracker = instance_double(KnapsackPro::Tracker)
116
- expect(KnapsackPro).to receive(:tracker).twice.and_return(tracker)
117
- expect(tracker).to receive(:reset!)
118
- expect(tracker).to receive(:set_prerun_tests).with(test_file_paths)
119
-
120
- expect(KnapsackPro::Hooks::Queue).to receive(:call_before_subset_queue)
121
-
122
- # .cucumber_run
123
- expect(Kernel).to receive(:system).with('bundle exec cucumber --retry 5 --no-strict-flaky --require fake-features-dir -- "features/a.feature" "features/b.feature"')
124
-
125
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_BEFORE_QUEUE_HOOK_CALLED', 'true')
126
-
127
- allow(described_class).to receive(:child_status).and_return(child_status)
128
- expect(child_status).to receive(:exited?).and_return(process_exited)
129
- allow(child_status).to receive(:exitstatus).and_return(exitstatus)
130
- end
131
-
132
- context 'when system process finished (exited)' do
133
- let(:process_exited) { true }
134
-
135
- context 'when tests are passing' do
136
- let(:exitstatus) { 0 }
137
-
138
- it 'returns exit code 0' do
139
- expect(subject).to eq({
140
- status: :next,
141
- runner: runner,
142
- can_initialize_queue: false,
143
- args: args,
144
- exitstatus: exitstatus,
145
- node_test_file_paths: test_file_paths,
146
- })
147
- end
148
- end
149
-
150
- context 'when tests are failing' do
151
- let(:exitstatus) { 1 }
152
-
153
- it 'returns exit code 1' do
154
- expect(subject).to eq({
155
- status: :next,
156
- runner: runner,
157
- can_initialize_queue: false,
158
- args: args,
159
- exitstatus: 1, # tests failed
160
- node_test_file_paths: test_file_paths,
161
- })
162
- end
163
- end
164
- end
165
-
166
- context 'when system process did not finish (it has not exited)' do
167
- let(:process_exited) { false }
168
-
169
- it 'raises an error' do
170
- expect { subject }.to raise_error(RuntimeError, /^Cucumber process execution failed/)
171
- end
172
- end
173
- end
174
-
175
- context 'when test files do not exist' do
176
- let(:test_file_paths) { [] }
177
-
178
- context 'when node_test_file_paths exists' do
179
- let(:node_test_file_paths) { ['features/a.feature'] }
180
-
181
- it 'returns exit code 0' do
182
- expect(KnapsackPro::Adapters::CucumberAdapter).to receive(:verify_bind_method_called)
183
-
184
- expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
185
- expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
186
-
187
- expect(subject).to eq({
188
- status: :completed,
189
- exitstatus: exitstatus,
190
- })
191
- end
192
- end
193
-
194
- context 'when node_test_file_paths do not exist' do
195
- let(:node_test_file_paths) { [] }
196
-
197
- it 'returns exit code 0' do
198
- expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
199
- expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
200
-
201
- expect(subject).to eq({
202
- status: :completed,
203
- exitstatus: exitstatus,
204
- })
205
- end
206
- end
207
- end
208
- end
209
- end
@@ -1,203 +0,0 @@
1
- describe KnapsackPro::Runners::Queue::MinitestRunner do
2
- describe '.run' do
3
- let(:test_suite_token_minitest) { 'fake-token' }
4
- let(:queue_id) { 'fake-queue-id' }
5
- let(:test_dir) { 'fake-test-dir' }
6
- let(:runner) do
7
- instance_double(described_class, test_dir: test_dir)
8
- end
9
-
10
- subject { described_class.run(args) }
11
-
12
- before do
13
- expect(described_class).to receive(:require).with('minitest')
14
-
15
- expect(KnapsackPro::Config::Env).to receive(:test_suite_token_minitest).and_return(test_suite_token_minitest)
16
- expect(KnapsackPro::Config::EnvGenerator).to receive(:set_queue_id).and_return(queue_id)
17
-
18
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_TEST_SUITE_TOKEN', test_suite_token_minitest)
19
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_QUEUE_MODE_ENABLED', 'true')
20
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_QUEUE_ID', queue_id)
21
-
22
- expect(KnapsackPro::Config::Env).to receive(:set_test_runner_adapter).with(KnapsackPro::Adapters::MinitestAdapter)
23
-
24
- expect(described_class).to receive(:new).with(KnapsackPro::Adapters::MinitestAdapter).and_return(runner)
25
-
26
- expect($LOAD_PATH).to receive(:unshift).with(test_dir)
27
- end
28
-
29
- context 'when args are provided' do
30
- let(:args) { '--verbose --pride' }
31
-
32
- it do
33
- expected_exitstatus = 0
34
- expected_accumulator = {
35
- status: :completed,
36
- exitstatus: expected_exitstatus
37
- }
38
- accumulator = {
39
- status: :next,
40
- runner: runner,
41
- can_initialize_queue: true,
42
- args: ['--verbose', '--pride'],
43
- exitstatus: 0,
44
- node_test_file_paths: [],
45
- }
46
- expect(described_class).to receive(:handle_signal!)
47
- expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
48
-
49
- expect(Kernel).to receive(:exit).with(expected_exitstatus)
50
-
51
- subject
52
- end
53
- end
54
-
55
- context 'when args are not provided' do
56
- let(:args) { nil }
57
-
58
- it do
59
- expected_exitstatus = 0
60
- expected_accumulator = {
61
- status: :completed,
62
- exitstatus: expected_exitstatus
63
- }
64
- accumulator = {
65
- status: :next,
66
- runner: runner,
67
- can_initialize_queue: true,
68
- args: [],
69
- exitstatus: 0,
70
- node_test_file_paths: [],
71
- }
72
- expect(described_class).to receive(:handle_signal!)
73
- expect(described_class).to receive(:run_tests).with(accumulator).and_return(expected_accumulator)
74
-
75
- expect(Kernel).to receive(:exit).with(expected_exitstatus)
76
-
77
- subject
78
- end
79
- end
80
- end
81
-
82
- describe '.run_tests' do
83
- let(:runner) { instance_double(described_class) }
84
- let(:can_initialize_queue) { double(:can_initialize_queue) }
85
- let(:args) { ['--verbose', '--pride'] }
86
- let(:exitstatus) { 0 }
87
- let(:node_test_file_paths) { [] }
88
- let(:accumulator) do
89
- {
90
- runner: runner,
91
- can_initialize_queue: can_initialize_queue,
92
- args: args,
93
- exitstatus: exitstatus,
94
- node_test_file_paths: node_test_file_paths,
95
- }
96
- end
97
-
98
- subject { described_class.run_tests(accumulator) }
99
-
100
- before do
101
- expect(runner).to receive(:test_file_paths).with(can_initialize_queue: can_initialize_queue, executed_test_files: node_test_file_paths).and_return(test_file_paths)
102
- end
103
-
104
- context 'when test files exist' do
105
- let(:test_file_paths) { ['a_test.rb', 'b_test.rb', 'fake_path_test.rb'] }
106
-
107
- before do
108
- subset_queue_id = 'fake-subset-queue-id'
109
- expect(KnapsackPro::Config::EnvGenerator).to receive(:set_subset_queue_id).and_return(subset_queue_id)
110
-
111
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_SUBSET_QUEUE_ID', subset_queue_id)
112
-
113
- tracker = instance_double(KnapsackPro::Tracker)
114
- expect(KnapsackPro).to receive(:tracker).twice.and_return(tracker)
115
- expect(tracker).to receive(:reset!)
116
- expect(tracker).to receive(:set_prerun_tests).with(test_file_paths)
117
-
118
- # .minitest_run
119
- allow(File).to receive(:exist?)
120
- expect(File).to receive(:exist?).with('./a_test.rb').and_return(true)
121
- expect(File).to receive(:exist?).with('./b_test.rb').and_return(true)
122
- expect(File).to receive(:exist?).with('./fake_path_test.rb').and_return(false)
123
- expect(described_class).to receive(:require).with('./a_test.rb')
124
- expect(described_class).to receive(:require).with('./b_test.rb')
125
- expect(described_class).to_not receive(:require).with('./fake_path_test.rb')
126
-
127
- expect(Minitest).to receive(:run).with(args).and_return(is_tests_green)
128
-
129
- expect(Minitest::Runnable).to receive(:reset)
130
-
131
- expect(KnapsackPro::Hooks::Queue).to receive(:call_before_subset_queue)
132
-
133
- expect(KnapsackPro::Hooks::Queue).to receive(:call_after_subset_queue)
134
-
135
- expect(KnapsackPro::Report).to receive(:save_subset_queue_to_file)
136
- end
137
-
138
- context 'when tests are passing' do
139
- let(:is_tests_green) { true }
140
-
141
- it 'returns exit code 0' do
142
- expect(subject).to eq({
143
- status: :next,
144
- runner: runner,
145
- can_initialize_queue: false,
146
- args: args,
147
- exitstatus: exitstatus,
148
- node_test_file_paths: test_file_paths,
149
- })
150
- end
151
- end
152
-
153
- context 'when tests are failing' do
154
- let(:is_tests_green) { false }
155
-
156
- it 'returns exit code 1' do
157
- expect(subject).to eq({
158
- status: :next,
159
- runner: runner,
160
- can_initialize_queue: false,
161
- args: args,
162
- exitstatus: 1, # tests failed
163
- node_test_file_paths: test_file_paths,
164
- })
165
- end
166
- end
167
- end
168
-
169
- context 'when test files do not exist' do
170
- let(:test_file_paths) { [] }
171
-
172
- context 'when node_test_file_paths exists' do
173
- let(:node_test_file_paths) { ['a_test.rb'] }
174
-
175
- it 'returns exit code 0' do
176
- expect(KnapsackPro::Adapters::MinitestAdapter).to receive(:verify_bind_method_called)
177
-
178
- expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
179
- expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
180
-
181
- expect(subject).to eq({
182
- status: :completed,
183
- exitstatus: exitstatus,
184
- })
185
- end
186
- end
187
-
188
- context 'when node_test_file_paths do not exist' do
189
- let(:node_test_file_paths) { [] }
190
-
191
- it 'returns exit code 0' do
192
- expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
193
- expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
194
-
195
- expect(subject).to eq({
196
- status: :completed,
197
- exitstatus: exitstatus,
198
- })
199
- end
200
- end
201
- end
202
- end
203
- end
@@ -1,111 +0,0 @@
1
- require 'rspec/core/rake_task'
2
-
3
- describe KnapsackPro::Runners::RSpecRunner do
4
- subject { described_class.new(KnapsackPro::Adapters::RSpecAdapter) }
5
-
6
- it { should be_kind_of KnapsackPro::Runners::BaseRunner }
7
-
8
- describe '.run' do
9
- let(:args) { '--profile --color' }
10
-
11
- let(:test_suite_token_rspec) { 'fake-token' }
12
-
13
- subject { described_class.run(args) }
14
-
15
- before do
16
- expect(KnapsackPro::Config::Env).to receive(:test_suite_token_rspec).and_return(test_suite_token_rspec)
17
-
18
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_TEST_SUITE_TOKEN', test_suite_token_rspec)
19
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_REGULAR_MODE_ENABLED', 'true')
20
- expect(ENV).to receive(:[]=).with('KNAPSACK_PRO_RSPEC_OPTIONS', args)
21
-
22
- expect(KnapsackPro::Config::Env).to receive(:set_test_runner_adapter).with(KnapsackPro::Adapters::RSpecAdapter)
23
-
24
- expect(described_class).to receive(:new)
25
- .with(KnapsackPro::Adapters::RSpecAdapter).and_return(runner)
26
- end
27
-
28
- context 'when test files were returned by Knapsack Pro API' do
29
- let(:test_dir) { 'fake-test-dir' }
30
- let(:test_file_paths) { ['spec/a_spec.rb', 'spec/b_spec.rb[1:1]'] }
31
- let(:stringify_test_file_paths) { test_file_paths.join(' ') }
32
- let(:runner) do
33
- instance_double(described_class,
34
- test_dir: test_dir,
35
- test_file_paths: test_file_paths,
36
- stringify_test_file_paths: stringify_test_file_paths,
37
- test_files_to_execute_exist?: true)
38
- end
39
- let(:task) { double }
40
- let(:task_config) { double }
41
-
42
- before do
43
- expect(KnapsackPro::Adapters::RSpecAdapter).to receive(:verify_bind_method_called).ordered
44
-
45
- expect(Rake::Task).to receive(:[]).with('knapsack_pro:rspec_run').at_least(1).and_return(task)
46
-
47
- expect(RSpec::Core::RakeTask).to receive(:new).with('knapsack_pro:rspec_run').and_yield(task_config)
48
- expect(RSpec::Core::ConfigurationOptions).to receive_message_chain(:new, :options).and_return({})
49
- expect(task_config).to receive(:rspec_opts=).with('--profile --color --format progress --format KnapsackPro::Formatters::TimeTracker --default-path fake-test-dir spec/a_spec.rb spec/b_spec.rb[1:1]')
50
- expect(task_config).to receive(:pattern=).with([])
51
- end
52
-
53
- shared_examples 'invokes RSpec rake task' do
54
- context 'when rake task already exists' do
55
- before do
56
- expect(Rake::Task).to receive(:task_defined?).with('knapsack_pro:rspec_run').and_return(true)
57
- expect(task).to receive(:clear)
58
- end
59
-
60
- it do
61
- result = double(:result)
62
- expect(task).to receive(:invoke).and_return(result)
63
- expect(subject).to eq result
64
- end
65
- end
66
-
67
- context "when rake task doesn't exist" do
68
- before do
69
- expect(Rake::Task).to receive(:task_defined?).with('knapsack_pro:rspec_run').and_return(false)
70
- expect(task).not_to receive(:clear)
71
- end
72
-
73
- it do
74
- result = double(:result)
75
- expect(task).to receive(:invoke).and_return(result)
76
- expect(subject).to eq result
77
- end
78
- end
79
- end
80
-
81
- context 'when the default log level' do
82
- before do
83
- expect(task_config).to receive(:verbose=).with(true)
84
- end
85
-
86
- it_behaves_like 'invokes RSpec rake task'
87
- end
88
-
89
- context 'when the warning log level' do
90
- before do
91
- expect(KnapsackPro::Config::Env).to receive(:log_level).and_return(::Logger::WARN)
92
-
93
- expect(task_config).to receive(:verbose=).with(false)
94
- end
95
-
96
- it_behaves_like 'invokes RSpec rake task'
97
- end
98
- end
99
-
100
- context 'when test files were not returned by Knapsack Pro API' do
101
- let(:runner) do
102
- instance_double(described_class,
103
- test_files_to_execute_exist?: false)
104
- end
105
-
106
- it "doesn't run tests" do
107
- subject
108
- end
109
- end
110
- end
111
- end
@@ -1,56 +0,0 @@
1
- describe KnapsackPro::Runners::SpinachRunner do
2
- subject { described_class.new(KnapsackPro::Adapters::SpinachAdapter) }
3
-
4
- it { should be_kind_of KnapsackPro::Runners::BaseRunner }
5
-
6
- describe '.run' do
7
- let(:args) { '--custom-arg' }
8
-
9
- subject { described_class.run(args) }
10
-
11
- before do
12
- stub_const("ENV", { 'KNAPSACK_PRO_TEST_SUITE_TOKEN_SPINACH' => 'spinach-token' })
13
-
14
- expect(KnapsackPro::Config::Env).to receive(:set_test_runner_adapter).with(KnapsackPro::Adapters::SpinachAdapter)
15
-
16
- expect(described_class).to receive(:new)
17
- .with(KnapsackPro::Adapters::SpinachAdapter).and_return(runner)
18
- end
19
-
20
- context 'when test files were returned by Knapsack Pro API' do
21
- let(:test_file_paths) { ['features/a.feature', 'features/b.feature'] }
22
- let(:stringify_test_file_paths) { test_file_paths.join(' ') }
23
- let(:test_dir) { 'fake-test-dir' }
24
- let(:runner) do
25
- instance_double(described_class,
26
- test_dir: test_dir,
27
- test_file_paths: test_file_paths,
28
- stringify_test_file_paths: stringify_test_file_paths,
29
- test_files_to_execute_exist?: true)
30
- end
31
-
32
- it do
33
- expect(KnapsackPro::Adapters::SpinachAdapter).to receive(:verify_bind_method_called)
34
-
35
- tracker = instance_double(KnapsackPro::Tracker)
36
- expect(KnapsackPro).to receive(:tracker).and_return(tracker)
37
- expect(tracker).to receive(:set_prerun_tests).with(test_file_paths)
38
-
39
- expect(Kernel).to receive(:exec).with('KNAPSACK_PRO_REGULAR_MODE_ENABLED=true KNAPSACK_PRO_TEST_SUITE_TOKEN=spinach-token bundle exec spinach --custom-arg --features_path fake-test-dir -- features/a.feature features/b.feature')
40
-
41
- subject
42
- end
43
- end
44
-
45
- context 'when test files were not returned by Knapsack Pro API' do
46
- let(:runner) do
47
- instance_double(described_class,
48
- test_files_to_execute_exist?: false)
49
- end
50
-
51
- it "doesn't run tests" do
52
- subject
53
- end
54
- end
55
- end
56
- end