mbailey-capistrano 2.5.5
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/CHANGELOG.rdoc +761 -0
- data/Manifest +104 -0
- data/README.rdoc +66 -0
- data/Rakefile +34 -0
- data/bin/cap +4 -0
- data/bin/capify +78 -0
- data/examples/sample.rb +14 -0
- data/lib/capistrano/callback.rb +45 -0
- data/lib/capistrano/cli/execute.rb +84 -0
- data/lib/capistrano/cli/help.rb +125 -0
- data/lib/capistrano/cli/help.txt +75 -0
- data/lib/capistrano/cli/options.rb +224 -0
- data/lib/capistrano/cli/ui.rb +40 -0
- data/lib/capistrano/cli.rb +47 -0
- data/lib/capistrano/command.rb +283 -0
- data/lib/capistrano/configuration/actions/file_transfer.rb +47 -0
- data/lib/capistrano/configuration/actions/inspect.rb +46 -0
- data/lib/capistrano/configuration/actions/invocation.rb +293 -0
- data/lib/capistrano/configuration/callbacks.rb +148 -0
- data/lib/capistrano/configuration/connections.rb +200 -0
- data/lib/capistrano/configuration/execution.rb +132 -0
- data/lib/capistrano/configuration/loading.rb +197 -0
- data/lib/capistrano/configuration/namespaces.rb +197 -0
- data/lib/capistrano/configuration/roles.rb +73 -0
- data/lib/capistrano/configuration/servers.rb +85 -0
- data/lib/capistrano/configuration/variables.rb +127 -0
- data/lib/capistrano/configuration.rb +43 -0
- data/lib/capistrano/errors.rb +15 -0
- data/lib/capistrano/extensions.rb +57 -0
- data/lib/capistrano/logger.rb +59 -0
- data/lib/capistrano/processable.rb +53 -0
- data/lib/capistrano/recipes/compat.rb +32 -0
- data/lib/capistrano/recipes/deploy/dependencies.rb +44 -0
- data/lib/capistrano/recipes/deploy/local_dependency.rb +54 -0
- data/lib/capistrano/recipes/deploy/remote_dependency.rb +105 -0
- data/lib/capistrano/recipes/deploy/scm/accurev.rb +169 -0
- data/lib/capistrano/recipes/deploy/scm/base.rb +196 -0
- data/lib/capistrano/recipes/deploy/scm/bzr.rb +83 -0
- data/lib/capistrano/recipes/deploy/scm/cvs.rb +152 -0
- data/lib/capistrano/recipes/deploy/scm/darcs.rb +85 -0
- data/lib/capistrano/recipes/deploy/scm/git.rb +271 -0
- data/lib/capistrano/recipes/deploy/scm/mercurial.rb +137 -0
- data/lib/capistrano/recipes/deploy/scm/none.rb +44 -0
- data/lib/capistrano/recipes/deploy/scm/perforce.rb +133 -0
- data/lib/capistrano/recipes/deploy/scm/subversion.rb +121 -0
- data/lib/capistrano/recipes/deploy/scm.rb +19 -0
- data/lib/capistrano/recipes/deploy/strategy/base.rb +79 -0
- data/lib/capistrano/recipes/deploy/strategy/checkout.rb +20 -0
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +210 -0
- data/lib/capistrano/recipes/deploy/strategy/export.rb +20 -0
- data/lib/capistrano/recipes/deploy/strategy/remote.rb +52 -0
- data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +56 -0
- data/lib/capistrano/recipes/deploy/strategy.rb +19 -0
- data/lib/capistrano/recipes/deploy/templates/maintenance.rhtml +53 -0
- data/lib/capistrano/recipes/deploy.rb +562 -0
- data/lib/capistrano/recipes/standard.rb +37 -0
- data/lib/capistrano/recipes/templates/maintenance.rhtml +53 -0
- data/lib/capistrano/recipes/upgrade.rb +33 -0
- data/lib/capistrano/role.rb +102 -0
- data/lib/capistrano/server_definition.rb +56 -0
- data/lib/capistrano/shell.rb +260 -0
- data/lib/capistrano/ssh.rb +99 -0
- data/lib/capistrano/task_definition.rb +70 -0
- data/lib/capistrano/transfer.rb +216 -0
- data/lib/capistrano/version.rb +18 -0
- data/lib/capistrano.rb +2 -0
- data/setup.rb +1346 -0
- data/test/cli/execute_test.rb +132 -0
- data/test/cli/help_test.rb +165 -0
- data/test/cli/options_test.rb +317 -0
- data/test/cli/ui_test.rb +28 -0
- data/test/cli_test.rb +17 -0
- data/test/command_test.rb +286 -0
- data/test/configuration/actions/file_transfer_test.rb +61 -0
- data/test/configuration/actions/inspect_test.rb +65 -0
- data/test/configuration/actions/invocation_test.rb +224 -0
- data/test/configuration/callbacks_test.rb +220 -0
- data/test/configuration/connections_test.rb +349 -0
- data/test/configuration/execution_test.rb +175 -0
- data/test/configuration/loading_test.rb +132 -0
- data/test/configuration/namespace_dsl_test.rb +311 -0
- data/test/configuration/roles_test.rb +144 -0
- data/test/configuration/servers_test.rb +121 -0
- data/test/configuration/variables_test.rb +184 -0
- data/test/configuration_test.rb +88 -0
- data/test/deploy/local_dependency_test.rb +76 -0
- data/test/deploy/remote_dependency_test.rb +114 -0
- data/test/deploy/scm/accurev_test.rb +23 -0
- data/test/deploy/scm/base_test.rb +55 -0
- data/test/deploy/scm/git_test.rb +167 -0
- data/test/deploy/scm/mercurial_test.rb +129 -0
- data/test/deploy/strategy/copy_test.rb +258 -0
- data/test/extensions_test.rb +69 -0
- data/test/fixtures/cli_integration.rb +5 -0
- data/test/fixtures/config.rb +5 -0
- data/test/fixtures/custom.rb +3 -0
- data/test/logger_test.rb +123 -0
- data/test/role_test.rb +11 -0
- data/test/server_definition_test.rb +121 -0
- data/test/shell_test.rb +90 -0
- data/test/ssh_test.rb +104 -0
- data/test/task_definition_test.rb +101 -0
- data/test/transfer_test.rb +160 -0
- data/test/utils.rb +38 -0
- metadata +205 -0
@@ -0,0 +1,144 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/configuration/roles'
|
3
|
+
require 'capistrano/server_definition'
|
4
|
+
|
5
|
+
class ConfigurationRolesTest < Test::Unit::TestCase
|
6
|
+
class MockConfig
|
7
|
+
attr_reader :original_initialize_called
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@original_initialize_called = true
|
11
|
+
end
|
12
|
+
|
13
|
+
include Capistrano::Configuration::Roles
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@config = MockConfig.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_initialize_should_initialize_roles_collection
|
21
|
+
assert @config.original_initialize_called
|
22
|
+
assert @config.roles.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_role_should_allow_empty_list
|
26
|
+
@config.role :app
|
27
|
+
assert @config.roles.keys.include?(:app)
|
28
|
+
assert @config.roles[:app].empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_role_with_one_argument_should_add_to_roles_collection
|
32
|
+
@config.role :app, "app1.capistrano.test"
|
33
|
+
assert_equal [:app], @config.roles.keys
|
34
|
+
assert_role_equals %w(app1.capistrano.test)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_role_block_returning_single_string_is_added_to_roles_collection
|
38
|
+
@config.role :app do
|
39
|
+
'app1.capistrano.test'
|
40
|
+
end
|
41
|
+
assert_role_equals %w(app1.capistrano.test)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_role_with_multiple_arguments_should_add_each_to_roles_collection
|
45
|
+
@config.role :app, "app1.capistrano.test", "app2.capistrano.test"
|
46
|
+
assert_equal [:app], @config.roles.keys
|
47
|
+
assert_role_equals %w(app1.capistrano.test app2.capistrano.test)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_role_with_block_and_strings_should_add_both_to_roles_collection
|
51
|
+
@config.role :app, 'app1.capistrano.test' do
|
52
|
+
'app2.capistrano.test'
|
53
|
+
end
|
54
|
+
assert_role_equals %w(app1.capistrano.test app2.capistrano.test)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_role_block_returning_array_should_add_each_to_roles_collection
|
58
|
+
@config.role :app do
|
59
|
+
['app1.capistrano.test', 'app2.capistrano.test']
|
60
|
+
end
|
61
|
+
assert_role_equals %w(app1.capistrano.test app2.capistrano.test)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_role_with_options_should_apply_options_to_each_argument
|
65
|
+
@config.role :app, "app1.capistrano.test", "app2.capistrano.test", :extra => :value
|
66
|
+
@config.roles[:app].each do |server|
|
67
|
+
assert_equal({:extra => :value}, server.options)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_role_with_options_should_apply_options_to_block_results
|
72
|
+
@config.role :app, :extra => :value do
|
73
|
+
['app1.capistrano.test', 'app2.capistrano.test']
|
74
|
+
end
|
75
|
+
@config.roles[:app].each do |server|
|
76
|
+
assert_equal({:extra => :value}, server.options)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_options_should_apply_only_to_this_argument_set
|
81
|
+
@config.role :app, 'app1.capistrano.test', 'app2.capistrano.test' do
|
82
|
+
['app3.capistrano.test', 'app4.capistrano.test']
|
83
|
+
end
|
84
|
+
@config.role :app, 'app5.capistrano.test', 'app6.capistrano.test', :extra => :value do
|
85
|
+
['app7.capistrano.test', 'app8.capistrano.test']
|
86
|
+
end
|
87
|
+
@config.role :app, 'app9.capistrano.test'
|
88
|
+
|
89
|
+
option_hosts = ['app5.capistrano.test', 'app6.capistrano.test', 'app7.capistrano.test', 'app8.capistrano.test']
|
90
|
+
@config.roles[:app].each do |server|
|
91
|
+
if (option_hosts.include? server.host)
|
92
|
+
assert_equal({:extra => :value}, server.options)
|
93
|
+
else
|
94
|
+
assert_not_equal({:extra => :value}, server.options)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Here, the source should be more readable than the method name
|
100
|
+
def test_role_block_returns_options_hash_is_merged_with_role_options_argument
|
101
|
+
@config.role :app, :first => :one, :second => :two do
|
102
|
+
['app1.capistrano.test', 'app2.capistrano.test', {:second => :please, :third => :three}]
|
103
|
+
end
|
104
|
+
@config.roles[:app].each do |server|
|
105
|
+
assert_equal({:first => :one, :second => :please, :third => :three}, server.options)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_role_block_can_override_role_options_argument
|
110
|
+
@config.role :app, :value => :wrong do
|
111
|
+
Capistrano::ServerDefinition.new('app.capistrano.test')
|
112
|
+
end
|
113
|
+
@config.roles[:app].servers
|
114
|
+
@config.roles[:app].servers.each do |server|
|
115
|
+
assert_not_equal({:value => :wrong}, server.options)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_role_block_can_return_nil
|
120
|
+
@config.role :app do
|
121
|
+
nil
|
122
|
+
end
|
123
|
+
assert_role_equals ([])
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_role_block_can_return_empty_array
|
127
|
+
@config.role :app do
|
128
|
+
[]
|
129
|
+
end
|
130
|
+
assert_role_equals ([])
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_role_definitions_via_server_should_associate_server_with_roles
|
134
|
+
@config.server "www.capistrano.test", :web, :app
|
135
|
+
assert_equal %w(www.capistrano.test), @config.roles[:app].map { |s| s.host }
|
136
|
+
assert_equal %w(www.capistrano.test), @config.roles[:web].map { |s| s.host }
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
def assert_role_equals(list)
|
142
|
+
assert_equal list, @config.roles[:app].map { |s| s.host }
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/task_definition'
|
3
|
+
require 'capistrano/configuration/servers'
|
4
|
+
|
5
|
+
class ConfigurationServersTest < Test::Unit::TestCase
|
6
|
+
class MockConfig
|
7
|
+
attr_reader :roles
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@roles = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
include Capistrano::Configuration::Servers
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@config = MockConfig.new
|
18
|
+
role(@config, :app, "app1", :primary => true)
|
19
|
+
role(@config, :app, "app2", "app3")
|
20
|
+
role(@config, :web, "web1", "web2")
|
21
|
+
role(@config, :report, "app2", :no_deploy => true)
|
22
|
+
role(@config, :file, "file", :no_deploy => true)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_task_without_roles_should_apply_to_all_defined_hosts
|
26
|
+
task = new_task(:testing)
|
27
|
+
assert_equal %w(app1 app2 app3 web1 web2 file).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_task_with_explicit_role_list_should_apply_only_to_those_roles
|
31
|
+
task = new_task(:testing, @config, :roles => %w(app web))
|
32
|
+
assert_equal %w(app1 app2 app3 web1 web2).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_task_with_single_role_should_apply_only_to_that_role
|
36
|
+
task = new_task(:testing, @config, :roles => :web)
|
37
|
+
assert_equal %w(web1 web2).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_task_with_unknown_role_should_raise_exception
|
41
|
+
task = new_task(:testing, @config, :roles => :bogus)
|
42
|
+
assert_raises(ArgumentError) do
|
43
|
+
@config.find_servers_for_task(task)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_task_with_hosts_option_should_apply_only_to_those_hosts
|
48
|
+
task = new_task(:testing, @config, :hosts => %w(foo bar))
|
49
|
+
assert_equal %w(foo bar).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_task_with_single_hosts_option_should_apply_only_to_that_host
|
53
|
+
task = new_task(:testing, @config, :hosts => "foo")
|
54
|
+
assert_equal %w(foo).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_task_with_roles_as_environment_variable_should_apply_only_to_that_role
|
58
|
+
ENV['ROLES'] = "app,file"
|
59
|
+
task = new_task(:testing)
|
60
|
+
assert_equal %w(app1 app2 app3 file).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
61
|
+
ensure
|
62
|
+
ENV.delete('ROLES')
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_task_with_hosts_as_environment_variable_should_apply_only_to_those_hosts
|
66
|
+
ENV['HOSTS'] = "foo,bar"
|
67
|
+
task = new_task(:testing)
|
68
|
+
assert_equal %w(foo bar).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
69
|
+
ensure
|
70
|
+
ENV.delete('HOSTS')
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_task_with_hosts_as_environment_variable_should_not_inspect_roles_at_all
|
74
|
+
ENV['HOSTS'] = "foo,bar"
|
75
|
+
task = new_task(:testing, @config, :roles => :bogus)
|
76
|
+
assert_equal %w(foo bar).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
77
|
+
ensure
|
78
|
+
ENV.delete('HOSTS')
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_task_with_onlyhosts_environment_variable_should_apply_only_to_those_hosts
|
82
|
+
ENV['HOSTFILTER'] = "app1,web1"
|
83
|
+
task = new_task(:testing)
|
84
|
+
assert_equal %w(app1 web1).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
85
|
+
ensure
|
86
|
+
ENV.delete('HOSTFILTER')
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_task_with_onlyhosts_environment_variable_should_filter_hosts_option
|
90
|
+
ENV['HOSTFILTER'] = "foo"
|
91
|
+
task = new_task(:testing, @config, :hosts => %w(foo bar))
|
92
|
+
assert_equal %w(foo).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
93
|
+
ensure
|
94
|
+
ENV.delete('HOSTFILTER')
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_task_with_only_should_apply_only_to_matching_tasks
|
98
|
+
task = new_task(:testing, @config, :roles => :app, :only => { :primary => true })
|
99
|
+
assert_equal %w(app1), @config.find_servers_for_task(task).map { |s| s.host }
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_task_with_except_should_apply_only_to_matching_tasks
|
103
|
+
task = new_task(:testing, @config, :except => { :no_deploy => true })
|
104
|
+
assert_equal %w(app1 app2 app3 web1 web2).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_options_to_find_servers_for_task_should_override_options_in_task
|
108
|
+
task = new_task(:testing, @config, :roles => :web)
|
109
|
+
assert_equal %w(app1 app2 app3).sort, @config.find_servers_for_task(task, :roles => :app).map { |s| s.host }.sort
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_find_servers_with_lambda_for_hosts_should_be_evaluated
|
113
|
+
assert_equal %w(foo), @config.find_servers(:hosts => lambda { "foo" }).map { |s| s.host }.sort
|
114
|
+
assert_equal %w(bar foo), @config.find_servers(:hosts => lambda { %w(foo bar) }).map { |s| s.host }.sort
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_find_servers_with_lambda_for_roles_should_be_evaluated
|
118
|
+
assert_equal %w(app1 app2 app3), @config.find_servers(:roles => lambda { :app }).map { |s| s.host }.sort
|
119
|
+
assert_equal %w(app2 file), @config.find_servers(:roles => lambda { [:report, :file] }).map { |s| s.host }.sort
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/configuration/variables'
|
3
|
+
|
4
|
+
class ConfigurationVariablesTest < Test::Unit::TestCase
|
5
|
+
class MockConfig
|
6
|
+
attr_reader :original_initialize_called
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@original_initialize_called = true
|
10
|
+
end
|
11
|
+
|
12
|
+
include Capistrano::Configuration::Variables
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
MockConfig.any_instance.stubs(:logger).returns(stub_everything)
|
17
|
+
@config = MockConfig.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_initialize_should_initialize_variables_hash
|
21
|
+
assert @config.original_initialize_called
|
22
|
+
assert_equal({:ssh_options => {}, :logger => @config.logger}, @config.variables)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_set_should_add_variable_to_hash
|
26
|
+
@config.set :sample, :value
|
27
|
+
assert_equal :value, @config.variables[:sample]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_set_should_convert_variable_name_to_symbol
|
31
|
+
@config.set "sample", :value
|
32
|
+
assert_equal :value, @config.variables[:sample]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_set_should_be_aliased_to_square_brackets
|
36
|
+
@config[:sample] = :value
|
37
|
+
assert_equal :value, @config.variables[:sample]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_variables_should_be_accessible_as_read_accessors
|
41
|
+
@config[:sample] = :value
|
42
|
+
assert_equal :value, @config.sample
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_method_missing_should_raise_error_if_no_variable_matches
|
46
|
+
assert_raises(NoMethodError) do
|
47
|
+
@config.sample
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_respond_to_should_look_for_variables
|
52
|
+
assert !@config.respond_to?(:sample)
|
53
|
+
@config[:sample] = :value
|
54
|
+
assert @config.respond_to?(:sample)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_respond_to_with_include_priv_paramter
|
58
|
+
assert !@config.respond_to?(:sample, true)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_set_should_require_value
|
62
|
+
assert_raises(ArgumentError) do
|
63
|
+
@config.set(:sample)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_set_should_allow_value_to_be_omitted_if_block_is_given
|
68
|
+
assert_nothing_raised do
|
69
|
+
@config.set(:sample) { :value }
|
70
|
+
end
|
71
|
+
assert_instance_of Proc, @config.variables[:sample]
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_set_should_not_allow_multiple_values
|
75
|
+
assert_raises(ArgumentError) do
|
76
|
+
@config.set(:sample, :value, :another)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_set_should_not_allow_both_a_value_and_a_block
|
81
|
+
assert_raises(ArgumentError) do
|
82
|
+
@config.set(:sample, :value) { :block }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_set_should_not_allow_capitalized_variables
|
87
|
+
assert_raises(ArgumentError) do
|
88
|
+
@config.set :Sample, :value
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_unset_should_remove_variable_from_hash
|
93
|
+
@config.set :sample, :value
|
94
|
+
assert @config.variables.key?(:sample)
|
95
|
+
@config.unset :sample
|
96
|
+
assert !@config.variables.key?(:sample)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_unset_should_clear_memory_of_original_proc
|
100
|
+
@config.set(:sample) { :value }
|
101
|
+
@config.fetch(:sample)
|
102
|
+
@config.unset(:sample)
|
103
|
+
assert_equal false, @config.reset!(:sample)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_exists_should_report_existance_of_variable_in_hash
|
107
|
+
assert !@config.exists?(:sample)
|
108
|
+
@config[:sample] = :value
|
109
|
+
assert @config.exists?(:sample)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_reset_should_do_nothing_if_variable_does_not_exist
|
113
|
+
assert_equal false, @config.reset!(:sample)
|
114
|
+
assert !@config.variables.key?(:sample)
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_reset_should_do_nothing_if_variable_is_not_a_proc
|
118
|
+
@config.set(:sample, :value)
|
119
|
+
assert_equal false, @config.reset!(:sample)
|
120
|
+
assert_equal :value, @config.variables[:sample]
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_reset_should_do_nothing_if_proc_variable_has_not_been_dereferenced
|
124
|
+
@config.set(:sample) { :value }
|
125
|
+
assert_equal false, @config.reset!(:sample)
|
126
|
+
assert_instance_of Proc, @config.variables[:sample]
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_reset_should_restore_variable_to_original_proc_value
|
130
|
+
@config.set(:sample) { :value }
|
131
|
+
assert_instance_of Proc, @config.variables[:sample]
|
132
|
+
@config.fetch(:sample)
|
133
|
+
assert_instance_of Symbol, @config.variables[:sample]
|
134
|
+
assert @config.reset!(:sample)
|
135
|
+
assert_instance_of Proc, @config.variables[:sample]
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_fetch_should_return_stored_non_proc_value
|
139
|
+
@config.set(:sample, :value)
|
140
|
+
assert_equal :value, @config.fetch(:sample)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_fetch_should_raise_index_error_if_variable_does_not_exist
|
144
|
+
assert_raises(IndexError) do
|
145
|
+
@config.fetch(:sample)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_fetch_should_return_default_if_variable_does_not_exist_and_default_is_given
|
150
|
+
assert_nothing_raised do
|
151
|
+
assert_equal :default_value, @config.fetch(:sample, :default_value)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_fetch_should_invoke_block_if_variable_does_not_exist_and_block_is_given
|
156
|
+
assert_nothing_raised do
|
157
|
+
assert_equal :default_value, @config.fetch(:sample) { :default_value }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_fetch_should_raise_argument_error_if_both_default_and_block_are_given
|
162
|
+
assert_raises(ArgumentError) do
|
163
|
+
@config.fetch(:sample, :default1) { :default2 }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_fetch_should_dereference_proc_values
|
168
|
+
@config.set(:sample) { :value }
|
169
|
+
assert_instance_of Proc, @config.variables[:sample]
|
170
|
+
assert_equal :value, @config.fetch(:sample)
|
171
|
+
assert_instance_of Symbol, @config.variables[:sample]
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_square_brackets_should_alias_fetch
|
175
|
+
@config.set(:sample, :value)
|
176
|
+
assert_equal :value, @config[:sample]
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_square_brackets_should_return_nil_for_non_existant_variable
|
180
|
+
assert_nothing_raised do
|
181
|
+
assert_nil @config[:sample]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/configuration'
|
3
|
+
|
4
|
+
# These tests are only for testing the integration of the various components
|
5
|
+
# of the Configuration class. To test specific features, please look at the
|
6
|
+
# tests under test/configuration.
|
7
|
+
|
8
|
+
class ConfigurationTest < Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@config = Capistrano::Configuration.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_connections_execution_loading_namespaces_roles_and_variables_modules_should_integrate_correctly
|
14
|
+
Capistrano::SSH.expects(:connect).with { |s,c| s.host == "www.capistrano.test" && c == @config }.returns(:session)
|
15
|
+
|
16
|
+
process_args = Proc.new do |tree, session, opts|
|
17
|
+
tree.fallback.command == "echo 'hello world'" &&
|
18
|
+
session == [:session] &&
|
19
|
+
opts == { :logger => @config.logger }
|
20
|
+
end
|
21
|
+
|
22
|
+
Capistrano::Command.expects(:process).with(&process_args)
|
23
|
+
|
24
|
+
@config.load do
|
25
|
+
role :test, "www.capistrano.test"
|
26
|
+
set :message, "hello world"
|
27
|
+
namespace :testing do
|
28
|
+
task :example, :roles => :test do
|
29
|
+
run "echo '#{message}'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
@config.testing.example
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_tasks_in_nested_namespace_should_be_able_to_call_tasks_in_same_namespace
|
38
|
+
@config.namespace(:outer) do
|
39
|
+
task(:first) { set :called_first, true }
|
40
|
+
namespace(:inner) do
|
41
|
+
task(:first) { set :called_inner_first, true }
|
42
|
+
task(:second) { first }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
@config.outer.inner.second
|
47
|
+
assert !@config[:called_first]
|
48
|
+
assert @config[:called_inner_first]
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_tasks_in_nested_namespace_should_be_able_to_call_tasks_in_parent_namespace
|
52
|
+
@config.namespace(:outer) do
|
53
|
+
task(:first) { set :called_first, true }
|
54
|
+
namespace(:inner) do
|
55
|
+
task(:second) { first }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@config.outer.inner.second
|
60
|
+
assert @config[:called_first]
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_tasks_in_nested_namespace_should_be_able_to_call_shadowed_tasks_in_parent_namespace
|
64
|
+
@config.namespace(:outer) do
|
65
|
+
task(:first) { set :called_first, true }
|
66
|
+
namespace(:inner) do
|
67
|
+
task(:first) { set :called_inner_first, true }
|
68
|
+
task(:second) { parent.first }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
@config.outer.inner.second
|
73
|
+
assert @config[:called_first]
|
74
|
+
assert !@config[:called_inner_first]
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_hooks_for_default_task_should_be_found_if_named_after_the_namespace
|
78
|
+
@config.namespace(:outer) do
|
79
|
+
task(:default) { set :called_default, true }
|
80
|
+
task(:before_outer) { set :called_before_outer, true }
|
81
|
+
task(:after_outer) { set :called_after_outer, true }
|
82
|
+
end
|
83
|
+
@config.outer.default
|
84
|
+
assert @config[:called_before_outer]
|
85
|
+
assert @config[:called_default]
|
86
|
+
assert @config[:called_after_outer]
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/recipes/deploy/local_dependency'
|
3
|
+
|
4
|
+
class LocalDependencyTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@config = { }
|
7
|
+
@dependency = Capistrano::Deploy::LocalDependency.new(@config)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_use_standard_error_message
|
11
|
+
setup_for_one_path_entry(false)
|
12
|
+
@dependency.command("cat")
|
13
|
+
assert_equal "`cat' could not be found in the path on the local host", @dependency.message
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_use_alternative_message_if_provided
|
17
|
+
setup_for_one_path_entry(false)
|
18
|
+
@dependency.command("cat").or("Sorry")
|
19
|
+
assert_equal "Sorry", @dependency.message
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_env_with_no_path_should_never_find_command
|
23
|
+
ENV.expects(:[]).with("PATH").returns(nil)
|
24
|
+
assert !@dependency.command("cat").pass?
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_env_with_one_path_entry_should_fail_if_command_not_found
|
28
|
+
setup_for_one_path_entry(false)
|
29
|
+
assert !@dependency.command("cat").pass?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_env_with_one_path_entry_should_pass_if_command_found
|
33
|
+
setup_for_one_path_entry(true)
|
34
|
+
assert @dependency.command("cat").pass?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_env_with_three_path_entries_should_fail_if_command_not_found
|
38
|
+
setup_for_three_path_entries(false)
|
39
|
+
assert !@dependency.command("cat").pass?
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_env_with_three_path_entries_should_pass_if_command_found
|
43
|
+
setup_for_three_path_entries(true)
|
44
|
+
assert @dependency.command("cat").pass?
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_env_with_one_path_entry_on_windows_should_pass_if_command_found_with_extension
|
48
|
+
setup_for_one_path_entry_on_windows(true)
|
49
|
+
assert @dependency.command("cat").pass?
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def setup_for_one_path_entry(command_found)
|
55
|
+
Capistrano::Deploy::LocalDependency.expects(:on_windows?).returns(false)
|
56
|
+
ENV.expects(:[]).with("PATH").returns("/bin")
|
57
|
+
File.expects(:executable?).with("/bin/cat").returns(command_found)
|
58
|
+
end
|
59
|
+
|
60
|
+
def setup_for_three_path_entries(command_found)
|
61
|
+
Capistrano::Deploy::LocalDependency.expects(:on_windows?).returns(false)
|
62
|
+
path = %w(/bin /usr/bin /usr/local/bin).join(File::PATH_SEPARATOR)
|
63
|
+
ENV.expects(:[]).with("PATH").returns(path)
|
64
|
+
File.expects(:executable?).with("/usr/bin/cat").returns(command_found)
|
65
|
+
File.expects(:executable?).at_most(1).with("/bin/cat").returns(false)
|
66
|
+
File.expects(:executable?).at_most(1).with("/usr/local/bin/cat").returns(false)
|
67
|
+
end
|
68
|
+
|
69
|
+
def setup_for_one_path_entry_on_windows(command_found)
|
70
|
+
Capistrano::Deploy::LocalDependency.expects(:on_windows?).returns(true)
|
71
|
+
ENV.expects(:[]).with("PATH").returns("/cygwin/bin")
|
72
|
+
File.stubs(:executable?).returns(false)
|
73
|
+
first_executable_extension = Capistrano::Deploy::LocalDependency.windows_executable_extensions.first
|
74
|
+
File.expects(:executable?).with("/cygwin/bin/cat#{first_executable_extension}").returns(command_found)
|
75
|
+
end
|
76
|
+
end
|