busser 0.9.1 → 0.9.3
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/.github/workflows/integration.yml +55 -0
- data/.github/workflows/publish.yml +22 -0
- data/.gitignore +1 -0
- data/.release-please-manifest.json +1 -1
- data/.rubocop.yml +1 -4
- data/CHANGELOG.md +19 -0
- data/Gemfile +12 -5
- data/README.md +82 -0
- data/Rakefile +19 -1
- data/busser.gemspec +11 -8
- data/kitchen-preinstall.sh +55 -0
- data/kitchen.yml +27 -0
- data/lib/busser/command/deserialize.rb +4 -0
- data/lib/busser/command/plugin_create.rb +50 -0
- data/lib/busser/command/plugin_install.rb +40 -4
- data/lib/busser/command/plugin_list.rb +16 -4
- data/lib/busser/command/setup.rb +27 -1
- data/lib/busser/command/suite_cleanup.rb +3 -0
- data/lib/busser/command/suite_path.rb +3 -0
- data/lib/busser/command/test.rb +38 -1
- data/lib/busser/cucumber/hooks.rb +9 -0
- data/lib/busser/helpers.rb +24 -0
- data/lib/busser/plugin.rb +51 -9
- data/lib/busser/rubygems.rb +20 -0
- data/lib/busser/runner_plugin/dummy.rb +3 -0
- data/lib/busser/runner_plugin.rb +5 -0
- data/lib/busser/thor.rb +23 -0
- data/lib/busser/ui.rb +55 -0
- data/lib/busser/version.rb +2 -1
- data/release-please-config.json +3 -1
- data/renovate.json +1 -0
- data/spec/busser/command/deserialize_spec.rb +0 -1
- data/spec/busser/command/plugin_create_spec.rb +79 -7
- data/spec/busser/command/plugin_install_spec.rb +44 -0
- data/spec/busser/command/plugin_list_spec.rb +49 -0
- data/spec/busser/command/setup_spec.rb +21 -1
- data/spec/busser/command/test_spec.rb +36 -0
- data/spec/busser/helpers_spec.rb +10 -10
- data/spec/busser/plugin_spec.rb +0 -1
- data/spec/busser/ui_spec.rb +7 -7
- data/spec/spec_helper.rb +2 -3
- data/templates/plugin/Gemfile.erb +7 -0
- data/templates/plugin/Rakefile.erb +5 -1
- data/templates/plugin/features_env.rb.erb +3 -8
- data/templates/plugin/gemspec.erb +2 -6
- data/templates/plugin/github_workflow.yml.erb +1 -1
- data/test/integration/default/bash/smoke_test.sh +12 -0
- metadata +15 -59
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
1
|
#
|
|
3
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
3
|
# you may not use this file except in compliance with the License.
|
|
@@ -87,12 +86,24 @@ describe Busser::Command::PluginCreate do
|
|
|
87
86
|
end
|
|
88
87
|
end
|
|
89
88
|
|
|
90
|
-
|
|
89
|
+
# These moved into the Gemfile, so the gemspec declares only what a
|
|
90
|
+
# consumer of the gem needs at runtime -- matching the busser-* plugins.
|
|
91
|
+
it "leaves development dependencies out of the gemspec" do
|
|
91
92
|
generate
|
|
92
93
|
|
|
93
|
-
_(dev_dependencies).
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
_(dev_dependencies).must_be_empty
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# busser-bash resolved busser 0.6.0 and failed its own suite because the
|
|
98
|
+
# requirement was open. A generated plugin should not start there.
|
|
99
|
+
it "requires a busser new enough to run the generated features" do
|
|
100
|
+
generate
|
|
101
|
+
|
|
102
|
+
busser = gemspec.dependencies.find { |d| d.name == "busser" }
|
|
103
|
+
|
|
104
|
+
_(busser).wont_be_nil
|
|
105
|
+
_(busser.requirement.satisfied_by?(Gem::Version.new("0.9.0"))).must_equal true
|
|
106
|
+
_(busser.requirement.satisfied_by?(Gem::Version.new("0.6.0"))).must_equal false
|
|
96
107
|
end
|
|
97
108
|
|
|
98
109
|
it "states a supported Ruby version" do
|
|
@@ -113,6 +124,25 @@ describe Busser::Command::PluginCreate do
|
|
|
113
124
|
end
|
|
114
125
|
end
|
|
115
126
|
|
|
127
|
+
describe "the generated Gemfile" do
|
|
128
|
+
|
|
129
|
+
it "declares what the generated Rakefile needs" do
|
|
130
|
+
generate
|
|
131
|
+
|
|
132
|
+
body = File.read(File.join(plugin_dir, "Gemfile"))
|
|
133
|
+
|
|
134
|
+
%w{rake cucumber aruba}.each { |g| _(body).must_include "'#{g}'" }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# cucumber needs base64 on Ruby 4.0, where it is no longer a default gem.
|
|
138
|
+
it "declares base64" do
|
|
139
|
+
generate
|
|
140
|
+
|
|
141
|
+
_(File.read(File.join(plugin_dir, "Gemfile"))).must_include "'base64'"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
|
|
116
146
|
describe "the generated project" do
|
|
117
147
|
|
|
118
148
|
it "ships a CI workflow rather than a Travis config" do
|
|
@@ -153,9 +183,51 @@ describe Busser::Command::PluginCreate do
|
|
|
153
183
|
end
|
|
154
184
|
end
|
|
155
185
|
|
|
156
|
-
|
|
186
|
+
# A name becomes a Ruby constant, and Thor's camel_case only folds
|
|
187
|
+
# underscores. "my-junit" produced `module My-junit`, which does not parse --
|
|
188
|
+
# and the generator ran to completion anyway, leaving a project that could
|
|
189
|
+
# not be loaded at all.
|
|
190
|
+
describe "the plugin name" do
|
|
191
|
+
|
|
192
|
+
%w{demo junit my_junit j2 x}.each do |name|
|
|
193
|
+
it "accepts #{name.inspect}" do
|
|
194
|
+
generate(name: name)
|
|
195
|
+
|
|
196
|
+
_(Dir.exist?(File.join(@tmpdir, "busser-#{name}"))).must_equal true
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
{
|
|
201
|
+
"my-junit" => "a hyphen cannot appear in a constant",
|
|
202
|
+
"My_Junit" => "an uppercase start is not a plugin name",
|
|
203
|
+
"2fast" => "a constant cannot start with a digit",
|
|
204
|
+
"my junit" => "a space cannot appear in a constant or a path",
|
|
205
|
+
"" => "an empty name",
|
|
206
|
+
"../escaped" => "a path fragment",
|
|
207
|
+
}.each do |name, why|
|
|
208
|
+
it "rejects #{name.inspect} -- #{why}" do
|
|
209
|
+
err = _(proc { generate(name: name) }).must_raise ::Thor::Error
|
|
210
|
+
|
|
211
|
+
_(err.message).must_include "not a usable plugin name"
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it "writes nothing when the name is rejected" do
|
|
216
|
+
_(proc { generate(name: "my-junit") }).must_raise ::Thor::Error
|
|
217
|
+
|
|
218
|
+
_(Dir.glob(File.join(@tmpdir, "*"))).must_be_empty
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "suggests a usable name" do
|
|
222
|
+
err = _(proc { generate(name: "my-junit") }).must_raise ::Thor::Error
|
|
223
|
+
|
|
224
|
+
_(err.message).must_include "'my_junit'"
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def generate(license: "apachev2", name: "demo")
|
|
157
229
|
command = Busser::Command::PluginCreate.new(
|
|
158
|
-
[
|
|
230
|
+
[name], { "type" => "runner", "license" => license }
|
|
159
231
|
)
|
|
160
232
|
command.stubs(:initialize_git)
|
|
161
233
|
capture_stdout { command.create }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require_relative "../../spec_helper"
|
|
2
|
+
|
|
3
|
+
require "busser/command/plugin_install"
|
|
4
|
+
|
|
5
|
+
describe Busser::Command::PluginInstall do
|
|
6
|
+
let(:command) { Busser::Command::PluginInstall.new([%w{busser-dummy}]) }
|
|
7
|
+
|
|
8
|
+
describe "#drop_ssl_verify_peer" do
|
|
9
|
+
# VERIFY_PEER is a process-global constant, so anything that leaves it
|
|
10
|
+
# lowered affects every later gem download in the same run. `busser plugin
|
|
11
|
+
# install` takes a list of plugins, which is exactly that situation.
|
|
12
|
+
it "lowers verification for the block" do
|
|
13
|
+
inside = nil
|
|
14
|
+
command.send(:drop_ssl_verify_peer) { inside = OpenSSL::SSL::VERIFY_PEER }
|
|
15
|
+
|
|
16
|
+
_(inside).must_equal OpenSSL::SSL::VERIFY_NONE
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "restores verification afterwards" do
|
|
20
|
+
before = OpenSSL::SSL::VERIFY_PEER
|
|
21
|
+
command.send(:drop_ssl_verify_peer) { nil }
|
|
22
|
+
|
|
23
|
+
_(OpenSSL::SSL::VERIFY_PEER).must_equal before
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The regression this guards. A postinstall raising is not exotic: it is
|
|
27
|
+
# how a plugin reports that it could not install its test framework.
|
|
28
|
+
it "restores verification when the block raises" do
|
|
29
|
+
before = OpenSSL::SSL::VERIFY_PEER
|
|
30
|
+
|
|
31
|
+
_(proc { command.send(:drop_ssl_verify_peer) { raise "postinstall blew up" } })
|
|
32
|
+
.must_raise RuntimeError
|
|
33
|
+
|
|
34
|
+
_(OpenSSL::SSL::VERIFY_PEER).must_equal before
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "restores verification when the block throws" do
|
|
38
|
+
before = OpenSSL::SSL::VERIFY_PEER
|
|
39
|
+
catch(:done) { command.send(:drop_ssl_verify_peer) { throw :done } }
|
|
40
|
+
|
|
41
|
+
_(OpenSSL::SSL::VERIFY_PEER).must_equal before
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require_relative "../../spec_helper"
|
|
2
|
+
|
|
3
|
+
require "busser/command/plugin_list"
|
|
4
|
+
|
|
5
|
+
describe Busser::Command::PluginList do
|
|
6
|
+
let(:command) { Busser::Command::PluginList.new }
|
|
7
|
+
|
|
8
|
+
describe "#plugin_data" do
|
|
9
|
+
def stub_plugins(paths, specs = {})
|
|
10
|
+
Busser::Plugin.stubs(:runner_plugins).returns(paths)
|
|
11
|
+
paths.each do |path|
|
|
12
|
+
Busser::Plugin.stubs(:gem_from_path).with(path).returns(specs[path])
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def spec_for(name, version)
|
|
17
|
+
Gem::Specification.new { |s| s.name = name; s.version = version }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "reports each plugin's short name and version" do
|
|
21
|
+
stub_plugins(["busser/runner_plugin/bash"],
|
|
22
|
+
"busser/runner_plugin/bash" => spec_for("busser-bash", "0.2.0"))
|
|
23
|
+
|
|
24
|
+
_(command.send(:plugin_data)).must_equal [["bash", Gem::Version.new("0.2.0")]]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# dummy is a fixture shipped inside busser for its own tests, not something
|
|
28
|
+
# anyone installed. `busser test` already passes over it, so listing it was
|
|
29
|
+
# inconsistent as well as confusing.
|
|
30
|
+
it "leaves out the internal dummy runner" do
|
|
31
|
+
stub_plugins(["busser/runner_plugin/dummy", "busser/runner_plugin/bash"],
|
|
32
|
+
"busser/runner_plugin/bash" => spec_for("busser-bash", "0.2.0"))
|
|
33
|
+
|
|
34
|
+
_(command.send(:plugin_data).map(&:first)).must_equal %w{bash}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "reports a nil version rather than raising when no spec is found" do
|
|
38
|
+
stub_plugins(["busser/runner_plugin/bash"])
|
|
39
|
+
|
|
40
|
+
_(command.send(:plugin_data)).must_equal [["bash", nil]]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "returns an empty list when dummy is all there is" do
|
|
44
|
+
stub_plugins(["busser/runner_plugin/dummy"])
|
|
45
|
+
|
|
46
|
+
_(command.send(:plugin_data)).must_be_empty
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
1
|
#
|
|
3
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
3
|
# you may not use this file except in compliance with the License.
|
|
@@ -97,6 +96,27 @@ describe Busser::Command::Setup do
|
|
|
97
96
|
end
|
|
98
97
|
end
|
|
99
98
|
|
|
99
|
+
# Windows RubyGems splits GEM_PATH on ";". Joining with ":" produced one
|
|
100
|
+
# unusable entry, because every Windows path already contains a colon after
|
|
101
|
+
# its drive letter -- so the isolated gem environment silently did not
|
|
102
|
+
# exist and Busser resolved gems from wherever it happened to land.
|
|
103
|
+
it "separates GEM_PATH entries with the Windows separator" do
|
|
104
|
+
Gem.paths.stubs(:path).returns(["C:/Ruby34/lib/ruby/gems", "C:/Users/kitchen/.gem"])
|
|
105
|
+
run_setup(type: "bat")
|
|
106
|
+
|
|
107
|
+
_(binstub_body).must_include(
|
|
108
|
+
'SET "GEM_PATH=C:\\Ruby34\\lib\\ruby\\gems;C:\\Users\\kitchen\\.gem"'
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "does not separate GEM_PATH entries with a colon" do
|
|
113
|
+
Gem.paths.stubs(:path).returns(["C:/a", "C:/b"])
|
|
114
|
+
run_setup(type: "bat")
|
|
115
|
+
|
|
116
|
+
gem_path = binstub_body[/^SET "GEM_PATH=(.*)"$/, 1]
|
|
117
|
+
_(gem_path.split(";").length).must_equal 2
|
|
118
|
+
end
|
|
119
|
+
|
|
100
120
|
def binstub
|
|
101
121
|
File.join(@tmpdir, "bin", "busser.bat")
|
|
102
122
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require_relative "../../spec_helper"
|
|
2
|
+
|
|
3
|
+
require "shellwords"
|
|
4
|
+
require "busser/command/test"
|
|
5
|
+
|
|
6
|
+
describe Busser::Command::Test do
|
|
7
|
+
describe ".prepare_sh_command" do
|
|
8
|
+
it "runs the script with sh" do
|
|
9
|
+
cmd = Busser::Command::Test.prepare_sh_command("/opt/busser/suites/bats/prepare.sh")
|
|
10
|
+
|
|
11
|
+
_(Shellwords.split(cmd)).must_equal ["/bin/sh", "/opt/busser/suites/bats/prepare.sh"]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# BUSSER_ROOT is chosen by whoever runs Busser, and Test Kitchen puts it
|
|
15
|
+
# under a path the user controls. Unquoted, a space split the path and sh
|
|
16
|
+
# was handed a fragment.
|
|
17
|
+
it "quotes a path containing spaces" do
|
|
18
|
+
cmd = Busser::Command::Test.prepare_sh_command("/tmp/my tests/suites/bats/prepare.sh")
|
|
19
|
+
|
|
20
|
+
_(Shellwords.split(cmd))
|
|
21
|
+
.must_equal ["/bin/sh", "/tmp/my tests/suites/bats/prepare.sh"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "neutralises shell metacharacters in the path" do
|
|
25
|
+
cmd = Busser::Command::Test.prepare_sh_command("/tmp/a;touch pwned/prepare.sh")
|
|
26
|
+
|
|
27
|
+
_(Shellwords.split(cmd)).must_equal ["/bin/sh", "/tmp/a;touch pwned/prepare.sh"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "accepts a Pathname" do
|
|
31
|
+
cmd = Busser::Command::Test.prepare_sh_command(Pathname.new("/a/prepare.sh"))
|
|
32
|
+
|
|
33
|
+
_(Shellwords.split(cmd).last).must_equal "/a/prepare.sh"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/spec/busser/helpers_spec.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative "../spec_helper"
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "busser/helpers"
|
|
4
4
|
|
|
5
5
|
describe Busser::Helpers do
|
|
6
6
|
|
|
@@ -25,16 +25,16 @@ describe Busser::Helpers do
|
|
|
25
25
|
|
|
26
26
|
describe "with a custom root path" do
|
|
27
27
|
|
|
28
|
-
before { ENV[
|
|
29
|
-
after { ENV[
|
|
28
|
+
before { ENV["_SPEC_BUSSER_ROOT"] = ENV["BUSSER_ROOT"] }
|
|
29
|
+
after { ENV["BUSSER_ROOT"] = ENV.delete("_SPEC_BUSSER_ROOT") }
|
|
30
30
|
|
|
31
31
|
it "returns a base path if no suite name is given" do
|
|
32
|
-
ENV[
|
|
32
|
+
ENV["BUSSER_ROOT"] = "/path/to/busser"
|
|
33
33
|
_(suite_path.to_s).must_match %r{/path/to/busser/suites$}
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "returns a suite path given a suite name" do
|
|
37
|
-
ENV[
|
|
37
|
+
ENV["BUSSER_ROOT"] = "/path/to/busser"
|
|
38
38
|
_(suite_path("fuzzy").to_s).must_match %r{/path/to/busser/suites/fuzzy$}
|
|
39
39
|
end
|
|
40
40
|
end
|
|
@@ -59,16 +59,16 @@ describe Busser::Helpers do
|
|
|
59
59
|
|
|
60
60
|
describe "with a custom root path" do
|
|
61
61
|
|
|
62
|
-
before { ENV[
|
|
63
|
-
after { ENV[
|
|
62
|
+
before { ENV["_SPEC_BUSSER_ROOT"] = ENV["BUSSER_ROOT"] }
|
|
63
|
+
after { ENV["BUSSER_ROOT"] = ENV.delete("_SPEC_BUSSER_ROOT") }
|
|
64
64
|
|
|
65
65
|
it "returns a base path if no product name is given" do
|
|
66
|
-
ENV[
|
|
66
|
+
ENV["BUSSER_ROOT"] = "/path/to/busser"
|
|
67
67
|
_(vendor_path.to_s).must_match %r{/path/to/busser/vendor$}
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
it "returns a suite path given a product name" do
|
|
71
|
-
ENV[
|
|
71
|
+
ENV["BUSSER_ROOT"] = "/path/to/busser"
|
|
72
72
|
_(vendor_path("maximal").to_s).must_match \
|
|
73
73
|
%r{/path/to/busser/vendor/maximal$}
|
|
74
74
|
end
|
data/spec/busser/plugin_spec.rb
CHANGED
data/spec/busser/ui_spec.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require_relative
|
|
1
|
+
require_relative "../spec_helper"
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "busser/ui"
|
|
4
4
|
|
|
5
5
|
# Dummy class containing diagnostic methods approximating Thor mixins
|
|
6
6
|
class SneakyUI
|
|
@@ -11,7 +11,7 @@ class SneakyUI
|
|
|
11
11
|
attr_accessor :status
|
|
12
12
|
|
|
13
13
|
def say(msg)
|
|
14
|
-
|
|
14
|
+
msg
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def error(msg)
|
|
@@ -111,7 +111,7 @@ describe Busser::UI do
|
|
|
111
111
|
|
|
112
112
|
_(ui.run_args).must_equal([
|
|
113
113
|
"doitpls",
|
|
114
|
-
{ :
|
|
114
|
+
{ capture: false, verbose: false },
|
|
115
115
|
])
|
|
116
116
|
end
|
|
117
117
|
|
|
@@ -181,16 +181,16 @@ describe Busser::UI do
|
|
|
181
181
|
|
|
182
182
|
_(ui.run_ruby_script_args).must_equal([
|
|
183
183
|
"theworks.rb",
|
|
184
|
-
{ :
|
|
184
|
+
{ capture: false, verbose: false },
|
|
185
185
|
])
|
|
186
186
|
end
|
|
187
187
|
|
|
188
188
|
it "calls #run_ruby_script with correct default options" do
|
|
189
|
-
ui.invoke_run_ruby_script!("theworks.rb", :
|
|
189
|
+
ui.invoke_run_ruby_script!("theworks.rb", verbose: true)
|
|
190
190
|
|
|
191
191
|
_(ui.run_ruby_script_args).must_equal([
|
|
192
192
|
"theworks.rb",
|
|
193
|
-
{ :
|
|
193
|
+
{ capture: false, verbose: true },
|
|
194
194
|
])
|
|
195
195
|
end
|
|
196
196
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
1
|
#
|
|
3
2
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
3
|
#
|
|
@@ -16,5 +15,5 @@
|
|
|
16
15
|
# See the License for the specific language governing permissions and
|
|
17
16
|
# limitations under the License.
|
|
18
17
|
|
|
19
|
-
require
|
|
20
|
-
require
|
|
18
|
+
require "minitest/autorun"
|
|
19
|
+
require "mocha/minitest"
|
|
@@ -2,7 +2,11 @@ require "bundler/gem_tasks"
|
|
|
2
2
|
require "cucumber/rake/task"
|
|
3
3
|
|
|
4
4
|
Cucumber::Rake::Task.new(:features) do |t|
|
|
5
|
-
|
|
5
|
+
# --strict-undefined so the scenarios generated with <YOUR_FILE> placeholders
|
|
6
|
+
# fail until they are filled in. Undefined steps otherwise pass silently, and
|
|
7
|
+
# a new plugin reports a green suite that asserts nothing.
|
|
8
|
+
t.cucumber_opts = ["features", "--format progress", "--fail-fast",
|
|
9
|
+
"--strict-undefined"]
|
|
6
10
|
end
|
|
7
11
|
|
|
8
12
|
desc "Run all test suites"
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
require "aruba/cucumber"
|
|
2
2
|
require "busser/cucumber"
|
|
3
3
|
|
|
4
|
+
# Installing a plugin and its gems into a cold sandbox does not fit in aruba's
|
|
5
|
+
# 15 second default.
|
|
4
6
|
Aruba.configure do |config|
|
|
5
|
-
config.exit_timeout =
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
After do |s|
|
|
9
|
-
# Tell Cucumber to quit after this scenario is done - if it failed.
|
|
10
|
-
# This is useful to inspect the 'tmp/aruba' directory before any other
|
|
11
|
-
# steps are executed and clear it out.
|
|
12
|
-
Cucumber.wants_to_quit = true if s.failed?
|
|
7
|
+
config.exit_timeout = 60
|
|
13
8
|
end
|
|
@@ -15,15 +15,11 @@ Gem::Specification.new do |spec|
|
|
|
15
15
|
spec.license = '<%= config[:license_spdx] %>'
|
|
16
16
|
<% end -%>
|
|
17
17
|
|
|
18
|
-
spec.files = `git ls-files`.split(
|
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
19
19
|
spec.executables = []
|
|
20
20
|
spec.require_paths = ['lib']
|
|
21
21
|
|
|
22
22
|
spec.required_ruby_version = '>= 3.2'
|
|
23
23
|
|
|
24
|
-
spec.add_dependency 'busser'
|
|
25
|
-
|
|
26
|
-
spec.add_development_dependency 'rake'
|
|
27
|
-
spec.add_development_dependency 'aruba', '>= 2.0'
|
|
28
|
-
spec.add_development_dependency 'cucumber', '>= 9.0'
|
|
24
|
+
spec.add_dependency 'busser', '>= 0.9.0'
|
|
29
25
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Runs on the machine under test, put there by Busser and executed by
|
|
3
|
+
# busser-bash. Exit status is the verdict.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
# Busser exports these for the suite, and getting them wrong is how the
|
|
7
|
+
# isolated gem environment silently stops being isolated.
|
|
8
|
+
test -n "${BUSSER_ROOT:-}"
|
|
9
|
+
test -d "${BUSSER_ROOT}"
|
|
10
|
+
test -x "${BUSSER_ROOT}/bin/busser"
|
|
11
|
+
|
|
12
|
+
echo "busser handed this script to busser-bash under ${BUSSER_ROOT}"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: busser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fletcher Nichol
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-10-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -38,62 +38,6 @@ dependencies:
|
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: aruba
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ">="
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '2.0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ">="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '2.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: minitest
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: mocha
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: rake
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
41
|
description: Busser - Runs tests for projects in Test Kitchen
|
|
98
42
|
email:
|
|
99
43
|
- fnichol@nichol.ca
|
|
@@ -103,6 +47,7 @@ extensions: []
|
|
|
103
47
|
extra_rdoc_files: []
|
|
104
48
|
files:
|
|
105
49
|
- ".github/workflows/ci.yml"
|
|
50
|
+
- ".github/workflows/integration.yml"
|
|
106
51
|
- ".github/workflows/pr-title.yml"
|
|
107
52
|
- ".github/workflows/publish.yml"
|
|
108
53
|
- ".gitignore"
|
|
@@ -126,6 +71,8 @@ files:
|
|
|
126
71
|
- features/suite_cleanup_command.feature
|
|
127
72
|
- features/suite_path_command.feature
|
|
128
73
|
- features/support/env.rb
|
|
74
|
+
- kitchen-preinstall.sh
|
|
75
|
+
- kitchen.yml
|
|
129
76
|
- lib/busser.rb
|
|
130
77
|
- lib/busser/cli.rb
|
|
131
78
|
- lib/busser/command/deserialize.rb
|
|
@@ -152,7 +99,10 @@ files:
|
|
|
152
99
|
- renovate.json
|
|
153
100
|
- spec/busser/command/deserialize_spec.rb
|
|
154
101
|
- spec/busser/command/plugin_create_spec.rb
|
|
102
|
+
- spec/busser/command/plugin_install_spec.rb
|
|
103
|
+
- spec/busser/command/plugin_list_spec.rb
|
|
155
104
|
- spec/busser/command/setup_spec.rb
|
|
105
|
+
- spec/busser/command/test_spec.rb
|
|
156
106
|
- spec/busser/helpers_spec.rb
|
|
157
107
|
- spec/busser/plugin_spec.rb
|
|
158
108
|
- spec/busser/ui_spec.rb
|
|
@@ -174,10 +124,16 @@ files:
|
|
|
174
124
|
- templates/plugin/license_reserved.erb
|
|
175
125
|
- templates/plugin/runner_plugin.rb.erb
|
|
176
126
|
- templates/plugin/version.rb.erb
|
|
127
|
+
- test/integration/default/bash/smoke_test.sh
|
|
177
128
|
homepage: https://github.com/test-kitchen/busser
|
|
178
129
|
licenses:
|
|
179
130
|
- Apache-2.0
|
|
180
|
-
metadata:
|
|
131
|
+
metadata:
|
|
132
|
+
bug_tracker_uri: https://github.com/test-kitchen/busser/issues
|
|
133
|
+
changelog_uri: https://github.com/test-kitchen/busser/blob/main/CHANGELOG.md
|
|
134
|
+
documentation_uri: https://github.com/test-kitchen/busser/blob/main/README.md
|
|
135
|
+
homepage_uri: https://github.com/test-kitchen/busser
|
|
136
|
+
source_code_uri: https://github.com/test-kitchen/busser
|
|
181
137
|
post_install_message:
|
|
182
138
|
rdoc_options: []
|
|
183
139
|
require_paths:
|