/
cucumber_runner.rb
96 lines (76 loc) · 3.17 KB
/
cucumber_runner.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
module KnapsackPro
module Runners
module Queue
class CucumberRunner < BaseRunner
def self.run(args)
require 'cucumber/rake/task'
ENV['KNAPSACK_PRO_TEST_SUITE_TOKEN'] = KnapsackPro::Config::Env.test_suite_token_cucumber
ENV['KNAPSACK_PRO_QUEUE_RECORDING_ENABLED'] = 'true'
ENV['KNAPSACK_PRO_QUEUE_ID'] = KnapsackPro::Config::EnvGenerator.set_queue_id
runner = new(KnapsackPro::Adapters::CucumberAdapter)
accumulator = {
status: :next,
runner: runner,
can_initialize_queue: true,
args: args,
exitstatus: 0,
all_test_file_paths: [],
}
while accumulator[:status] == :next
accumulator = run_tests(accumulator)
end
Kernel.exit(accumulator[:exitstatus])
end
def self.run_tests(accumulator)
runner = accumulator.fetch(:runner)
can_initialize_queue = accumulator.fetch(:can_initialize_queue)
args = accumulator.fetch(:args)
exitstatus = accumulator.fetch(:exitstatus)
all_test_file_paths = accumulator.fetch(:all_test_file_paths)
test_file_paths = runner.test_file_paths(
can_initialize_queue: can_initialize_queue,
executed_test_files: all_test_file_paths
)
if test_file_paths.empty?
KnapsackPro::Hooks::Queue.call_after_queue
KnapsackPro::Report.save_node_queue_to_api
return {
status: :completed,
exitstatus: exitstatus,
}
else
subset_queue_id = KnapsackPro::Config::EnvGenerator.set_subset_queue_id
ENV['KNAPSACK_PRO_SUBSET_QUEUE_ID'] = subset_queue_id
KnapsackPro.tracker.reset!
KnapsackPro.tracker.set_prerun_tests(test_file_paths)
all_test_file_paths += test_file_paths
result_exitstatus = cucumber_run(runner, test_file_paths, args)
exitstatus = 1 if result_exitstatus != 0
# KnapsackPro::Hooks::Queue.call_after_subset_queue
# KnapsackPro::Report.save_subset_queue_to_file
# are called in adapter: lib/knapsack_pro/adapters/cucumber_adapter.rb
return {
status: :next,
runner: runner,
can_initialize_queue: false,
args: args,
exitstatus: exitstatus,
all_test_file_paths: all_test_file_paths,
}
end
end
private
def self.cucumber_run(runner, test_file_paths, args)
stringify_test_file_paths = KnapsackPro::TestFilePresenter.stringify_paths(test_file_paths)
cmd = %Q[bundle exec cucumber #{args} --require #{runner.test_dir} -- #{stringify_test_file_paths}]
Kernel.system(cmd)
# it must be set here so when we call next time above cmd we won't run again:
# KnapsackPro::Hooks::Queue.call_before_queue
# which is defined in lib/knapsack_pro/adapters/cucumber_adapter.rb
ENV['KNAPSACK_PRO_BEFORE_QUEUE_HOOK_CALLED'] = 'true'
$?.exitstatus
end
end
end
end
end