whiskey_disk 0.0.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,283 +2,418 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper.rb
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'whiskey_disk', 'config'))
3
3
  require 'yaml'
4
4
 
5
- CURRENT = File.expand_path(File.dirname(__FILE__)) # BACON evidently mucks around with __FILE__ or something related :-/
5
+ CURRENT_FILE = File.expand_path(__FILE__) # Bacon evidently mucks around with __FILE__ or something related :-/
6
+ CURRENT = File.expand_path(File.dirname(__FILE__)) # Bacon evidently mucks around with __FILE__ or something related :-/
6
7
 
7
8
  describe WhiskeyDisk::Config do
9
+ describe 'when computing the environment name' do
10
+ it 'should return false when there is no ENV["to"] setting' do
11
+ ENV['to'] = nil
12
+ WhiskeyDisk::Config.environment_name.should == false
13
+ end
14
+
15
+ it 'should return false when the ENV["to"] setting is blank' do
16
+ ENV['to'] = ''
17
+ WhiskeyDisk::Config.environment_name.should == false
18
+ end
19
+
20
+ it 'should return the ENV["to"] setting when it is non-blank' do
21
+ ENV['to'] = 'staging'
22
+ WhiskeyDisk::Config.environment_name.should == 'staging'
23
+ end
24
+
25
+ it 'should return the environment portion of the ENV["to"] setting when a project is specified' do
26
+ ENV['to'] = 'project:staging'
27
+ WhiskeyDisk::Config.environment_name.should == 'staging'
28
+ end
29
+ end
30
+
8
31
  describe 'when fetching configuration' do
32
+ before do
33
+ ENV['to'] = @env = 'foo:staging'
34
+ end
35
+
9
36
  it 'should fail if the current environment cannot be determined' do
10
37
  ENV['to'] = nil
11
38
  lambda { WhiskeyDisk::Config.fetch }.should.raise
12
39
  end
13
40
 
14
- describe 'when there is no separate configuration file for the current environment' do
15
- before do
16
- ENV['to'] = @env = 'staging'
17
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(nil)
18
- end
19
-
20
- it 'should fail if the main configuration file does not exist' do
21
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return(__FILE__ + "_.crap")
22
- lambda { WhiskeyDisk::Config.fetch }.should.raise
23
- end
24
-
25
- it 'should fail if the main configuration file cannot be read' do
26
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return("/tmp")
27
- lambda { WhiskeyDisk::Config.fetch }.should.raise
28
- end
29
-
30
- it 'should fail if the main configuration file is invalid' do
31
- YAML.stub!(:load).and_raise
32
- lambda { WhiskeyDisk::Config.fetch }.should.raise
33
- end
34
-
35
- it 'should fail if the main configuration file does not define data for this environment' do
36
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'} }))
37
- lambda { WhiskeyDisk::Config.fetch }.should.raise
38
- end
39
-
40
- it 'should return the main configuration yaml file data for this environment as a hash' do
41
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
42
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
43
- result = WhiskeyDisk::Config.fetch
44
- staging.each_pair do |k,v|
45
- result[k].should == v
46
- end
47
- end
48
-
49
- it 'should not include configuration information for other environments in the returned hash' do
50
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
51
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
52
- WhiskeyDisk::Config.fetch['a'].should.be.nil
53
- end
54
-
55
- it 'should include the environment in the hash' do
56
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
57
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
58
- WhiskeyDisk::Config.fetch['environment'].should == 'staging'
59
- end
60
-
61
- it 'should not allow overriding the environment in the configuration file' do
62
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy', 'environment' => 'production' }
63
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
64
- WhiskeyDisk::Config.fetch['environment'].should == 'staging'
65
- end
66
-
67
- it 'should include the project handle in the hash' do
68
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
69
- WhiskeyDisk::Config.stub!(:project_name).and_return('whiskey_disk')
70
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
71
- WhiskeyDisk::Config.fetch['project'].should == 'whiskey_disk'
41
+ it 'should fail if the configuration file does not exist' do
42
+ WhiskeyDisk::Config.stub!(:configuration_file).and_return(__FILE__ + "_.crap")
43
+ lambda { WhiskeyDisk::Config.fetch }.should.raise
44
+ end
45
+
46
+ it 'should fail if the configuration file cannot be read' do
47
+ WhiskeyDisk::Config.stub!(:configuration_file).and_return("/tmp")
48
+ lambda { WhiskeyDisk::Config.fetch }.should.raise
49
+ end
50
+
51
+ it 'should fail if the configuration file is invalid' do
52
+ YAML.stub!(:load).and_raise
53
+ lambda { WhiskeyDisk::Config.fetch }.should.raise
54
+ end
55
+
56
+ it 'should fail if the configuration file does not define data for this environment' do
57
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'a' => 'b'}}}))
58
+ lambda { WhiskeyDisk::Config.fetch }.should.raise
59
+ end
60
+
61
+ it 'should return the configuration yaml file data for this environment as a hash' do
62
+ staging = { 'foo' => 'bar', 'repository' => 'xyzzy' }
63
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'repository' => 'b'}, 'staging' => staging }}))
64
+ result = WhiskeyDisk::Config.fetch
65
+ staging.each_pair do |k,v|
66
+ result[k].should == v
72
67
  end
