vagrant_spec 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +10 -0
- data/LICENSE +13 -0
- data/README.md +146 -0
- data/Rakefile +26 -0
- data/Vagrantfile +27 -0
- data/lib/vagrant_spec/ansible_inventory.rb +80 -0
- data/lib/vagrant_spec/command/base.rb +74 -0
- data/lib/vagrant_spec/command/init.rb +45 -0
- data/lib/vagrant_spec/command/test.rb +32 -0
- data/lib/vagrant_spec/command.rb +9 -0
- data/lib/vagrant_spec/config/base.rb +42 -0
- data/lib/vagrant_spec/config.rb +20 -0
- data/lib/vagrant_spec/machine_finder.rb +31 -0
- data/lib/vagrant_spec/spec_helper.rb +42 -0
- data/lib/vagrant_spec/templates/spec_helper.erb +19 -0
- data/lib/vagrant_spec/templates/vagrantspec_inventory.erb +12 -0
- data/lib/vagrant_spec/test_plan.rb +68 -0
- data/lib/vagrant_spec/utils.rb +23 -0
- data/lib/vagrant_spec/version.rb +6 -0
- data/lib/vagrant_spec.rb +27 -0
- data/scripts/poor_mans_smoke_test.sh +17 -0
- data/serverspec/fail_spec.rb +7 -0
- data/serverspec/ssh_spec.rb +10 -0
- data/spec/unit/spec_helper.rb +101 -0
- data/spec/unit/vagrant_spec_spec.rb +13 -0
- data/spec/unit/vagrant_spec_test/ansible_inventory_spec.rb +143 -0
- data/spec/unit/vagrant_spec_test/command_spec/base_spec.rb +105 -0
- data/spec/unit/vagrant_spec_test/command_spec/init_spec.rb +87 -0
- data/spec/unit/vagrant_spec_test/command_spec/test_spec.rb +45 -0
- data/spec/unit/vagrant_spec_test/config_spec/base_spec.rb +34 -0
- data/spec/unit/vagrant_spec_test/config_spec.rb +15 -0
- data/spec/unit/vagrant_spec_test/machine_finder_spec.rb +27 -0
- data/spec/unit/vagrant_spec_test/spec_helper_spec.rb +41 -0
- data/spec/unit/vagrant_spec_test/test_plan_spec.rb +104 -0
- data/spec/unit/vagrant_spec_test/utils_spec.rb +24 -0
- data/vagrant_spec.gemspec +30 -0
- metadata +184 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'rspec'
|
4
|
+
|
5
|
+
require 'vagrant_spec/config'
|
6
|
+
require 'vagrant_spec/machine_finder'
|
7
|
+
|
8
|
+
module VagrantSpec
|
9
|
+
# Run serverspec tests
|
10
|
+
#
|
11
|
+
# env [Vagrant::Environment]
|
12
|
+
class TestPlan
|
13
|
+
attr_reader :env, :config, :test_plan, :m_finder
|
14
|
+
def initialize(env)
|
15
|
+
@env = env
|
16
|
+
@config = VagrantSpec::Config.load(env)
|
17
|
+
@test_plan = @config.spec.test_plan
|
18
|
+
@m_finder = VagrantSpec::MachineFinder.new(env)
|
19
|
+
@ret_code = 0
|
20
|
+
end
|
21
|
+
|
22
|
+
# Run the test suite and exit based on the return codes of the tests
|
23
|
+
#
|
24
|
+
# This will fail if any of the tests fail, but it will allow all tests to
|
25
|
+
# run
|
26
|
+
def run
|
27
|
+
@env.ui.info('*******************************************************')
|
28
|
+
@env.ui.info('***************** ServerSpec Test Run *****************')
|
29
|
+
@env.ui.info('*******************************************************')
|
30
|
+
@env.ui.info('')
|
31
|
+
@test_plan.each do |plan|
|
32
|
+
nodes(plan).each { |node| execute_plan_tests(node, plan) }
|
33
|
+
end
|
34
|
+
exit @ret_code
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return array of active Vagrant machines
|
38
|
+
#
|
39
|
+
# plan [Hash] item in the @config.spec.test_plan
|
40
|
+
#
|
41
|
+
# return [Array<Vagrant::Machine>]
|
42
|
+
def nodes(plan)
|
43
|
+
if plan['nodes'].is_a?(Regexp)
|
44
|
+
@m_finder.match_nodes(plan['nodes'])
|
45
|
+
elsif plan['nodes'].is_a?(Array)
|
46
|
+
plan['nodes'].collect { |n| @m_finder.machine(n.to_sym) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Execute a test_suite and return the code
|
51
|
+
#
|
52
|
+
# node [Vagrant::Machine]
|
53
|
+
# plan [Hash] item in the @config.spec.test_plan
|
54
|
+
#
|
55
|
+
# return [@ret_code]
|
56
|
+
def execute_plan_tests(node, plan)
|
57
|
+
@env.ui.info("[#{node.name}]")
|
58
|
+
ENV['VAGRANT_HOST'] = node.ssh_info[:host].to_s
|
59
|
+
ENV['VAGRANT_PORT'] = node.ssh_info[:port].to_s
|
60
|
+
ENV['VAGRANT_KEY'] = node.ssh_info[:private_key_path][0].to_s
|
61
|
+
ENV['VAGRANT_USER'] = node.ssh_info[:username].to_s
|
62
|
+
plan['flags'].prepend "-I #{@config.spec.directory} "
|
63
|
+
ret_code = RSpec::Core::Runner.run(plan['flags'].split, $stderr, $stdout)
|
64
|
+
RSpec.clear_examples
|
65
|
+
@ret_code = ret_code unless ret_code.zero?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module VagrantSpec
|
4
|
+
# Utilities
|
5
|
+
module Utils
|
6
|
+
# return [String]
|
7
|
+
def project_root
|
8
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', '..'), __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
# return [String]
|
12
|
+
def lib_root
|
13
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..'), __FILE__)
|
14
|
+
end
|
15
|
+
|
16
|
+
# return [String]
|
17
|
+
def template_dir
|
18
|
+
File.expand_path(
|
19
|
+
File.join(lib_root, 'vagrant_spec', 'templates'), __FILE__
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/vagrant_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'vagrant'
|
5
|
+
rescue LoadError
|
6
|
+
raise 'The Vagrant plugin vagrant_spec must be run within Vagrant'
|
7
|
+
end
|
8
|
+
|
9
|
+
module VagrantSpec
|
10
|
+
# Plugin definitions
|
11
|
+
class Plugin < Vagrant.plugin(2)
|
12
|
+
name 'spec'
|
13
|
+
description <<-DESC
|
14
|
+
This plugin eases rspec and serverspec testing
|
15
|
+
DESC
|
16
|
+
|
17
|
+
command :spec do
|
18
|
+
require 'vagrant_spec/command/base'
|
19
|
+
VagrantSpec::Command::Base
|
20
|
+
end
|
21
|
+
|
22
|
+
config :spec do
|
23
|
+
require 'vagrant_spec/config/base'
|
24
|
+
VagrantSpec::Config::Base
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is purely for convenience. This has to be watched to verify that the
|
4
|
+
# plugin works in a live environment. Better testing to come...
|
5
|
+
|
6
|
+
set -e
|
7
|
+
|
8
|
+
bundle exec vagrant spec
|
9
|
+
bundle exec vagrant spec -h
|
10
|
+
bundle exec vagrant spec init -h
|
11
|
+
bundle exec vagrant spec test -h
|
12
|
+
bundle exec vagrant spec no_command -h
|
13
|
+
rm -f serverspec/spec_helper.rb
|
14
|
+
bundle exec vagrant up
|
15
|
+
bundle exec vagrant spec init
|
16
|
+
bundle exec vagrant spec test || true
|
17
|
+
bundle exec vagrant destroy -f
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
# Get path to vagrant's test directory so we can load that code. We'll want it
|
9
|
+
# for getting access to its convenient shared methods and contexts and such
|
10
|
+
VAGRANT_LIB_DIR = Gem::Specification.find_by_name('vagrant').gem_dir.freeze
|
11
|
+
VAGRANT_TEST_DIR = File.join(VAGRANT_LIB_DIR, 'test').freeze
|
12
|
+
|
13
|
+
# Load code paths
|
14
|
+
$LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), __FILE__)
|
15
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
|
16
|
+
$LOAD_PATH.unshift File.expand_path(VAGRANT_TEST_DIR, __FILE__)
|
17
|
+
|
18
|
+
require 'vagrant'
|
19
|
+
require 'vagrant_spec'
|
20
|
+
|
21
|
+
require 'unit/support/shared/base_context'
|
22
|
+
require 'unit/support/shared/virtualbox_context'
|
23
|
+
|
24
|
+
# Build methods to retrieve plugins against VagrantSpec::Plugin.
|
25
|
+
#
|
26
|
+
# Example: get_commands(VagrantSpec::Plugin)
|
27
|
+
#
|
28
|
+
# The method call above will return an array of Command plugin names as symbols.
|
29
|
+
# Add support by extending the symbol arrays as needed
|
30
|
+
%i(command).each do |plugin|
|
31
|
+
plural = "#{plugin}s"
|
32
|
+
plural_symbol = plural.to_sym
|
33
|
+
method_name = "get_#{plural}"
|
34
|
+
define_method(method_name) do |plugin_obj|
|
35
|
+
plugin_obj.components.send(plural_symbol).keys
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
%i(config).each do |plugin|
|
40
|
+
plural = "#{plugin}s"
|
41
|
+
plural_symbol = plural.to_sym
|
42
|
+
method_name = "get_#{plural}"
|
43
|
+
define_method(method_name) do |plugin_obj|
|
44
|
+
plugin_obj.components.send(plural_symbol)[:top].keys
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
RSpec.shared_examples 'shared_mocks' do
|
49
|
+
let(:vagrant_file) do
|
50
|
+
<<-EOF.gsub(/^ {4}/, '')
|
51
|
+
Vagrant.configure(2) do |config|
|
52
|
+
config.vm.box = 'test'
|
53
|
+
end
|
54
|
+
EOF
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:mock_vf_obj) { double(Vagrant::Vagrantfile) }
|
58
|
+
let(:mock_ui) { double(Vagrant::UI) }
|
59
|
+
let(:mock_config) { double(Vagrant::Config) }
|
60
|
+
let(:mock_spec) { double(VagrantSpec::Config::Base) }
|
61
|
+
let(:mock_node) { double(Vagrant::Machine) }
|
62
|
+
|
63
|
+
let(:spec_dir) { 'serverspec' }
|
64
|
+
|
65
|
+
let(:iso_env) do
|
66
|
+
env = isolated_environment
|
67
|
+
env.vagrantfile vagrant_file
|
68
|
+
env.create_vagrant_env
|
69
|
+
env
|
70
|
+
end
|
71
|
+
|
72
|
+
before do
|
73
|
+
allow(iso_env).to receive(:ui)
|
74
|
+
allow(mock_node).to receive(:name)
|
75
|
+
allow(mock_ui).to receive(:info)
|
76
|
+
|
77
|
+
allow(iso_env).to receive(:vagrantfile) { mock_vf_obj }
|
78
|
+
allow(iso_env).to receive(:ui) { mock_ui }
|
79
|
+
allow(mock_vf_obj).to receive(:config) { mock_config }
|
80
|
+
allow(mock_config).to receive(:spec) { mock_spec }
|
81
|
+
allow(mock_spec).to receive(:directory) { spec_dir }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
RSpec::Matchers.define :have_attr_accessor do |field|
|
86
|
+
match do |obj_i|
|
87
|
+
obj_i.respond_to?(field) && obj_i.respond_to?("#{field}=")
|
88
|
+
end
|
89
|
+
|
90
|
+
failure_message do |obj_i|
|
91
|
+
"expected attr_accessor for #{field} on #{obj_i}"
|
92
|
+
end
|
93
|
+
|
94
|
+
failure_message_when_negated do |obj_i|
|
95
|
+
"expected attr_accessor for #{field} not to be defined on #{obj_i}"
|
96
|
+
end
|
97
|
+
|
98
|
+
description do
|
99
|
+
'checks to see if there is an attr accessor on the supplied object'
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
describe VagrantSpec::Plugin do
|
6
|
+
it 'has a command plugin: spec' do
|
7
|
+
expect(get_commands(VagrantSpec::Plugin)).to include(:spec)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'has a config plugin: spec' do
|
11
|
+
expect(get_configs(VagrantSpec::Plugin)).to include(:spec)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'vagrant_spec/ansible_inventory'
|
5
|
+
|
6
|
+
describe VagrantSpec::AnsibleInventory do
|
7
|
+
include_context 'unit'
|
8
|
+
include_examples 'shared_mocks'
|
9
|
+
|
10
|
+
let(:mock_ansible_inventory_regexp) { { 'all' => /node/ } }
|
11
|
+
let(:mock_ansible_inventory_array) { { 'all' => %w(node1) } }
|
12
|
+
|
13
|
+
let(:mock_machine_ssh_config) do
|
14
|
+
{
|
15
|
+
'ansible_host' => 'node1',
|
16
|
+
'ansible_port' => '2222',
|
17
|
+
'ansible_user' => 'vagrant',
|
18
|
+
'ansible_ssh_private_key_file' => 'mock_key'
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
subject { VagrantSpec::AnsibleInventory.new(iso_env) }
|
23
|
+
|
24
|
+
def load_ansible_inventory_proc
|
25
|
+
proc do
|
26
|
+
allow(subject).to receive(:handle_array)
|
27
|
+
allow(subject).to receive(:handle_regexp)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when ansible_inventory is a Regexp' do
|
32
|
+
it '#load_ansible_inventory calls handle_regexp' do
|
33
|
+
allow(mock_spec).to receive(:ansible_inventory) do
|
34
|
+
mock_ansible_inventory_regexp
|
35
|
+
end
|
36
|
+
load_ansible_inventory_proc.call
|
37
|
+
expect(subject).to receive(:handle_regexp)
|
38
|
+
subject.load_ansible_inventory
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when ansibe_inventory is an Array' do
|
43
|
+
it '#load_ansible_inventory calls handle_array' do
|
44
|
+
allow(mock_spec).to receive(:ansible_inventory) do
|
45
|
+
mock_ansible_inventory_array
|
46
|
+
end
|
47
|
+
|
48
|
+
load_ansible_inventory_proc.call
|
49
|
+
expect(subject).to receive(:handle_array)
|
50
|
+
subject.load_ansible_inventory
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it '#handle_array calls generate_machine_config on each node name' do
|
55
|
+
group = mock_ansible_inventory_array.keys[0]
|
56
|
+
nodes = mock_ansible_inventory_array.values[0]
|
57
|
+
|
58
|
+
allow(mock_spec).to receive(:ansible_inventory) do
|
59
|
+
mock_ansible_inventory_array
|
60
|
+
end
|
61
|
+
|
62
|
+
allow(subject).to receive(:generate_machine_config)
|
63
|
+
expect(subject).to receive(:generate_machine_config).with(nodes[0])
|
64
|
+
|
65
|
+
subject.handle_array(group, nodes)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Inject code into handle_regexp tests
|
69
|
+
def handle_regexp_proc
|
70
|
+
proc do
|
71
|
+
allow(mock_spec).to receive(:ansible_inventory) do
|
72
|
+
mock_ansible_inventory_regexp
|
73
|
+
end
|
74
|
+
|
75
|
+
allow(mock_node).to receive(:name) { 'node1' }
|
76
|
+
allow(subject).to receive(:generate_machine_config)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when nodes are matched' do
|
81
|
+
it '#handle_regexp calls generate_machine_config' do
|
82
|
+
handle_regexp_proc.call
|
83
|
+
|
84
|
+
allow(subject.m_finder).to receive(:match_nodes) { [mock_node] }
|
85
|
+
expect(subject).to receive(:generate_machine_config).with('node1')
|
86
|
+
|
87
|
+
subject.handle_regexp('all', /node/)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when nodes are not matched' do
|
92
|
+
it '#handle_regexp does nothing' do
|
93
|
+
handle_regexp_proc.call
|
94
|
+
|
95
|
+
allow(subject.m_finder).to receive(:match_nodes) {}
|
96
|
+
expect(subject).to_not receive(:generate_machine_config)
|
97
|
+
|
98
|
+
subject.handle_regexp('all', /node/)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def generate_machine_config_proc(_name)
|
103
|
+
proc do
|
104
|
+
allow(mock_spec).to receive(:ansible_inventory) do
|
105
|
+
mock_ansible_inventory_regexp
|
106
|
+
end
|
107
|
+
|
108
|
+
allow(subject).to receive(:machine_ssh_config) { mock_machine_ssh_config }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'when a node is found' do
|
113
|
+
it '#generate_machine_config calls machine_ssh_config' do
|
114
|
+
name = 'node1'
|
115
|
+
generate_machine_config_proc(name).call
|
116
|
+
|
117
|
+
allow(subject.m_finder).to receive(:machine).with(name.to_sym) do
|
118
|
+
mock_node
|
119
|
+
end
|
120
|
+
|
121
|
+
expect(subject).to receive(:machine_ssh_config) do
|
122
|
+
{ 'name' => mock_machine_ssh_config }
|
123
|
+
end
|
124
|
+
|
125
|
+
subject.generate_machine_config(name)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'when a node is not found' do
|
130
|
+
it '#generate_machine_config does nothing' do
|
131
|
+
name = 'node1'
|
132
|
+
generate_machine_config_proc(name).call
|
133
|
+
|
134
|
+
allow(subject.m_finder).to receive(:machine).with(name.to_sym) {}
|
135
|
+
|
136
|
+
expect(subject).not_to receive(:machine_ssh_config) do
|
137
|
+
{ 'name' => mock_machine_ssh_config }
|
138
|
+
end
|
139
|
+
|
140
|
+
subject.generate_machine_config(name)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'vagrant_spec/command/base'
|
5
|
+
|
6
|
+
describe VagrantSpec::Command::Base do
|
7
|
+
include_context 'unit'
|
8
|
+
include_examples 'shared_mocks'
|
9
|
+
|
10
|
+
let(:mock_opts) { double(OptionParser) }
|
11
|
+
let(:mock_registry) { double(Vagrant::Registry) }
|
12
|
+
|
13
|
+
before do
|
14
|
+
allow(Dir).to receive(:glob) { %w(base.rb foo.rb bar.rb bing.rb) }
|
15
|
+
allow_any_instance_of(VagrantSpec::Command::Base)
|
16
|
+
.to receive(:instance_variable_get).with('subcommands') { mock_registry }
|
17
|
+
end
|
18
|
+
|
19
|
+
subject { VagrantSpec::Command::Base.new([], iso_env) }
|
20
|
+
|
21
|
+
it 'VagrantSpec::Command::Base is subclass of Vagrant::Plugin::V2:Command' do
|
22
|
+
expect(VagrantSpec::Command::Base).to be < Vagrant::Plugin::V2::Command
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'instance contains the correct valid commands' do
|
26
|
+
expect(subject.valid_commands).to eq(%w(foo bar bing))
|
27
|
+
end
|
28
|
+
|
29
|
+
it '#register_subcommands results in the correct length' do
|
30
|
+
subject.valid_commands.each do |cmd|
|
31
|
+
allow(subject.subcommands).to receive(:register).with(cmd.to_sym)
|
32
|
+
expect(subject.subcommands).to receive(:register).with(cmd.to_sym)
|
33
|
+
end
|
34
|
+
subject.register_subcommands
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when -h is passed' do
|
38
|
+
it '#parse_main_args returns help' do
|
39
|
+
i = VagrantSpec::Command::Base.new(%w(-h), iso_env)
|
40
|
+
allow(i).to receive(:help)
|
41
|
+
expect(i).to receive(:help)
|
42
|
+
i.parse_main_args
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when --help is passed' do
|
47
|
+
it '#parse_main_args returns help' do
|
48
|
+
i = VagrantSpec::Command::Base.new(%w(--help), iso_env)
|
49
|
+
allow(i).to receive(:help)
|
50
|
+
expect(i).to receive(:help)
|
51
|
+
i.parse_main_args
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it '#print_help prints help output' do
|
56
|
+
i = VagrantSpec::Command::Base.new([], iso_env)
|
57
|
+
allow(i).to receive(:instance_variable_get).with('opts') do
|
58
|
+
mock_opts
|
59
|
+
end
|
60
|
+
|
61
|
+
allow(i).to receive(:help)
|
62
|
+
allow(i.env).to receive(:ui) { mock_ui }
|
63
|
+
allow(mock_ui).to receive(:info)
|
64
|
+
allow(mock_opts).to receive(:help)
|
65
|
+
|
66
|
+
expect(i).to receive(:help)
|
67
|
+
expect(mock_ui).to receive(:info).with(subject.opts)
|
68
|
+
|
69
|
+
i.print_help
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when no @sub_commands are nil' do
|
73
|
+
it '#parse_subcommands prints help' do
|
74
|
+
allow(subject).to receive(:instance_variable_get).with('sub_command') do
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
allow(subject.subcommands).to receive(:get) { nil }
|
78
|
+
allow(subject).to receive(:print_help)
|
79
|
+
expect(subject).to receive(:print_help)
|
80
|
+
subject.parse_subcommand
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when @subcommands.get returns nil' do
|
85
|
+
it '#parse_subcommands prints help' do
|
86
|
+
allow(subject).to receive(:instance_variable_get).with('sub_command') do
|
87
|
+
'mock_command'
|
88
|
+
end
|
89
|
+
allow(subject.subcommands).to receive(:get) { nil }
|
90
|
+
allow(subject).to receive(:print_help)
|
91
|
+
expect(subject).to receive(:print_help)
|
92
|
+
subject.parse_subcommand
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it '#execute registers subcommands and parses' do
|
97
|
+
allow(subject).to receive(:register_subcommands)
|
98
|
+
allow(subject).to receive(:parse_main_args) { 'not_nil' }
|
99
|
+
allow(subject).to receive(:parse_subcommand) { 'not_nil' }
|
100
|
+
expect(subject).to receive(:register_subcommands)
|
101
|
+
expect(subject).to receive(:parse_main_args)
|
102
|
+
expect(subject).to receive(:parse_subcommand)
|
103
|
+
subject.execute
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'vagrant_spec/command/init'
|
5
|
+
|
6
|
+
describe VagrantSpec::Command::Init do
|
7
|
+
include_context 'unit'
|
8
|
+
include_examples 'shared_mocks'
|
9
|
+
|
10
|
+
let(:mock_spec_helper) do
|
11
|
+
double(VagrantSpec::SpecHelper)
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:mock_ansible_inventory) do
|
15
|
+
double(VagrantSpec::AnsibleInventory)
|
16
|
+
end
|
17
|
+
|
18
|
+
before do
|
19
|
+
allow(mock_spec).to receive(:ansible_inventory) { { 'all' => /node/ } }
|
20
|
+
end
|
21
|
+
|
22
|
+
subject { VagrantSpec::Command::Init.new([], iso_env) }
|
23
|
+
|
24
|
+
it 'VagrantSpec::Command::Init is subclass of Vagrant::Plugin::V2:Command' do
|
25
|
+
expect(VagrantSpec::Command::Init).to be < Vagrant::Plugin::V2::Command
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute_proc
|
29
|
+
proc do
|
30
|
+
allow_any_instance_of(VagrantSpec::SpecHelper).to receive(:generate)
|
31
|
+
allow_any_instance_of(VagrantSpec::AnsibleInventory).to receive(:generate)
|
32
|
+
allow(mock_spec_helper).to receive(:generate)
|
33
|
+
allow(mock_ansible_inventory).to receive(:generate)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when parse_opts returns nil' do
|
38
|
+
it '#execute does nothing' do
|
39
|
+
allow(subject).to receive(:parse_opts) { nil }
|
40
|
+
execute_proc.call
|
41
|
+
expect(subject.execute).to be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when parse_opts does not return nil' do
|
46
|
+
def execute_protection_proc
|
47
|
+
proc do
|
48
|
+
allow(subject).to receive(:parse_opts) { 'not_nil' }
|
49
|
+
allow(VagrantSpec::SpecHelper).to receive(:new) do
|
50
|
+
mock_spec_helper
|
51
|
+
end
|
52
|
+
allow(VagrantSpec::AnsibleInventory).to receive(:new) do
|
53
|
+
mock_ansible_inventory
|
54
|
+
end
|
55
|
+
execute_proc.call
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'and when @ansible_inventory eq empty hash,' do
|
60
|
+
it '#execute creates an instance of VagrantSpec::SpecHelper' do
|
61
|
+
execute_protection_proc.call
|
62
|
+
subject.ansible_inventory = {}
|
63
|
+
|
64
|
+
expect(mock_spec_helper).to receive(:generate)
|
65
|
+
expect(mock_ansible_inventory).to_not receive(:generate)
|
66
|
+
subject.execute
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'and when @ansible_inventory has data' do
|
71
|
+
it '#execute creates instances of SpecHelper and AnsibleInventory' do
|
72
|
+
execute_protection_proc.call
|
73
|
+
subject.ansible_inventory = { 'all' => /node/ }
|
74
|
+
|
75
|
+
expect(mock_spec_helper).to receive(:generate)
|
76
|
+
expect(mock_ansible_inventory).to receive(:generate)
|
77
|
+
subject.execute
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it '#parse_opts calls parse_options' do
|
83
|
+
allow(subject).to receive(:parse_options)
|
84
|
+
expect(subject).to receive(:parse_options)
|
85
|
+
subject.parse_opts
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'vagrant_spec/command/test'
|
5
|
+
|
6
|
+
describe VagrantSpec::Command::Test do
|
7
|
+
include_context 'unit'
|
8
|
+
include_examples 'shared_mocks'
|
9
|
+
|
10
|
+
let(:mock_test) { double(VagrantSpec::TestPlan) }
|
11
|
+
|
12
|
+
subject { VagrantSpec::Command::Test.new([], iso_env) }
|
13
|
+
|
14
|
+
context 'when parse_opts returns nil' do
|
15
|
+
it '#execute should do nothing' do
|
16
|
+
allow(VagrantSpec::TestPlan).to receive(:new) { mock_test }
|
17
|
+
|
18
|
+
allow(subject).to receive(:parse_opts) { nil }
|
19
|
+
allow(mock_test).to receive(:new)
|
20
|
+
allow(mock_test).to receive(:run)
|
21
|
+
|
22
|
+
expect(mock_test).not_to receive(:new)
|
23
|
+
subject.execute
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when parse_opts returns data' do
|
28
|
+
it '#execute should test' do
|
29
|
+
allow(subject).to receive(:parse_opts) { 'not_nil' }
|
30
|
+
|
31
|
+
allow(VagrantSpec::TestPlan).to receive(:new) { mock_test }
|
32
|
+
allow(mock_test).to receive(:new)
|
33
|
+
allow(mock_test).to receive(:run)
|
34
|
+
|
35
|
+
expect(mock_test).to receive(:run)
|
36
|
+
subject.execute
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it '#parse_opts calls parse_options' do
|
41
|
+
allow(subject).to receive(:parse_options)
|
42
|
+
expect(subject).to receive(:parse_options)
|
43
|
+
subject.parse_opts
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'vagrant_spec/config/base'
|
5
|
+
require 'vagrant/plugin'
|
6
|
+
|
7
|
+
describe VagrantSpec::Config::Base do
|
8
|
+
include_context 'unit'
|
9
|
+
include_examples 'shared_mocks'
|
10
|
+
|
11
|
+
subject { VagrantSpec::Config::Base.new }
|
12
|
+
|
13
|
+
it 'VagrantSpec::Config::Base is a subclass of Vagrant::Plugin::V2::Config' do
|
14
|
+
expect(VagrantSpec::Config::Base).to be < Vagrant::Plugin::V2::Config
|
15
|
+
end
|
16
|
+
|
17
|
+
%i(directory ansible_inventory test_plan).each do |a|
|
18
|
+
it "VagrantSpec::Config::Base has the attr_accessor: #{a}" do
|
19
|
+
expect(subject).to have_attr_accessor(a)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:methods) do
|
24
|
+
%w(final_directory final_ansible_inventory final_test_plan)
|
25
|
+
end
|
26
|
+
|
27
|
+
%w(final_directory final_ansible_inventory final_test_plan).each do |method|
|
28
|
+
it "#finalize! calls #{method}" do
|
29
|
+
methods.each { |m| allow(subject).to receive(m.to_sym) }
|
30
|
+
expect(subject).to receive(method.to_sym)
|
31
|
+
subject.finalize!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|