knapsack_pro 1.21.0 → 2.0.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 +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
|