berkshelf 0.3.3 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Guardfile +1 -1
- data/features/install.feature +129 -2
- data/features/lockfile.feature +1 -1
- data/features/step_definitions/filesystem_steps.rb +12 -0
- data/features/update.feature +1 -1
- data/features/upload_command.feature +1 -1
- data/lib/berkshelf/berksfile.rb +4 -1
- data/lib/berkshelf/cached_cookbook.rb +36 -9
- data/lib/berkshelf/cli.rb +2 -2
- data/lib/berkshelf/cookbook_source.rb +26 -63
- data/lib/berkshelf/cookbook_source/git_location.rb +21 -10
- data/lib/berkshelf/cookbook_source/location.rb +50 -0
- data/lib/berkshelf/cookbook_source/path_location.rb +13 -5
- data/lib/berkshelf/cookbook_source/site_location.rb +14 -4
- data/lib/berkshelf/cookbook_store.rb +34 -16
- data/lib/berkshelf/core_ext/string.rb +12 -0
- data/lib/berkshelf/downloader.rb +0 -4
- data/lib/berkshelf/errors.rb +41 -1
- data/lib/berkshelf/git.rb +83 -14
- data/lib/berkshelf/resolver.rb +85 -66
- data/lib/berkshelf/version.rb +1 -1
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +1 -0
- data/spec/fixtures/cookbooks/example_metadata_name/metadata.rb +2 -0
- data/spec/fixtures/cookbooks/example_metadata_no_name/metadata.rb +1 -0
- data/spec/fixtures/cookbooks/example_no_metadata/recipes/default.rb +1 -0
- data/spec/support/chef_api.rb +42 -0
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +55 -11
- data/spec/unit/berkshelf/cookbook_source/git_location_spec.rb +65 -15
- data/spec/unit/berkshelf/cookbook_source/location_spec.rb +42 -0
- data/spec/unit/berkshelf/cookbook_source/path_location_spec.rb +22 -5
- data/spec/unit/berkshelf/cookbook_source/site_location_spec.rb +32 -13
- data/spec/unit/berkshelf/cookbook_source_spec.rb +24 -33
- data/spec/unit/berkshelf/cookbook_store_spec.rb +47 -7
- data/spec/unit/berkshelf/git_spec.rb +97 -12
- data/spec/unit/berkshelf/resolver_spec.rb +72 -48
- data/spec/unit/berkshelf/uploader_spec.rb +12 -4
- metadata +13 -7
- data/spec/fixtures/cookbooks/invalid_ruby_files-1.0.0/recipes/default.rb +0 -1
- data/spec/fixtures/cookbooks/invalid_template_files-1.0.0/templates/default/broken.erb +0 -1
@@ -0,0 +1,42 @@
|
|
1
|
+
module Berkshelf
|
2
|
+
describe CookbookSource::Location do
|
3
|
+
let(:name) { "nginx" }
|
4
|
+
let(:constraint) { double('constraint') }
|
5
|
+
|
6
|
+
subject do
|
7
|
+
Class.new do
|
8
|
+
include CookbookSource::Location
|
9
|
+
end.new(name, constraint)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "sets the downloaded? state to false" do
|
13
|
+
subject.downloaded?.should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#download" do
|
17
|
+
it "raises a NotImplementedError if not overridden" do
|
18
|
+
lambda {
|
19
|
+
subject.download(double('destination'))
|
20
|
+
}.should raise_error(NotImplementedError)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#validate_cached" do
|
25
|
+
let(:cached) { double('cached-cb', version: "0.1.0") }
|
26
|
+
|
27
|
+
it "raises a ConstraintNotSatisfied error if the version constraint does not satisfy the cached version" do
|
28
|
+
constraint.should_receive(:include?).with(cached.version).and_return(false)
|
29
|
+
|
30
|
+
lambda {
|
31
|
+
subject.validate_cached(cached)
|
32
|
+
}.should raise_error(ConstraintNotSatisfied)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns true if the version constraint satisfies the cached version" do
|
36
|
+
constraint.should_receive(:include?).with(cached.version).and_return(true)
|
37
|
+
|
38
|
+
subject.validate_cached(cached).should be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -2,16 +2,23 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Berkshelf
|
4
4
|
describe CookbookSource::PathLocation do
|
5
|
+
let(:complacent_constraint) { double('comp-vconstraint', include?: true) }
|
5
6
|
let(:path) { fixtures_path.join("cookbooks", "example_cookbook").to_s }
|
6
|
-
subject { CookbookSource::PathLocation.new("nginx", :
|
7
|
+
subject { CookbookSource::PathLocation.new("nginx", complacent_constraint, path: path) }
|
7
8
|
|
8
9
|
describe "#download" do
|
9
|
-
it "returns
|
10
|
-
subject.download(tmp_path).should
|
10
|
+
it "returns an instance of CachedCookbook" do
|
11
|
+
subject.download(tmp_path).should be_a(CachedCookbook)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets the downloaded status to true" do
|
15
|
+
subject.download(tmp_path)
|
16
|
+
|
17
|
+
subject.should be_downloaded
|
11
18
|
end
|
12
19
|
|
13
20
|
context "given a path that does not exist" do
|
14
|
-
subject { CookbookSource::PathLocation.new("doesnot_exist", :
|
21
|
+
subject { CookbookSource::PathLocation.new("doesnot_exist", complacent_constraint, path: tmp_path.join("doesntexist_noway")) }
|
15
22
|
|
16
23
|
it "raises a CookbookNotFound error" do
|
17
24
|
lambda {
|
@@ -21,7 +28,7 @@ module Berkshelf
|
|
21
28
|
end
|
22
29
|
|
23
30
|
context "given a path that does not contain a cookbook" do
|
24
|
-
subject { CookbookSource::PathLocation.new("doesnot_exist", :
|
31
|
+
subject { CookbookSource::PathLocation.new("doesnot_exist", complacent_constraint, path: fixtures_path) }
|
25
32
|
|
26
33
|
it "raises a CookbookNotFound error" do
|
27
34
|
lambda {
|
@@ -29,6 +36,16 @@ module Berkshelf
|
|
29
36
|
}.should raise_error(CookbookNotFound)
|
30
37
|
end
|
31
38
|
end
|
39
|
+
|
40
|
+
context "given the content at path does not satisfy the version constraint" do
|
41
|
+
subject { CookbookSource::PathLocation.new("nginx", double('constraint', include?: false), path: path) }
|
42
|
+
|
43
|
+
it "raises a ConstraintNotSatisfied error" do
|
44
|
+
lambda {
|
45
|
+
subject.download(double('path'))
|
46
|
+
}.should raise_error(ConstraintNotSatisfied)
|
47
|
+
end
|
48
|
+
end
|
32
49
|
end
|
33
50
|
end
|
34
51
|
end
|
@@ -3,8 +3,8 @@ require 'spec_helper'
|
|
3
3
|
module Berkshelf
|
4
4
|
describe CookbookSource::SiteLocation do
|
5
5
|
describe "ClassMethods" do
|
6
|
-
subject { CookbookSource::SiteLocation }
|
7
6
|
let(:constraint) { DepSelector::VersionConstraint.new("~> 0.101.2") }
|
7
|
+
subject { CookbookSource::SiteLocation }
|
8
8
|
let(:versions) do
|
9
9
|
{
|
10
10
|
DepSelector::Version.new("0.101.2") => "http://cookbooks.opscode.com/api/v1/cookbooks/nginx/versions/0_101_2",
|
@@ -39,19 +39,28 @@ module Berkshelf
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
let(:complacent_constraint) { double('comp-vconstraint', include?: true) }
|
43
|
+
subject { CookbookSource::SiteLocation.new("nginx", complacent_constraint) }
|
43
44
|
|
44
45
|
describe "#download" do
|
45
|
-
it "returns
|
46
|
+
it "returns a CachedCookbook" do
|
46
47
|
result = subject.download(tmp_path)
|
47
48
|
name = subject.name
|
48
49
|
ver, uri = subject.latest_version
|
49
50
|
|
50
|
-
result.should
|
51
|
+
result.should be_a(CachedCookbook)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "sets the downloaded status to true" do
|
55
|
+
subject.download(tmp_path)
|
56
|
+
|
57
|
+
subject.should be_downloaded
|
51
58
|
end
|
52
59
|
|
53
|
-
context "
|
54
|
-
|
60
|
+
context "given a wildcard '>= 0.0.0' version constraint is specified" do
|
61
|
+
subject { CookbookSource::SiteLocation.new("nginx", DepSelector::VersionConstraint.new(">= 0.0.0")) }
|
62
|
+
|
63
|
+
it "downloads the latest version of the cookbook to the given destination" do
|
55
64
|
subject.download(tmp_path)
|
56
65
|
name = subject.name
|
57
66
|
ver, uri = subject.latest_version
|
@@ -64,8 +73,8 @@ module Berkshelf
|
|
64
73
|
end
|
65
74
|
end
|
66
75
|
|
67
|
-
context "given an
|
68
|
-
subject { CookbookSource::SiteLocation.new("nginx",
|
76
|
+
context "given an exact match version constraint" do
|
77
|
+
subject { CookbookSource::SiteLocation.new("nginx", DepSelector::VersionConstraint.new("= 0.101.2")) }
|
69
78
|
|
70
79
|
it "downloads the cookbook with the version matching the version_constraint to the given destination" do
|
71
80
|
subject.download(tmp_path)
|
@@ -79,8 +88,8 @@ module Berkshelf
|
|
79
88
|
end
|
80
89
|
end
|
81
90
|
|
82
|
-
context "given a more broad
|
83
|
-
subject { CookbookSource::SiteLocation.new("nginx",
|
91
|
+
context "given a more broad version constraint" do
|
92
|
+
subject { CookbookSource::SiteLocation.new("nginx", DepSelector::VersionConstraint.new("~> 0.99.0")) }
|
84
93
|
|
85
94
|
it "downloads the best matching cookbook version for the constraint to the given destination" do
|
86
95
|
subject.download(tmp_path)
|
@@ -95,7 +104,12 @@ module Berkshelf
|
|
95
104
|
end
|
96
105
|
|
97
106
|
context "given an explicit :site location key" do
|
98
|
-
subject
|
107
|
+
subject do
|
108
|
+
CookbookSource::SiteLocation.new("nginx",
|
109
|
+
complacent_constraint,
|
110
|
+
site: "http://cookbooks.opscode.com/api/v1/cookbooks"
|
111
|
+
)
|
112
|
+
end
|
99
113
|
|
100
114
|
it "downloads the cookbook to the given destination" do
|
101
115
|
subject.download(tmp_path)
|
@@ -111,12 +125,17 @@ module Berkshelf
|
|
111
125
|
end
|
112
126
|
|
113
127
|
context "given a cookbook that does not exist on the specified site" do
|
114
|
-
subject
|
128
|
+
subject do
|
129
|
+
CookbookSource::SiteLocation.new("nowaythis_exists",
|
130
|
+
complacent_constraint,
|
131
|
+
site: "http://cookbooks.opscode.com/api/v1/cookbooks"
|
132
|
+
)
|
133
|
+
end
|
115
134
|
|
116
135
|
it "raises a CookbookNotFound error" do
|
117
136
|
lambda {
|
118
137
|
subject.download(tmp_path)
|
119
|
-
|
138
|
+
}.should raise_error(CookbookNotFound)
|
120
139
|
end
|
121
140
|
end
|
122
141
|
end
|
@@ -45,15 +45,26 @@ module Berkshelf
|
|
45
45
|
end
|
46
46
|
|
47
47
|
context "given a location key :path" do
|
48
|
-
|
49
|
-
|
48
|
+
context "given a value for path that contains a cookbook" do
|
49
|
+
let(:path) { fixtures_path.join("cookbooks", "example_cookbook").to_s }
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
it "initializes a PathLocation for location" do
|
52
|
+
subject.new(cookbook_name, path: path).location.should be_a(subject::PathLocation)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "points to the specified path" do
|
56
|
+
subject.new(cookbook_name, path: path).location.path.should eql(path)
|
57
|
+
end
|
53
58
|
end
|
54
59
|
|
55
|
-
|
56
|
-
|
60
|
+
context "given a value for path that does not contain a cookbook" do
|
61
|
+
let(:path) { "/does/not/exist" }
|
62
|
+
|
63
|
+
it "rasies Berkshelf::CookbookNotFound" do
|
64
|
+
lambda {
|
65
|
+
subject.new(cookbook_name, path: path)
|
66
|
+
}.should raise_error(Berkshelf::CookbookNotFound)
|
67
|
+
end
|
57
68
|
end
|
58
69
|
end
|
59
70
|
|
@@ -133,16 +144,10 @@ module Berkshelf
|
|
133
144
|
|
134
145
|
describe "#download" do
|
135
146
|
context "when download is successful" do
|
136
|
-
it "
|
147
|
+
it "sets a CachedCookbook to the cached_cookbook attr" do
|
137
148
|
subject.download(tmp_path)
|
138
149
|
|
139
|
-
subject.
|
140
|
-
end
|
141
|
-
|
142
|
-
it "writes a value to local_version" do
|
143
|
-
subject.download(tmp_path)
|
144
|
-
|
145
|
-
subject.local_version.should_not be_nil
|
150
|
+
subject.cached_cookbook.should be_a(Berkshelf::CachedCookbook)
|
146
151
|
end
|
147
152
|
|
148
153
|
it "returns an array containing the symbol :ok and the local_path" do
|
@@ -150,7 +155,7 @@ module Berkshelf
|
|
150
155
|
|
151
156
|
result.should be_a(Array)
|
152
157
|
result[0].should eql(:ok)
|
153
|
-
result[1].should eql(subject.
|
158
|
+
result[1].should eql(subject.cached_cookbook)
|
154
159
|
end
|
155
160
|
end
|
156
161
|
|
@@ -168,26 +173,12 @@ module Berkshelf
|
|
168
173
|
end
|
169
174
|
end
|
170
175
|
|
171
|
-
describe "#metadata" do
|
172
|
-
it "should return the metadata of a CookbookSource that has been downloaded" do
|
173
|
-
subject.download(tmp_path)
|
174
|
-
|
175
|
-
subject.metadata.should be_a(Chef::Cookbook::Metadata)
|
176
|
-
end
|
177
|
-
|
178
|
-
it "should return nil if the CookbookSource has not been downloaded" do
|
179
|
-
subject.metadata.should be_nil
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
176
|
describe "#downloaded?" do
|
184
|
-
|
185
|
-
subject { CookbookSource.new("example_cookbook", :path => path) }
|
186
|
-
|
187
|
-
it "returns true if the local_path has been set" do
|
188
|
-
subject.stub(:local_path) { path }
|
177
|
+
subject{ CookbookSource.new("nginx", ">= 1.0.1") }
|
189
178
|
|
190
|
-
|
179
|
+
it "delegates the message ':downloaded?' to the location" do
|
180
|
+
subject.location.should_receive(:downloaded?)
|
181
|
+
subject.downloaded?
|
191
182
|
end
|
192
183
|
end
|
193
184
|
end
|
@@ -34,15 +34,42 @@ module Berkshelf
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
describe "#
|
38
|
-
|
39
|
-
|
37
|
+
describe "#satisfy" do
|
38
|
+
let(:name) { "nginx" }
|
39
|
+
let(:version) { DepSelector::Version.new("0.101.4") }
|
40
|
+
let(:constraint) { DepSelector::VersionConstraint.new("~> 0.101.2") }
|
41
|
+
let(:cached_cb) { double('cached-cb', name: name, version: version) }
|
42
|
+
let(:cached_two) { double('cached-two', name: "mysql", version: DepSelector::Version.new("1.2.6")) }
|
43
|
+
|
44
|
+
before(:each) do
|
45
|
+
subject.stub(:cookbooks).and_return([cached_cb, cached_two])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "gets and returns the the CachedCookbook best matching the name and constraint" do
|
49
|
+
subject.should_receive(:cookbook).with(name, version).and_return(cached_cb)
|
40
50
|
|
41
|
-
subject.
|
51
|
+
subject.satisfy(name, constraint).should eql(cached_cb)
|
42
52
|
end
|
43
53
|
|
44
|
-
|
45
|
-
subject.
|
54
|
+
context "when there are no cookbooks in the cookbook store" do
|
55
|
+
before(:each) { subject.stub(:cookbooks).and_return([]) }
|
56
|
+
|
57
|
+
it "returns nil" do
|
58
|
+
subject.satisfy(name, constraint).should be_nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when there is no matching cookbook for the given name and constraint" do
|
63
|
+
let(:version) { DepSelector::Version.new("1.0.0") }
|
64
|
+
let(:constraint) { DepSelector::VersionConstraint.new("= 0.0.1") }
|
65
|
+
|
66
|
+
before(:each) do
|
67
|
+
subject.stub(:cookbooks).and_return([ double('badcache', name: 'none', version: version) ])
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns nil if there is no matching cookbook for the name and constraint" do
|
71
|
+
subject.satisfy(name, constraint).should be_nil
|
72
|
+
end
|
46
73
|
end
|
47
74
|
end
|
48
75
|
|
@@ -59,13 +86,26 @@ module Berkshelf
|
|
59
86
|
end
|
60
87
|
|
61
88
|
describe "#cookbooks" do
|
62
|
-
|
89
|
+
before(:each) do
|
63
90
|
CookbookSource.new("nginx", "0.101.2").download(subject.storage_path)
|
91
|
+
CookbookSource.new("mysql", "1.2.6").download(subject.storage_path)
|
92
|
+
end
|
64
93
|
|
94
|
+
it "returns a list of CachedCookbooks" do
|
65
95
|
subject.cookbooks.each do |cb|
|
66
96
|
cb.should be_a(CachedCookbook)
|
67
97
|
end
|
68
98
|
end
|
99
|
+
|
100
|
+
it "return an instance of CachedCookbook for every downloaded cookbook" do
|
101
|
+
subject.cookbooks.should have(2).items
|
102
|
+
end
|
103
|
+
|
104
|
+
context "given a value for the filter parameter" do
|
105
|
+
it "returns only the CachedCookbooks whose name match the filter" do
|
106
|
+
subject.cookbooks("mysql").should have(1).item
|
107
|
+
end
|
108
|
+
end
|
69
109
|
end
|
70
110
|
end
|
71
111
|
end
|
@@ -5,24 +5,21 @@ module Berkshelf
|
|
5
5
|
describe "ClassMethods" do
|
6
6
|
subject { Git }
|
7
7
|
|
8
|
-
describe "
|
8
|
+
describe "::find_git" do
|
9
9
|
it "should find git" do
|
10
10
|
subject.find_git.should_not be_nil
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should raise if it can't find git" do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
ensure
|
20
|
-
ENV["PATH"] = path
|
21
|
-
end
|
14
|
+
ENV.should_receive(:[]).with("PATH").and_return(String.new)
|
15
|
+
|
16
|
+
lambda {
|
17
|
+
subject.find_git
|
18
|
+
}.should raise_error(GitNotFound)
|
22
19
|
end
|
23
20
|
end
|
24
21
|
|
25
|
-
describe "
|
22
|
+
describe "::clone" do
|
26
23
|
let(:target) { tmp_path.join("nginx") }
|
27
24
|
|
28
25
|
it "clones the repository to the target path" do
|
@@ -33,7 +30,7 @@ module Berkshelf
|
|
33
30
|
end
|
34
31
|
end
|
35
32
|
|
36
|
-
describe "
|
33
|
+
describe "::checkout" do
|
37
34
|
let(:repo_path) { tmp_path.join("nginx") }
|
38
35
|
let(:repo) { subject.clone("git://github.com/opscode-cookbooks/nginx.git", repo_path) }
|
39
36
|
let(:tag) { "0.101.2" }
|
@@ -47,7 +44,7 @@ module Berkshelf
|
|
47
44
|
end
|
48
45
|
end
|
49
46
|
|
50
|
-
describe "
|
47
|
+
describe "::rev_parse" do
|
51
48
|
let(:repo_path) { tmp_path.join("nginx") }
|
52
49
|
before(:each) do
|
53
50
|
subject.clone("git://github.com/opscode-cookbooks/nginx.git", repo_path)
|
@@ -58,6 +55,94 @@ module Berkshelf
|
|
58
55
|
subject.rev_parse(repo_path).should eql("0e4887d9eef8cb83972f974a85890983c8204c3b")
|
59
56
|
end
|
60
57
|
end
|
58
|
+
|
59
|
+
let(:readonly_uri) { "git://github.com/reset/thor-foodcritic.git" }
|
60
|
+
let(:https_uri) { "https://github.com/reset/solve.git" }
|
61
|
+
let(:ssh_uri) { "git@github.com:reset/solve.git" }
|
62
|
+
let(:http_uri) { "http://github.com/reset/solve.git" }
|
63
|
+
let(:invalid_uri) { "/something/on/disk" }
|
64
|
+
|
65
|
+
describe "::validate_uri" do
|
66
|
+
context "given a valid Git read-only URI" do
|
67
|
+
it "returns true" do
|
68
|
+
subject.validate_uri(readonly_uri)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "given a valid Git HTTPS URI" do
|
73
|
+
it "returns true" do
|
74
|
+
subject.validate_uri(https_uri)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "given a valid Git SSH URI" do
|
79
|
+
it "returns true" do
|
80
|
+
subject.validate_uri(ssh_uri)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "given an invalid URI" do
|
85
|
+
it "returns false" do
|
86
|
+
subject.validate_uri(invalid_uri)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "given a HTTP URI" do
|
91
|
+
it "returns false" do
|
92
|
+
subject.validate_uri(http_uri)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "given an integer" do
|
97
|
+
it "returns false" do
|
98
|
+
subject.validate_uri(123)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "::validate_uri!" do
|
104
|
+
context "given a valid Git read-only URI" do
|
105
|
+
it "returns true" do
|
106
|
+
subject.validate_uri!(readonly_uri)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "given a valid Git HTTPS URI" do
|
111
|
+
it "returns true" do
|
112
|
+
subject.validate_uri!(https_uri)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "given a valid Git SSH URI" do
|
117
|
+
it "returns true" do
|
118
|
+
subject.validate_uri!(ssh_uri)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "given an invalid URI" do
|
123
|
+
it "raises InvalidGitURI" do
|
124
|
+
lambda {
|
125
|
+
subject.validate_uri!(invalid_uri)
|
126
|
+
}.should raise_error(InvalidGitURI)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "given a HTTP URI" do
|
131
|
+
it "raises InvalidGitURI" do
|
132
|
+
lambda {
|
133
|
+
subject.validate_uri!(http_uri)
|
134
|
+
}.should raise_error(InvalidGitURI)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "given an integer" do
|
139
|
+
it "raises InvalidGitURI" do
|
140
|
+
lambda {
|
141
|
+
subject.validate_uri!(123)
|
142
|
+
}.should raise_error(InvalidGitURI)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
61
146
|
end
|
62
147
|
end
|
63
148
|
end
|