68
+ end
69
+
70
+ it 'should not include configuration information for other environments in the returned hash' do
71
+ staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
72
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({ 'production' => { 'repository' => 'c', 'a' => 'b'}, 'staging' => staging }))
73
+ WhiskeyDisk::Config.fetch['a'].should.be.nil
74
+ end
75
+
76
+ it 'should include the environment in the hash' do
77
+ staging = { 'foo' => 'bar', 'baz' => 'xyzzy' }
78
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'repository' => 'b'}, 'staging' => staging }}))
79
+ WhiskeyDisk::Config.fetch['environment'].should == 'staging'
80
+ end
81
+
82
+ it 'should not allow overriding the environment in the configuration file' do
83
+ staging = { 'foo' => 'bar', 'repository' => 'xyzzy', 'environment' => 'production' }
84
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'repository' => 'b'}, 'staging' => staging }}))
85
+ WhiskeyDisk::Config.fetch['environment'].should == 'staging'
86
+ end
87
+
88
+ it 'should include the project handle in the hash' do
89
+ staging = { 'foo' => 'bar', 'repository' => 'xyzzy' }
90
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'repository' => 'b'}, 'staging' => staging }}))
91
+ WhiskeyDisk::Config.fetch['project'].should == 'foo'
92
+ end
93
+
94
+ it 'should not allow overriding the project handle in the configuration file' do
95
+ staging = { 'foo' => 'bar', 'repository' => 'xyzzy', 'project' => 'diskey_whisk' }
96
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump({'foo' => { 'production' => { 'repository' => 'b'}, 'staging' => staging }}))
97
+ WhiskeyDisk::Config.fetch['project'].should == 'foo'
98
+ end
99
+ end
100
+
101
+ describe 'returning configuration data from a configuration file' do
102
+ it 'should fail if the configuration file does not exist' do
103
+ WhiskeyDisk::Config.stub!(:configuration_file).and_return(CURRENT_FILE + '._crap')
104
+ lambda { WhiskeyDisk::Config.configuration_data }.should.raise
105
+ end
106
+
107
+ it 'should return the contents of the configuration file' do
108
+ WhiskeyDisk::Config.stub!(:configuration_file).and_return(CURRENT_FILE)
109
+ File.stub!(:read).with(CURRENT_FILE).and_return('file contents')
110
+ WhiskeyDisk::Config.configuration_data.should == 'file contents'
111
+ end
112
+ end
113
+
114
+ describe 'transforming data from the configuration file' do
115
+ it 'should fail if the configuration data cannot be loaded' do
116
+ WhiskeyDisk::Config.stub!(:configuration_data).and_raise
117
+ lambda { WhiskeyDisk::Config.load_data }.should.raise
118
+ end
119
+
120
+ it 'should fail if converting the configuration data from YAML fails' do
121
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return('configuration data')
122
+ YAML.stub!(:load).and_raise
123
+ lambda { WhiskeyDisk::Config.load_data }.should.raise
124
+ end
125
+
126
+ it 'should return a normalized version of the un-YAMLized configuration data' do
127
+ data = { 'a' => 'b', 'c' => 'd' }
128
+ WhiskeyDisk::Config.stub!(:configuration_data).and_return(YAML.dump(data))
129
+ WhiskeyDisk::Config.stub!(:normalize_data).with(data).and_return('normalized data')
130
+ WhiskeyDisk::Config.load_data.should == 'normalized data'
131
+ end
132
+ end
133
+
134
+ describe 'normalizing YAML data from the configuration file' do
135
+ before do
136
+ ENV['to'] = @env = 'foo:staging'
73
137
 
