chef-dk 0.2.0

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 (142) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +192 -0
  3. data/LICENSE +201 -0
  4. data/README.md +198 -0
  5. data/Rakefile +18 -0
  6. data/bin/chef +25 -0
  7. data/lib/chef-dk.rb +19 -0
  8. data/lib/chef-dk/builtin_commands.rb +31 -0
  9. data/lib/chef-dk/chef_runner.rb +83 -0
  10. data/lib/chef-dk/cli.rb +135 -0
  11. data/lib/chef-dk/command/base.rb +71 -0
  12. data/lib/chef-dk/command/exec.rb +33 -0
  13. data/lib/chef-dk/command/gem.rb +47 -0
  14. data/lib/chef-dk/command/generate.rb +97 -0
  15. data/lib/chef-dk/command/generator_commands.rb +417 -0
  16. data/lib/chef-dk/command/shell_init.rb +80 -0
  17. data/lib/chef-dk/command/verify.rb +226 -0
  18. data/lib/chef-dk/commands_map.rb +115 -0
  19. data/lib/chef-dk/component_test.rb +142 -0
  20. data/lib/chef-dk/cookbook_metadata.rb +36 -0
  21. data/lib/chef-dk/cookbook_omnifetch.rb +29 -0
  22. data/lib/chef-dk/cookbook_profiler/git.rb +95 -0
  23. data/lib/chef-dk/cookbook_profiler/identifiers.rb +79 -0
  24. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -0
  25. data/lib/chef-dk/exceptions.rb +46 -0
  26. data/lib/chef-dk/generator.rb +70 -0
  27. data/lib/chef-dk/helpers.rb +95 -0
  28. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +46 -0
  29. data/lib/chef-dk/policyfile/community_cookbook_source.rb +84 -0
  30. data/lib/chef-dk/policyfile/cookbook_sources.rb +20 -0
  31. data/lib/chef-dk/policyfile/cookbook_spec.rb +96 -0
  32. data/lib/chef-dk/policyfile/dsl.rb +148 -0
  33. data/lib/chef-dk/policyfile/null_cookbook_source.rb +37 -0
  34. data/lib/chef-dk/policyfile_compiler.rb +217 -0
  35. data/lib/chef-dk/policyfile_lock.rb +243 -0
  36. data/lib/chef-dk/shell_out.rb +36 -0
  37. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -0
  38. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +96 -0
  39. data/lib/chef-dk/skeletons/code_generator/files/default/converge_spec.rb +9 -0
  40. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -0
  41. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +8 -0
  42. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -0
  43. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +65 -0
  44. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -0
  45. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +50 -0
  46. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -0
  47. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -0
  48. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +9 -0
  49. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -0
  50. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -0
  51. data/lib/chef-dk/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  52. data/lib/chef-dk/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  53. data/lib/chef-dk/skeletons/code_generator/templates/default/default_recipe.rb.erb +8 -0
  54. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +16 -0
  55. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +8 -0
  56. data/lib/chef-dk/skeletons/code_generator/templates/default/provider.rb.erb +0 -0
  57. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +0 -0
  58. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +0 -0
  59. data/lib/chef-dk/skeletons/code_generator/templates/default/template.erb +0 -0
  60. data/lib/chef-dk/version.rb +20 -0
  61. data/spec/shared/setup_git_cookbooks.rb +53 -0
  62. data/spec/spec_helper.rb +32 -0
  63. data/spec/test_helpers.rb +59 -0
  64. data/spec/unit/chef_runner_spec.rb +70 -0
  65. data/spec/unit/cli_spec.rb +151 -0
  66. data/spec/unit/command/base_spec.rb +88 -0
  67. data/spec/unit/command/exec_spec.rb +123 -0
  68. data/spec/unit/command/generate_spec.rb +102 -0
  69. data/spec/unit/command/generator_commands_spec.rb +504 -0
  70. data/spec/unit/command/shell_init_spec.rb +109 -0
  71. data/spec/unit/command/verify_spec.rb +311 -0
  72. data/spec/unit/commands_map_spec.rb +57 -0
  73. data/spec/unit/component_test_spec.rb +126 -0
  74. data/spec/unit/cookbook_metadata_spec.rb +62 -0
  75. data/spec/unit/cookbook_profiler/git_spec.rb +127 -0
  76. data/spec/unit/cookbook_profiler/identifiers_spec.rb +79 -0
  77. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
  78. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
  79. data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
  80. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
  81. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  82. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
  83. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  84. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
  85. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  86. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  87. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
  88. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
  89. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
  90. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
  91. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
  92. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
  93. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -0
  94. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
  95. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
  96. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
  97. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
  98. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
  99. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
  100. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
  101. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
  102. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -0
  103. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
  104. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  105. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  106. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  107. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  108. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  109. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  110. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  111. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  112. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  113. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
  114. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
  115. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  116. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
  117. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
  118. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  119. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  120. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
  121. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
  122. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
  123. data/spec/unit/fixtures/example_cookbook/README.md +4 -0
  124. data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
  125. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
  126. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
  127. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
  128. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
  129. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
  130. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
  131. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
  132. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
  133. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
  134. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -0
  135. data/spec/unit/policyfile/community_cookbook_source_spec.rb +51 -0
  136. data/spec/unit/policyfile/cookbook_spec_spec.rb +200 -0
  137. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -0
  138. data/spec/unit/policyfile_builder_spec.rb +489 -0
  139. data/spec/unit/policyfile_demands_spec.rb +484 -0
  140. data/spec/unit/policyfile_evaluation_spec.rb +284 -0
  141. data/spec/unit/shell_out_spec.rb +34 -0
  142. metadata +422 -0
