taketo 0.0.6 → 0.0.7
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/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/README.md +20 -7
- data/VERSION +1 -1
- data/bin/taketo +30 -31
- data/features/config.feature +33 -3
- data/features/config_validation.feature +29 -4
- data/features/connect_to_server.feature +2 -1
- data/features/error_handling.feature +1 -0
- data/features/help.feature +5 -3
- data/features/support/env.rb +2 -0
- data/lib/taketo/associated_nodes.rb +90 -0
- data/lib/taketo/commands/ssh_command.rb +0 -4
- data/lib/taketo/config_printer_visitor.rb +68 -0
- data/lib/taketo/config_traverser.rb +55 -0
- data/lib/taketo/config_validator.rb +33 -34
- data/lib/taketo/config_visitor.rb +29 -0
- data/lib/taketo/constructs/base_construct.rb +9 -54
- data/lib/taketo/constructs/command.rb +9 -1
- data/lib/taketo/constructs/environment.rb +11 -1
- data/lib/taketo/constructs/project.rb +5 -0
- data/lib/taketo/constructs/server.rb +7 -4
- data/lib/taketo/dsl.rb +13 -2
- data/lib/taketo/support/named_nodes_collection.rb +10 -0
- data/lib/taketo/support.rb +0 -1
- data/lib/taketo.rb +2 -1
- data/spec/integration/dsl_integration_spec.rb +1 -1
- data/spec/lib/taketo/associated_nodes_spec.rb +101 -0
- data/spec/lib/taketo/commands/ssh_command_spec.rb +5 -15
- data/spec/lib/taketo/config_printer_visitor_spec.rb +112 -0
- data/spec/lib/taketo/config_traverser_spec.rb +63 -0
- data/spec/lib/taketo/config_validator_spec.rb +53 -39
- data/spec/lib/taketo/config_visitor_spec.rb +51 -0
- data/spec/lib/taketo/constructs/base_construct_spec.rb +7 -70
- data/spec/lib/taketo/constructs/command_spec.rb +20 -8
- data/spec/lib/taketo/constructs/config_spec.rb +2 -6
- data/spec/lib/taketo/constructs/environment_spec.rb +12 -7
- data/spec/lib/taketo/constructs/project_spec.rb +10 -4
- data/spec/lib/taketo/constructs/server_spec.rb +25 -16
- data/spec/lib/taketo/constructs_factory_spec.rb +12 -12
- data/spec/lib/taketo/destination_resolver_spec.rb +32 -32
- data/spec/lib/taketo/dsl_spec.rb +115 -98
- data/spec/lib/taketo/support/named_nodes_collection_spec.rb +49 -21
- data/spec/support/helpers/construct_spec_helper.rb +5 -5
- data/spec/support/matchers/be_appropriate_construct_matcher.rb +9 -1
- data/spec/support/matchers/have_accessor_matcher.rb +6 -3
- metadata +18 -7
- data/lib/taketo/config_printer.rb +0 -84
- data/lib/taketo/support/eval_delegator.rb +0 -25
- data/spec/lib/taketo/config_printer_spec.rb +0 -116
- data/spec/lib/taketo/support/eval_delegator_spec.rb +0 -43
@@ -1,60 +1,74 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'taketo/config_validator'
|
3
3
|
|
4
4
|
include Taketo
|
5
5
|
|
6
6
|
describe "ConfigValidator" do
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
let(:traverser) { stub(:ConfigTraverser) }
|
8
|
+
|
9
|
+
describe "#validate!" do
|
10
|
+
it "should visit all nodes with an instance of ConfigValidator::ConfigValidatorVisitor" do
|
11
|
+
validator = ConfigValidator.new(traverser)
|
12
|
+
traverser.should_receive(:visit_depth_first).with(an_instance_of(ConfigValidator::ConfigValidatorVisitor))
|
13
|
+
validator.validate!
|
14
|
+
end
|
10
15
|
end
|
16
|
+
end
|
11
17
|
|
12
|
-
|
13
|
-
|
14
|
-
project_2 = stub(:Project, :name => :project_2, :environments => [stub])
|
18
|
+
describe "ConfigValidator::ConfigValidatorVisitor" do
|
19
|
+
subject(:visitor) { ConfigValidator::ConfigValidatorVisitor.new }
|
15
20
|
|
16
|
-
|
17
|
-
|
21
|
+
it "should require config to have projects" do
|
22
|
+
config = stub(:Config, :has_projects? => false)
|
23
|
+
error_message = /no projects/
|
24
|
+
expect { visitor.visit_config(config) }.to raise_error ConfigError, error_message
|
18
25
|
|
19
|
-
|
20
|
-
expect {
|
26
|
+
config.stub(:has_projects? => true)
|
27
|
+
expect { visitor.visit_config(config) }.not_to raise_error ConfigError, error_message
|
21
28
|
end
|
22
29
|
|
23
|
-
it "should require
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
it "should require projects to have environments" do
|
31
|
+
project = stub(:Project, :has_environments? => false, :path => "my_project")
|
32
|
+
error_message = /my_project: no environments/
|
33
|
+
expect { visitor.visit_project(project) }.to raise_error ConfigError, error_message
|
34
|
+
|
35
|
+
project.stub(:has_environments? => true)
|
36
|
+
expect { visitor.visit_project(project) }.not_to raise_error ConfigError, error_message
|
37
|
+
end
|
28
38
|
|
29
|
-
|
30
|
-
|
39
|
+
it "should require environments to have servers" do
|
40
|
+
environment = stub(:Environment, :has_servers? => false, :path => "my_project:my_environment")
|
41
|
+
error_message = /my_project:my_environment: no servers/
|
42
|
+
expect { visitor.visit_environment(environment) }.to raise_error ConfigError, error_message
|
31
43
|
|
32
|
-
|
33
|
-
expect {
|
44
|
+
environment.stub(:has_servers? => true)
|
45
|
+
expect { visitor.visit_environment(environment) }.not_to raise_error ConfigError, error_message
|
34
46
|
end
|
35
47
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
let(:project) { stub(:Project, :name => :project, :environments => [environment]) }
|
41
|
-
let(:config) { stub(:Config, :projects => [project]) }
|
42
|
-
|
43
|
-
it "should not raise error if unique" do
|
44
|
-
server_1.stub(:global_alias => :foo)
|
45
|
-
server_2.stub(:global_alias => :bar)
|
46
|
-
expect { validator(config).validate! }.not_to raise_error(ConfigError, /alias/i)
|
47
|
-
end
|
48
|
+
it "should require servers to have host" do
|
49
|
+
server = stub(:Server, :host => '', :path => "my_project:my_environment:my_server", :global_alias => nil)
|
50
|
+
error_message = /my_project:my_environment:my_server: host is not defined/
|
51
|
+
expect { visitor.visit_server(server) }.to raise_error ConfigError, error_message
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
server.stub(:host => 'the-host')
|
54
|
+
expect { visitor.visit_server(server) }.not_to raise_error ConfigError, error_message
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should require servers to have unique global server aliases" do
|
58
|
+
server1 = stub(:Server, :host => 'the-host1', :path => "my_project:my_environment:my_server", :global_alias => 'foo')
|
59
|
+
server2 = stub(:Server, :host => 'the-host2', :path => "my_project:my_environment2:my_server3", :global_alias => 'foo')
|
60
|
+
error_message = /my_project:my_environment2:my_server3: global alias 'foo' has already been taken.*my_project:my_environment:my_server/
|
61
|
+
@visitor = visitor
|
62
|
+
expect { @visitor.visit_server(server1) }.not_to raise_error ConfigError, error_message
|
63
|
+
expect { @visitor.visit_server(server2) }.to raise_error ConfigError, error_message
|
54
64
|
end
|
55
65
|
|
56
|
-
|
57
|
-
|
66
|
+
it "should require commands to have command specified" do
|
67
|
+
command = stub(:Command, :command => '', :name => 'qux')
|
68
|
+
error_message = /execute/
|
69
|
+
expect { visitor.visit_command(command) }.to raise_error ConfigError, error_message
|
70
|
+
command.stub(:command => 'foo')
|
71
|
+
expect { visitor.visit_command(command) }.not_to raise_error ConfigError, error_message
|
58
72
|
end
|
59
73
|
end
|
60
74
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'taketo/config_visitor'
|
3
|
+
|
4
|
+
include Taketo
|
5
|
+
|
6
|
+
describe "ConfigVisitor" do
|
7
|
+
class DummyVisitor < ConfigVisitor
|
8
|
+
visit String do |s|
|
9
|
+
s.upcase
|
10
|
+
end
|
11
|
+
|
12
|
+
visit NilClass do |n|
|
13
|
+
"hooray"
|
14
|
+
end
|
15
|
+
|
16
|
+
visit Fixnum do |n|
|
17
|
+
n.to_s.reverse
|
18
|
+
end
|
19
|
+
|
20
|
+
visit Numeric do |n|
|
21
|
+
n.to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
subject(:visitor) { DummyVisitor.new }
|
26
|
+
|
27
|
+
it "defines #visit* methods" do
|
28
|
+
expect(visitor.visit_string('qwe')).to eq('QWE')
|
29
|
+
expect(visitor.visit_nil_class(nil)).to eq('hooray')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "dispatches according to class" do
|
33
|
+
expect(visitor.visit(700)).to eq("007")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "takes ancestors into account" do
|
37
|
+
expect(visitor.visit(2.0)).to eq("2.0")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "skips anonymous classes/modules" do
|
41
|
+
c = Class.new(Numeric) do
|
42
|
+
def to_s; "captured as Numeric"; end
|
43
|
+
end
|
44
|
+
expect(visitor.visit(c.new)).to eq("captured as Numeric")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises if doesn't know how to visit" do
|
48
|
+
expect { visitor.visit([]) }.to raise_error /Array/
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -1,84 +1,21 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'taketo/constructs/base_construct'
|
3
3
|
|
4
4
|
include Taketo
|
5
5
|
|
6
6
|
describe "BaseConstruct" do
|
7
|
-
class
|
8
|
-
attr_reader :foos
|
7
|
+
class TestBaseConstruct < Constructs::BaseConstruct; end
|
9
8
|
|
10
|
-
|
11
|
-
super(name)
|
12
|
-
@foos = foos
|
13
|
-
end
|
9
|
+
subject(:construct) { TestBaseConstruct.new(:my_node) }
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
11
|
+
specify "#node_type returns demodulized snake-cased class name" do
|
12
|
+
construct.node_type.should == :test_base_construct
|
18
13
|
end
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
describe "#find" do
|
24
|
-
context "if there is such node" do
|
25
|
-
it "should return node object with corresponding name" do
|
26
|
-
foos.should_receive(:[]).with(:bar).and_return(:qux)
|
27
|
-
construct.find(:foo, :bar).should == :qux
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "if there is no such command" do
|
32
|
-
before(:each) { foos.should_receive(:[]).and_return(nil) }
|
33
|
-
|
34
|
-
it "should yield if block given" do
|
35
|
-
expect { |b| construct.find(:foo, :bar, &b) }.to yield_control
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should raise KeyError if no block given" do
|
39
|
-
expect { construct.find(:foo, :bar) }.to raise_error(KeyError)
|
40
|
-
end
|
41
|
-
end
|
15
|
+
specify "#qualified_name returns node type and name as string" do
|
16
|
+
expect(construct.qualified_name).to eq('test_base_construct my_node')
|
42
17
|
end
|
43
18
|
|
44
|
-
describe "#node_type" do
|
45
|
-
it "should return demodulized snake-cased class name" do
|
46
|
-
construct.node_type.should == :test_construct
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "nodes" do
|
51
|
-
class TestConstruct2 < Constructs::BaseConstruct
|
52
|
-
has_nodes :foos, :foo
|
53
|
-
end
|
54
|
-
|
55
|
-
let(:construct) { TestConstruct2.new(:node_name) }
|
56
|
-
|
57
|
-
let(:foo) { stub(:name => :bar) }
|
58
|
-
|
59
|
-
describe ".has_nodes" do
|
60
|
-
it "should define add node type to class's node_types" do
|
61
|
-
TestConstruct2.node_types.should include(:foos)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should make nodes accessible via added methods" do
|
65
|
-
construct.append_foo(foo)
|
66
|
-
construct.foos.should include(foo)
|
67
|
-
construct.find_foo(:bar).should == foo
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "#nodes" do
|
72
|
-
it "should return nodes collection by plural name" do
|
73
|
-
construct.append_foo(foo)
|
74
|
-
construct.nodes(:foos).should include(foo)
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should raise NodesNotDefinedError if non-specified node requested" do
|
78
|
-
expect { construct.nodes(:bars) }.to raise_error(NodesNotDefinedError, /bars/)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
19
|
end
|
83
20
|
|
84
21
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'taketo/constructs/command'
|
3
3
|
|
4
4
|
include Taketo
|
5
5
|
|
6
6
|
describe "Command" do
|
7
|
-
subject { Taketo::Constructs::Command.new(:the_command) }
|
7
|
+
subject(:command) { Taketo::Constructs::Command.new(:the_command) }
|
8
8
|
|
9
9
|
it { should have_accessor(:command) }
|
10
10
|
it { should have_accessor(:description) }
|
@@ -16,14 +16,26 @@ describe "Command" do
|
|
16
16
|
:default_location => "/var/apps/the app")
|
17
17
|
end
|
18
18
|
|
19
|
-
it "
|
20
|
-
|
21
|
-
|
19
|
+
it "picks up server's environment variables and location" do
|
20
|
+
command.command = "rails c"
|
21
|
+
expect(command.render(server)).to eq("cd /var/apps/the\\ app; FOO=bar\\ baz rails c")
|
22
22
|
end
|
23
23
|
|
24
|
-
it "
|
25
|
-
|
26
|
-
|
24
|
+
it "lets user override default directory" do
|
25
|
+
command.command = "rails c"
|
26
|
+
expect(command.render(server, :directory => "/var/qux")).to eq("cd /var/qux; FOO=bar\\ baz rails c")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".default" do
|
31
|
+
it "returns 'bash' command" do
|
32
|
+
expect(Taketo::Constructs::Command.default.command).to eq("bash")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".explicit_command" do
|
37
|
+
it "returns given command string encapsulated" do
|
38
|
+
expect(Taketo::Constructs::Command.explicit_command("qq").command).to eq("qq")
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'support/helpers/construct_spec_helper'
|
3
3
|
require 'taketo/constructs/config'
|
4
4
|
|
@@ -9,10 +9,6 @@ describe "Config" do
|
|
9
9
|
|
10
10
|
it_behaves_like "a construct with nodes", :projects, :project
|
11
11
|
|
12
|
-
it
|
13
|
-
subject.default_destination.should be_nil
|
14
|
-
subject.default_destination = "foo:bar:baz"
|
15
|
-
subject.default_destination.should == "foo:bar:baz"
|
16
|
-
end
|
12
|
+
it { should have_accessor(:default_destination) }
|
17
13
|
end
|
18
14
|
|
@@ -1,23 +1,28 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'support/helpers/construct_spec_helper'
|
3
3
|
require 'taketo/constructs/environment'
|
4
4
|
|
5
5
|
include Taketo
|
6
6
|
|
7
7
|
describe "Environment" do
|
8
|
-
subject { Taketo::Constructs::Environment.new(:foo) }
|
8
|
+
subject(:environment) { Taketo::Constructs::Environment.new(:foo) }
|
9
9
|
|
10
|
-
it "
|
11
|
-
|
10
|
+
it "has name" do
|
11
|
+
expect(environment.name).to eq(:foo)
|
12
12
|
end
|
13
13
|
|
14
14
|
it_behaves_like "a construct with nodes", :servers, :server
|
15
15
|
|
16
|
-
specify "#append_server
|
16
|
+
specify "#append_server sets environment attribute on a server to self" do
|
17
17
|
server = mock(:Server, :name => :foo)
|
18
|
-
server.should_receive(:environment=).with(
|
19
|
-
|
18
|
+
server.should_receive(:environment=).with(environment)
|
19
|
+
environment.append_server(server)
|
20
20
|
end
|
21
|
+
|
22
|
+
specify "#project_name returns project name" do
|
23
|
+
environment.project = stub(:Project, :name => "TheProject")
|
24
|
+
expect(environment.project_name).to eq("TheProject")
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
|
@@ -1,16 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'support/helpers/construct_spec_helper'
|
3
3
|
require 'taketo/constructs/project'
|
4
4
|
|
5
5
|
include Taketo
|
6
6
|
|
7
7
|
describe "Project" do
|
8
|
-
subject { Taketo::Constructs::Project.new(:foo) }
|
8
|
+
subject(:project) { Taketo::Constructs::Project.new(:foo) }
|
9
9
|
|
10
|
-
it "
|
11
|
-
|
10
|
+
it "has name" do
|
11
|
+
expect(project.name).to eq(:foo)
|
12
12
|
end
|
13
13
|
|
14
|
+
specify "#append_environment sets project attribute on an environment to self" do
|
15
|
+
environment = mock(:Environment, :name => :bar)
|
16
|
+
environment.should_receive(:project=).with(project)
|
17
|
+
project.append_environment(environment)
|
18
|
+
end
|
19
|
+
|
14
20
|
it_behaves_like "a construct with nodes", :environments, :environment
|
15
21
|
end
|
16
22
|
|
@@ -1,42 +1,51 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'support/helpers/construct_spec_helper'
|
3
3
|
require 'taketo/constructs/server'
|
4
4
|
|
5
5
|
include Taketo
|
6
6
|
|
7
7
|
describe "Server" do
|
8
|
-
subject { Taketo::Constructs::Server.new(:foo) }
|
8
|
+
subject(:server) { Taketo::Constructs::Server.new(:foo) }
|
9
9
|
|
10
|
-
it "
|
11
|
-
|
10
|
+
it "has name" do
|
11
|
+
expect(server.name).to eq(:foo)
|
12
12
|
end
|
13
13
|
|
14
14
|
it { should have_accessor(:host) }
|
15
15
|
it { should have_accessor(:port) }
|
16
16
|
it { should have_accessor(:username) }
|
17
17
|
it { should have_accessor(:default_location) }
|
18
|
+
it { should have_accessor(:default_command) }
|
18
19
|
it { should have_accessor(:global_alias) }
|
19
20
|
it { should have_accessor(:identity_file) }
|
20
21
|
|
22
|
+
module Taketo
|
23
|
+
module Constructs
|
24
|
+
Command = Class.new unless defined? Command
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has default command" do
|
29
|
+
Taketo::Constructs::Command.should_receive(:default).and_return(:qux)
|
30
|
+
expect(server.default_command).to eq(:qux)
|
31
|
+
end
|
32
|
+
|
21
33
|
describe "#environment=" do
|
22
34
|
let(:environment) { environment = stub(:Environment, :name => :the_environment) }
|
23
35
|
|
24
|
-
it
|
25
|
-
subject.environment = environment
|
26
|
-
subject.environment.should == environment
|
27
|
-
end
|
36
|
+
it { should have_accessor(:environment, environment) }
|
28
37
|
|
29
|
-
it "
|
30
|
-
|
31
|
-
|
32
|
-
|
38
|
+
it "sets RAILS_ENV environment variable" do
|
39
|
+
server.environment_variables.should == {}
|
40
|
+
server.environment = environment
|
41
|
+
expect(server.environment_variables[:RAILS_ENV]).to eq(environment.name.to_s)
|
33
42
|
end
|
34
43
|
end
|
35
44
|
|
36
|
-
it "
|
37
|
-
|
38
|
-
|
39
|
-
|
45
|
+
it "sets environment variables" do
|
46
|
+
server.env :FOO => "bar"
|
47
|
+
server.env :BAR => "baz"
|
48
|
+
expect(server.environment_variables).to include(:FOO => "bar", :BAR => "baz")
|
40
49
|
end
|
41
50
|
|
42
51
|
it_behaves_like "a construct with nodes", :commands, :command
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'taketo/constructs_factory'
|
3
3
|
|
4
4
|
include Taketo
|
@@ -6,7 +6,7 @@ include Taketo
|
|
6
6
|
describe "ConstructsFactory" do
|
7
7
|
let(:factory) { Taketo::ConstructsFactory.new }
|
8
8
|
|
9
|
-
specify "#create
|
9
|
+
specify "#create delegates to appropriate method according to the type" do
|
10
10
|
factory.should_receive(:create_config)
|
11
11
|
factory.create(:config)
|
12
12
|
|
@@ -14,28 +14,28 @@ describe "ConstructsFactory" do
|
|
14
14
|
factory.create(:project, :foo)
|
15
15
|
end
|
16
16
|
|
17
|
-
specify "#create_config
|
18
|
-
factory.create_config.
|
17
|
+
specify "#create_config creates a config object" do
|
18
|
+
expect(factory.create_config).to be_an_instance_of(Taketo::Constructs::Config)
|
19
19
|
end
|
20
20
|
|
21
|
-
specify "#create_project
|
21
|
+
specify "#create_project creates a project object" do
|
22
22
|
project = factory.create_project(:foo)
|
23
|
-
project.
|
23
|
+
expect(project).to be_an_instance_of(Taketo::Constructs::Project)
|
24
24
|
end
|
25
25
|
|
26
|
-
specify "#create_environment
|
26
|
+
specify "#create_environment creates an environment object" do
|
27
27
|
environment = factory.create_environment(:foo)
|
28
|
-
environment.
|
28
|
+
expect(environment).to be_an_instance_of(Taketo::Constructs::Environment)
|
29
29
|
end
|
30
30
|
|
31
|
-
specify "#create_server
|
31
|
+
specify "#create_server creates a server object" do
|
32
32
|
server = factory.create_server(:foo)
|
33
|
-
server.
|
33
|
+
expect(server).to be_an_instance_of(Taketo::Constructs::Server)
|
34
34
|
end
|
35
35
|
|
36
|
-
specify "#create_command
|
36
|
+
specify "#create_command creates a command object" do
|
37
37
|
command = factory.create_command(:foo)
|
38
|
-
command.
|
38
|
+
expect(command).to be_an_instance_of(Taketo::Constructs::Command)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|