74
- it 'should allow overriding the project handle in the configuration file' do
75
- staging = { 'foo' => 'bar', 'baz' => 'xyzzy', 'project' => 'diskey_whisk' }
76
- WhiskeyDisk::Config.stub!(:project_name).and_return('whiskey_disk')
77
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'}, 'staging' => staging }))
78
- WhiskeyDisk::Config.fetch['project'].should == 'diskey_whisk'
79
- end
138
+ @bare_data = { 'repository' => 'git://foo/bar.git', 'domain' => 'ogc@ogtastic.com' }
139
+ @env_data = { 'staging' => @bare_data }
140
+ @proj_data = { 'foo' => @env_data }
141
+ end
142
+
143
+ it 'should fail if the configuration data is not a hash' do
144
+ lambda { WhiskeyDisk::Config.normalize_data([]) }.should.raise
80
145
  end
81
146
 
82
- describe 'when there is a separate configuration file for the current environment' do
147
+ describe 'when no project name is specified via ENV["to"]' do
83
148
  before do
84
149
  ENV['to'] = @env = 'staging'
85
- WhiskeyDisk::Config.stub!(:environment_configuration_file).and_return(__FILE__)
86
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return(__FILE__)
87
150
  end
88
151
 
89
- it 'should fail if the main configuration file does not exist' do
90
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return(__FILE__ + "_.crap")
91
- lambda { WhiskeyDisk::Config.fetch }.should.raise(RuntimeError)
152
+ it 'should return the original data if it has both project and environment scoping' do
153
+ WhiskeyDisk::Config.normalize_data(@proj_data).should == @proj_data
92
154
  end
93
-
94
- it 'should fail if the main configuration file cannot be read' do
95
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return("/tmp")
96
- lambda { WhiskeyDisk::Config.fetch }.should.raise(RuntimeError)
97
- end
98
-
99
- it 'should fail if the main configuration file is invalid' do
100
- YAML.stub!(:load).and_raise
101
- lambda { WhiskeyDisk::Config.fetch }.should.raise
102
- end
103
-
104
- it 'should fail if the separate configuration file cannot be read' do
105
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({}))
106
- WhiskeyDisk::Config.stub!(:environment_configuration_file).and_return("/tmp")
107
- lambda { WhiskeyDisk::Config.fetch }.should.raise
108
- end
109
-
110
- it 'should fail if the separate configuration file is invalid' do
111
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({}))
112
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return('BAD DATA')
113
- YAML.stub!(:load).with('BAD DATA').and_raise
114
- lambda { WhiskeyDisk::Config.fetch }.should.raise
115
- end
116
-
117
- it 'should fail if the separate configuration file does not define data for this environment' do
118
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump({}))
119
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump({ 'production' => { 'a' => 'b'} }))
120
- lambda { WhiskeyDisk::Config.fetch }.should.raise
121
- end
122
-
123
- it 'should return the merger of main and separate yaml configuration data as a hash' do
124
- main = { 'staging' => { 'foo' => 'bar'}}
125
- env = { 'staging' => { 'baz' => 'xyzzy'}}
126
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
127
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
128
- result = WhiskeyDisk::Config.fetch
129
- main.merge(env)['staging'].each_pair {|k,v| result[k].should == v}
130
- end
131
-
132
- it 'should work even if main does not provide configuration data for this environment' do
133
- main = { 'production' => { 'foo' => 'bar'}}
134
- env = { 'staging' => { 'baz' => 'xyzzy'}}
135
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
136
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
137
- result = WhiskeyDisk::Config.fetch
138
- env['staging'].each_pair {|k,v| result[k].should == v}
155
+
156
+ it 'should return the original data wrapped in project scope, using a dummy project, if it has environment scoping but no project scoping' do
157
+ WhiskeyDisk::Config.normalize_data(@env_data).should == { 'unnamed_project' => @env_data }
139
158
  end
