knapsack_pro 1.20.2 → 1.22.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/README.md +43 -18
- data/lib/knapsack_pro.rb +6 -0
- data/lib/knapsack_pro/adapters/base_adapter.rb +16 -0
- data/lib/knapsack_pro/adapters/rspec_adapter.rb +11 -9
- data/lib/knapsack_pro/allocator.rb +7 -5
- data/lib/knapsack_pro/allocator_builder.rb +2 -1
- data/lib/knapsack_pro/base_allocator_builder.rb +41 -10
- data/lib/knapsack_pro/build_distribution_fetcher.rb +57 -0
- data/lib/knapsack_pro/client/api/v1/build_distributions.rb +13 -0
- data/lib/knapsack_pro/client/connection.rb +38 -16
- data/lib/knapsack_pro/config/env.rb +4 -0
- data/lib/knapsack_pro/queue_allocator.rb +7 -5
- data/lib/knapsack_pro/queue_allocator_builder.rb +2 -1
- data/lib/knapsack_pro/runners/queue/rspec_runner.rb +8 -1
- data/lib/knapsack_pro/runners/rspec_runner.rb +5 -2
- data/lib/knapsack_pro/slow_test_file_determiner.rb +33 -0
- data/lib/knapsack_pro/slow_test_file_finder.rb +27 -0
- data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +26 -7
- data/lib/knapsack_pro/test_case_mergers/base_merger.rb +29 -0
- data/lib/knapsack_pro/test_case_mergers/rspec_merger.rb +34 -0
- data/lib/knapsack_pro/test_file_finder.rb +43 -5
- data/lib/knapsack_pro/test_files_with_test_cases_composer.rb +22 -0
- data/lib/knapsack_pro/version.rb +1 -1
- data/spec/knapsack_pro/adapters/base_adapter_spec.rb +55 -0
- data/spec/knapsack_pro/adapters/rspec_adapter_spec.rb +61 -25
- data/spec/knapsack_pro/allocator_builder_spec.rb +7 -3
- data/spec/knapsack_pro/allocator_spec.rb +7 -5
- data/spec/knapsack_pro/base_allocator_builder_spec.rb +79 -27
- data/spec/knapsack_pro/build_distribution_fetcher_spec.rb +89 -0
- data/spec/knapsack_pro/client/api/v1/build_distributions_spec.rb +31 -0
- data/spec/knapsack_pro/client/connection_spec.rb +235 -104
- data/spec/knapsack_pro/config/env_spec.rb +14 -0
- data/spec/knapsack_pro/queue_allocator_builder_spec.rb +7 -3
- data/spec/knapsack_pro/queue_allocator_spec.rb +7 -5
- data/spec/knapsack_pro/runners/queue/rspec_runner_spec.rb +25 -0
- data/spec/knapsack_pro/runners/rspec_runner_spec.rb +4 -4
- data/spec/knapsack_pro/slow_test_file_determiner_spec.rb +74 -0
- data/spec/knapsack_pro/slow_test_file_finder_spec.rb +43 -0
- data/spec/knapsack_pro/test_case_detectors/rspec_test_example_detector_spec.rb +83 -37
- data/spec/knapsack_pro/test_case_mergers/base_merger_spec.rb +27 -0
- data/spec/knapsack_pro/test_case_mergers/rspec_merger_spec.rb +59 -0
- data/spec/knapsack_pro/test_file_finder_spec.rb +105 -29
- data/spec/knapsack_pro/test_files_with_test_cases_composer_spec.rb +41 -0
- metadata +27 -10
@@ -8,8 +8,11 @@ describe KnapsackPro::QueueAllocatorBuilder do
|
|
8
8
|
subject { allocator_builder.allocator }
|
9
9
|
|
10
10
|
before do
|
11
|
-
|
12
|
-
expect(allocator_builder).to receive(:
|
11
|
+
fast_and_slow_test_files_to_run = double
|
12
|
+
expect(allocator_builder).to receive(:fast_and_slow_test_files_to_run).and_return(fast_and_slow_test_files_to_run)
|
13
|
+
|
14
|
+
fallback_mode_test_files = double
|
15
|
+
expect(allocator_builder).to receive(:fallback_mode_test_files).and_return(fallback_mode_test_files)
|
13
16
|
|
14
17
|
repository_adapter = double
|
15
18
|
expect(KnapsackPro::RepositoryAdapterInitiator).to receive(:call).and_return(repository_adapter)
|
@@ -22,7 +25,8 @@ describe KnapsackPro::QueueAllocatorBuilder do
|
|
22
25
|
expect(KnapsackPro::Config::Env).to receive(:ci_node_build_id).and_return(ci_node_build_id)
|
23
26
|
|
24
27
|
expect(KnapsackPro::QueueAllocator).to receive(:new).with(
|
25
|
-
|
28
|
+
fast_and_slow_test_files_to_run: fast_and_slow_test_files_to_run,
|
29
|
+
fallback_mode_test_files: fallback_mode_test_files,
|
26
30
|
ci_node_total: ci_node_total,
|
27
31
|
ci_node_index: ci_node_index,
|
28
32
|
ci_node_build_id: ci_node_build_id,
|
@@ -1,5 +1,6 @@
|
|
1
1
|
describe KnapsackPro::QueueAllocator do
|
2
|
-
let(:
|
2
|
+
let(:fast_and_slow_test_files_to_run) { double }
|
3
|
+
let(:fallback_mode_test_files) { double }
|
3
4
|
let(:ci_node_total) { double }
|
4
5
|
let(:ci_node_index) { double }
|
5
6
|
let(:ci_node_build_id) { double }
|
@@ -7,7 +8,8 @@ describe KnapsackPro::QueueAllocator do
|
|
7
8
|
|
8
9
|
let(:queue_allocator) do
|
9
10
|
described_class.new(
|
10
|
-
|
11
|
+
fast_and_slow_test_files_to_run: fast_and_slow_test_files_to_run,
|
12
|
+
fallback_mode_test_files: fallback_mode_test_files,
|
11
13
|
ci_node_total: ci_node_total,
|
12
14
|
ci_node_index: ci_node_index,
|
13
15
|
ci_node_build_id: ci_node_build_id,
|
@@ -24,7 +26,7 @@ describe KnapsackPro::QueueAllocator do
|
|
24
26
|
|
25
27
|
before do
|
26
28
|
encrypted_test_files = double
|
27
|
-
expect(KnapsackPro::Crypto::Encryptor).to receive(:call).with(
|
29
|
+
expect(KnapsackPro::Crypto::Encryptor).to receive(:call).with(fast_and_slow_test_files_to_run).and_return(encrypted_test_files)
|
28
30
|
|
29
31
|
encrypted_branch = double
|
30
32
|
expect(KnapsackPro::Crypto::BranchEncryptor).to receive(:call).with(repository_adapter.branch).and_return(encrypted_branch)
|
@@ -70,7 +72,7 @@ describe KnapsackPro::QueueAllocator do
|
|
70
72
|
end
|
71
73
|
|
72
74
|
before do
|
73
|
-
expect(KnapsackPro::Crypto::Decryptor).to receive(:call).with(
|
75
|
+
expect(KnapsackPro::Crypto::Decryptor).to receive(:call).with(fast_and_slow_test_files_to_run, response['test_files']).and_call_original
|
74
76
|
end
|
75
77
|
|
76
78
|
it { should eq ['a_spec.rb', 'b_spec.rb'] }
|
@@ -120,7 +122,7 @@ describe KnapsackPro::QueueAllocator do
|
|
120
122
|
context 'when fallback mode started' do
|
121
123
|
before do
|
122
124
|
test_flat_distributor = instance_double(KnapsackPro::TestFlatDistributor)
|
123
|
-
expect(KnapsackPro::TestFlatDistributor).to receive(:new).with(
|
125
|
+
expect(KnapsackPro::TestFlatDistributor).to receive(:new).with(fallback_mode_test_files, ci_node_total).and_return(test_flat_distributor)
|
124
126
|
expect(test_flat_distributor).to receive(:test_files_for_node).with(ci_node_index).and_return([
|
125
127
|
{ 'path' => 'c_spec.rb' },
|
126
128
|
{ 'path' => 'd_spec.rb' },
|
@@ -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
|
@@ -24,11 +24,11 @@ describe KnapsackPro::Runners::RSpecRunner do
|
|
24
24
|
|
25
25
|
context 'when test files were returned by Knapsack Pro API' do
|
26
26
|
let(:test_dir) { 'fake-test-dir' }
|
27
|
-
let(:
|
27
|
+
let(:stringify_test_file_paths) { "spec/a_spec.rb spec/b_spec.rb[1:1]" }
|
28
28
|
let(:runner) do
|
29
29
|
instance_double(described_class,
|
30
30
|
test_dir: test_dir,
|
31
|
-
|
31
|
+
stringify_test_file_paths: stringify_test_file_paths,
|
32
32
|
test_files_to_execute_exist?: true)
|
33
33
|
end
|
34
34
|
let(:task) { double }
|
@@ -38,8 +38,8 @@ describe KnapsackPro::Runners::RSpecRunner do
|
|
38
38
|
|
39
39
|
t = double
|
40
40
|
expect(RSpec::Core::RakeTask).to receive(:new).with('knapsack_pro:rspec_run').and_yield(t)
|
41
|
-
expect(t).to receive(:rspec_opts=).with('--profile --color --default-path fake-test-dir')
|
42
|
-
expect(t).to receive(:pattern=).with(
|
41
|
+
expect(t).to receive(:rspec_opts=).with('--profile --color --default-path fake-test-dir spec/a_spec.rb spec/b_spec.rb[1:1]')
|
42
|
+
expect(t).to receive(:pattern=).with([])
|
43
43
|
end
|
44
44
|
|
45
45
|
context 'when task already exists' do
|
@@ -0,0 +1,74 @@
|
|
1
|
+
describe KnapsackPro::SlowTestFileDeterminer do
|
2
|
+
describe '.call' do
|
3
|
+
let(:node_total) { 4 }
|
4
|
+
let(:time_execution) { 20.0 }
|
5
|
+
let(:test_files) do
|
6
|
+
[
|
7
|
+
{ 'path' => 'a_spec.rb', 'time_execution' => 1.0 },
|
8
|
+
{ 'path' => 'b_spec.rb', 'time_execution' => 3.4 },
|
9
|
+
# slow tests are above 3.5s threshold (20.0 / 4 * 0.7 = 3.5)
|
10
|
+
{ 'path' => 'c_spec.rb', 'time_execution' => 3.5 },
|
11
|
+
{ 'path' => 'd_spec.rb', 'time_execution' => 5.9 },
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
expect(KnapsackPro::Config::Env).to receive(:ci_node_total).and_return(node_total)
|
17
|
+
end
|
18
|
+
|
19
|
+
subject { described_class.call(test_files, time_execution) }
|
20
|
+
|
21
|
+
it do
|
22
|
+
expect(subject).to eq([
|
23
|
+
{ 'path' => 'c_spec.rb', 'time_execution' => 3.5 },
|
24
|
+
{ 'path' => 'd_spec.rb', 'time_execution' => 5.9 },
|
25
|
+
])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.save_to_json_report', :clear_tmp do
|
30
|
+
let(:json_report_path) { 'tmp/knapsack_pro/slow_test_file_determiner/slow_test_files_node_0.json' }
|
31
|
+
let(:test_files) do
|
32
|
+
[
|
33
|
+
{ 'path' => 'a_spec.rb', 'time_execution' => 1.0 },
|
34
|
+
# unique path to ensure we saved on disk a completely new report
|
35
|
+
{ 'path' => "#{SecureRandom.hex}_spec.rb", 'time_execution' => 3.4 },
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
subject { described_class.save_to_json_report(test_files) }
|
40
|
+
|
41
|
+
it do
|
42
|
+
subject
|
43
|
+
expect(File.read(json_report_path)).to eq(test_files.to_json)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '.read_from_json_report', :clear_tmp do
|
48
|
+
let(:test_files) do
|
49
|
+
[
|
50
|
+
{ 'path' => 'a_spec.rb', 'time_execution' => 1.0 },
|
51
|
+
# unique path to ensure we saved on disk a completely new report
|
52
|
+
{ 'path' => "#{SecureRandom.hex}_spec.rb", 'time_execution' => 3.4 },
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
subject { described_class.read_from_json_report }
|
57
|
+
|
58
|
+
context 'when json report exists' do
|
59
|
+
before do
|
60
|
+
described_class.save_to_json_report(test_files)
|
61
|
+
end
|
62
|
+
|
63
|
+
it do
|
64
|
+
expect(subject).to eq test_files
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when json report does not exist' do
|
69
|
+
it do
|
70
|
+
expect { subject }.to raise_error(RuntimeError, 'Report with slow test files was not generated yet. If you have enabled split by test cases https://github.com/KnapsackPro/knapsack_pro-ruby#split-test-files-by-test-cases and you see this error it means that your tests accidentally cleaned up tmp/knapsack_pro directory. Please do not remove this directory during tests runtime!')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe KnapsackPro::SlowTestFileFinder do
|
2
|
+
describe '.call' do
|
3
|
+
let(:adapter_class) { double }
|
4
|
+
|
5
|
+
subject { described_class.call(adapter_class) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
expect(KnapsackPro::Config::Env).to receive(:test_files_encrypted?).and_return(test_files_encrypted?)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when test files are not encrypted' do
|
12
|
+
let(:test_files_encrypted?) { false }
|
13
|
+
|
14
|
+
it do
|
15
|
+
test_files_from_api = double
|
16
|
+
time_execution = double
|
17
|
+
build_distribution_entity = instance_double(KnapsackPro::BuildDistributionFetcher::BuildDistributionEntity, test_files: test_files_from_api, time_execution: time_execution)
|
18
|
+
expect(KnapsackPro::BuildDistributionFetcher).to receive(:call).and_return(build_distribution_entity)
|
19
|
+
|
20
|
+
merged_test_files_from_api = double
|
21
|
+
expect(KnapsackPro::TestCaseMergers::BaseMerger).to receive(:call).with(adapter_class, test_files_from_api).and_return(merged_test_files_from_api)
|
22
|
+
|
23
|
+
test_files_existing_on_disk = double
|
24
|
+
expect(KnapsackPro::TestFileFinder).to receive(:select_test_files_that_can_be_run).with(adapter_class, merged_test_files_from_api).and_return(test_files_existing_on_disk)
|
25
|
+
|
26
|
+
slow_test_files = double
|
27
|
+
expect(KnapsackPro::SlowTestFileDeterminer).to receive(:call).with(test_files_existing_on_disk, time_execution).and_return(slow_test_files)
|
28
|
+
|
29
|
+
expect(KnapsackPro::SlowTestFileDeterminer).to receive(:save_to_json_report).with(slow_test_files)
|
30
|
+
|
31
|
+
expect(subject).to eq slow_test_files
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when test files are encrypted' do
|
36
|
+
let(:test_files_encrypted?) { true }
|
37
|
+
|
38
|
+
it do
|
39
|
+
expect { subject }.to raise_error RuntimeError, 'Split by test cases is not possible when you have enabled test file names encryption ( https://github.com/KnapsackPro/knapsack_pro-ruby#test-file-names-encryption ). You need to disable encryption with KNAPSACK_PRO_TEST_FILES_ENCRYPTED=false in order to use split by test cases https://github.com/KnapsackPro/knapsack_pro-ruby#split-test-files-by-test-cases'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
2
2
|
let(:report_dir) { 'tmp/knapsack_pro/test_case_detectors/rspec' }
|
3
|
-
let(:report_path) { 'tmp/knapsack_pro/test_case_detectors/rspec/
|
3
|
+
let(:report_path) { 'tmp/knapsack_pro/test_case_detectors/rspec/rspec_dry_run_json_report_node_0.json' }
|
4
|
+
let(:rspec_test_example_detector) { described_class.new }
|
4
5
|
|
5
6
|
describe '#generate_json_report' do
|
6
|
-
subject {
|
7
|
+
subject { rspec_test_example_detector.generate_json_report }
|
7
8
|
|
8
9
|
before do
|
9
10
|
expect(FileUtils).to receive(:mkdir_p).with(report_dir)
|
@@ -11,48 +12,63 @@ describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
|
11
12
|
expect(File).to receive(:exists?).with(report_path).and_return(true)
|
12
13
|
expect(File).to receive(:delete).with(report_path)
|
13
14
|
|
14
|
-
|
15
|
-
adapter_class = KnapsackPro::Adapters::RSpecAdapter
|
16
|
-
expect(KnapsackPro::TestFilePattern).to receive(:call).with(adapter_class).and_return(test_file_pattern)
|
17
|
-
|
18
|
-
test_file_paths = [
|
19
|
-
{ 'path' => 'spec/a_spec.rb' },
|
20
|
-
{ 'path' => 'spec/b_spec.rb' },
|
21
|
-
]
|
22
|
-
expect(KnapsackPro::TestFileFinder).to receive(:call).with(test_file_pattern).and_return(test_file_paths)
|
23
|
-
|
24
|
-
test_dir = 'spec'
|
25
|
-
expect(KnapsackPro::Config::Env).to receive(:test_dir).and_return(nil)
|
26
|
-
expect(KnapsackPro::TestFilePattern).to receive(:test_dir).with(adapter_class).and_return(test_dir)
|
27
|
-
|
28
|
-
options = double
|
29
|
-
expect(RSpec::Core::ConfigurationOptions).to receive(:new).with([
|
30
|
-
'--format', expected_format,
|
31
|
-
'--dry-run',
|
32
|
-
'--out', report_path,
|
33
|
-
'--default-path', test_dir,
|
34
|
-
'spec/a_spec.rb', 'spec/b_spec.rb',
|
35
|
-
]).and_return(options)
|
36
|
-
|
37
|
-
rspec_core_runner = double
|
38
|
-
expect(RSpec::Core::Runner).to receive(:new).with(options).and_return(rspec_core_runner)
|
39
|
-
expect(rspec_core_runner).to receive(:run).with($stderr, $stdout).and_return(exit_code)
|
15
|
+
expect(rspec_test_example_detector).to receive(:slow_test_files).and_return(test_file_entities)
|
40
16
|
end
|
41
17
|
|
42
18
|
shared_examples 'generate_json_report runs RSpec::Core::Runner' do
|
43
|
-
context 'when
|
44
|
-
let(:
|
19
|
+
context 'when there are no slow test files' do
|
20
|
+
let(:test_file_entities) { [] }
|
21
|
+
|
22
|
+
before do
|
23
|
+
expect(File).to receive(:write).with(report_path, { examples: [] }.to_json)
|
24
|
+
end
|
45
25
|
|
46
26
|
it do
|
47
27
|
expect(subject).to be_nil
|
48
28
|
end
|
49
29
|
end
|
50
30
|
|
51
|
-
context 'when
|
52
|
-
let(:
|
31
|
+
context 'when slow test files exist' do
|
32
|
+
let(:test_file_entities) do
|
33
|
+
[
|
34
|
+
{ 'path' => 'spec/a_spec.rb' },
|
35
|
+
{ 'path' => 'spec/b_spec.rb' },
|
36
|
+
]
|
37
|
+
end
|
53
38
|
|
54
|
-
|
55
|
-
|
39
|
+
before do
|
40
|
+
test_dir = 'spec'
|
41
|
+
expect(KnapsackPro::Config::Env).to receive(:test_dir).and_return(nil)
|
42
|
+
expect(KnapsackPro::TestFilePattern).to receive(:test_dir).with(KnapsackPro::Adapters::RSpecAdapter).and_return(test_dir)
|
43
|
+
|
44
|
+
options = double
|
45
|
+
expect(RSpec::Core::ConfigurationOptions).to receive(:new).with([
|
46
|
+
'--format', expected_format,
|
47
|
+
'--dry-run',
|
48
|
+
'--out', report_path,
|
49
|
+
'--default-path', test_dir,
|
50
|
+
'spec/a_spec.rb', 'spec/b_spec.rb',
|
51
|
+
]).and_return(options)
|
52
|
+
|
53
|
+
rspec_core_runner = double
|
54
|
+
expect(RSpec::Core::Runner).to receive(:new).with(options).and_return(rspec_core_runner)
|
55
|
+
expect(rspec_core_runner).to receive(:run).with($stderr, $stdout).and_return(exit_code)
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when exit code from RSpec::Core::Runner is 0' do
|
59
|
+
let(:exit_code) { 0 }
|
60
|
+
|
61
|
+
it do
|
62
|
+
expect(subject).to be_nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when exit code from RSpec::Core::Runner is 1' do
|
67
|
+
let(:exit_code) { 1 }
|
68
|
+
|
69
|
+
it do
|
70
|
+
expect { subject }.to raise_error(RuntimeError, 'There was problem to generate test examples for test suite')
|
71
|
+
end
|
56
72
|
end
|
57
73
|
end
|
58
74
|
end
|
@@ -77,7 +93,7 @@ describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
|
77
93
|
describe '#test_file_example_paths' do
|
78
94
|
subject { described_class.new.test_file_example_paths }
|
79
95
|
|
80
|
-
context 'when
|
96
|
+
context 'when JSON report exists' do
|
81
97
|
it do
|
82
98
|
expect(File).to receive(:exists?).with(report_path).and_return(true)
|
83
99
|
|
@@ -96,11 +112,41 @@ describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
|
96
112
|
end
|
97
113
|
end
|
98
114
|
|
99
|
-
context 'when
|
115
|
+
context 'when JSON report does not exist' do
|
100
116
|
it do
|
101
117
|
expect(File).to receive(:exists?).with(report_path).and_return(false)
|
102
118
|
|
103
|
-
expect { subject }.to raise_error(RuntimeError, 'No report found at tmp/knapsack_pro/test_case_detectors/rspec/
|
119
|
+
expect { subject }.to raise_error(RuntimeError, 'No report found at tmp/knapsack_pro/test_case_detectors/rspec/rspec_dry_run_json_report_node_0.json')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe '#slow_test_files' do
|
125
|
+
subject { described_class.new.slow_test_files }
|
126
|
+
|
127
|
+
before do
|
128
|
+
expect(KnapsackPro::Config::Env).to receive(:slow_test_file_pattern).and_return(slow_test_file_pattern)
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'when slow test file pattern is present' do
|
132
|
+
let(:slow_test_file_pattern) { double }
|
133
|
+
|
134
|
+
it do
|
135
|
+
expected_slow_test_files = double
|
136
|
+
expect(KnapsackPro::TestFileFinder).to receive(:slow_test_files_by_pattern).with(KnapsackPro::Adapters::RSpecAdapter).and_return(expected_slow_test_files)
|
137
|
+
|
138
|
+
expect(subject).to eq expected_slow_test_files
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'when slow test file pattern is not present' do
|
143
|
+
let(:slow_test_file_pattern) { nil }
|
144
|
+
|
145
|
+
it do
|
146
|
+
expected_slow_test_files = double
|
147
|
+
expect(KnapsackPro::SlowTestFileDeterminer).to receive(:read_from_json_report).and_return(expected_slow_test_files)
|
148
|
+
|
149
|
+
expect(subject).to eq expected_slow_test_files
|
104
150
|
end
|
105
151
|
end
|
106
152
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
describe KnapsackPro::TestCaseMergers::BaseMerger do
|
2
|
+
describe '.call' do
|
3
|
+
let(:test_files) { double }
|
4
|
+
|
5
|
+
subject { described_class.call(adapter_class, test_files) }
|
6
|
+
|
7
|
+
context 'when adapter_class is KnapsackPro::Adapters::RSpecAdapter' do
|
8
|
+
let(:adapter_class) { KnapsackPro::Adapters::RSpecAdapter }
|
9
|
+
|
10
|
+
it do
|
11
|
+
result = double
|
12
|
+
rspec_merger = instance_double(KnapsackPro::TestCaseMergers::RSpecMerger, call: result)
|
13
|
+
expect(KnapsackPro::TestCaseMergers::RSpecMerger).to receive(:new).with(test_files).and_return(rspec_merger)
|
14
|
+
|
15
|
+
expect(subject).to eq result
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when adapter_class is unknown' do
|
20
|
+
let(:adapter_class) { 'fake-adapter' }
|
21
|
+
|
22
|
+
it do
|
23
|
+
expect { subject }.to raise_error 'Test case merger does not exist for adapter_class: fake-adapter'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
describe KnapsackPro::TestCaseMergers::RSpecMerger do
|
2
|
+
describe '#call' do
|
3
|
+
subject { described_class.new(test_files).call }
|
4
|
+
|
5
|
+
context 'when all test files are not test example paths' do
|
6
|
+
let(:test_files) do
|
7
|
+
[
|
8
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
9
|
+
{ 'path' => 'spec/b_spec.rb', 'time_execution' => 2.2 },
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
it do
|
14
|
+
expect(subject).to eq([
|
15
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
16
|
+
{ 'path' => 'spec/b_spec.rb', 'time_execution' => 2.2 },
|
17
|
+
])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when test files have test example paths' do
|
22
|
+
let(:test_files) do
|
23
|
+
[
|
24
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
25
|
+
# test example paths
|
26
|
+
{ 'path' => 'spec/test_case_spec.rb[1:1]', 'time_execution' => 2.2 },
|
27
|
+
{ 'path' => 'spec/test_case_spec.rb[1:2]', 'time_execution' => 0.8 },
|
28
|
+
]
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns merged paths for test examples and sum of their time_execution' do
|
32
|
+
expect(subject).to eq([
|
33
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
34
|
+
{ 'path' => 'spec/test_case_spec.rb', 'time_execution' => 3.0 },
|
35
|
+
])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when test files have test example paths and at the same time test file path for test example path is present as full test file path' do
|
40
|
+
let(:test_files) do
|
41
|
+
[
|
42
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
43
|
+
# full test file path is present despite existing test example paths
|
44
|
+
{ 'path' => 'spec/test_case_spec.rb', 'time_execution' => 1.0 },
|
45
|
+
# test example paths
|
46
|
+
{ 'path' => 'spec/test_case_spec.rb[1:1]', 'time_execution' => 2.2 },
|
47
|
+
{ 'path' => 'spec/test_case_spec.rb[1:2]', 'time_execution' => 0.8 },
|
48
|
+
]
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns merged paths for test examples and sum of their time_execution' do
|
52
|
+
expect(subject).to eq([
|
53
|
+
{ 'path' => 'spec/a_spec.rb', 'time_execution' => 1.1 },
|
54
|
+
{ 'path' => 'spec/test_case_spec.rb', 'time_execution' => 4.0 },
|
55
|
+
])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|