knapsack_pro 1.21.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +49 -0
- data/README.md +22 -6
- data/lib/knapsack_pro/client/connection.rb +8 -4
- data/lib/knapsack_pro/config/ci/github_actions.rb +3 -2
- data/lib/knapsack_pro/runners/queue/rspec_runner.rb +1 -1
- data/lib/knapsack_pro/slow_test_file_determiner.rb +9 -4
- data/lib/knapsack_pro/test_case_detectors/rspec_test_example_detector.rb +9 -6
- data/lib/knapsack_pro/version.rb +1 -1
- data/spec/knapsack_pro/client/connection_spec.rb +76 -7
- data/spec/knapsack_pro/config/ci/github_actions_spec.rb +8 -1
- data/spec/knapsack_pro/runners/queue/rspec_runner_spec.rb +25 -0
- data/spec/knapsack_pro/slow_test_file_determiner_spec.rb +1 -1
- data/spec/knapsack_pro/test_case_detectors/rspec_test_example_detector_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 575934b81520ce3bbf894d8cf643ae5af0279fd43b0529c62d8a4b71a595fbc8
|
4
|
+
data.tar.gz: dbebdb5c243e9a363a0f4737d4d78d9c2f1ff66f18e8087faafaece2299998eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e636160f7c6793f371840b481154a7bcb6a5215580f5d5a92cd4be21242a544bc3c6bbf6c64d92da66fb2228e20f1ccf3836408405881c460c85472b0f3fbcb4
|
7
|
+
data.tar.gz: 41375edcb7f40c0044bacba75a89f0e43766261db0c148b525a565580592ad08df3cc9f37843fd056bc29ef79e0e3437266512cbdb6ddc7ce81219ee5ba92edf
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,54 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
### 2.0.0
|
4
|
+
|
5
|
+
* Add support for CI build ID for Github Actions
|
6
|
+
|
7
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/116
|
8
|
+
|
9
|
+
__Migration path for Github Actions users - required__
|
10
|
+
|
11
|
+
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).
|
12
|
+
|
13
|
+
__Migration path for other users__ - just update `knapsack_pro` gem. Nothing to change in your code :)
|
14
|
+
|
15
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.3...v2.0.0
|
16
|
+
|
17
|
+
### 1.22.3
|
18
|
+
|
19
|
+
* Support for non-delimited formatting params of RSpec like `-fMyCustomFormatter`
|
20
|
+
|
21
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/115
|
22
|
+
|
23
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.2...v1.22.3
|
24
|
+
|
25
|
+
### 1.22.2
|
26
|
+
|
27
|
+
* Log when next retry request to Knapsack Pro API happens before starting Fallback Mode
|
28
|
+
|
29
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/114
|
30
|
+
|
31
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.1...v1.22.2
|
32
|
+
|
33
|
+
### 1.22.1
|
34
|
+
|
35
|
+
* 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.
|
36
|
+
|
37
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/113
|
38
|
+
|
39
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.22.0...v1.22.1
|
40
|
+
|
41
|
+
### 1.22.0
|
42
|
+
|
43
|
+
* Increase request retry timebox from 4s to 8s to not flood Knapsack Pro API with too many requests in a short period of time and to give time for API server to autoscale and add additional machines to serve traffic
|
44
|
+
* When Fallback Mode is disabled with env `KNAPSACK_PRO_FALLBACK_MODE_ENABLED=false` then retry the request to Knapsack Pro API for 6 times instead of only 3 times.
|
45
|
+
|
46
|
+
Here is related [info why some users want to disable Fallback Mode](https://github.com/KnapsackPro/knapsack_pro-ruby#required-ci-configuration-if-you-use-retry-single-failed-ci-node-feature-on-your-ci-server-when-knapsack_pro_fixed_queue_splittrue-in-queue-mode-or-knapsack_pro_fixed_test_suite_splittrue-in-regular-mode).
|
47
|
+
|
48
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/112
|
49
|
+
|
50
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.21.0...v1.22.0
|
51
|
+
|
3
52
|
### 1.21.0
|
4
53
|
|
5
54
|
* Automatically detect slow test files for RSpec and split them by test examples when `KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true`
|
data/README.md
CHANGED
@@ -711,7 +711,7 @@ Read below required configuration step if you use Queue Mode and you set [`KNAPS
|
|
711
711
|
|
712
712
|
If you use other CI server you need to manually configure your CI server to set `KNAPSACK_PRO_CI_NODE_RETRY_COUNT=1` only during retry CI node attempt. If `KNAPSACK_PRO_CI_NODE_RETRY_COUNT > 0` then knapsack_pro won't allow starting running tests in Fallback Mode and instead will raise error so a user can manually retry CI node later when a connection to Knapsack Pro API can be established.
|
713
713
|
|
714
|
-
If you cannot set `KNAPSACK_PRO_CI_NODE_RETRY_COUNT` only for retried CI node or it is not possible for your CI server then you can disable Fallback Mode completely `KNAPSACK_PRO_FALLBACK_MODE_ENABLED=false`.
|
714
|
+
If you cannot set `KNAPSACK_PRO_CI_NODE_RETRY_COUNT` only for retried CI node or it is not possible for your CI server then you can disable Fallback Mode completely `KNAPSACK_PRO_FALLBACK_MODE_ENABLED=false`. When Fallback Mode is disabled then knapsack_pro gem will try to connect to Knapsack Pro API 6 times instead of only 3 times to ensure there is a low chance of failing your CI node due to lost connection with the API.
|
715
715
|
|
716
716
|
### Passing arguments to rake task
|
717
717
|
|
@@ -991,19 +991,28 @@ You can parallelize your builds across virtual machines with [travis matrix feat
|
|
991
991
|
|
992
992
|
```yaml
|
993
993
|
script:
|
994
|
-
# Step for RSpec
|
994
|
+
# Step for RSpec in Regular Mode
|
995
995
|
- "bundle exec rake knapsack_pro:rspec"
|
996
996
|
|
997
|
-
# Step for
|
997
|
+
# Step for RSpec in Queue Mode
|
998
|
+
- "bundle exec rake knapsack_pro:queue:rspec"
|
999
|
+
|
1000
|
+
# Step for Cucumber in Regular Mode
|
998
1001
|
- "bundle exec rake knapsack_pro:cucumber"
|
999
1002
|
|
1000
|
-
# Step for
|
1003
|
+
# Step for Cucumber in Queue Mode
|
1004
|
+
- "bundle exec rake knapsack_pro:queue:cucumber"
|
1005
|
+
|
1006
|
+
# Step for Minitest in Regular Mode
|
1001
1007
|
- "bundle exec rake knapsack_pro:minitest"
|
1002
1008
|
|
1003
|
-
# Step for
|
1009
|
+
# Step for Minitest in Queue Mode
|
1010
|
+
- "bundle exec rake knapsack_pro:queue:minitest"
|
1011
|
+
|
1012
|
+
# Step for test-unit in Regular Mode
|
1004
1013
|
- "bundle exec rake knapsack_pro:test_unit"
|
1005
1014
|
|
1006
|
-
# Step for Spinach
|
1015
|
+
# Step for Spinach in Regular Mode
|
1007
1016
|
- "bundle exec rake knapsack_pro:spinach"
|
1008
1017
|
|
1009
1018
|
env:
|
@@ -1015,6 +1024,10 @@ env:
|
|
1015
1024
|
- KNAPSACK_PRO_TEST_SUITE_TOKEN_TEST_UNIT=test-unit-token
|
1016
1025
|
- KNAPSACK_PRO_TEST_SUITE_TOKEN_SPINACH=spinach-token
|
1017
1026
|
|
1027
|
+
# if you use Knapsack Pro Queue Mode you must set below env variable
|
1028
|
+
# to be able to retry single failed parallel job from Travis UI
|
1029
|
+
- KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
|
1030
|
+
|
1018
1031
|
- KNAPSACK_PRO_CI_NODE_TOTAL=2
|
1019
1032
|
jobs:
|
1020
1033
|
- KNAPSACK_PRO_CI_NODE_INDEX=0
|
@@ -1626,6 +1639,9 @@ jobs:
|
|
1626
1639
|
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: ${{ secrets.KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC }}
|
1627
1640
|
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }}
|
1628
1641
|
KNAPSACK_PRO_CI_NODE_INDEX: ${{ matrix.ci_node_index }}
|
1642
|
+
# if you use Knapsack Pro Queue Mode you must set below env variable
|
1643
|
+
# to be able to retry CI build and run previously recorded tests
|
1644
|
+
KNAPSACK_PRO_FIXED_QUEUE_SPLIT: true
|
1629
1645
|
run: |
|
1630
1646
|
# run tests in Knapsack Pro Regular Mode
|
1631
1647
|
bundle exec rake knapsack_pro:rspec
|
@@ -4,8 +4,8 @@ module KnapsackPro
|
|
4
4
|
class ServerError < StandardError; end
|
5
5
|
|
6
6
|
TIMEOUT = 15
|
7
|
-
MAX_RETRY = 3
|
8
|
-
REQUEST_RETRY_TIMEBOX =
|
7
|
+
MAX_RETRY = -> { KnapsackPro::Config::Env.fallback_mode_enabled? ? 3 : 6 }
|
8
|
+
REQUEST_RETRY_TIMEBOX = 8
|
9
9
|
|
10
10
|
def initialize(action)
|
11
11
|
@action = action
|
@@ -118,10 +118,14 @@ module KnapsackPro
|
|
118
118
|
rescue ServerError, Errno::ECONNREFUSED, Errno::ETIMEDOUT, Errno::EPIPE, EOFError, SocketError, Net::OpenTimeout, Net::ReadTimeout, OpenSSL::SSL::SSLError => e
|
119
119
|
logger.warn(e.inspect)
|
120
120
|
retries += 1
|
121
|
-
if retries < MAX_RETRY
|
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
|
-
|
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/
|
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
|
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
|
@@ -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.
|
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 += [
|
@@ -2,7 +2,6 @@ module KnapsackPro
|
|
2
2
|
class SlowTestFileDeterminer
|
3
3
|
TIME_THRESHOLD_PER_CI_NODE = 0.7 # 70%
|
4
4
|
REPORT_DIR = 'tmp/knapsack_pro/slow_test_file_determiner'
|
5
|
-
REPORT_PATH = "#{REPORT_DIR}/slow_test_files.json"
|
6
5
|
|
7
6
|
# test_files: { 'path' => 'a_spec.rb', 'time_execution' => 0.0 }
|
8
7
|
# time_execution: of build distribution (total time of CI build run)
|
@@ -16,13 +15,19 @@ module KnapsackPro
|
|
16
15
|
|
17
16
|
def self.save_to_json_report(test_files)
|
18
17
|
FileUtils.mkdir_p(REPORT_DIR)
|
19
|
-
File.write(
|
18
|
+
File.write(report_path, test_files.to_json)
|
20
19
|
end
|
21
20
|
|
22
21
|
def self.read_from_json_report
|
23
|
-
raise '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!' unless File.exists?(
|
24
|
-
slow_test_files_json_report = File.read(
|
22
|
+
raise '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!' unless File.exists?(report_path)
|
23
|
+
slow_test_files_json_report = File.read(report_path)
|
25
24
|
JSON.parse(slow_test_files_json_report)
|
26
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def self.report_path
|
30
|
+
"#{REPORT_DIR}/slow_test_files_node_#{KnapsackPro::Config::Env.ci_node_index}.json"
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
@@ -2,7 +2,6 @@ module KnapsackPro
|
|
2
2
|
module TestCaseDetectors
|
3
3
|
class RSpecTestExampleDetector
|
4
4
|
REPORT_DIR = 'tmp/knapsack_pro/test_case_detectors/rspec'
|
5
|
-
REPORT_PATH = "#{REPORT_DIR}/rspec_dry_run_json_report.json"
|
6
5
|
|
7
6
|
def generate_json_report
|
8
7
|
require 'rspec/core'
|
@@ -22,13 +21,13 @@ module KnapsackPro
|
|
22
21
|
|
23
22
|
if test_file_entities.empty?
|
24
23
|
no_examples_json = { examples: [] }.to_json
|
25
|
-
File.write(
|
24
|
+
File.write(report_path, no_examples_json)
|
26
25
|
return
|
27
26
|
end
|
28
27
|
|
29
28
|
cli_args = cli_format + [
|
30
29
|
'--dry-run',
|
31
|
-
'--out',
|
30
|
+
'--out', report_path,
|
32
31
|
'--default-path', test_dir,
|
33
32
|
] + KnapsackPro::TestFilePresenter.paths(test_file_entities)
|
34
33
|
options = RSpec::Core::ConfigurationOptions.new(cli_args)
|
@@ -39,9 +38,9 @@ module KnapsackPro
|
|
39
38
|
end
|
40
39
|
|
41
40
|
def test_file_example_paths
|
42
|
-
raise "No report found at #{
|
41
|
+
raise "No report found at #{report_path}" unless File.exists?(report_path)
|
43
42
|
|
44
|
-
json_report = File.read(
|
43
|
+
json_report = File.read(report_path)
|
45
44
|
hash_report = JSON.parse(json_report)
|
46
45
|
hash_report
|
47
46
|
.fetch('examples')
|
@@ -61,6 +60,10 @@ module KnapsackPro
|
|
61
60
|
|
62
61
|
private
|
63
62
|
|
63
|
+
def report_path
|
64
|
+
"#{REPORT_DIR}/rspec_dry_run_json_report_node_#{KnapsackPro::Config::Env.ci_node_index}.json"
|
65
|
+
end
|
66
|
+
|
64
67
|
def adapter_class
|
65
68
|
KnapsackPro::Adapters::RSpecAdapter
|
66
69
|
end
|
@@ -78,7 +81,7 @@ module KnapsackPro
|
|
78
81
|
end
|
79
82
|
|
80
83
|
def remove_old_json_report
|
81
|
-
File.delete(
|
84
|
+
File.delete(report_path) if File.exists?(report_path)
|
82
85
|
end
|
83
86
|
|
84
87
|
def test_file_hash_for(test_file_path)
|
data/lib/knapsack_pro/version.rb
CHANGED
@@ -72,12 +72,13 @@ shared_examples 'when retry request' do
|
|
72
72
|
|
73
73
|
before do
|
74
74
|
expect(KnapsackPro).to receive(:logger).at_least(1).and_return(logger)
|
75
|
+
end
|
76
|
+
|
77
|
+
it do
|
75
78
|
expect(logger).to receive(:debug).exactly(3).with("#{expected_http_method} http://api.knapsackpro.test:3000/v1/fake_endpoint")
|
76
79
|
expect(logger).to receive(:debug).exactly(3).with('API request UUID: fake-uuid')
|
77
80
|
expect(logger).to receive(:debug).exactly(3).with('API response:')
|
78
|
-
end
|
79
81
|
|
80
|
-
it do
|
81
82
|
parsed_response = { 'error' => 'Internal Server Error' }
|
82
83
|
|
83
84
|
expect(logger).to receive(:error).exactly(3).with(parsed_response)
|
@@ -85,16 +86,84 @@ shared_examples 'when retry request' do
|
|
85
86
|
server_error = described_class::ServerError.new(parsed_response)
|
86
87
|
expect(logger).to receive(:warn).exactly(3).with(server_error.inspect)
|
87
88
|
|
88
|
-
expect(logger).to receive(:warn).with("Wait 4s and retry request to Knapsack Pro API.")
|
89
89
|
expect(logger).to receive(:warn).with("Wait 8s and retry request to Knapsack Pro API.")
|
90
|
-
expect(
|
91
|
-
expect(
|
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...")
|
94
|
+
expect(logger).to receive(:warn).with("Wait 16s and retry request to Knapsack Pro API.")
|
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)
|
92
104
|
|
93
105
|
expect(subject).to eq(parsed_response)
|
94
106
|
|
95
107
|
expect(connection.success?).to be false
|
96
108
|
expect(connection.errors?).to be true
|
97
109
|
end
|
110
|
+
|
111
|
+
context 'when Fallback Mode is disabled' do
|
112
|
+
before do
|
113
|
+
expect(KnapsackPro::Config::Env).to receive(:fallback_mode_enabled?).at_least(1).and_return(false)
|
114
|
+
end
|
115
|
+
|
116
|
+
it do
|
117
|
+
expect(logger).to receive(:debug).exactly(6).with("#{expected_http_method} http://api.knapsackpro.test:3000/v1/fake_endpoint")
|
118
|
+
expect(logger).to receive(:debug).exactly(6).with('API request UUID: fake-uuid')
|
119
|
+
expect(logger).to receive(:debug).exactly(6).with('API response:')
|
120
|
+
|
121
|
+
parsed_response = { 'error' => 'Internal Server Error' }
|
122
|
+
|
123
|
+
expect(logger).to receive(:error).exactly(6).with(parsed_response)
|
124
|
+
|
125
|
+
server_error = described_class::ServerError.new(parsed_response)
|
126
|
+
expect(logger).to receive(:warn).exactly(6).with(server_error.inspect)
|
127
|
+
|
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
|
+
|
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
|
+
|
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
|
+
|
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
|
+
|
154
|
+
expect(logger).to receive(:warn).with("Wait 40s and retry request to Knapsack Pro API.")
|
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)
|
160
|
+
|
161
|
+
expect(subject).to eq(parsed_response)
|
162
|
+
|
163
|
+
expect(connection.success?).to be false
|
164
|
+
expect(connection.errors?).to be true
|
165
|
+
end
|
166
|
+
end
|
98
167
|
end
|
99
168
|
end
|
100
169
|
|
@@ -186,7 +255,7 @@ describe KnapsackPro::Client::Connection do
|
|
186
255
|
let(:http_method) { :post }
|
187
256
|
|
188
257
|
before do
|
189
|
-
expect(http).to receive(:post).
|
258
|
+
expect(http).to receive(:post).at_least(3).with(
|
190
259
|
endpoint_path,
|
191
260
|
request_hash.to_json,
|
192
261
|
{
|
@@ -210,7 +279,7 @@ describe KnapsackPro::Client::Connection do
|
|
210
279
|
before do
|
211
280
|
uri = URI.parse("http://api.knapsackpro.test:3000#{endpoint_path}")
|
212
281
|
uri.query = URI.encode_www_form(request_hash)
|
213
|
-
expect(http).to receive(:get).
|
282
|
+
expect(http).to receive(:get).at_least(3).with(
|
214
283
|
uri,
|
215
284
|
{
|
216
285
|
'Content-Type' => 'application/json',
|
@@ -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
|
-
|
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
|
@@ -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
|
@@ -27,7 +27,7 @@ describe KnapsackPro::SlowTestFileDeterminer do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '.save_to_json_report', :clear_tmp do
|
30
|
-
let(:json_report_path) { 'tmp/knapsack_pro/slow_test_file_determiner/
|
30
|
+
let(:json_report_path) { 'tmp/knapsack_pro/slow_test_file_determiner/slow_test_files_node_0.json' }
|
31
31
|
let(:test_files) do
|
32
32
|
[
|
33
33
|
{ 'path' => 'a_spec.rb', 'time_execution' => 1.0 },
|
@@ -1,6 +1,6 @@
|
|
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
4
|
let(:rspec_test_example_detector) { described_class.new }
|
5
5
|
|
6
6
|
describe '#generate_json_report' do
|
@@ -116,7 +116,7 @@ describe KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector do
|
|
116
116
|
it do
|
117
117
|
expect(File).to receive(:exists?).with(report_path).and_return(false)
|
118
118
|
|
119
|
-
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
120
|
end
|
121
121
|
end
|
122
122
|
end
|
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:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ArturT
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|