140
-
141
- it 'should override main configuration file data with separate configuration file data when there is a conflict' do
142
- main = { 'production' => { 'foo' => 'bar'}}
143
- env = { 'staging' => { 'baz' => 'xyzzy', 'foo' => 'mine'}}
144
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
145
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
146
- result = WhiskeyDisk::Config.fetch
147
- env['staging'].each_pair {|k,v| result[k].should == v}
148
- end
149
-
150
- it 'should include the environment in the hash' do
151
- main = { 'staging' => { 'foo' => 'bar'}}
152
- env = { 'staging' => { 'baz' => 'xyzzy'}}
153
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
154
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
155
- WhiskeyDisk::Config.fetch['environment'].should == 'staging'
156
- end
157
-
158
- it 'should not allow overriding the environment in the main configuration file' do
159
- main = { 'staging' => { 'foo' => 'bar', 'environment' => 'production'}}
160
- env = { 'staging' => { 'baz' => 'xyzzy'}}
161
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
162
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
163
- WhiskeyDisk::Config.fetch['environment'].should == 'staging'
159
+
160
+ it 'should return the original data wrapped in a project scope, using a dummy project, and an environment scope if it has neither scoping' do
161
+ WhiskeyDisk::Config.normalize_data(@bare_data).should == { 'unnamed_project' => { 'staging' => @bare_data } }
164
162
  end
165
-
166
- it 'should not allow overriding the environment in the separate configuration file' do
167
- main = { 'staging' => { 'foo' => 'bar', 'environment' => 'production'}}
168
- env = { 'staging' => { 'baz' => 'xyzzy', 'environment' => 'production'}}
169
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
170
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
171
- WhiskeyDisk::Config.fetch['environment'].should == 'staging'
163
+ end
164
+
165
+ describe 'when a project name is specified via ENV["to"]' do
166
+ before do
167
+ ENV['to'] = @env = 'whiskey_disk:staging'
172
168
  end
173
169
 
174
- it 'should include the project handle in the hash' do
175
- main = { 'staging' => { 'foo' => 'bar' }}
176
- env = { 'staging' => { 'baz' => 'xyzzy' }}
177
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
178
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
179
- WhiskeyDisk::Config.stub!(:project_name).and_return('whiskey_disk')
180
- WhiskeyDisk::Config.fetch['project'].should == 'whiskey_disk'
170
+ it 'should return the original data if it has both project and environment scoping' do
171
+ WhiskeyDisk::Config.normalize_data(@proj_data).should == @proj_data
181
172
  end
182
-
183
- it 'should allow overriding the project handle in the main configuration file' do
184
- main = { 'staging' => { 'foo' => 'bar', 'project' => 'diskey_whisk' }}
185
- env = { 'staging' => { 'baz' => 'xyzzy' }}
186
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
187
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
188
- WhiskeyDisk::Config.stub!(:project_name).and_return('whiskey_disk')
189
- WhiskeyDisk::Config.fetch['project'].should == 'diskey_whisk'
173
+
174
+ it 'should return the original data wrapped in project scope if it has environment scoping but no project scoping' do
175
+ WhiskeyDisk::Config.normalize_data(@env_data).should == { 'whiskey_disk' => @env_data }
190
176
  end
191
-
192
- it 'should allow overriding the project handle in the separate configuration file' do
193
- main = { 'staging' => { 'foo' => 'bar', 'project' => 'diskey_whisk' }}
194
- env = { 'staging' => { 'baz' => 'xyzzy', 'project' => 'diskey_whisk' }}
195
- WhiskeyDisk::Config.stub!(:main_configuration_data).and_return(YAML.dump(main))
196
- WhiskeyDisk::Config.stub!(:environment_configuration_data).and_return(YAML.dump(env))
197
- WhiskeyDisk::Config.stub!(:project_name).and_return('whiskey_disk')
198
- WhiskeyDisk::Config.fetch['project'].should == 'diskey_whisk'
177
+
178
+ it 'should return the original data wrapped in a project scope and an environment scope if it has neither scoping' do
179
+ WhiskeyDisk::Config.normalize_data(@bare_data).should == { 'whiskey_disk' => { 'staging' => @bare_data } }
199
180
  end
