cookbook-omnifetch 0.8.0 → 0.8.1
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.
- checksums.yaml +5 -5
- data/lib/cookbook-omnifetch.rb +2 -2
- data/lib/cookbook-omnifetch/metadata_based_installer.rb +1 -1
- data/lib/cookbook-omnifetch/version.rb +1 -1
- metadata +15 -57
- data/.gitignore +0 -23
- data/.rspec +0 -1
- data/.travis.yml +0 -11
- data/Gemfile +0 -8
- data/README.md +0 -90
- data/Rakefile +0 -19
- data/cookbook-omnifetch.gemspec +0 -39
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb +0 -8
- data/spec/fixtures/cookbooks/example_cookbook/.gitignore +0 -2
- data/spec/fixtures/cookbooks/example_cookbook/.kitchen.yml +0 -26
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile +0 -1
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/recipes/default.rb +0 -8
- data/spec/spec_helper.rb +0 -43
- data/spec/unit/artifactory_spec.rb +0 -64
- data/spec/unit/artifactserver_spec.rb +0 -116
- data/spec/unit/base_spec.rb +0 -87
- data/spec/unit/chef_server_artifact_spec.rb +0 -110
- data/spec/unit/chef_server_spec.rb +0 -108
- data/spec/unit/exceptions_spec.rb +0 -87
- data/spec/unit/git_spec.rb +0 -290
- data/spec/unit/metadata_based_installer_spec.rb +0 -137
- data/spec/unit/path_spec.rb +0 -119
@@ -1,87 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "cookbook-omnifetch/exceptions"
|
3
|
-
|
4
|
-
module CookbookOmnifetch
|
5
|
-
describe "Exceptions" do
|
6
|
-
|
7
|
-
describe NotACookbook do
|
8
|
-
|
9
|
-
subject(:exception) do
|
10
|
-
described_class.new("/path/to/cookbook")
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:message) do
|
14
|
-
"The resource at '/path/to/cookbook' does not appear to be a valid cookbook. Does it have a metadata.rb?"
|
15
|
-
end
|
16
|
-
|
17
|
-
it "creates an informative error in #message" do
|
18
|
-
expect(exception.message).to eq(message)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "creates an informative error in #to_s" do
|
22
|
-
expect(exception.to_s).to eq(message)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
describe CookbookValidationFailure do
|
28
|
-
|
29
|
-
let(:dependency) { instance_double("ChefDK::Policyfile::CookbookLocationSpecification", to_s: "apt ~> 1.2.3") }
|
30
|
-
|
31
|
-
# The exception class itself doesn't use this
|
32
|
-
let(:cached_cookbook) { Object.new }
|
33
|
-
|
34
|
-
subject(:exception) do
|
35
|
-
described_class.new(dependency, cached_cookbook)
|
36
|
-
end
|
37
|
-
|
38
|
-
let(:message) do
|
39
|
-
"The cookbook downloaded for apt ~> 1.2.3 did not satisfy the constraint."
|
40
|
-
end
|
41
|
-
|
42
|
-
it "creates an informative error in #message" do
|
43
|
-
expect(exception.message).to eq(message)
|
44
|
-
end
|
45
|
-
|
46
|
-
it "creates an informative error in #to_s" do
|
47
|
-
expect(exception.to_s).to eq(message)
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
describe MismatchedCookbookName do
|
53
|
-
|
54
|
-
let(:dependency) { instance_double("ChefDK::Policyfile::CookbookLocationSpecification", name: "apt") }
|
55
|
-
|
56
|
-
let(:cached_cookbook) { instance_double("Chef::Cookbook", cookbook_name: "apt") }
|
57
|
-
|
58
|
-
subject(:exception) do
|
59
|
-
described_class.new(dependency, cached_cookbook)
|
60
|
-
end
|
61
|
-
|
62
|
-
let(:message) do
|
63
|
-
<<-EOM
|
64
|
-
In your Berksfile, you have:
|
65
|
-
|
66
|
-
cookbook 'apt'
|
67
|
-
|
68
|
-
But that cookbook is actually named 'apt'
|
69
|
-
|
70
|
-
This can cause potentially unwanted side-effects in the future.
|
71
|
-
|
72
|
-
NOTE: If you do not explicitly set the 'name' attribute in the metadata, the name of the directory will be used instead. This is often a cause of confusion for dependency solving.
|
73
|
-
EOM
|
74
|
-
end
|
75
|
-
|
76
|
-
it "creates an informative error in #message" do
|
77
|
-
expect(exception.message).to eq(message)
|
78
|
-
end
|
79
|
-
|
80
|
-
it "creates an informative error in #to_s" do
|
81
|
-
expect(exception.to_s).to eq(message)
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
data/spec/unit/git_spec.rb
DELETED
@@ -1,290 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "cookbook-omnifetch/git"
|
3
|
-
|
4
|
-
module CookbookOmnifetch
|
5
|
-
describe GitLocation do
|
6
|
-
let(:dependency) { double(name: "bacon") }
|
7
|
-
|
8
|
-
subject do
|
9
|
-
described_class.new(dependency, git: "https://repo.com", branch: "ham",
|
10
|
-
tag: "v1.2.3", ref: "abc123", revision: "defjkl123456", rel: "hi")
|
11
|
-
end
|
12
|
-
|
13
|
-
describe ".initialize" do
|
14
|
-
it "sets the uri" do
|
15
|
-
instance = described_class.new(dependency, git: "https://repo.com")
|
16
|
-
expect(instance.uri).to eq("https://repo.com")
|
17
|
-
end
|
18
|
-
|
19
|
-
it "sets the branch" do
|
20
|
-
instance = described_class.new(dependency,
|
21
|
-
git: "https://repo.com", branch: "magic_new_feature")
|
22
|
-
expect(instance.branch).to eq("magic_new_feature")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "sets the tag" do
|
26
|
-
instance = described_class.new(dependency,
|
27
|
-
git: "https://repo.com", tag: "v1.2.3")
|
28
|
-
expect(instance.tag).to eq("v1.2.3")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "adds the ref" do
|
32
|
-
instance = described_class.new(dependency,
|
33
|
-
git: "https://repo.com", ref: "abc123")
|
34
|
-
expect(instance.ref).to eq("abc123")
|
35
|
-
end
|
36
|
-
|
37
|
-
it "sets the revision" do
|
38
|
-
instance = described_class.new(dependency,
|
39
|
-
git: "https://repo.com", revision: "abcde12345")
|
40
|
-
expect(instance.revision).to eq("abcde12345")
|
41
|
-
end
|
42
|
-
|
43
|
-
it "sets the rel" do
|
44
|
-
instance = described_class.new(dependency,
|
45
|
-
git: "https://repo.com", rel: "internal/path")
|
46
|
-
expect(instance.rel).to eq("internal/path")
|
47
|
-
end
|
48
|
-
|
49
|
-
context "rev_parse" do
|
50
|
-
def rev_parse(instance)
|
51
|
-
instance.instance_variable_get(:@rev_parse)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "uses the :ref option with priority" do
|
55
|
-
instance = described_class.new(dependency,
|
56
|
-
git: "https://repo.com", ref: "abc123", branch: "magic_new_feature")
|
57
|
-
expect(rev_parse(instance)).to eq("abc123")
|
58
|
-
end
|
59
|
-
|
60
|
-
it "uses the :branch option with priority" do
|
61
|
-
instance = described_class.new(dependency,
|
62
|
-
git: "https://repo.com", branch: "magic_new_feature", tag: "v1.2.3")
|
63
|
-
expect(rev_parse(instance)).to eq("magic_new_feature")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "uses the :tag option" do
|
67
|
-
instance = described_class.new(dependency,
|
68
|
-
git: "https://repo.com", tag: "v1.2.3")
|
69
|
-
expect(rev_parse(instance)).to eq("v1.2.3")
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'uses "master" when none is given' do
|
73
|
-
instance = described_class.new(dependency, git: "https://repo.com")
|
74
|
-
expect(rev_parse(instance)).to eq("master")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "#cache_key" do
|
80
|
-
|
81
|
-
it "concatenates the name and revision" do
|
82
|
-
subject.stub(:revision).and_return("abcdef123456")
|
83
|
-
expect(subject.cache_key).to eq("bacon-abcdef123456")
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe "#installed?" do
|
88
|
-
it "returns false when there is no revision" do
|
89
|
-
subject.stub(:revision).and_return(nil)
|
90
|
-
expect(subject.installed?).to be false
|
91
|
-
end
|
92
|
-
|
93
|
-
it "returns false when the install_path does not exist" do
|
94
|
-
subject.stub(:revision).and_return("abcd1234")
|
95
|
-
subject.stub(:install_path).and_return(double(exist?: false))
|
96
|
-
expect(subject.installed?).to be false
|
97
|
-
end
|
98
|
-
|
99
|
-
it "returns true when the location is installed" do
|
100
|
-
subject.stub(:revision).and_return("abcd1234")
|
101
|
-
subject.stub(:install_path).and_return(double(exist?: true))
|
102
|
-
expect(subject.installed?).to be true
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
describe "#install" do
|
107
|
-
before do
|
108
|
-
File.stub(:chmod)
|
109
|
-
FileUtils.stub(:cp_r)
|
110
|
-
subject.stub(:validate_cached!)
|
111
|
-
subject.stub(:git)
|
112
|
-
end
|
113
|
-
|
114
|
-
context "when the repository is cached" do
|
115
|
-
it "pulls a new version" do
|
116
|
-
Dir.stub(:chdir) { |args, &b| b.call } # Force eval the chdir block
|
117
|
-
|
118
|
-
subject.stub(:cached?).and_return(true)
|
119
|
-
expect(subject).to receive(:git).with(
|
120
|
-
'fetch --force --tags https://repo.com "refs/heads/*:refs/heads/*"'
|
121
|
-
)
|
122
|
-
subject.install
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context "when the revision is not cached" do
|
127
|
-
it "clones the repository" do
|
128
|
-
Dir.stub(:chdir) { |args, &b| b.call } # Force eval the chdir block
|
129
|
-
|
130
|
-
cache_path = subject.send(:cache_path)
|
131
|
-
subject.stub(:cached?).and_return(false)
|
132
|
-
expect(subject).to receive(:git).with(
|
133
|
-
%{clone https://repo.com "#{cache_path}" --bare --no-hardlinks}
|
134
|
-
)
|
135
|
-
subject.install
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe "#cached_cookbook" do
|
141
|
-
it "returns nil if the cookbook is not installed" do
|
142
|
-
subject.stub(:installed?).and_return(false)
|
143
|
-
expect(subject.cached_cookbook).to be_nil
|
144
|
-
end
|
145
|
-
|
146
|
-
it "returns the cookbook at the install_path" do
|
147
|
-
subject.stub(:installed?).and_return(true)
|
148
|
-
MockCachedCookbook.stub(:from_path)
|
149
|
-
|
150
|
-
expect(MockCachedCookbook).to receive(:from_path).once
|
151
|
-
subject.cached_cookbook
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
describe "#==" do
|
156
|
-
let(:other) { subject.dup }
|
157
|
-
|
158
|
-
it "returns true when everything matches" do
|
159
|
-
expect(subject).to eq(other)
|
160
|
-
end
|
161
|
-
|
162
|
-
it "returns false when the other location is not an GitLocation" do
|
163
|
-
other.stub(:is_a?).and_return(false)
|
164
|
-
expect(subject).to_not eq(other)
|
165
|
-
end
|
166
|
-
|
167
|
-
it "returns false when the uri is different" do
|
168
|
-
other.stub(:uri).and_return("different")
|
169
|
-
expect(subject).to_not eq(other)
|
170
|
-
end
|
171
|
-
|
172
|
-
it "returns false when the branch is different" do
|
173
|
-
other.stub(:branch).and_return("different")
|
174
|
-
expect(subject).to_not eq(other)
|
175
|
-
end
|
176
|
-
|
177
|
-
it "returns false when the tag is different" do
|
178
|
-
other.stub(:tag).and_return("different")
|
179
|
-
expect(subject).to_not eq(other)
|
180
|
-
end
|
181
|
-
|
182
|
-
it "returns false when the ref is different" do
|
183
|
-
other.stub(:ref).and_return("different")
|
184
|
-
expect(subject).to_not eq(other)
|
185
|
-
end
|
186
|
-
|
187
|
-
it "returns false when the rel is different" do
|
188
|
-
other.stub(:rel).and_return("different")
|
189
|
-
expect(subject).to_not eq(other)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
describe "#to_s" do
|
194
|
-
it "prefers the tag" do
|
195
|
-
expect(subject.to_s).to eq("https://repo.com (at v1.2.3/hi)")
|
196
|
-
end
|
197
|
-
|
198
|
-
it "prefers the branch" do
|
199
|
-
subject.stub(:tag).and_return(nil)
|
200
|
-
expect(subject.to_s).to eq("https://repo.com (at ham/hi)")
|
201
|
-
end
|
202
|
-
|
203
|
-
it "falls back to the ref" do
|
204
|
-
subject.stub(:tag).and_return(nil)
|
205
|
-
subject.stub(:branch).and_return(nil)
|
206
|
-
expect(subject.to_s).to eq("https://repo.com (at abc123/hi)")
|
207
|
-
end
|
208
|
-
|
209
|
-
it "does not use the rel if missing" do
|
210
|
-
subject.stub(:rel).and_return(nil)
|
211
|
-
expect(subject.to_s).to eq("https://repo.com (at v1.2.3)")
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
describe "#to_lock" do
|
216
|
-
it "includes all the information" do
|
217
|
-
expect(subject.to_lock).to eq <<-EOH.gsub(/^ {8}/, "")
|
218
|
-
git: https://repo.com
|
219
|
-
revision: defjkl123456
|
220
|
-
ref: abc123
|
221
|
-
branch: ham
|
222
|
-
tag: v1.2.3
|
223
|
-
rel: hi
|
224
|
-
EOH
|
225
|
-
end
|
226
|
-
|
227
|
-
it "does not include the branch if missing" do
|
228
|
-
subject.stub(:branch).and_return(nil)
|
229
|
-
expect(subject.to_lock).to_not include("branch")
|
230
|
-
end
|
231
|
-
|
232
|
-
it "does not include the tag if missing" do
|
233
|
-
subject.stub(:tag).and_return(nil)
|
234
|
-
expect(subject.to_lock).to_not include("tag")
|
235
|
-
end
|
236
|
-
|
237
|
-
it "does not include the rel if missing" do
|
238
|
-
subject.stub(:rel).and_return(nil)
|
239
|
-
expect(subject.to_lock).to_not include("rel")
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
describe "#lock_data" do
|
244
|
-
let(:full_lock_data) do
|
245
|
-
{
|
246
|
-
"git" => "https://repo.com",
|
247
|
-
"revision" => "defjkl123456",
|
248
|
-
"ref" => "abc123",
|
249
|
-
"branch" => "ham",
|
250
|
-
"tag" => "v1.2.3",
|
251
|
-
"rel" => "hi",
|
252
|
-
}
|
253
|
-
end
|
254
|
-
|
255
|
-
it "includes all the information" do
|
256
|
-
expect(subject.lock_data).to eq(full_lock_data)
|
257
|
-
end
|
258
|
-
|
259
|
-
it "does not include the branch if missing" do
|
260
|
-
subject.stub(:branch).and_return(nil)
|
261
|
-
expect(subject.lock_data).to_not have_key("branch")
|
262
|
-
end
|
263
|
-
|
264
|
-
it "does not include the tag if missing" do
|
265
|
-
subject.stub(:tag).and_return(nil)
|
266
|
-
expect(subject.lock_data).to_not have_key("tag")
|
267
|
-
end
|
268
|
-
|
269
|
-
it "does not include the rel if missing" do
|
270
|
-
subject.stub(:rel).and_return(nil)
|
271
|
-
expect(subject.lock_data).to_not have_key("rel")
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
describe "#git" do
|
276
|
-
before { described_class.send(:public, :git) }
|
277
|
-
|
278
|
-
it "raises an error if Git is not installed" do
|
279
|
-
CookbookOmnifetch.stub(:which).and_return(false)
|
280
|
-
expect { subject.git("foo") }.to raise_error(GitNotInstalled)
|
281
|
-
end
|
282
|
-
|
283
|
-
it "raises an error if the command fails" do
|
284
|
-
shell_out = double("shell_out", success?: false, stderr: nil)
|
285
|
-
MockShellOut.stub(:shell_out).and_return(shell_out)
|
286
|
-
expect { subject.git("foo") }.to raise_error(GitCommandError)
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
end
|
@@ -1,137 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "cookbook-omnifetch/metadata_based_installer.rb"
|
3
|
-
|
4
|
-
RSpec.shared_context "sample_metadata" do
|
5
|
-
|
6
|
-
let(:raw_metadata) do
|
7
|
-
{
|
8
|
-
"recipes" => [
|
9
|
-
{ "name" => "default.rb", "path" => "recipes/default.rb", "checksum" => "a6be794cdd2eb44d38fdf17f792a0d0d", "specificity" => "default", "url" => "https://example.com/recipes/default.rb" },
|
10
|
-
],
|
11
|
-
"root_files" => [
|
12
|
-
{ "name" => "metadata.rb", "path" => "metadata.rb", "checksum" => "5b346119e5e41ab99500608decac8dca", "specificity" => "default", "url" => "https://example.com/metadata.rb" },
|
13
|
-
],
|
14
|
-
}
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
RSpec.describe CookbookOmnifetch::MetadataBasedInstaller::CookbookMetadata do
|
20
|
-
|
21
|
-
include_context "sample_metadata"
|
22
|
-
|
23
|
-
subject(:cb_metadata) { described_class.new(raw_metadata) }
|
24
|
-
|
25
|
-
it "yields a set of paths and urls" do
|
26
|
-
expect { |b| cb_metadata.files(&b) }.to yield_successive_args(["https://example.com/recipes/default.rb", "recipes/default.rb"], ["https://example.com/metadata.rb", "metadata.rb"])
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
RSpec.describe CookbookOmnifetch::MetadataBasedInstaller do
|
31
|
-
|
32
|
-
include_context "sample_metadata"
|
33
|
-
|
34
|
-
let(:url_path) { "/cookbooks/example/0.5.0" }
|
35
|
-
|
36
|
-
let(:http_client) do
|
37
|
-
double("Http Client")
|
38
|
-
end
|
39
|
-
|
40
|
-
let(:recipe_url) do
|
41
|
-
raw_metadata["recipes"][0]["url"]
|
42
|
-
end
|
43
|
-
|
44
|
-
let(:recipe_path) do
|
45
|
-
raw_metadata["recipes"][0]["path"]
|
46
|
-
end
|
47
|
-
|
48
|
-
let(:recipe_filehandle) do
|
49
|
-
File.open(File.join(remote_path, recipe_path))
|
50
|
-
end
|
51
|
-
|
52
|
-
let(:root_file_url) do
|
53
|
-
raw_metadata["root_files"][0]["url"]
|
54
|
-
end
|
55
|
-
|
56
|
-
let(:root_file_path) do
|
57
|
-
raw_metadata["root_files"][0]["path"]
|
58
|
-
end
|
59
|
-
|
60
|
-
let(:root_file_filehandle) do
|
61
|
-
File.open(File.join(remote_path, root_file_path))
|
62
|
-
end
|
63
|
-
|
64
|
-
let(:cookbook_fixture_path) { fixtures_path.join("cookbooks/example_cookbook") }
|
65
|
-
|
66
|
-
let(:test_root) { Dir.mktmpdir(nil) }
|
67
|
-
|
68
|
-
let(:cache_path) { File.join(test_root, "cache") }
|
69
|
-
|
70
|
-
let(:remote_path) { File.join(test_root, "remote") }
|
71
|
-
|
72
|
-
let(:install_path) { File.join(test_root, "install_path") }
|
73
|
-
|
74
|
-
let(:cookbook_files) { %w{metadata.rb recipes recipes/default.rb} }
|
75
|
-
|
76
|
-
let(:expected_installed_files) do
|
77
|
-
cookbook_files.map do |file|
|
78
|
-
File.join(install_path, file)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
subject(:installer) do
|
83
|
-
described_class.new(http_client: http_client,
|
84
|
-
url_path: url_path,
|
85
|
-
install_path: install_path)
|
86
|
-
end
|
87
|
-
|
88
|
-
before do
|
89
|
-
FileUtils.cp_r(cookbook_fixture_path, remote_path)
|
90
|
-
|
91
|
-
allow(CookbookOmnifetch).to receive(:cache_path).and_return(cache_path)
|
92
|
-
end
|
93
|
-
|
94
|
-
after do
|
95
|
-
FileUtils.rm_r(test_root)
|
96
|
-
end
|
97
|
-
|
98
|
-
it "stages the download to a randomized location" do
|
99
|
-
Kernel.srand(0)
|
100
|
-
expected_path = Pathname.new(cache_path).join(".cache_tmp/metadata-installer/_cookbooks_example_0_5_0_209652396")
|
101
|
-
|
102
|
-
expect(installer.staging_path).to eq(expected_path)
|
103
|
-
|
104
|
-
next_installer = described_class.new(http_client: http_client,
|
105
|
-
url_path: url_path,
|
106
|
-
install_path: install_path)
|
107
|
-
|
108
|
-
next_expected_path = Pathname.new(cache_path).join(".cache_tmp/metadata-installer/_cookbooks_example_0_5_0_398764591")
|
109
|
-
expect(next_installer.staging_path).to eq(next_expected_path)
|
110
|
-
end
|
111
|
-
|
112
|
-
describe "installing the cookbook" do
|
113
|
-
|
114
|
-
before do
|
115
|
-
expect(http_client).to receive(:get).
|
116
|
-
with(url_path).
|
117
|
-
and_return(raw_metadata)
|
118
|
-
expect(http_client).to receive(:streaming_request).
|
119
|
-
with(recipe_url).
|
120
|
-
and_yield(recipe_filehandle)
|
121
|
-
expect(http_client).to receive(:streaming_request).
|
122
|
-
with(root_file_url).
|
123
|
-
and_yield(root_file_filehandle)
|
124
|
-
end
|
125
|
-
|
126
|
-
it "installs the cookbook to the desired install path" do
|
127
|
-
expect(Dir).to_not exist(install_path)
|
128
|
-
|
129
|
-
installer.install
|
130
|
-
|
131
|
-
expect(Dir).to exist(install_path)
|
132
|
-
expect(Dir.glob("#{install_path}/**/*")).to match_array(expected_installed_files)
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|