cuken 0.1.4 → 0.1.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.
Files changed (41) hide show
  1. data/.relish +2 -0
  2. data/Gemfile +4 -4
  3. data/Gemfile.lock +17 -23
  4. data/VERSION +1 -1
  5. data/cuken.gems +108 -0
  6. data/cuken.gemspec +33 -10
  7. data/features/about.md +15 -2
  8. data/features/chef_examples/cookbooks_cookbook.feature +38 -3
  9. data/features/chef_examples/cookbooks_remote_repo.feature +10 -0
  10. data/features/chef_examples/cookbooks_repo.feature +5 -5
  11. data/features/{chef_steps → chef_examples}/knife_admin_client.feature +4 -4
  12. data/features/chef_examples/knife_client_create.feature +13 -0
  13. data/features/chef_steps/common_steps.feature +2 -2
  14. data/features/chef_steps/cookbook_steps.feature +12 -5
  15. data/features/chef_steps/node_steps.feature +1 -1
  16. data/features/file_steps/file_steps.feature +11 -11
  17. data/lib/cuken/all.rb +4 -0
  18. data/lib/cuken/api/chef/common.rb +46 -8
  19. data/lib/cuken/api/chef/knife.rb +107 -0
  20. data/lib/cuken/api/chef.rb +21 -13
  21. data/lib/cuken/api/common.rb +12 -0
  22. data/lib/cuken/api/rvm.rb +501 -0
  23. data/lib/cuken/api/ssh-forever.rb +237 -0
  24. data/lib/cuken/chef.rb +2 -0
  25. data/lib/cuken/common.rb +1 -0
  26. data/lib/cuken/cucumber/chef/common.rb +4 -2
  27. data/lib/cuken/cucumber/chef/cookbook.rb +87 -12
  28. data/lib/cuken/cucumber/chef/data_bag.rb +27 -0
  29. data/lib/cuken/cucumber/chef/knife.rb +10 -0
  30. data/lib/cuken/cucumber/chef/node.rb +20 -8
  31. data/lib/cuken/cucumber/chef/role.rb +18 -1
  32. data/lib/cuken/cucumber/chef.rb +5 -3
  33. data/lib/cuken/cucumber/cmd.rb +1 -1
  34. data/lib/cuken/cucumber/file.rb +18 -2
  35. data/lib/cuken/cucumber/rvm.rb +4 -0
  36. data/lib/cuken/rvm.rb +3 -0
  37. data/spec/api/knife_spec.rb +94 -0
  38. data/spec/api/rvm_spec.rb +274 -0
  39. data/spec/api/rvmrc_processor_spec.rb +288 -0
  40. data/spec/spec_helper.rb +58 -2
  41. metadata +67 -30