200
- end
201
- end
202
-
203
- describe 'when returning the configuration filenames' do
204
- before do
205
- ENV['to'] = @env = 'staging'
206
- WhiskeyDisk::Config.stub!(:main_configuration_file).and_return('/path/to/main')
207
- WhiskeyDisk::Config.stub!(:environment_configuration_file).and_return('/path/to/staging')
208
181
  end
182
+ end
209
183
 
210
- it 'should fail if the current environment cannot be determined' do
211
- ENV['to'] = nil
212
- lambda { WhiskeyDisk::Config.filenames }.should.raise
184
+ describe 'computing the project name from a configuration hash' do
185
+ it 'should return the project name from the ENV["to"] setting when it is available' do
186
+ ENV['to'] = 'foo:staging'
187
+ WhiskeyDisk::Config.project_name.should == 'foo'
213
188
  end
214
189
 
215
- it 'should include the location of the main configuration file' do
216
- WhiskeyDisk::Config.filenames.should.include('/path/to/main')
190
+ it 'should fail when ENV["to"] is unset' do
191
+ ENV['to'] = ''
192
+ WhiskeyDisk::Config.project_name.should == 'unnamed_project'
217
193
  end
218
-
219
- it 'should include the location of a separate configuration file for this environment' do
220
- WhiskeyDisk::Config.filenames.should.include('/path/to/staging')
194
+
195
+ it 'should return "unnamed_project" when no ENV["to"] project setting is available' do
196
+ ENV['to'] = 'staging'
197
+ WhiskeyDisk::Config.project_name.should == 'unnamed_project'
221
198
  end
222
199
  end
223
200
 
224
- describe 'computing the project name from a configuration hash' do
225
- it 'should return the empty string if no repository is defined' do
226
- WhiskeyDisk::Config.project_name({}).should == ''
201
+ describe 'finding the configuration file' do
202
+ before do
203
+ ENV['to'] = @env = 'staging'
227
204
  end
228
205
 
229
- it 'should return the empty string if the repository is blank' do
230
- WhiskeyDisk::Config.project_name({ 'repository' => ''}).should == ''
231
- end
206
+ describe 'and no path is specified' do
207
+ before do
208
+ ENV['path'] = @path = nil
209
+ end
210
+
211
+ describe 'and a project name is specified in ENV["to"]' do
212
+ before do
213
+ ENV['to'] = @env = 'foo:staging'
214
+ end
215
+
216
+ it 'should return the path to deploy/foo/<environment>.yml under the project base path if it exists' do
217
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
218
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(true)
219
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy/foo/staging.yml'
220
+ end
221
+
222
+ it 'should return the path to deploy/foo.yml under the project base path if it exists' do
223
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
224
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(false)
225
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo.yml').and_return(true)
226
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy/foo.yml'
227
+ end
228
+
229
+ it 'should return the path to a per-environment configuration file in the deploy/ directory under the project base path if it exists' do
230
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
231
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(false)
232
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo.yml').and_return(false)
233
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(true)
234
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy/staging.yml'
235
+ end
232
236
 
233
- it 'should return the last path segment if the repository does not end in .git' do
234
- WhiskeyDisk::Config.project_name({ 'repository' => 'git@foo/bar/baz'}).should == 'baz'
235
- end
237
+ it 'should return the path to a per-environment configuration file under the project base path if it exists' do
238
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
239
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(false)
240
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo.yml').and_return(false)
241
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
242
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(true)
243
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/staging.yml'
244
+ end
236
245
 
237
- it 'should return the last path segment, stripping .git, if the repository ends in .git' do
238
- WhiskeyDisk::Config.project_name({ 'repository' => 'git@foo/bar/baz.git'}).should == 'baz'
239
- end
246
+ it 'should return the path to deploy.yml under the project base path' do
247
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
248
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(false)
249
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo.yml').and_return(false)
250
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
251
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(false)
252
+ File.stub!(:exists?).with('/path/to/project/config/deploy.yml').and_return(true)
253
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy.yml'
254
+ end
240
255
 
