berkshelf 3.1.5 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/berkshelf.gemspec +6 -5
- data/features/commands/search.feature +2 -2
- data/features/commands/vendor.feature +6 -2
- data/features/commands/verify.feature +29 -0
- data/features/config.feature +13 -48
- data/features/step_definitions/filesystem_steps.rb +2 -2
- data/features/step_definitions/gem_steps.rb +3 -1
- data/features/step_definitions/utility_steps.rb +2 -2
- data/generator_files/Vagrantfile.erb +30 -30
- data/generator_files/metadata.rb.erb +0 -1
- data/lib/berkshelf.rb +5 -2
- data/lib/berkshelf/berksfile.rb +41 -41
- data/lib/berkshelf/cli.rb +11 -1
- data/lib/berkshelf/community_rest.rb +1 -0
- data/lib/berkshelf/config.rb +18 -4
- data/lib/berkshelf/cookbook_store.rb +1 -1
- data/lib/berkshelf/downloader.rb +4 -0
- data/lib/berkshelf/errors.rb +0 -1
- data/lib/berkshelf/file_syncer.rb +134 -0
- data/lib/berkshelf/locations/base.rb +6 -1
- data/lib/berkshelf/locations/git.rb +2 -2
- data/lib/berkshelf/lockfile.rb +14 -2
- data/lib/berkshelf/uploader.rb +10 -17
- data/lib/berkshelf/validator.rb +37 -0
- data/lib/berkshelf/version.rb +1 -1
- data/lib/berkshelf/visualizer.rb +13 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/kitchen.rb +3 -1
- data/spec/support/matchers/file_system_matchers.rb +1 -1
- data/spec/support/matchers/filepath_matchers.rb +38 -2
- data/spec/support/shared_examples/formatter.rb +7 -7
- data/spec/unit/berkshelf/berksfile_spec.rb +51 -21
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +5 -5
- data/spec/unit/berkshelf/cli_spec.rb +1 -1
- data/spec/unit/berkshelf/community_rest_spec.rb +12 -12
- data/spec/unit/berkshelf/config_spec.rb +4 -4
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +2 -2
- data/spec/unit/berkshelf/cookbook_store_spec.rb +6 -6
- data/spec/unit/berkshelf/core_ext/file_utils_spec.rb +3 -3
- data/spec/unit/berkshelf/core_ext/pathname_spec.rb +23 -6
- data/spec/unit/berkshelf/dependency_spec.rb +4 -4
- data/spec/unit/berkshelf/downloader_spec.rb +5 -1
- data/spec/unit/berkshelf/errors_spec.rb +1 -1
- data/spec/unit/berkshelf/file_syncer_spec.rb +206 -0
- data/spec/unit/berkshelf/init_generator_spec.rb +19 -22
- data/spec/unit/berkshelf/installer_spec.rb +6 -6
- data/spec/unit/berkshelf/locations/base_spec.rb +17 -8
- data/spec/unit/berkshelf/locations/git_spec.rb +34 -34
- data/spec/unit/berkshelf/locations/path_spec.rb +3 -3
- data/spec/unit/berkshelf/lockfile_parser_spec.rb +1 -1
- data/spec/unit/berkshelf/lockfile_spec.rb +50 -36
- data/spec/unit/berkshelf/packager_spec.rb +6 -4
- data/spec/unit/berkshelf/resolver/graph_spec.rb +3 -3
- data/spec/unit/berkshelf/resolver_spec.rb +3 -3
- data/spec/unit/berkshelf/shell_spec.rb +30 -24
- data/spec/unit/berkshelf/uploader_spec.rb +10 -36
- data/spec/unit/berkshelf/validator_spec.rb +30 -0
- data/spec/unit/berkshelf/visualizer_spec.rb +17 -2
- metadata +34 -15
- data/lib/berkshelf/mixin/dsl_eval.rb +0 -58
- data/spec/unit/berkshelf/mixin/dsl_eval_spec.rb +0 -55
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,7 @@ end
|
|
6
6
|
|
7
7
|
Spork.prefork do
|
8
8
|
require 'rspec'
|
9
|
+
require 'cleanroom/rspec'
|
9
10
|
require 'webmock/rspec'
|
10
11
|
require 'berkshelf/api/rspec' unless windows?
|
11
12
|
|
@@ -24,7 +25,6 @@ Spork.prefork do
|
|
24
25
|
end
|
25
26
|
|
26
27
|
config.mock_with :rspec
|
27
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
28
28
|
config.filter_run focus: true
|
29
29
|
config.filter_run_excluding not_supported_on_windows: windows?
|
30
30
|
config.run_all_when_everything_filtered = true
|
data/spec/support/kitchen.rb
CHANGED
@@ -5,7 +5,9 @@ module Berkshelf
|
|
5
5
|
|
6
6
|
def stub_kitchen!
|
7
7
|
generator = double('kitchen-generator', invoke_all: nil)
|
8
|
-
::Kitchen::Generator::Init.
|
8
|
+
allow(::Kitchen::Generator::Init).to receive(:new)
|
9
|
+
.with(any_args())
|
10
|
+
.and_return(generator)
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rspec/expectations'
|
1
2
|
require 'pathname'
|
2
3
|
|
3
4
|
RSpec::Matchers.define :be_relative_path do
|
@@ -9,11 +10,46 @@ RSpec::Matchers.define :be_relative_path do
|
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
+
failure_message do |given|
|
13
14
|
"Expected '#{given}' to be a relative path but got an absolute path."
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
failure_message_when_negated do |given|
|
17
18
|
"Expected '#{given}' to not be a relative path but got an absolute path."
|
18
19
|
end
|
19
20
|
end
|
21
|
+
|
22
|
+
# expect('/path/to/directory').to be_a_directory
|
23
|
+
RSpec::Matchers.define :be_a_directory do
|
24
|
+
match do |actual|
|
25
|
+
File.directory?(actual)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# expect('/path/to/directory').to be_a_file
|
30
|
+
RSpec::Matchers.define :be_a_file do
|
31
|
+
match do |actual|
|
32
|
+
File.file?(actual)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# expect('/path/to/directory').to be_a_symlink
|
37
|
+
RSpec::Matchers.define :be_a_symlink do
|
38
|
+
match do |actual|
|
39
|
+
File.symlink?(actual)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# expect('/path/to/directory').to be_a_symlink_to
|
44
|
+
RSpec::Matchers.define :be_a_symlink_to do |path|
|
45
|
+
match do |actual|
|
46
|
+
File.symlink?(actual) && File.readlink(actual) == path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# expect('/path/to/file').to be_an_executable
|
51
|
+
RSpec::Matchers.define :be_an_executable do
|
52
|
+
match do |actual|
|
53
|
+
File.executable?(actual)
|
54
|
+
end
|
55
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
2
|
-
shared_examples 'a formatter object' do
|
3
|
-
BaseFormatter.instance_methods(false).each do |name|
|
4
|
-
next if name == :cleanup_hook
|
1
|
+
require 'rspec'
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
RSpec.shared_examples "a formatter object" do
|
4
|
+
Berkshelf::BaseFormatter.instance_methods(false).each do |name|
|
5
|
+
next if name == :cleanup_hook
|
6
|
+
|
7
|
+
it "implements ##{name}" do
|
8
|
+
expect(subject.method(name).owner).to eq(described_class)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -53,12 +53,12 @@ describe Berkshelf::Berksfile do
|
|
53
53
|
let(:default_options) { { group: [] } }
|
54
54
|
|
55
55
|
it 'sends the add_dependency message with the name, constraint, and options to the instance of the includer' do
|
56
|
-
subject.
|
56
|
+
expect(subject).to receive(:add_dependency).with(name, constraint, default_options)
|
57
57
|
subject.cookbook(name, constraint, default_options)
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'merges the default options into specified options' do
|
61
|
-
subject.
|
61
|
+
expect(subject).to receive(:add_dependency)do |arg_name, arg_constraint, arg_options|
|
62
62
|
expect(arg_name).to eq(name)
|
63
63
|
expect(arg_constraint).to eq(constraint)
|
64
64
|
expect(arg_options[:path]).to match(%r{/Users/reset})
|
@@ -69,23 +69,27 @@ describe Berkshelf::Berksfile do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'converts a single specified group option into an array of groups' do
|
72
|
-
subject.
|
72
|
+
expect(subject).to receive(:add_dependency).with(name, constraint, group: [:production])
|
73
73
|
subject.cookbook(name, constraint, group: :production)
|
74
74
|
end
|
75
75
|
|
76
76
|
context 'when no constraint specified' do
|
77
77
|
it 'sends the add_dependency message with a nil value for constraint' do
|
78
|
-
subject.
|
78
|
+
expect(subject).to receive(:add_dependency).with(name, nil, default_options)
|
79
79
|
subject.cookbook(name, default_options)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
context 'when no options specified' do
|
84
84
|
it 'sends the add_dependency message with an empty Hash for the value of options' do
|
85
|
-
subject.
|
85
|
+
expect(subject).to receive(:add_dependency).with(name, constraint, default_options)
|
86
86
|
subject.cookbook(name, constraint)
|
87
87
|
end
|
88
88
|
end
|
89
|
+
|
90
|
+
it "is a DSL method" do
|
91
|
+
expect(subject).to have_exposed_method(:cookbook)
|
92
|
+
end
|
89
93
|
end
|
90
94
|
|
91
95
|
describe '#group' do
|
@@ -93,12 +97,16 @@ describe Berkshelf::Berksfile do
|
|
93
97
|
let(:group) { 'production' }
|
94
98
|
|
95
99
|
it 'sends the add_dependency message with an array of groups determined by the parameter to the group block' do
|
96
|
-
subject.
|
100
|
+
expect(subject).to receive(:add_dependency).with(name, nil, group: [group])
|
97
101
|
|
98
102
|
subject.group(group) do
|
99
103
|
subject.cookbook(name)
|
100
104
|
end
|
101
105
|
end
|
106
|
+
|
107
|
+
it "is a DSL method" do
|
108
|
+
expect(subject).to have_exposed_method(:group)
|
109
|
+
end
|
102
110
|
end
|
103
111
|
|
104
112
|
describe '#metadata' do
|
@@ -108,14 +116,22 @@ describe Berkshelf::Berksfile do
|
|
108
116
|
before { Dir.chdir(path) }
|
109
117
|
|
110
118
|
it 'sends the add_dependency message with an explicit version constraint and the path to the cookbook' do
|
111
|
-
subject.
|
119
|
+
expect(subject).to receive(:add_dependency).with('example_cookbook', nil, path: path.to_s, metadata: true)
|
112
120
|
subject.metadata
|
113
121
|
end
|
122
|
+
|
123
|
+
it "is a DSL method" do
|
124
|
+
expect(subject).to have_exposed_method(:metadata)
|
125
|
+
end
|
114
126
|
end
|
115
127
|
|
116
128
|
describe "#source" do
|
117
129
|
let(:new_source) { "http://berks.riotgames.com" }
|
118
130
|
|
131
|
+
it "is a DSL method" do
|
132
|
+
expect(subject).to have_exposed_method(:source)
|
133
|
+
end
|
134
|
+
|
119
135
|
it "adds a source to the sources" do
|
120
136
|
subject.source(new_source)
|
121
137
|
expect(subject.sources.map(&:to_s)).to include(new_source)
|
@@ -179,12 +195,26 @@ describe Berkshelf::Berksfile do
|
|
179
195
|
it "raises a Berkshelf::Deprecated error" do
|
180
196
|
expect { subject.site }.to raise_error(Berkshelf::DeprecatedError)
|
181
197
|
end
|
198
|
+
|
199
|
+
it "is a DSL method" do
|
200
|
+
expect(subject).to have_exposed_method(:site)
|
201
|
+
end
|
182
202
|
end
|
183
203
|
|
184
204
|
describe "#chef_api" do
|
185
205
|
it "raises a Berkshelf::Deprecated error" do
|
186
206
|
expect { subject.chef_api }.to raise_error(Berkshelf::DeprecatedError)
|
187
207
|
end
|
208
|
+
|
209
|
+
it "is a DSL method" do
|
210
|
+
expect(subject).to have_exposed_method(:chef_api)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe '#extension' do
|
215
|
+
it "is a DSL method" do
|
216
|
+
expect(subject).to have_exposed_method(:extension)
|
217
|
+
end
|
188
218
|
end
|
189
219
|
|
190
220
|
describe '#dependencies' do
|
@@ -199,7 +229,7 @@ describe Berkshelf::Berksfile do
|
|
199
229
|
subject.add_dependency(dependency_one.name)
|
200
230
|
subject.add_dependency(dependency_two.name)
|
201
231
|
|
202
|
-
expect(subject.dependencies).to
|
232
|
+
expect(subject.dependencies.size).to eq(2)
|
203
233
|
expect(subject).to have_dependency(dependency_one.name)
|
204
234
|
expect(subject).to have_dependency(dependency_two.name)
|
205
235
|
end
|
@@ -214,7 +244,7 @@ describe Berkshelf::Berksfile do
|
|
214
244
|
it 'retrieves the locked (cached) cookbook for each dependency' do
|
215
245
|
subject.add_dependency('bacon', nil)
|
216
246
|
subject.add_dependency('ham', nil)
|
217
|
-
subject.
|
247
|
+
allow(subject).to receive(:retrive_locked)
|
218
248
|
|
219
249
|
expect(subject).to receive(:retrieve_locked).twice
|
220
250
|
subject.cookbooks
|
@@ -223,21 +253,21 @@ describe Berkshelf::Berksfile do
|
|
223
253
|
|
224
254
|
describe '#groups' do
|
225
255
|
before do
|
226
|
-
subject.
|
227
|
-
dependency_one.
|
228
|
-
dependency_two.
|
256
|
+
allow(subject).to receive(:dependencies) { [dependency_one, dependency_two] }
|
257
|
+
allow(dependency_one).to receive(:groups) { [:nautilus, :skarner] }
|
258
|
+
allow(dependency_two).to receive(:groups) { [:nautilus, :riven] }
|
229
259
|
end
|
230
260
|
|
231
261
|
it 'returns a hash containing keys for every group a dependency is a member of' do
|
232
|
-
expect(subject.groups.keys).to
|
262
|
+
expect(subject.groups.keys.size).to eq(3)
|
233
263
|
expect(subject.groups).to have_key(:nautilus)
|
234
264
|
expect(subject.groups).to have_key(:skarner)
|
235
265
|
expect(subject.groups).to have_key(:riven)
|
236
266
|
end
|
237
267
|
|
238
268
|
it 'returns an Array of Berkshelf::Dependencys who are members of the group for value' do
|
239
|
-
expect(subject.groups[:nautilus]).to
|
240
|
-
expect(subject.groups[:riven]).to
|
269
|
+
expect(subject.groups[:nautilus].size).to eq(2)
|
270
|
+
expect(subject.groups[:riven].size).to eq(1)
|
241
271
|
end
|
242
272
|
end
|
243
273
|
|
@@ -253,7 +283,7 @@ describe Berkshelf::Berksfile do
|
|
253
283
|
let(:dependency) { subject.dependencies.first }
|
254
284
|
|
255
285
|
it 'adds new dependency to the list of dependencies' do
|
256
|
-
expect(subject.dependencies).to
|
286
|
+
expect(subject.dependencies.size).to eq(1)
|
257
287
|
end
|
258
288
|
|
259
289
|
it "is a Berkshelf::Dependency" do
|
@@ -310,7 +340,7 @@ describe Berkshelf::Berksfile do
|
|
310
340
|
let(:cached) { double('cached') }
|
311
341
|
|
312
342
|
before do
|
313
|
-
subject.
|
343
|
+
allow(subject).to receive(:lockfile).and_return(lockfile)
|
314
344
|
end
|
315
345
|
|
316
346
|
it 'delegates to the lockfile' do
|
@@ -323,11 +353,11 @@ describe Berkshelf::Berksfile do
|
|
323
353
|
let(:uploader) { double(Berkshelf::Uploader, run: nil) }
|
324
354
|
|
325
355
|
before do
|
326
|
-
subject.
|
327
|
-
subject.
|
328
|
-
subject.
|
356
|
+
allow(subject).to receive(:validate_lockfile_present!)
|
357
|
+
allow(subject).to receive(:validate_lockfile_trusted!)
|
358
|
+
allow(subject).to receive(:validate_dependencies_installed!)
|
329
359
|
|
330
|
-
Berkshelf::Uploader.
|
360
|
+
allow(Berkshelf::Uploader).to receive(:new).and_return(uploader)
|
331
361
|
end
|
332
362
|
|
333
363
|
it 'validates the lockfile is present' do
|
@@ -88,27 +88,27 @@ describe Berkshelf::CachedCookbook do
|
|
88
88
|
describe '#pretty_hash' do
|
89
89
|
shared_examples 'a pretty_hash cookbook attribute' do |attribute, key|
|
90
90
|
it "is not present when the `#{attribute}` attribute is nil" do
|
91
|
-
subject.
|
91
|
+
allow(subject).to receive(attribute.to_sym).and_return(nil)
|
92
92
|
expect(subject.pretty_hash).to_not have_key((key || attribute).to_sym)
|
93
93
|
end
|
94
94
|
|
95
95
|
it "is not present when the `#{attribute}` attribute is an empty string" do
|
96
|
-
subject.
|
96
|
+
allow(subject).to receive(attribute.to_sym).and_return('')
|
97
97
|
expect(subject.pretty_hash).to_not have_key((key || attribute).to_sym)
|
98
98
|
end
|
99
99
|
|
100
100
|
it "is not present when the `#{attribute}` attribute is an empty array" do
|
101
|
-
subject.
|
101
|
+
allow(subject).to receive(attribute.to_sym).and_return([])
|
102
102
|
expect(subject.pretty_hash).to_not have_key((key || attribute).to_sym)
|
103
103
|
end
|
104
104
|
|
105
105
|
it "is not present when the `#{attribute}` attribute is an empty hash" do
|
106
|
-
subject.
|
106
|
+
allow(subject).to receive(attribute.to_sym).and_return([])
|
107
107
|
expect(subject.pretty_hash).to_not have_key((key || attribute).to_sym)
|
108
108
|
end
|
109
109
|
|
110
110
|
it "is present when the `#{attribute}` attribute has a Hash value" do
|
111
|
-
subject.
|
111
|
+
allow(subject).to receive(attribute.to_sym).and_return(foo: 'bar')
|
112
112
|
expect(subject.pretty_hash).to have_key((key || attribute).to_sym)
|
113
113
|
end
|
114
114
|
end
|
@@ -9,16 +9,16 @@ describe Berkshelf::CommunityREST do
|
|
9
9
|
let(:gzip_reader) { double('gzip_reader') }
|
10
10
|
|
11
11
|
before do
|
12
|
-
File.
|
13
|
-
Zlib::GzipReader.
|
14
|
-
Archive::Tar::Minitar.
|
12
|
+
allow(File).to receive(:open).with(target, 'rb').and_return(file)
|
13
|
+
allow(Zlib::GzipReader).to receive(:new).with(file).and_return(gzip_reader)
|
14
|
+
allow(Archive::Tar::Minitar).to receive(:unpack).with(gzip_reader, destination)
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'unpacks the tar' do
|
18
|
-
File.
|
19
|
-
::IO.
|
20
|
-
Zlib::GzipReader.
|
21
|
-
Archive::Tar::Minitar.
|
18
|
+
expect(File).to receive(:open).with(target, 'rb')
|
19
|
+
expect(::IO).to receive(:binread).with(target, 2).and_return([0x1F, 0x8B].pack("C*"))
|
20
|
+
expect(Zlib::GzipReader).to receive(:new).with(file)
|
21
|
+
expect(Archive::Tar::Minitar).to receive(:unpack).with(gzip_reader, destination)
|
22
22
|
|
23
23
|
expect(Berkshelf::CommunityREST.unpack(target, destination)).to eq(destination)
|
24
24
|
end
|
@@ -76,8 +76,8 @@ describe Berkshelf::CommunityREST do
|
|
76
76
|
let(:archive) { double('archive', path: '/foo/bar', unlink: true) }
|
77
77
|
|
78
78
|
before do
|
79
|
-
subject.
|
80
|
-
Berkshelf::CommunityREST.
|
79
|
+
allow(subject).to receive(:stream).with(any_args()).and_return(archive)
|
80
|
+
allow(Berkshelf::CommunityREST).to receive(:unpack)
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'unpacks the archive' do
|
@@ -87,8 +87,8 @@ describe Berkshelf::CommunityREST do
|
|
87
87
|
headers: { 'Content-Type' => 'application/json' },
|
88
88
|
)
|
89
89
|
|
90
|
-
Berkshelf::CommunityREST.
|
91
|
-
archive.
|
90
|
+
expect(Berkshelf::CommunityREST).to receive(:unpack).with('/foo/bar').once.and_return('/foo/nginx')
|
91
|
+
expect(archive).to receive(:unlink).once
|
92
92
|
|
93
93
|
subject.download('bacon', '1.0.0')
|
94
94
|
end
|
@@ -215,6 +215,6 @@ describe Berkshelf::CommunityREST do
|
|
215
215
|
end
|
216
216
|
|
217
217
|
describe '#stream' do
|
218
|
-
|
218
|
+
skip
|
219
219
|
end
|
220
220
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Berkshelf::Config do
|
4
4
|
describe '::file' do
|
5
5
|
context 'when the file does not exist' do
|
6
|
-
before { File.
|
6
|
+
before { allow(File).to receive(:exists?).and_return(false) }
|
7
7
|
|
8
8
|
it 'is nil' do
|
9
9
|
expect(Berkshelf::Config.file).to be_nil
|
@@ -23,7 +23,7 @@ describe Berkshelf::Config do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
before do
|
26
|
-
File.
|
26
|
+
allow(File).to receive(:exists?).and_return(false)
|
27
27
|
end
|
28
28
|
|
29
29
|
after do
|
@@ -32,8 +32,8 @@ describe Berkshelf::Config do
|
|
32
32
|
|
33
33
|
context "when ENV['BERKSHELF_CONFIG'] is used" do
|
34
34
|
before do
|
35
|
-
ENV.
|
36
|
-
File.
|
35
|
+
allow(ENV).to receive(:[]).with('BERKSHELF_CONFIG').and_return('/tmp/config.json')
|
36
|
+
allow(File).to receive(:exists?).with('/tmp/config.json').and_return(true)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "points to a location within it" do
|
@@ -6,7 +6,7 @@ describe Berkshelf::CookbookGenerator do
|
|
6
6
|
let(:kitchen_generator) { double('kitchen-generator', invoke_all: nil) }
|
7
7
|
|
8
8
|
before do
|
9
|
-
Kitchen::Generator::Init.
|
9
|
+
allow(Kitchen::Generator::Init).to receive(:new).with(any_args()).and_return(kitchen_generator)
|
10
10
|
end
|
11
11
|
|
12
12
|
context 'with default options' do
|
@@ -69,7 +69,7 @@ describe Berkshelf::CookbookGenerator do
|
|
69
69
|
|
70
70
|
context "given a 'maintainer_email' option" do
|
71
71
|
before do
|
72
|
-
Kitchen::Generator::Init.
|
72
|
+
allow(Kitchen::Generator::Init).to receive(:new).with(any_args()).and_return(kitchen_generator)
|
73
73
|
capture(:stdout) {
|
74
74
|
Berkshelf::CookbookGenerator.new([target, name], maintainer_email: 'jamie@vialstudios.com').invoke_all
|
75
75
|
}
|
@@ -42,17 +42,17 @@ describe Berkshelf::CookbookStore do
|
|
42
42
|
let(:cached_one) { double('cached-one', name: name, version: Semverse::Version.new(version)) }
|
43
43
|
let(:cached_two) { double('cached-two', name: 'mysql', version: Semverse::Version.new('1.2.6')) }
|
44
44
|
|
45
|
-
before { subject.
|
45
|
+
before { allow(subject).to receive(:cookbooks).and_return([cached_one, cached_two]) }
|
46
46
|
|
47
47
|
it 'gets and returns the the CachedCookbook best matching the name and constraint' do
|
48
|
-
subject.
|
48
|
+
expect(subject).to receive(:cookbook).with(name, version).and_return(cached_one)
|
49
49
|
result = subject.satisfy(name, constraint)
|
50
50
|
|
51
51
|
expect(result).to eq(cached_one)
|
52
52
|
end
|
53
53
|
|
54
54
|
context 'when there are no cookbooks in the cookbook store' do
|
55
|
-
before { subject.
|
55
|
+
before { allow(subject).to receive(:cookbooks).and_return([]) }
|
56
56
|
|
57
57
|
it 'returns nil' do
|
58
58
|
result = subject.satisfy(name, constraint)
|
@@ -64,7 +64,7 @@ describe Berkshelf::CookbookStore do
|
|
64
64
|
let(:version) { Semverse::Version.new('1.0.0') }
|
65
65
|
let(:constraint) { Semverse::Constraint.new('= 0.1.0') }
|
66
66
|
|
67
|
-
before { subject.
|
67
|
+
before { allow(subject).to receive(:cookbooks).and_return([ double('badcache', name: 'none', version: version) ]) }
|
68
68
|
|
69
69
|
it 'returns nil if there is no matching cookbook for the name and constraint' do
|
70
70
|
result = subject.satisfy(name, constraint)
|
@@ -98,12 +98,12 @@ describe Berkshelf::CookbookStore do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it 'contains a CachedCookbook for every cookbook in the storage path' do
|
101
|
-
expect(subject.cookbooks).to
|
101
|
+
expect(subject.cookbooks.size).to eq(2)
|
102
102
|
end
|
103
103
|
|
104
104
|
context 'given a value for the filter parameter' do
|
105
105
|
it 'returns only the CachedCookbooks whose name match the filter' do
|
106
|
-
expect(subject.cookbooks('mysql')).to
|
106
|
+
expect(subject.cookbooks('mysql').size).to eq(1)
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|