@@ -0,0 +1,484 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+ require 'chef-dk/policyfile_compiler'
20
+
21
+ describe ChefDK::PolicyfileCompiler, "when expressing the Policyfile graph demands" do
22
+
23
+ let(:run_list) { [] }
24
+
25
+ let(:default_source) { nil }
26
+
27
+ let(:external_cookbook_universe) { {} }
28
+
29
+ let(:policyfile) do
30
+ policyfile = ChefDK::PolicyfileCompiler.new.build do |p|
31
+
32
+ p.policyfile_filename = "/no-such-place/Policyfile.rb"
33
+
34
+ p.default_source(*default_source) if default_source
35
+ p.run_list(*run_list)
36
+
37
+ allow(p.default_source).to receive(:universe_graph).and_return(external_cookbook_universe)
38
+ end
39
+
40
+ policyfile
41
+ end
42
+
43
+ let(:demands) { policyfile.graph_demands }
44
+
45
+ shared_context("community default source") do
46
+
47
+ let(:default_source) { [:community] }
48
+
49
+ let(:external_cookbook_universe) do
50
+ {
51
+ "nginx" => {
52
+ "1.0.0" => [ [ "apt", "~> 2.0" ], [ "yum", "~> 1.0" ] ],
53
+ "1.2.0" => [ [ "apt", "~> 2.1" ], [ "yum", "~> 1.0" ] ],
54
+ "2.0.0" => [ [ "apt", "~> 3.0" ], [ "yum", "~> 1.0" ], [ "ohai", "~> 2.0" ] ]
55
+ },
56
+
57
+ "mysql" => {
58
+ "3.0.0" => [ [ "apt", "~> 2.0" ], [ "yum", "~> 1.0" ] ],
59
+ "4.0.0" => [ [ "apt", "~> 2.4" ], [ "yum", "~> 1.1" ] ],
60
+ "5.0.0" => [ ],
61
+ },
62
+
63
+ "local-cookbook" => {
64
+ "9.9.9" => [ ["local-cookbook-on-community-dep", "= 1.0.0"] ]
65
+ },
66
+
67
+ "git-sourced-cookbook" => {
68
+ "10.10.10" => [ ["git-sourced-cookbook-dep", "= 1.0.0"] ]
69
+ },
70
+
71
+ "remote-cb" => {
72
+ "0.1.0" => [ ],
73
+ "1.1.1" => [ ]
74
+ },
75
+
76
+ "local-cookbook-dep-one" => {
77
+ "1.5.0" => [ ]
78
+ },
79
+
80
+ "git-sourced-cookbook-dep" => {
81
+ "2.8.0" => [ ]
82
+ }
83
+
84
+ }
85
+ end
86
+ end
87
+
88
+ shared_context("chef server default source") do
89
+
90
+ let(:default_source) { [:chef_server, "https://chef.example.com"] }
91
+
92
+ let(:external_cookbook_universe) do
93
+ {
94
+ "nginx" => {
95
+ "1.0.0" => [ [ "apt", "~> 2.0" ], [ "yum", "~> 1.0" ] ],
96
+ },
97
+
98
+ "mysql" => {
99
+ "5.0.0" => [ ],
100
+ },
101
+
102
+ "local-cookbook" => {
103
+ "9.9.9" => [ ["local-cookbook-on-community-dep", "= 1.0.0"] ]
104
+ },
105
+
106
+ "remote-cb" => {
107
+ "1.1.1" => [ ]
108
+ },
109
+
110
+ "git-sourced-cookbook" => {
111
+ "10.10.10" => [ ["git-sourced-cookbook-dep", "= 1.0.0"] ]
112
+ },
113
+
114
+ "private-cookbook" => {
115
+ "0.1.0" => [ ]
116
+ },
117
+
118
+ "local-cookbook-dep-one" => {
119
+ "1.6.0" => [ ]
120
+ },
121
+
122
+ "git-sourced-cookbook-dep" => {
123
+ "2.9.0" => [ ]
124
+ }
125
+
126
+
127
+ }
128
+ end
129
+ end
130
+
131
+
132
+ before do
133
+ expect(policyfile.errors).to eq([])
134
+ end
135
+
136
+ context "Given no local or git cookbooks, no default source, and an empty run list" do
137
+
138
+ let(:run_list) { [] }
139
+
140
+ it "has an empty set of demands" do
141
+ expect(demands).to eq([])
142
+ end
143
+
144
+ it "uses an empty universe for dependencies" do
145
+ expect(policyfile.artifacts_graph).to eq({})
146
+ end
147
+
148
+ it "has an empty solution" do
149
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
150
+ expect(policyfile.graph_solution).to eq({})
151
+ end
152
+ end
153
+
154
+ context "Given a run list and no local or git cookbooks" do
155
+
156
+ let(:run_list) { ["remote-cb"] }
157
+
158
+ context "And the default source is the community site" do
159
+
160
+ include_context "community default source"
161
+
162
+ it "has an unconstrained demand on the required cookbooks" do
163
+ expect(demands).to eq([["remote-cb", ">= 0.0.0"]])
164
+ end
165
+
166
+ it "uses the community site universe for dependencies" do
167
+ expect(policyfile.artifacts_graph).to eq(external_cookbook_universe)
168
+ end
169
+
170
+ it "uses the community cookbook in the solution" do
171
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
172
+ expect(policyfile.graph_solution).to eq({"remote-cb" => "1.1.1"})
173
+ end
174
+
175
+ end
176
+
177
+ context "And the default source is the chef-server" do
178
+
179
+ include_context "chef server default source"
180
+
181
+ it "has an unconstrained demand on the required cookbooks" do
182
+ expect(demands).to eq([["remote-cb", ">= 0.0.0"]])
183
+ end
184
+
185
+ it "uses the chef-server universe for dependencies" do
186
+ expect(policyfile.artifacts_graph).to eq(external_cookbook_universe)
187
+ end
188
+
189
+ it "uses the chef-server cookbook in the solution" do
190
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
191
+ expect(policyfile.graph_solution).to eq({"remote-cb" => "1.1.1"})
192
+ end
193
+ end
194
+ end
195
+
196
+ context "Given a local cookbook and only that cookbook in the run list" do
197
+
198
+ let(:run_list) { ['local-cookbook'] }
199
+
200
+ before do
201
+ policyfile.dsl.cookbook('local-cookbook', path: "/foo")
202
+ policyfile.cookbook_spec_for("local-cookbook").stub(:version).and_return("2.3.4")
203
+ policyfile.cookbook_spec_for("local-cookbook").stub(:dependencies).and_return([])
204
+ end
205
+
206
+ it "demands a solution using the local cookbook" do
207
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"]])
208
+ end
209
+
210
+ it "includes the local cookbook in the artifact universe" do
211
+ expected_artifacts_graph = {
212
+ "local-cookbook" => { "2.3.4" => [] }
213
+ }
214
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
215
+ end
216
+
217
+ end
218
+
219
+ context "Given a local cookbook with a dependency and only the local cookbook in the run list" do
220
+
221
+ let(:run_list) { ['local-cookbook'] }
222
+
223
+ context "And the default source is the community site" do
224
+
225
+ include_context "community default source"
226
+
227
+ before do
228
+ policyfile.dsl.cookbook("local-cookbook", path: "foo/")
229
+ policyfile.cookbook_spec_for("local-cookbook").stub(:ensure_cached)
230
+ policyfile.cookbook_spec_for("local-cookbook").stub(:version).and_return("2.3.4")
231
+ policyfile.cookbook_spec_for("local-cookbook").stub(:dependencies).and_return([ [ "local-cookbook-dep-one", "~> 1.0"] ])
232
+ end
233
+
234
+ it "demands a solution using the local cookbook" do
235
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"]])
236
+ end
237
+
238
+ it "overrides the community site universe with the local cookbook and its dependencies" do
239
+ expected_artifacts_graph = external_cookbook_universe.dup
240
+ expected_artifacts_graph["local-cookbook"] = {
241
+ "2.3.4" => [ [ "local-cookbook-dep-one", "~> 1.0" ] ]
242
+ }
243
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
244
+ end
245
+
246
+ it "uses the local cookbook in the solution and gets dependencies remotely" do
247
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
248
+ expect(policyfile.graph_solution).to eq({"local-cookbook" => "2.3.4", "local-cookbook-dep-one" => "1.5.0"})
249
+ end
250
+
251
+ end
252
+ context "And the default source is the chef server" do
253
+
254
+ include_context "chef server default source"
255
+
256
+ before do
257
+ policyfile.dsl.cookbook("local-cookbook", path: "foo/")
258
+ policyfile.cookbook_spec_for("local-cookbook").stub(:ensure_cached)
259
+ policyfile.cookbook_spec_for("local-cookbook").stub(:version).and_return("2.3.4")
260
+ policyfile.cookbook_spec_for("local-cookbook").stub(:dependencies).and_return([ [ "local-cookbook-dep-one", "~> 1.0"] ])
261
+ end
262
+
263
+ it "demands a solution using the local cookbook" do
264
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"]])
265
+ end
266
+
267
+ it "overrides the chef server universe with the local cookbook and its dependencies" do
268
+ # all versions of "local-cookbook" from the cookbook site universe
269
+ # should be removed so we won't run into trouble if there's a community
270
+ # cookbook with the same name and version but different deps.
271
+ expected_artifacts_graph = external_cookbook_universe.dup
272
+ expected_artifacts_graph["local-cookbook"] = {
273
+ "2.3.4" => [ [ "local-cookbook-dep-one", "~> 1.0" ] ]
274
+ }
275
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
276
+ end
277
+
278
+ it "uses the local cookbook in the solution and gets dependencies remotely" do
279
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
280
+ expect(policyfile.graph_solution).to eq({"local-cookbook" => "2.3.4", "local-cookbook-dep-one" => "1.6.0"})
281
+ end
282
+
283
+ end
284
+ end
285
+
286
+ context "Given a git-sourced cookbook with no dependencies and only the git cookbook in the run list" do
287
+
288
+ let(:run_list) { ["git-sourced-cookbook"] }
289
+
290
+ before do
291
+ policyfile.dsl.cookbook("git-sourced-cookbook", git: "git://git.example.org:user/a-cookbook.git")
292
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:ensure_cached)
293
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:version).and_return("8.6.7")
294
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:dependencies).and_return([ ])
295
+ end
296
+
297
+ it "demands a solution using the git sourced cookbook" do
298
+ expect(demands).to eq([["git-sourced-cookbook", "= 8.6.7"]])
299
+ end
300
+
301
+ it "includes the git-sourced cookbook in the universe graph" do
302
+ expected_artifacts_graph = {
303
+ "git-sourced-cookbook" => { "8.6.7" => [ ] }
304
+ }
305
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
306
+ end
307
+
308
+ it "uses the git sourced cookbook in the solution" do
309
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
310
+ expect(policyfile.graph_solution).to eq({"git-sourced-cookbook" => "8.6.7"})
311
+ end
312
+ end
313
+
314
+ context "Given a git-sourced cookbook with a dependency and only the git cookbook in the run list" do
315
+
316
+ let(:run_list) { ["git-sourced-cookbook"] }
317
+
318
+ before do
319
+ policyfile.dsl.cookbook("git-sourced-cookbook", git: "git://git.example.org:user/a-cookbook.git")
320
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:ensure_cached)
321
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:version).and_return("8.6.7")
322
+ policyfile.cookbook_spec_for("git-sourced-cookbook").stub(:dependencies).and_return([ ["git-sourced-cookbook-dep", "~> 2.2" ] ])
323
+ end
324
+
325
+ context "And the default source is the community site" do
326
+
327
+ include_context "community default source"
328
+
329
+ it "demands a solution using the git sourced cookbook" do
330
+ expect(demands).to eq([["git-sourced-cookbook", "= 8.6.7"]])
331
+ end
332
+
333
+ it "overrides the community site universe with the git-sourced cookbook and deps" do
334
+ expected_artifacts_graph = external_cookbook_universe.dup
335
+ expected_artifacts_graph["git-sourced-cookbook"] = {
336
+ "8.6.7" => [ ["git-sourced-cookbook-dep", "~> 2.2" ] ]
337
+ }
338
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
339
+ end
340
+
341
+ it "uses the git sourced cookbook with remote dependencies in the solution" do
342
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
343
+ expect(policyfile.graph_solution).to eq({"git-sourced-cookbook" => "8.6.7", "git-sourced-cookbook-dep" => "2.8.0"})
344
+ end
345
+ end
346
+
347
+ context "And the default source is the chef server" do
348
+
349
+ include_context "chef server default source"
350
+
351
+ it "demands a solution using the git sourced cookbook" do
352
+ expect(demands).to eq([["git-sourced-cookbook", "= 8.6.7"]])
353
+ end
354
+
355
+ it "overrides the chef server universe with the git-sourced cookbook and deps" do
356
+ expected_artifacts_graph = external_cookbook_universe.dup
357
+ expected_artifacts_graph["git-sourced-cookbook"] = {
358
+ "8.6.7" => [ ["git-sourced-cookbook-dep", "~> 2.2" ] ]
359
+ }
360
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
361
+ end
362
+
363
+ it "uses the git sourced cookbook with remote dependencies in the solution" do
364
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
365
+ expect(policyfile.graph_solution).to eq({"git-sourced-cookbook" => "8.6.7", "git-sourced-cookbook-dep" => "2.9.0"})
366
+ end
367
+ end
368
+ end
369
+
370
+ context "Given a local cookbook with a run list containing the local cookbook and another cookbook" do
371
+
372
+ let(:run_list) { ['local-cookbook', 'remote-cb'] }
373
+
374
+ before do
375
+ policyfile.dsl.cookbook("local-cookbook", path: "foo/")
376
+ policyfile.cookbook_spec_for("local-cookbook").stub(:ensure_cached)
377
+ policyfile.cookbook_spec_for("local-cookbook").stub(:version).and_return("2.3.4")
378
+ policyfile.cookbook_spec_for("local-cookbook").stub(:dependencies).and_return([])
379
+ end
380
+
381
+ context "And the default source is the community site" do
382
+
383
+ include_context "community default source"
384
+
385
+ it "demands a solution with the local cookbook and any version of the other cookbook" do
386
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"], ["remote-cb", ">= 0.0.0"]])
387
+ end
388
+
389
+ it "overrides the community universe with the local cookbook and deps" do
390
+ expected_artifacts_graph = external_cookbook_universe.dup
391
+ expected_artifacts_graph["local-cookbook"] = { "2.3.4" => [ ] }
392
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
393
+ end
394
+
395
+ it "uses the locally specified cookbook and remote cookbooks in the solution" do
396
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
397
+ expect(policyfile.graph_solution).to eq({"local-cookbook" => "2.3.4", "remote-cb" => "1.1.1"})
398
+ end
399
+
400
+ end
401
+
402
+ context "And the default source is the chef server" do
403
+
404
+ include_context "chef server default source"
405
+
406
+ it "demands a solution with the local cookbook and any version of the other cookbook" do
407
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"], ["remote-cb", ">= 0.0.0"]])
408
+ end
409
+
410
+ it "overrides the chef-server universe with the local cookbook and deps" do
411
+ expected_artifacts_graph = external_cookbook_universe.dup
412
+ expected_artifacts_graph["local-cookbook"] = { "2.3.4" => [ ] }
413
+ expect(policyfile.artifacts_graph).to eq(expected_artifacts_graph)
414
+ end
415
+
416
+ it "uses the locally specified cookbook and remote cookbooks in the solution" do
417
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
418
+ expect(policyfile.graph_solution).to eq({"local-cookbook" => "2.3.4", "remote-cb" => "1.1.1"})
419
+ end
420
+
421
+ end
422
+ end
423
+
424
+ context "given a cookbook with a version constraint in the policyfile" do
425
+
426
+ include_context "community default source"
427
+
428
+ let(:run_list) { ['remote-cb'] }
429
+
430
+ before do
431
+ policyfile.dsl.cookbook("remote-cb", "~> 0.1")
432
+ end
433
+
434
+ it "demands a solution that matches the version constraint in the policyfile" do
435
+ expect(demands).to eq([["remote-cb", "~> 0.1"]])
436
+ end
437
+
438
+ it "emits a solution that satisfies the policyfile constraint" do
439
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
440
+ expect(policyfile.graph_solution).to eq({"remote-cb" => "0.1.0"})
441
+ end
442
+
443
+ end
444
+
445
+ context "given a cookbook that isn't in the run list is specified with a version constraint in the policyfile" do
446
+
447
+ include_context "community default source"
448
+
449
+ let(:run_list) { ['local-cookbook'] }
450
+
451
+ before do
452
+ policyfile.dsl.cookbook("remote-cb", "~> 0.1")
453
+
454
+ policyfile.dsl.cookbook("local-cookbook", path: "foo/")
455
+
456
+ policyfile.cookbook_spec_for("local-cookbook").stub(:ensure_cached)
457
+ policyfile.cookbook_spec_for("local-cookbook").stub(:version).and_return("2.3.4")
458
+ policyfile.cookbook_spec_for("local-cookbook").stub(:dependencies).and_return([])
459
+ end
460
+
461
+ it "demands a solution that matches the version constraint in the policyfile" do
462
+ expect(demands).to eq([["local-cookbook", "= 2.3.4"], ["remote-cb", "~> 0.1"]])
463
+ end
464
+
465
+ it "emits a solution that satisfies the policyfile constraint" do
466
+ expect(policyfile).to receive(:ensure_cache_dir_exists)
467
+ expect(policyfile.graph_solution).to eq({"local-cookbook" => "2.3.4", "remote-cb" => "0.1.0"})
468
+ end
469
+
470
+ it "builds a policyfile lock from the constraints" do
471
+ pending
472
+ expect(policyfile).to receive(:cache_path).and_return(Pathname.new("~/.nopenope/cache"))
473
+ expect(policyfile.lock).to eq(:wat)
474
+ end
475
+
476
+ end
477
+
478
+ context "Given a run_list with roles" do
479
+ it "expands the roles from the given role source" do
480
+ pending
481
+ end
482
+ end
483
+
484
+ end