241
- it 'should return the last :-delimited segment if the repository does not end in .git' do
242
- WhiskeyDisk::Config.project_name({ 'repository' => 'git@foo/bar:baz'}).should == 'baz'
243
- end
256
+ it 'should fail if no per-environment config file nor deploy.yml exists under the project base path' do
257
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
258
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo/staging.yml').and_return(false)
259
+ File.stub!(:exists?).with('/path/to/project/config/deploy/foo.yml').and_return(false)
260
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
261
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(false)
262
+ File.stub!(:exists?).with('/path/to/project/config/deploy.yml').and_return(false)
263
+ lambda { WhiskeyDisk::Config.configuration_file }.should.raise
264
+ end
265
+ end
266
+
267
+ describe 'and no project name is specified in ENV["to"]' do
268
+ it 'should return the path to a per-environment configuration file in the deploy/ directory under the project base path if it exists' do
269
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
270
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(true)
271
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy/staging.yml'
272
+ end
244
273
 
245
- it 'should return the last :-delimited segment, stripping .git, if the repository ends in .git' do
246
- WhiskeyDisk::Config.project_name({ 'repository' => 'git@foo/bar:baz.git'}).should == 'baz'
274
+ it 'should return the path to a per-environment configuration file under the project base path if it exists' do
275
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
276
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
277
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(true)
278
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/staging.yml'
279
+ end
280
+
281
+ it 'should return the path to deploy.yml under the project base path' do
282
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
283
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
284
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(false)
285
+ File.stub!(:exists?).with('/path/to/project/config/deploy.yml').and_return(true)
286
+ WhiskeyDisk::Config.configuration_file.should == '/path/to/project/config/deploy.yml'
287
+ end
288
+
289
+ it 'should fail if no per-environment config file nor deploy.yml exists under the project base path' do
290
+ WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project/config')
291
+ File.stub!(:exists?).with('/path/to/project/config/deploy/staging.yml').and_return(false)
292
+ File.stub!(:exists?).with('/path/to/project/config/staging.yml').and_return(false)
293
+ File.stub!(:exists?).with('/path/to/project/config/deploy.yml').and_return(false)
294
+ lambda { WhiskeyDisk::Config.configuration_file }.should.raise
295
+ end
296
+ end
247
297
  end
248
- end
249
298
 
250
- describe 'finding the main configuration file' do
251
- it 'should return the path to deploy.yml in the config directory under the project base path' do
252
- WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project')
253
- WhiskeyDisk::Config.main_configuration_file.should == '/path/to/project/config/deploy.yml'
299
+ it 'should fail if a path is specified which does not exist' do
300
+ ENV['path'] = @path = (CURRENT_FILE + "_.crap")
301
+ lambda { WhiskeyDisk::Config.configuration_file }.should.raise
254
302
  end
255
- end
256
303
 
257
- describe 'finding the per-environment configuration file' do
258
- it 'should fail if the current environment cannot be determined' do
259
- ENV['to'] = nil
260
- lambda { WhiskeyDisk::Config.environment_configuration_file }.should.raise
304
+ it 'should return the file path when a path which points to an existing file is specified' do
305
+ ENV['path'] = @path = CURRENT_FILE
306
+ File.stub!(:exists?).with(@path).and_return(true)
307
+ WhiskeyDisk::Config.configuration_file.should == @path
261
308
  end