@@ -0,0 +1,94 @@
1
+ require Pathname(__FILE__).ascend { |d| h=d+'spec_helper.rb'; break h if h.file? }
2
+
3
+ module ::Cuken::Api::Chef
4
+
5
+ describe Knife do
6
+ before :all do
7
+ ::Chef::Config[:node_name] = "webmonkey.example.com"
8
+ @knife = ::Chef::Knife::ClientCreate.new
9
+ @knife.config = {
10
+ :file => nil
11
+ }
12
+ @client = ::Chef::ApiClient.new
13
+ end
14
+ describe "#create_client(data)" do
15
+ it "should create a new named admin Client" do
16
+ data = {:name => 'Im_new_here',
17
+ :config_file => '/some/knife.rb',
18
+ :admin => true,
19
+ :file => '/some/sekret.pem',
20
+ :no_editor => true}
21
+ any_instance_of(::Chef::ApiClient) do |u|
22
+ stub(u).name.with(data[:name]).times(1)
23
+ stub(u).name.with("").times(1) # some json creation routine
24
+ stub(u).admin.with(data[:admin]).times(1)
25
+ stub(u).admin.with(false).times(1) # some json creation routine
26
+ stub(u).save{ { 'private_key' => 'sekret' } }
27
+ end
28
+ stub(Chef::Config).from_file.with(is_a(String))
29
+ FakeFS do
30
+ chef.knife.create_client(data)
31
+ File.read(data[:file]).should == 'sekret'
32
+ end
33
+ end
34
+ it "should create a new named non-admin Client" do
35
+ data = {:name => 'Im_new_here',
36
+ :config_file => '/some/knife.rb',
37
+ :admin => false,
38
+ :file => '/some/sekret2.pem',
39
+ :no_editor => true}
40
+ any_instance_of(::Chef::ApiClient) do |u|
41
+ stub(u).name.with(data[:name]).times(1)
42
+ stub(u).name.with("").times(1) # some json creation routine
43
+ stub(u).admin.with(nil).times(1)
44
+ stub(u).admin.with(false).times(1) # some json creation routine
45
+ stub(u).save{ { 'private_key' => 'sekret2' } }
46
+ end
47
+ stub(Chef::Config).from_file.with(is_a(String))
48
+ FakeFS do
49
+ chef.knife.create_client(data)
50
+ File.read(data[:file]).should == 'sekret2'
51
+ end
52
+ end
53
+ end
54
+ describe "#show_client(data)" do
55
+ it "should show a named Client" do
56
+ data = {:name => 'Im_new_here',
57
+ :config_file => '/some/knife.rb',
58
+ :file => '/some/sekret.pem',
59
+ :no_editor => true}
60
+ stub(Chef::Config).from_file.with(is_a(String))
61
+ stub(Chef::ApiClient).load.with(data[:name]){['somthing: displayed']}
62
+ FakeFS do
63
+ chef.knife.show_client(data).should be_nil
64
+
65
+ end
66
+ end
67
+ end
68
+ # describe "#check_client(data)" do
69
+ # it "should check a named Client" do
70
+ # data = {:name => 'Im_new_here',
71
+ # :file => '/some/sekret.pem',
72
+ # :no_editor => true}
73
+ # stub(Chef::Config).from_file.with(is_a(String))
74
+ # stub(Chef::ApiClient).load.with(data[:name]){['somthing: displayed']}
75
+ # FakeFS do
76
+ # chef.knife.check_client(data).should match /somthing: displayed/
77
+ # end
78
+ # end
79
+ # end
80
+ describe "#delete_client(data)" do
81
+ it "should delete a named Client" do
82
+ data = {:name => 'Im_new_here',
83
+ :config_file => '/some/knife.rb',
84
+ :file => '/some/sekret.pem',
85
+ :no_editor => true}
86
+ stub(Chef::Config).from_file.with(is_a(String))
87
+ stub(Chef::ApiClient).load.with(data[:name]){stub!.destroy{true}}
88
+ FakeFS do
89
+ chef.knife.delete_client(data).should be_nil
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,274 @@
1
+ require Pathname(__FILE__).ascend { |d| h=d+'spec_helper.rb'; break h if h.file? }
2
+
3
+ #Reference:
4
+ # http://www.metaskills.net/2010/07/30/the-rvm-ruby-api/
5
+
6
+ module ::Cuken::Api
7
+ describe Rvm do
8
+ before(:all) do
9
+ include ::Cuken::Api::Rvm
10
+ # ::FakeFS.activate!
11
+ # ::FakeFS::FileSystem.clear
12
+ @rvmrc_root = setup_rvmrc_gems_files(1)
13
+ @rvmrc_file = Dir.glob(@rvmrc_root + '/**' + '/.rvmrc')[-1]
14
+ end
15
+ before(:each) do
16
+ puts self.class
17
+ @rvmrc_processor= ::Cuken::Api::Rvm::RvmrcProcessor.new(@rvmrc_file)
18
+ end
19
+ after(:all) do
20
+ # ::FakeFS.deactivate!
21
+ end
22
+ # context ".b3_setup" do
23
+ # it "should set the path to BigBlueButton's sources root" do
24
+ # ::Cuken::Api::Rvm.rvm_setup.directory?.should be_true
25
+ # end
26
+ # it "should raise an error if the path to BigBlueButton's sources root does not exist" do
27
+ # FakeFS { lambda{ ::B3::Bdd::Helpers.b3_setup}.should raise_error(RuntimeError, /Could not find BigBlueButton's sources root./) }
28
+ # end
29
+ # end
30
+
31
+ describe ".rvm_current_name" do
32
+ it "should return the full rubie and gemset name" do
33
+ ::Cuken::Api::Rvm.rvm_current_name.should =~ /ruby(.*)@(.*)/
34
+ end
35
+ end
36
+
37
+ describe ".rvm_path" do
38
+ it "should return a Pathname of the rvm_path environment variable" do
39
+ ::Cuken::Api::Rvm.rvm_path.should be_kind_of Pathname
40
+ end
41
+ it "should return the path to RVM's install root if it exists" do
42
+ ::Cuken::Api::Rvm.rvm_path.directory?.should be_true
43
+ end
44
+ it "should raise an error if RVM's install root does not exist" do
45
+ FakeFS { lambda{ ::Cuken::Api::Rvm.rvm_path}.should raise_error(RuntimeError, /Could not find RVM's .rvm folder/) }
46
+ end
47
+ end
48
+ describe ".rvm_local_install?" do
49
+ it "should indicate RVM is installed locally" do
50
+ ::Cuken::Api::Rvm.rvm_local_install?.should be_true
51
+ end
52
+ end
53
+
54
+ context ".rvm_loaded? with RVM" do
55
+ it "should return true when RVM is installed locally" do
56
+ ::Cuken::Api::Rvm.rvm_loaded?.should be_true
57
+ end
58
+ end
59
+
60
+ context ".rvm_loaded? without RVM" do
61
+ it "should return false when RVM is not installed locally" do
62
+ FakeFS do
63
+ ::Cuken::Api::Rvm.rvm_loaded?.should be_false
64
+ end
65
+ end
66
+ end
67
+
68
+ context ".rvm_gemset_paths with root path argument" do
69
+ it "should return default paths requiring RVM gemsets be loaded" do
70
+ FakeFS do
71
+ root_path = setup_rvmrc_gems_files(8)
72
+ ::Cuken::Api::Rvm.rvm_gemset_paths(root_path).should have(9).items
73
+ end
74
+ end
75
+ end
76
+
77
+ context ".rvmrc_rubies_gemsets without root path argument" do
78
+ it "should return a hash whose keys are rubies (in the .rvmrc files)" do
79
+ FakeFS do
80
+ root_path = setup_rvmrc_gems_files(1)
81
+ ::Cuken::Api::Rvm.rvmrc_rubies_gemsets(root_path).should be_kind_of(Hash)
82
+ ::Cuken::Api::Rvm.rvmrc_rubies_gemsets(root_path).keys.each {|k| k.should match /ruby/ }
83
+ end
84
+ end
85
+ it "should return a hash whose values are array of gemsets (in the .rvmrc files)" do
86
+ ::Cuken::Api::Rvm.rvmrc_rubies_gemsets.each do |k, v|
87
+ k.should match /ruby/
88
+ v.should be_kind_of(Array)
89
+ v.each{|elem| elem.should be_kind_of(Hash) }
90
+ end
91
+ end
92
+ it "should return RVM gemsets names that exist in the .rvmrc files" do
93
+ FakeFS do
94
+ root_path = setup_rvmrc_gems_files(8)
95
+ res = ::Cuken::Api::Rvm.rvmrc_rubies_gemsets(root_path)
96
+ res.should have(1).item
97
+ res.first.last.should have(9).items
98
+ end
99
+ end
100
+ end
101
+
102
+ context ".rvmrc_rubies without root path argument" do
103
+ it "should return RVM Ruby names that exist in the .rvmrc files" do
104
+ ::Cuken::Api::Rvm.rvm_install_rubies = {'ruby-1.9.2-p136' => {:alias => 'cuken192'}}
105
+ res = ::Cuken::Api::Rvm.rvmrc_rubies
106
+ res.should have(1).item
107
+ res.first.should have(2).items
108
+ end
109
+ it "should contain an alias with prefix cuken-" do
110
+ ::Cuken::Api::Rvm.rvmrc_rubies.each do |k, v|
111
+ v[:alias].should match /\Acuken-/
112
+ end
113
+ end
114
+ end
115
+
116
+ context ".rvm_rubies_setup without root path argument" do
117
+ it "should raise an error if RVM's install root does not exist" do
118
+ FakeFS { lambda{ ::Cuken::Api::Rvm.rvm_rubies_setup}.should raise_error(RuntimeError, /RVM library not loaded./) }
119
+ end
120
+ it "should not install existing RVM rubies that exists in the .rvmrc files" do
121
+ rvm_now=(`rvm current`)[/(.*)@/,1]
122
+ mock(::RVM).install(rvm_now,{}).times(0){true}
123
+ mock(::RVM).alias_create.with(is_a(String),/@vagrant/).times(1) { true }
124
+ ::Cuken::Api::Rvm.rvm_rubies_setup.should have(1).item
125
+ end
126
+ end
127
+
128
+ describe ".rvm_install_gemspecs" do
129
+ it "should return an array of 2-element arrays with gem name and version" do
130
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_a', '1.0.0']
131
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_b', '2.0.0']
132
+ ::Cuken::Api::Rvm.rvm_install_gemspecs.should == [["bundler", "1.0.10"], ["gem_a", "1.0.0"], ["gem_b", "2.0.0"]]
133
+ end
134
+ end
135
+
136
+ describe ".rvm_create_gemsets" do
137
+ it "should return an array of gemsets names" do
138
+ ::Cuken::Api::Rvm.rvm_create_gemsets << 'gemset_a'
139
+ ::Cuken::Api::Rvm.rvm_create_gemsets << 'gemset_b'
140
+ ::Cuken::Api::Rvm.rvm_create_gemsets.should == ["gemset_a", "gemset_b"]
141
+ end
142
+ end
143
+
144
+ context ".rvmrc_gems_install" do
145
+ it "should require a directory path argument" do
146
+ lambda{::Cuken::Api::Rvm.rvmrc_gems_install}.should raise_error(ArgumentError, /wrong number of arguments \(0 for 1\)/)
147
+ end
148
+ end
149
+
150
+ context ".rvmrc_gems_install when gem is not installed" do
151
+ it "should install gems added to rvm_install_gemspecs" do
152
+ FakeFS do
153
+ root_path = setup_rvmrc_gems_files(8)
154
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_a', '1.0.0']
155
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_b', '2.0.0']
156
+ mock(::RVM).use.with("ruby-1.9.2-p136").times(2){true}
157
+ #mock(::RVM).gemset.stub!.create.with(is_a(String)).times(9){true}
158
+ mock(::RVM).gemset.times(27).stub!.use!.with(is_a(String)).times(27){true}
159
+ # mock(::RVM).gemset_import.with(is_a(String)).times(8) { true }
160
+ #mock(::RVM).perform_set_operation.with(is_a(Symbol),is_a(String),is_a(String),is_a(String),is_a(String)).times(4){ stub!.stdout{ "some progress messages" } }
161
+ #mock(::RVM).perform_set_operation.with(is_a(Symbol),is_a(String),is_a(String),is_a(String),is_a(String)).times(4){ stub!.stdout{ "some progress messages" } }
162
+ mock(::RVM).ruby_eval.with(is_a(String)).times(27){ stub!.stdout{'false'}}
163
+ mock(::RVM).run.with(is_a(String)).times(27){ stub!.stdout{'false'}}
164
+ ::Cuken::Api::Rvm.rvmrc_gems_install(root_path).should be_true
165
+ end
166
+ end
167
+ end
168
+
169
+ context ".rvmrc_gems_install when gem is installed" do
170
+ it "should not install gems added to rvm_install_gemspecs" do
171
+ FakeFS do
172
+ root_path = setup_rvmrc_gems_files(8)
173
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_a', '1.0.0']
174
+ ::Cuken::Api::Rvm.rvm_install_gemspecs << ['gem_b', '2.0.0']
175
+ stub(::RVM).use.verbose.with(is_a(String))
176
+ #stub(::RVM).gemset.times(27).stub!.create.verbose.with(is_a(Array)).times(27){true}
177
+ stub(::RVM).gemset.times(27).stub!.use.verbose.with(is_a(String)).times(27){true}
178
+ # mock(::RVM).use.with(is_a(String)).times(1){true}
179
+ # mock(::RVM).gemset_import.with(is_a(String)).times(8) { true }
180
+ mock(::RVM).perform_set_operation.with(is_a(Symbol),is_a(String),is_a(String),is_a(String),is_a(String)).times(0){ stub!.stdout{ "some progress messages" } }
181
+ mock(::RVM).ruby_eval.with(is_a(String)).times(27){ stub!.stdout{'true'}}
182
+ ::Cuken::Api::Rvm.rvmrc_gems_install(root_path).should be_true
183
+ end
184
+ end
185
+ end
186
+
187
+ # context ".rvmrc_gemsets_install when gemset is not installed" do
188
+ # it "should install gemsets found in .rvmrc files" do
189
+ # FakeFS do
190
+ # root_path = setup_rvmrc_gems_files(8)
191
+ # mock(::RVM).use.with(is_a(String)).times(1){true}
192
+ # mock(::RVM).gemset_import.with(is_a(String)).times(8) { true }
193
+ # #mock(::RVM).perform_set_operation.with(is_a(Symbol),is_a(String),is_a(String),is_a(String),is_a(String)).times(3){ stub!.stdout{ "some progress messages" } }
194
+ # #mock(::RVM).ruby_eval.with(is_a(String)).times(3){ stub!.stdout{'false'}}
195
+ # ::Cuken::Api::Rvm.rvmrc_gems_install(root_path).should be_true
196
+ # end
197
+ # end
198
+ # end
199
+ #
200
+ # context ".rvmrc_gemsets_install" do
201
+ # it "should require a directory path argument" do
202
+ # lambda{::Cuken::Api::Rvm.rvmrc_gemsets_install}.should raise_error(ArgumentError, /wrong number of arguments \(0 for 1\)/)
203
+ # end
204
+ # end
205
+
206
+ describe ".rvm_steup" do
207
+ it "should require RVM and the libraries this API requires"
208
+ end
209
+
210
+ describe "_rvm_current_rubie_name" do
211
+ it "should return the rubie name without any gemset"
212
+ end
213
+ describe "#rvm_gem_available?(spec)" do
214
+ it "should expect gem name and version as an array"
215
+ it "should return true if the gem can be required"
216
+ end
217
+ end
218
+ end
219
+
220
+ #module B3
221
+ # module Bdd
222
+ # module Helpers
223
+ #
224
+ # end
225
+ # end
226
+ #end
227
+ #describe ::B3::Bdd::Helpers do
228
+ # context ".b3_setup" do
229
+ # it "should set the path to BigBlueButton's sources root" do
230
+ # ::B3::Bdd::Helpers.b3_setup.directory?.should be_true
231
+ # end
232
+ # it "should raise an error if the path to BigBlueButton's sources root does not exist" do
233
+ # FakeFS { lambda{ ::B3::Bdd::Helpers.b3_setup}.should raise_error(RuntimeError, /Could not find BigBlueButton's sources root./) }
234
+ # end
235
+ # end
236
+ #
237
+ # context ".b3_bdd_feature_sets(hsh)" do
238
+ # it "should return the subset of hash having feature sets" do
239
+ # hsh = ::B3::Bdd::Helpers.b3_bdd_feature_sets
240
+ # hsh.first.last.should have(3).items
241
+ # hsh.should be_kind_of(Hash)
242
+ # hsh.each do |k, v|
243
+ # k.should match /ruby/
244
+ # v.each{|elem| elem.key? :feature_set_name }
245
+ # end
246
+ # end
247
+ # end
248
+ #
249
+ # context ".b3_bdd_features_parser" do
250
+ # it "should accept an empty hash and return default set_profile" do
251
+ # hsh = ::B3::Bdd::Helpers.b3_bdd_features_parser
252
+ # hsh.keys.should == [:set_profile]
253
+ # hsh[:set_profile].keys.should == ["bbb_bdd_app", "bbb_bdd_sys_os", "bbb_bdd_meta_bdd"]
254
+ # hsh.each do |k, v|
255
+ # k.should match /ruby/
256
+ # v.each do |elem|
257
+ # elem.key?(:feature_set_name).should be_true
258
+ # elem.key?(:profiles).should be_true
259
+ # elem.value(:profiles).should == ["default"]
260
+ # end
261
+ # end
262
+ # end
263
+ # end
264
+ #
265
+ # context ".b3_bdd_run :feature" do
266
+ # it "should run all feature sets with default Cucumber profile" do
267
+ # mock(::RVM).use.with(is_a(String)).times(8){true}
268
+ # mock(::RVM).use_from_path!.with(is_a(String)).times(3){true}
269
+ # mock(::Open4).popen4.with(is_a(String)).times(3) { true }
270
+ # ::B3::Bdd::Helpers.b3_bdd_run(:feature,{}).should be_true
271
+ # end
272
+ # end
273
+ #
274
+ #end
@@ -0,0 +1,288 @@
1
+ require Pathname(__FILE__).ascend { |d| h=d+'spec_helper.rb'; break h if h.file? }
2
+
3
+
4
+ module ::Cuken::Api::Rvm
5
+ describe RvmrcProcessor do
6
+ before(:all) do
7
+ ::FakeFS.activate!
8
+ ::FakeFS::FileSystem.clear
9
+ @rvmrc_root = setup_rvmrc_gems_files(1)
10
+ @rvmrc_file = Dir.glob(@rvmrc_root + '/**' + '/.rvmrc')[-1]
11
+ end
12
+ before(:each) do
13
+ @rvmrc_processor= ::Cuken::Api::Rvm::RvmrcProcessor.new(@rvmrc_file)
14
+ end
15
+ after(:all) do
16
+ ::FakeFS.deactivate!
17
+ end
18
+ describe "#rvmrc_read" do
19
+ context "given the path to a .rvmrc file" do
20
+ it "should return the file contents" do
21
+ rvmrc_contents = @rvmrc_processor.rvmrc_read(@rvmrc_file)
22
+ rvmrc_contents.should be_true
23
+ end
24
+ end
25
+ context "given the path to folder with a .rvmrc file" do
26
+ it "should read the file contents and return true on success" do
27
+ rvmrc_contents = @rvmrc_processor.rvmrc_read(File.dirname(@rvmrc_file))
28
+ rvmrc_contents.should be_true
29
+ end
30
+ describe "#rvmrc" do
31
+ it "should return the contents of the .rvmrc file" do
32
+ @rvmrc_processor.rvmrc_read(@rvmrc_file)
33
+ @rvmrc_processor.rvmrc.size.should == 544
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ context "having read the .rvmrc file" do
40
+ before(:all) do
41
+ @rvmrc_processor = ::Cuken::Api::Rvm::RvmrcProcessor.new(@rvmrc_file)
42
+ end
43
+ describe "#rvmrc_ruby_name" do
44
+ it "should return the rubie name from the .rvmrc file" do
45
+ @rvmrc_processor.rvmrc_ruby_name.should == "ruby-1.9.2-p136"
46
+ end
47
+ end
48
+ describe "#rvmrc_gemset_name" do
49
+ it "should return the gemset name from the .rvmrc file" do
50
+ @rvmrc_processor.rvmrc_gemset_name.should == "1"
51
+ end
52
+ end
53
+ describe "#find_rvmrc_files" do
54
+ it "should return an array of .rvmrc file paths found beneath a root folder" do
55
+ @rvmrc_processor.find_rvmrc_files(@rvmrc_root).should == ["/path/to/dir/.rvmrc", "/path/to/dir/1/.rvmrc"]
56
+ end
57
+ end
58
+ describe "#find_rvmrc_paths" do
59
+ context "when given a folder path" do
60
+ it "should return an array of paths to .rvmrc files found beneath a root folder" do
61
+ @rvmrc_processor.find_rvmrc_paths(@rvmrc_root).should == ["/path/to/dir", "/path/to/dir/1"]
62
+ end
63
+ end
64
+ context "when given a file path" do
65
+ it "should return an array of paths to .rvmrc files found beneath a root folder" do
66
+ @rvmrc_processor.find_rvmrc_paths(@rvmrc_root+'/.rvmrc').should == ["/path/to/dir", "/path/to/dir/1"]
67
+ end
68
+ end
69
+ end
70
+ describe "#find_gems_files" do
71
+ it "should return an array of *.gems file paths found beneath a root folder" do
72
+ @rvmrc_processor.find_gems_files(@rvmrc_root).should == ["/path/to/dir/1/1.gems", "/path/to/dir/dir.gems"]
73
+ end
74
+ end
75
+ describe "#all_rubies_gemsets" do
76
+ context "when passed a folder path" do
77
+ it "should return a hash whose keys are rubies (in the .rvmrc files)" do
78
+ @rvmrc_processor.all_rubies_gemsets(@rvmrc_root).should be_kind_of(Hash)
79
+ @rvmrc_processor.all_rubies_gemsets(@rvmrc_root).keys.each {|k| k.should match /ruby/ }
80
+ end
81
+ it "should return a hash whose values are array of gemsets (in the .rvmrc files)" do
82
+ @rvmrc_processor.all_rubies_gemsets(@rvmrc_root).each do |k, v|
83
+ k.should match /ruby/
84
+ v.should be_kind_of(Array)
85
+ v.each do |elem|
86
+ elem.keys.should == [:ruby_alias, :gemset_alias, :gemset_name,:gemset_path]
87
+ end
88
+ end
89
+ end
90
+ it "should return RVM gemsets names that exist in the .rvmrc files" do
91
+ root_path = setup_rvmrc_gems_files(8)
92
+ res = @rvmrc_processor.all_rubies_gemsets(root_path)
93
+ res.should have(1).item
94
+ res.first.last.should have(9).items
95
+ res.first.last[0].keys.should == [:ruby_alias, :gemset_alias, :gemset_name, :gemset_path]
96
+ end
97
+ end
98
+ context "when not passed a folder path it uses the path passed to new and" do
99
+ it "should return a hash whose keys are rubies (in the .rvmrc files)" do
100
+ @rvmrc_processor.all_rubies_gemsets.should be_kind_of(Hash)
101
+ @rvmrc_processor.all_rubies_gemsets.keys.each {|k| k.should match /ruby/ }
102
+ end
103
+ it "should return a hash whose values are array of gemsets (in the .rvmrc files)" do
104
+ @rvmrc_processor.all_rubies_gemsets.each do |k, v|
105
+ k.should match /ruby/
106
+ v.should be_kind_of(Array)
107
+ v.each do |elem|
108
+ elem.keys.should == [:ruby_alias, :gemset_alias, :gemset_name,:gemset_path]
109
+ end
110
+ end
111
+ end
112
+ it "should return RVM gemsets names that exist in the .rvmrc files" do
113
+ res = @rvmrc_processor.all_rubies_gemsets
114
+ res.should have(1).item
115
+ res.first.last.should have(8).items
116
+ res.first.last[0].keys.should == [:ruby_alias, :gemset_alias, :gemset_name, :gemset_path]
117
+ end
118
+ end
119
+ end
120
+ describe "#all_gemsets" do
121
+ context "when passed a folder path" do
122
+ it "should return an Hash" do
123
+ @rvmrc_processor.all_gemsets(@rvmrc_root).should be_kind_of Hash
124
+ end
125
+ it "should use as keys the rubies found in .rvmrc files beneath a root folder" do
126
+ @rvmrc_processor.all_gemsets(@rvmrc_root).keys.should == ["ruby-1.9.2-p136"]
127
+ end
128
+ it "should return the alias and gemsets per ruby found in .rvmrc files beneath a root folder" do
129
+ @rvmrc_processor.all_gemsets(@rvmrc_root)["ruby-1.9.2-p136"].keys.should == [:ruby_alias, :gemsets]
130
+ end
131
+ end
132
+ context "when not passed a folder path" do
133
+ it "should return an Hash" do
134
+ @rvmrc_processor.all_gemsets.should be_kind_of Hash
135
+ end
136
+ it "should use as keys the rubies found in .rvmrc files beneath a root folder" do
137
+ @rvmrc_processor.all_gemsets.keys.should == ["ruby-1.9.2-p136"]
138
+ end
139
+ it "should return the alias and gemsets per ruby found in .rvmrc files beneath a root folder" do
140
+ @rvmrc_processor.all_gemsets["ruby-1.9.2-p136"].keys.should == [:ruby_alias, :gemsets]
141
+ end
142
+ end
143
+ end
144
+ describe "#all_rubies" do
145
+ it "should return an Array" do
146
+ @rvmrc_processor.all_rubies(@rvmrc_root).should be_kind_of Array
147
+ end
148
+ it "should return the rubies found in .rvmrc files beneath a root folder" do
149
+ @rvmrc_processor.all_rubies(@rvmrc_root).should == ["ruby-1.9.2-p136"]
150
+ end
151
+ end
152
+ describe "#each_ruby" do
153
+ it "should use each of the installed rubies" do
154
+ @rvmrc_processor.all_rubies(@rvmrc_root).each do |rubie|
155
+ mock(::RVM).use.with(rubie).times(1){true}.should be_true
156
+ end
157
+ @rvmrc_processor.each_ruby do |rubie|
158
+ true
159
+ end
160
+ end
161
+ it "should yield a block in the environment of each in the installed rubies" do
162
+ @rvmrc_processor.all_rubies(@rvmrc_root).each do |rubie|
163
+ mock(::RVM).use.with(rubie).times(1){true}.should be_true
164
+ return_value = @rvmrc_processor.each_ruby do |rubie|
165
+ raise unless match /ruby/
166
+ end
167
+ return_value.should==[rubie]
168
+ end
169
+ end
170
+ it "should return current Ruby string even if the given block raises in the environment of each in the installed rubies" do
171
+ @rvmrc_processor.all_rubies(@rvmrc_root).each do |rubie|
172
+ mock(::RVM).use.with(rubie).times(1){true}.should be_true
173
+ lambda {
174
+ return_value = @rvmrc_processor.each_ruby do |rubie|
175
+ raise if match /ruby/
176
+ end
177
+ return_value.should==[rubie]
178
+ }.should_not raise_error RuntimeError
179
+
180
+ end
181
+ end
182
+ end
183
+ describe "#create_gemsets" do
184
+ it "should create gemsets parsed from all .rvmrc files beneath a root folder" do
185
+ mock(::RVM).use.with(is_a(String)).times(1){true}
186
+ mock(::RVM).gemset.times(8).stub!.create.with(is_a(Array)).times(8){true}
187
+ @rvmrc_processor.create_gemsets
188
+ end
189
+ end
190
+
191
+ describe "gemspecs_to_install" do
192
+ it "should always install Bundler 1.0.10" do
193
+ @rvmrc_processor.gemspecs_to_install == [["bundler", "1.0.10"]]
194
+ end
195
+ it "should return an array of 2-element arrays with gem name and version" do
196
+ @rvmrc_processor.gemspecs_to_install << ['gem_a', '1.0.0']
197
+ @rvmrc_processor.gemspecs_to_install << ['gem_b', '2.0.0']
198
+ @rvmrc_processor.gemspecs_to_install == [["bundler", "1.0.10"], ["gem_a", "1.0.0"], ["gem_b", "2.0.0"]]
199
+ end
200
+ end
201
+
202
+ # Some subtle issue with this spec it fails whenthe whole file is run,
203
+ # but passes when run in isolation.
204
+ describe "#gems_install" do
205
+ it "should install gems from install_gemspecs_list into gemsets parsed from all .rvmrc files beneath a root folder" do
206
+ stub(@rvmrc_processor).install_gem.with(is_a(String),is_a(Array)).times(1){true}
207
+ @rvmrc_processor.gems_install
208
+ end
209
+ end
210
+ describe "#gem_install_options" do
211
+ it "should return the options string for Ruby's `gem install...` CLI" do
212
+ @rvmrc_processor.gem_install_options.should == "--no_ri --no_rdoc"
213
+ end
214
+ end
215
+ # Some subtle issue with this spec it fails whenthe whole file is run,
216
+ # but passes when run in isolation.
217
+ describe "#install_gem(rubie, spec)" do
218
+ context "when the gem is not installed" do
219
+ # Some subtle issue with this spec it fails whenthe whole file is run,
220
+ # but passes when run in isolation.
221
+ it "should install given gem into all ruby+gemsets parsed from .rvmrc files beneath a root folder" do
222
+ #mock(::RVM).use.with(is_a(String)).times(1){true}
223
+ stub(@rvmrc_processor).gem_available?.with(is_a(Array)).times(1){false}
224
+ mock(::RVM).gemset.times(1).stub!.use.with(is_a(String)).times(1){true}
225
+ mock(::RVM).run.with(is_a(String)).times(1){true}
226
+ @rvmrc_processor.install_gem("ruby-1.9.2-p136",["bundler", "1.0.10"])
227
+ end
228
+ end
229
+ context "when the gem is installed" do
230
+ it "should not install given gem into all ruby+gemsets parsed from .rvmrc files beneath a root folder" do
231
+ #mock(::RVM).use.with(is_a(String)).times(1){true}
232
+ stub(@rvmrc_processor).gem_available?.with(is_a(Array)).times(8){true}
233
+ mock(::RVM).gemset.times(0).stub!.use.with(is_a(String)).times(0){true}
234
+ mock(::RVM).run.with(is_a(String)).times(0){true}
235
+ @rvmrc_processor.install_gem("ruby-1.9.2-p136",["bundler", "1.0.10"])
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "#current_ruby_info" do
241
+ it "should return the parsed .rvmrc info for the current ruby" do
242
+ @rvmrc_processor.current_ruby_info('ruby-1.9.2-p136').each do |hsh|
243
+ hsh.keys.should == [:ruby_alias, :gemset_alias, :gemset_name, :gemset_path]
244
+ end
245
+ end
246
+ end
247
+
248
+ describe "#setup_rubies " do
249
+ it "should raise an error if RVM's install root does not exist" do
250
+ lambda{ ::Cuken::Api::Rvm::RvmrcProcessor.new('/junk') }.should raise_error(Errno::ENOENT, /No such file or directory/)
251
+ end
252
+ context "when RVM ruby exists " do
253
+ it "should not install a Ruby listed in the .rvmrc files" do
254
+ rvm_now=(`rvm current`)[/(.*)@/,1]
255
+ mock(::RVM).list_strings.times(1).stub!.include?.with(is_a(String)).times(1){true}
256
+ mock(::RVM).alias_create.with(/cuken_/,is_a(String)).times(1) { true }
257
+ stub(@rvmrc_processor).install_rubie.with(is_a(String)).times(0){true}
258
+ @rvmrc_processor.setup_rubies.should have(1).item
259
+ end
260
+ end
261
+ context "when RVM ruby does not exist " do
262
+ it "should install a Ruby listed in the .rvmrc files" do
263
+ rvm_now=(`rvm current`)[/(.*)@/,1]
264
+ mock(::RVM).list_strings.times(1).stub!.include?.with(is_a(String)).times(1){false}
265
+ mock(::RVM).alias_create.with(/cuken_/,is_a(String)).times(1) { true }
266
+ stub(@rvmrc_processor).install_rubie.with(is_a(String)).times(1){true}
267
+ @rvmrc_processor.setup_rubies.should have(1).item
268
+ end
269
+ end
270
+ end
271
+ describe "#rvm_path" do
272
+ it "should return a Pathname of the rvm_path environment variable" do
273
+ ::FakeFS.deactivate!
274
+ @rvmrc_processor.rvm_path.should be_kind_of Pathname
275
+ ::FakeFS.activate!
276
+ end
277
+ it "should return the path to RVM's install root if it exists" do
278
+ ::FakeFS.deactivate!
279
+ @rvmrc_processor.rvm_path.directory?.should be_true
280
+ ::FakeFS.activate!
281
+ end
282
+ it "should raise an error if RVM's install root does not exist" do
283
+ FakeFS { lambda{ @rvmrc_processor.rvm_path}.should raise_error(RuntimeError, /Could not find RVM's .rvm folder/) }
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end