ridley 0.9.1 → 0.10.0.rc1
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.
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/Guardfile +1 -1
- data/README.md +1 -1
- data/bootstrappers/{omnibus.erb → unix_omnibus.erb} +20 -5
- data/bootstrappers/windows_omnibus.erb +133 -0
- data/lib/ridley.rb +4 -1
- data/lib/ridley/bootstrap_bindings.rb +5 -0
- data/lib/ridley/bootstrap_bindings/unix_template_binding.rb +112 -0
- data/lib/ridley/bootstrap_bindings/windows_template_binding.rb +221 -0
- data/lib/ridley/bootstrapper.rb +14 -22
- data/lib/ridley/bootstrapper/context.rb +53 -162
- data/lib/ridley/chef.rb +0 -1
- data/lib/ridley/chef/cookbook.rb +0 -9
- data/lib/ridley/client.rb +12 -1
- data/lib/ridley/errors.rb +1 -0
- data/lib/ridley/host_connector.rb +76 -0
- data/lib/ridley/{ssh → host_connector}/response.rb +1 -1
- data/lib/ridley/{ssh → host_connector}/response_set.rb +11 -11
- data/lib/ridley/host_connector/ssh.rb +58 -0
- data/lib/ridley/host_connector/ssh/worker.rb +99 -0
- data/lib/ridley/host_connector/winrm.rb +55 -0
- data/lib/ridley/host_connector/winrm/worker.rb +126 -0
- data/lib/ridley/mixin/bootstrap_binding.rb +88 -0
- data/lib/ridley/resource.rb +1 -1
- data/lib/ridley/resources/client_resource.rb +7 -0
- data/lib/ridley/resources/node_resource.rb +9 -4
- data/lib/ridley/sandbox_uploader.rb +1 -7
- data/lib/ridley/version.rb +1 -1
- data/ridley.gemspec +1 -0
- data/spec/unit/ridley/bootstrap_bindings/unix_template_binding_spec.rb +102 -0
- data/spec/unit/ridley/bootstrap_bindings/windows_template_binding_spec.rb +118 -0
- data/spec/unit/ridley/bootstrapper/context_spec.rb +19 -106
- data/spec/unit/ridley/bootstrapper_spec.rb +2 -12
- data/spec/unit/ridley/client_spec.rb +20 -2
- data/spec/unit/ridley/{ssh → host_connector}/response_set_spec.rb +17 -17
- data/spec/unit/ridley/host_connector/ssh/worker_spec.rb +15 -0
- data/spec/unit/ridley/{ssh_spec.rb → host_connector/ssh_spec.rb} +5 -5
- data/spec/unit/ridley/host_connector/winrm/worker_spec.rb +41 -0
- data/spec/unit/ridley/host_connector/winrm_spec.rb +47 -0
- data/spec/unit/ridley/host_connector_spec.rb +102 -0
- data/spec/unit/ridley/mixin/bootstrap_binding_spec.rb +56 -0
- data/spec/unit/ridley/sandbox_uploader_spec.rb +1 -28
- metadata +53 -25
- data/.rbenv-version +0 -1
- data/lib/ridley/chef/chefignore.rb +0 -76
- data/lib/ridley/ssh.rb +0 -56
- data/lib/ridley/ssh/worker.rb +0 -87
- data/spec/fixtures/chefignore +0 -8
- data/spec/unit/ridley/chef/chefignore_spec.rb +0 -40
- data/spec/unit/ridley/ssh/worker_spec.rb +0 -13
@@ -18,6 +18,8 @@ describe Ridley::Bootstrapper do
|
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
21
|
+
before(:each) { Ridley::HostConnector.stub(:best_connector_for).and_return(Ridley::HostConnector::SSH) }
|
22
|
+
|
21
23
|
describe "ClassMethods" do
|
22
24
|
subject { Ridley::Bootstrapper }
|
23
25
|
|
@@ -50,18 +52,6 @@ describe Ridley::Bootstrapper do
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
53
|
-
|
54
|
-
describe "::templates_path" do
|
55
|
-
it "returns a pathname" do
|
56
|
-
subject.templates_path.should be_a(Pathname)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "::default_template" do
|
61
|
-
it "returns a string" do
|
62
|
-
subject.default_template.should be_a(String)
|
63
|
-
end
|
64
|
-
end
|
65
55
|
end
|
66
56
|
|
67
57
|
subject { Ridley::Bootstrapper.new(nodes, options) }
|
@@ -6,6 +6,9 @@ describe Ridley::Client do
|
|
6
6
|
let(:client_key) { fixtures_path.join("reset.pem").to_s }
|
7
7
|
let(:organization) { "vialstudios" }
|
8
8
|
let(:encrypted_data_bag_secret_path) { fixtures_path.join("reset.pem").to_s }
|
9
|
+
let(:ssh) { {user: "reset", password: "password1", port: "222"} }
|
10
|
+
let(:winrm) { {user: "reset", password: "password2", port: "5986"} }
|
11
|
+
let(:chef_version) { "10.24.0-01" }
|
9
12
|
|
10
13
|
let(:config) do
|
11
14
|
{
|
@@ -13,7 +16,10 @@ describe Ridley::Client do
|
|
13
16
|
client_name: client_name,
|
14
17
|
client_key: client_key,
|
15
18
|
organization: organization,
|
16
|
-
encrypted_data_bag_secret_path: encrypted_data_bag_secret_path
|
19
|
+
encrypted_data_bag_secret_path: encrypted_data_bag_secret_path,
|
20
|
+
ssh: ssh,
|
21
|
+
winrm: winrm,
|
22
|
+
chef_version: chef_version
|
17
23
|
}
|
18
24
|
end
|
19
25
|
|
@@ -28,7 +34,7 @@ describe Ridley::Client do
|
|
28
34
|
@conn = subject.new(
|
29
35
|
server_url: server_url,
|
30
36
|
client_name: client_name,
|
31
|
-
client_key: client_key
|
37
|
+
client_key: client_key,
|
32
38
|
)
|
33
39
|
end
|
34
40
|
|
@@ -108,6 +114,18 @@ describe Ridley::Client do
|
|
108
114
|
|
109
115
|
subject.new(config).client_key.should_not == "~/"
|
110
116
|
end
|
117
|
+
|
118
|
+
it "assigns a 'ssh' attribute from the given 'ssh' option" do
|
119
|
+
subject.new(config).ssh.should eql({user: "reset", password: "password1", port: "222"})
|
120
|
+
end
|
121
|
+
|
122
|
+
it "assigns a 'winrm' attribute from the given 'winrm' option" do
|
123
|
+
subject.new(config).winrm.should eql({user: "reset", password: "password2", port: "5986"})
|
124
|
+
end
|
125
|
+
|
126
|
+
it "assigns a 'chef_version' attribute from the given 'chef_version' option" do
|
127
|
+
subject.new(config).chef_version.should eql("10.24.0-01")
|
128
|
+
end
|
111
129
|
end
|
112
130
|
|
113
131
|
describe "::open" do
|
@@ -1,15 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Ridley::
|
3
|
+
describe Ridley::HostConnector::ResponseSet do
|
4
4
|
describe "ClassMethods" do
|
5
5
|
subject { described_class }
|
6
6
|
|
7
7
|
describe "::merge!" do
|
8
|
-
let(:target) { Ridley::
|
9
|
-
let(:other) { Ridley::
|
8
|
+
let(:target) { Ridley::HostConnector::ResponseSet.new }
|
9
|
+
let(:other) { Ridley::HostConnector::ResponseSet.new }
|
10
10
|
|
11
11
|
before(:each) do
|
12
|
-
other.add_response(Ridley::
|
12
|
+
other.add_response(Ridley::HostConnector::Response.new('host.local'))
|
13
13
|
end
|
14
14
|
|
15
15
|
it "returns the mutated target" do
|
@@ -26,8 +26,8 @@ describe Ridley::SSH::ResponseSet do
|
|
26
26
|
describe "#add_response" do
|
27
27
|
it "accepts an array of responses" do
|
28
28
|
responses = [
|
29
|
-
Ridley::
|
30
|
-
Ridley::
|
29
|
+
Ridley::HostConnector::Response.new("one.riotgames.com"),
|
30
|
+
Ridley::HostConnector::Response.new("two.riotgames.com")
|
31
31
|
]
|
32
32
|
subject.add_response(responses)
|
33
33
|
|
@@ -35,7 +35,7 @@ describe Ridley::SSH::ResponseSet do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "accepts a single response" do
|
38
|
-
response = Ridley::
|
38
|
+
response = Ridley::HostConnector::Response.new("one.riotgames.com")
|
39
39
|
subject.add_response(response)
|
40
40
|
|
41
41
|
subject.responses.should have(1).item
|
@@ -43,7 +43,7 @@ describe Ridley::SSH::ResponseSet do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "#responses" do
|
46
|
-
it "returns an array of Ridley::
|
46
|
+
it "returns an array of Ridley::HostConnector::Response objects including both failures and successes" do
|
47
47
|
responses = [
|
48
48
|
double('success', error?: false),
|
49
49
|
double('failure', error?: true)
|
@@ -55,7 +55,7 @@ describe Ridley::SSH::ResponseSet do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
describe "#successes" do
|
58
|
-
it "returns an array of Ridley::
|
58
|
+
it "returns an array of Ridley::HostConnector::Response objects only including the successes" do
|
59
59
|
responses = [
|
60
60
|
double('success', error?: false),
|
61
61
|
double('failure', error?: true)
|
@@ -67,7 +67,7 @@ describe Ridley::SSH::ResponseSet do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
describe "#failures" do
|
70
|
-
it "returns an array of Ridley::
|
70
|
+
it "returns an array of Ridley::HostConnector::Response objects only including the failures" do
|
71
71
|
responses = [
|
72
72
|
double('success', error?: false),
|
73
73
|
double('failure', error?: true)
|
@@ -79,14 +79,14 @@ describe Ridley::SSH::ResponseSet do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
describe "#merge" do
|
82
|
-
let(:target) { Ridley::
|
83
|
-
let(:other) { Ridley::
|
82
|
+
let(:target) { Ridley::HostConnector::ResponseSet.new }
|
83
|
+
let(:other) { Ridley::HostConnector::ResponseSet.new }
|
84
84
|
|
85
85
|
before(:each) do
|
86
|
-
other.add_response(Ridley::
|
86
|
+
other.add_response(Ridley::HostConnector::Response.new('host.local'))
|
87
87
|
end
|
88
88
|
|
89
|
-
it "returns a new Ridley::
|
89
|
+
it "returns a new Ridley::HostConnector::ResponseSet object" do
|
90
90
|
result = target.merge(other)
|
91
91
|
|
92
92
|
result.should have(1).item
|
@@ -95,11 +95,11 @@ describe Ridley::SSH::ResponseSet do
|
|
95
95
|
end
|
96
96
|
|
97
97
|
describe "#merge!" do
|
98
|
-
let(:target) { Ridley::
|
99
|
-
let(:other) { Ridley::
|
98
|
+
let(:target) { Ridley::HostConnector::ResponseSet.new }
|
99
|
+
let(:other) { Ridley::HostConnector::ResponseSet.new }
|
100
100
|
|
101
101
|
before(:each) do
|
102
|
-
other.add_response(Ridley::
|
102
|
+
other.add_response(Ridley::HostConnector::Response.new('host.local'))
|
103
103
|
end
|
104
104
|
|
105
105
|
it "returns the mutated target" do
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::HostConnector::SSH::Worker do
|
4
|
+
describe "ClassMethods" do
|
5
|
+
let(:host) { 'reset.riotgames.com' }
|
6
|
+
|
7
|
+
subject { described_class }
|
8
|
+
|
9
|
+
describe "::new" do
|
10
|
+
it { subject.new(host, ssh: {sudo: true}).sudo.should be_true }
|
11
|
+
it { subject.new(host, ssh: {sudo: false}).sudo.should be_false }
|
12
|
+
it { subject.new(host).sudo.should be_false }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Ridley::SSH do
|
3
|
+
describe Ridley::HostConnector::SSH do
|
4
4
|
let(:connection) { double('conn', ssh: { user: "vagrant", password: "vagrant" }) }
|
5
5
|
|
6
6
|
let(:node_one) do
|
@@ -12,7 +12,7 @@ describe Ridley::SSH do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "ClassMethods" do
|
15
|
-
subject { Ridley::SSH }
|
15
|
+
subject { Ridley::HostConnector::SSH }
|
16
16
|
|
17
17
|
describe "::start" do
|
18
18
|
let(:options) do
|
@@ -27,7 +27,7 @@ describe Ridley::SSH do
|
|
27
27
|
ssh.run("ls")
|
28
28
|
end
|
29
29
|
|
30
|
-
result.should be_a(Ridley::
|
30
|
+
result.should be_a(Ridley::HostConnector::ResponseSet)
|
31
31
|
end
|
32
32
|
|
33
33
|
it "raises a LocalJumpError if a block is not provided" do
|
@@ -38,11 +38,11 @@ describe Ridley::SSH do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
subject { Ridley::SSH.new([node_one, node_two], user: "vagrant", password: "vagrant") }
|
41
|
+
subject { Ridley::HostConnector::SSH.new([node_one, node_two], user: "vagrant", password: "vagrant") }
|
42
42
|
|
43
43
|
describe "#run" do
|
44
44
|
it "returns an SSH::ResponseSet" do
|
45
|
-
subject.run("ls").should be_a(Ridley::
|
45
|
+
subject.run("ls").should be_a(Ridley::HostConnector::ResponseSet)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::HostConnector::WinRM::Worker do
|
4
|
+
let(:host) { 'reset.riotgames.com' }
|
5
|
+
|
6
|
+
let(:options) do
|
7
|
+
{
|
8
|
+
winrm: {
|
9
|
+
port: 1234
|
10
|
+
}
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { Ridley::HostConnector::WinRM::Worker.new(host, options) }
|
15
|
+
|
16
|
+
describe "#winrm_port" do
|
17
|
+
it "can be overridden if options contains :winrm_port" do
|
18
|
+
subject.winrm_port.should eq(1234)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "defaults to Ridley::HostConnector::DEFAULT_WINRM_PORT when not overridden" do
|
22
|
+
options.delete(:winrm)
|
23
|
+
subject.winrm_port.should eq(Ridley::HostConnector::DEFAULT_WINRM_PORT)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#winrm" do
|
28
|
+
it "returns a WinRM::WinRMWebService" do
|
29
|
+
subject.winrm.should be_a(WinRM::WinRMWebService)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#get_command" do
|
34
|
+
let(:command) { "echo %TEMP%" }
|
35
|
+
context "when a command is less than 2047 characters" do
|
36
|
+
it "returns the command" do
|
37
|
+
subject.get_command(command).should eq(command)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::HostConnector::WinRM do
|
4
|
+
let(:connection) { double('conn', ssh: { user: "vagrant", password: "vagrant" }) }
|
5
|
+
|
6
|
+
let(:node_one) do
|
7
|
+
Ridley::NodeResource.new(connection, automatic: { cloud: { public_hostname: "33.33.33.10" } })
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:node_two) do
|
11
|
+
Ridley::NodeResource.new(connection, automatic: { cloud: { public_hostname: "33.33.33.11" } })
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "ClassMethods" do
|
15
|
+
subject { Ridley::HostConnector::WinRM }
|
16
|
+
|
17
|
+
describe "::start" do
|
18
|
+
let(:options) do
|
19
|
+
{
|
20
|
+
user: "Administrator",
|
21
|
+
password: "password1"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "evaluates within the context of a new WinRM and returns the last item in the block" do
|
26
|
+
result = subject.start([node_one, node_two], options) do |winrm|
|
27
|
+
winrm.run("dir")
|
28
|
+
end
|
29
|
+
result.should be_a(Ridley::HostConnector::ResponseSet)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "raises a LocalJumpError if a block is not provided" do
|
33
|
+
expect {
|
34
|
+
subject.start([node_one, node_two], options)
|
35
|
+
}.to raise_error(LocalJumpError)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
subject { Ridley::HostConnector::WinRM.new([node_one, node_two], user: 'Administrator', password: 'password1') }
|
41
|
+
|
42
|
+
describe "#run" do
|
43
|
+
it "returns a ResponseSet" do
|
44
|
+
subject.run("dir").should be_a(Ridley::HostConnector::ResponseSet)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::HostConnector do
|
4
|
+
|
5
|
+
subject do
|
6
|
+
described_class
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns 22 as the default SSH port" do
|
10
|
+
described_class::DEFAULT_SSH_PORT.should eq(22)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns 5985 as the default WinRM port" do
|
14
|
+
described_class::DEFAULT_WINRM_PORT.should eq(5985)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#connector_port_open" do
|
18
|
+
let(:host) {"127.0.0.1"}
|
19
|
+
let(:port) {22}
|
20
|
+
let(:socket) {double(:new => true, :close => nil)}
|
21
|
+
|
22
|
+
context "when a port is open" do
|
23
|
+
it "returns true" do
|
24
|
+
TCPSocket.stub(:new).and_return(socket)
|
25
|
+
subject.connector_port_open?(host, port).should eq(true)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when a port is closed" do
|
30
|
+
it "returns false" do
|
31
|
+
TCPSocket.stub(:new).and_raise(Errno::ECONNREFUSED)
|
32
|
+
subject.connector_port_open?(host, port).should eq(false)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#best_connector_for" do
|
38
|
+
let(:host) {"127.0.0.1"}
|
39
|
+
|
40
|
+
context "when an SSH port is open" do
|
41
|
+
it "returns Ridley::HostConnector::SSH" do
|
42
|
+
subject.stub(:connector_port_open?).and_return(true)
|
43
|
+
subject.best_connector_for(host).should eq(Ridley::HostConnector::SSH)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when an SSH port isnt open and a WinRM port is open" do
|
48
|
+
it "retrns Ridley::HostConnector::WinRM" do
|
49
|
+
subject.stub(:connector_port_open?).and_return(false, true)
|
50
|
+
subject.best_connector_for(host).should eq(Ridley::HostConnector::WinRM)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when no useable ports are open" do
|
55
|
+
it "raises an exception" do
|
56
|
+
subject.stub(:connector_port_open?).and_return(false, false)
|
57
|
+
expect {
|
58
|
+
subject.best_connector_for(host)
|
59
|
+
}.to raise_error(Ridley::Errors::HostConnectionError)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#parse_port_options" do
|
65
|
+
let(:options) do
|
66
|
+
{
|
67
|
+
ssh: {
|
68
|
+
port: 1234
|
69
|
+
},
|
70
|
+
winrm: {
|
71
|
+
port: 5678
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when :ssh has a key for :port" do
|
77
|
+
it "returns the value of port instead of the default" do
|
78
|
+
subject.parse_port_options(options).should include(1234)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when there is no :ssh key" do
|
83
|
+
it "returns the default value for port" do
|
84
|
+
options.delete(:ssh)
|
85
|
+
subject.parse_port_options(options).should include(22)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when :winrm has a key for :port" do
|
90
|
+
it "returns the value of port instead of the default" do
|
91
|
+
subject.parse_port_options(options).should include(5678)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "when there is no :ssh key" do
|
96
|
+
it "returns the default value for port" do
|
97
|
+
options.delete(:winrm)
|
98
|
+
subject.parse_port_options(options).should include(5985)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::BootstrapBinding do
|
4
|
+
let(:host) { "reset.riotgames.com" }
|
5
|
+
let(:options) do
|
6
|
+
{
|
7
|
+
server_url: "https://api.opscode.com/organizations/vialstudios",
|
8
|
+
validator_client: "chef-validator",
|
9
|
+
validator_path: fixtures_path.join("reset.pem").to_s,
|
10
|
+
encrypted_data_bag_secret_path: fixtures_path.join("reset.pem").to_s,
|
11
|
+
chef_version: "11.4.0"
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "ClassMethods" do
|
16
|
+
subject do
|
17
|
+
Class.new do
|
18
|
+
include Ridley::BootstrapBinding
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ":included" do
|
23
|
+
context "when a class includes Ridley::BootstrapBinding" do
|
24
|
+
it "should have a validate_options class method`" do
|
25
|
+
subject.methods.should include(:validate_options)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ":validate_options" do
|
31
|
+
context "when server_url is not specified" do
|
32
|
+
let(:options) { Hash.new }
|
33
|
+
|
34
|
+
it "raises an ArgumentError" do
|
35
|
+
expect {
|
36
|
+
subject.validate_options(options)
|
37
|
+
}.to raise_error(Ridley::Errors::ArgumentError)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when validator_path is not specified" do
|
43
|
+
let(:options) do
|
44
|
+
{
|
45
|
+
server_url: "https://api.opscode.com/organizations/vialstudios"
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
it "raises an ArgumentError" do
|
50
|
+
expect {
|
51
|
+
subject.validate_options(options)
|
52
|
+
}.to raise_error(Ridley::Errors::ArgumentError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|