262
-
263
- it 'should return the path to deploy-<environment>.yml in the config directory under the project base path' do
264
- ENV['to'] = @env = 'staging'
265
- WhiskeyDisk::Config.stub!(:base_path).and_return('/path/to/project')
266
- WhiskeyDisk::Config.environment_configuration_file.should == '/path/to/project/config/deploy-staging.yml'
309
+
310
+ describe 'and a path which points to a directory is specified' do
311
+ before do
312
+ ENV['path'] = @path = CURRENT
313
+ end
314
+
315
+ describe 'and a project name is specified in ENV["to"]' do
316
+ before do
317
+ ENV['to'] = @env = 'foo:staging'
318
+ end
319
+
320
+ it 'should return the path to deploy/foo/<environment>.yml under the project base path if it exists' do
321
+ WhiskeyDisk::Config.stub!(:base_path).and_return(@path)
322
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(true)
323
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy', 'foo' ,'staging.yml')
324
+ end
325
+
326
+ it 'should return the path to deploy/foo.yml under the project base path if it exists' do
327
+ WhiskeyDisk::Config.stub!(:base_path).and_return(@path)
328
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(false)
329
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo.yml')).and_return(true)
330
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy', 'foo.yml')
331
+ end
332
+
333
+ it 'should return the path to a per-environment configuration file under deploy/ in the path specified if that file exists' do
334
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(false)
335
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo.yml')).and_return(false)
336
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(true)
337
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy', 'staging.yml')
338
+ end
339
+
340
+ it 'should return the path to a per-environment configuration file in the path specified if that file exists' do
341
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(false)
342
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo.yml')).and_return(false)
343
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
344
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(true)
345
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'staging.yml')
346
+ end
347
+
348
+ it 'should return the path to deploy.yaml in the path specified if deploy.yml exists' do
349
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(false)
350
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo.yml')).and_return(false)
351
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
352
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(false)
353
+ File.stub!(:exists?).with(File.join(@path, 'deploy.yml')).and_return(true)
354
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy.yml')
355
+ end
356
+
357
+ it 'should fail if no per-environment configuration file nor deploy.yml exists in the path specified' do
358
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo', 'staging.yml')).and_return(false)
359
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'foo.yml')).and_return(false)
360
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
361
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(false)
362
+ File.stub!(:exists?).with(File.join(@path, 'deploy.yml')).and_return(false)
363
+ lambda { WhiskeyDisk::Config.configuration_file }.should.raise
364
+ end
365
+ end
366
+
367
+ describe 'and no project name is specified in ENV["to"]' do
368
+ it 'should return the path to a per-environment configuration file under deploy/ in the path specified if that file exists' do
369
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(true)
370
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy', 'staging.yml')
371
+ end
372
+
373
+ it 'should return the path to a per-environment configuration file in the path specified if that file exists' do
374
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
375
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(true)
376
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'staging.yml')
377
+ end
378
+
379
+ it 'should return the path to deploy.yaml in the path specified if deploy.yml exists' do
380
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
381
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(false)
382
+ File.stub!(:exists?).with(File.join(@path, 'deploy.yml')).and_return(true)
383
+ WhiskeyDisk::Config.configuration_file.should == File.join(@path, 'deploy.yml')
384
+ end
385
+
386
+ it 'should fail if no per-environment configuration file nor deploy.yml exists in the path specified' do
387
+ File.stub!(:exists?).with(File.join(@path, 'deploy', 'staging.yml')).and_return(false)
388
+ File.stub!(:exists?).with(File.join(@path, 'staging.yml')).and_return(false)
389
+ File.stub!(:exists?).with(File.join(@path, 'deploy.yml')).and_return(false)
390
+ lambda { WhiskeyDisk::Config.configuration_file }.should.raise
391
+ end
392
+ end
267
393
  end
268
394
  end
269
395
 
270
396
  describe 'computing the base path for the project' do
397
+ before do
398
+ ENV['path'] = @path = nil
399
+ end
400
+
401
+ it 'should return the path set in the "path" environment variable when one is set' do
402
+ ENV['path'] = @path = CURRENT
403
+ WhiskeyDisk::Config.base_path.should == @path
404
+ end
405
+
271
406
  it 'should fail if there is no Rakefile along the root path to the current directory' do
272
407
  WhiskeyDisk::Config.stub!(:contains_rakefile?).and_return(false)
273
408
  lambda { WhiskeyDisk::Config.base_path }.should.raise
274
409
  end
275
410
 
276
- it 'return the nearest enclosing path with a Rakefile along the root path to the current directory' do
411
+ it 'return the config directory in the nearest enclosing path with a Rakefile along the root path to the current directory' do
277
412
  top = ::File.expand_path(File.join(CURRENT, '..', '..'))
278
413
  WhiskeyDisk::Config.stub!(:contains_rakefile?).and_return(false)
279
414
  WhiskeyDisk::Config.stub!(:contains_rakefile?).with(top).and_return(true)
280
415
  Dir.chdir(CURRENT)
281
- WhiskeyDisk::Config.base_path.should == top
416
+ WhiskeyDisk::Config.base_path.should == File.join(top, 'config')
282
417
  end
283
418
  end
284
419
  end