puppet-library 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,314 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'spec_helper'
19
+
20
+ class Hash
21
+ def deep_clone
22
+ other = clone
23
+ keys.each do |key|
24
+ other[key] = self[key].clone
25
+ end
26
+ other
27
+ end
28
+ end
29
+
30
+ module PuppetLibrary::Forge
31
+ describe Multi do
32
+ let(:subforge_one) { double('subforge_one').as_null_object }
33
+ let(:subforge_two) { double('subforge_two').as_null_object }
34
+ let(:multi_forge) do
35
+ forge = Multi.new
36
+ forge.add_forge(subforge_one)
37
+ forge.add_forge(subforge_two)
38
+ return forge
39
+ end
40
+
41
+ describe "#search_modules" do
42
+ context "when no modules match in any subforge" do
43
+ it "returns an empty array" do
44
+ expect(subforge_one).to receive(:search_modules).with("apache").and_return([])
45
+ expect(subforge_two).to receive(:search_modules).with("apache").and_return([])
46
+
47
+ result = multi_forge.search_modules("apache")
48
+
49
+ expect(result).to eq []
50
+ end
51
+ end
52
+
53
+ context "when modules match in subforges" do
54
+ it "returns an array with all of them" do
55
+ apache = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "version" => "1"}
56
+ concat = { "author" => "puppetlabs", "full_name" => "puppetlabs/concat", "version" => "1"}
57
+ expect(subforge_one).to receive(:search_modules).with("puppetlabs").and_return([apache])
58
+ expect(subforge_two).to receive(:search_modules).with("puppetlabs").and_return([concat])
59
+
60
+ result = multi_forge.search_modules("puppetlabs")
61
+
62
+ result = result.sort_by {|r| r["full_name"]}
63
+ expect(result).to eq [apache, concat]
64
+ end
65
+ end
66
+
67
+ context "when modules match in subforges that overlap" do
68
+ it "favors the details of the ones in the first repository" do
69
+ apache_1 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "one", "version" => "1"}
70
+ apache_2 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "two", "version" => "2"}
71
+ expect(subforge_one).to receive(:search_modules).with("puppetlabs").and_return([apache_1])
72
+ expect(subforge_two).to receive(:search_modules).with("puppetlabs").and_return([apache_2])
73
+
74
+ result = multi_forge.search_modules("puppetlabs")
75
+
76
+ expect(result.size).to eq 1
77
+ expect(result.first["desc"]).to eq "one"
78
+ end
79
+
80
+ it "sets the version to the maximum version" do
81
+ apache_1 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "one", "version" => "1"}
82
+ apache_2 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "two", "version" => "2"}
83
+ expect(subforge_one).to receive(:search_modules).with("puppetlabs").and_return([apache_1])
84
+ expect(subforge_two).to receive(:search_modules).with("puppetlabs").and_return([apache_2])
85
+
86
+ result = multi_forge.search_modules("puppetlabs")
87
+
88
+ expect(result.size).to eq 1
89
+ expect(result.first["version"]).to eq "2"
90
+ end
91
+
92
+ it "combines the available tags" do
93
+ apache_1 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "one", "version" => "1", "tag_list" => ["a", "b"]}
94
+ apache_2 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "two", "version" => "2", "tag_list" => ["a", "c"]}
95
+ expect(subforge_one).to receive(:search_modules).with("puppetlabs").and_return([apache_1])
96
+ expect(subforge_two).to receive(:search_modules).with("puppetlabs").and_return([apache_2])
97
+
98
+ result = multi_forge.search_modules("puppetlabs")
99
+
100
+ tags = result.first["tag_list"]
101
+ expect(tags).to eq ["a", "b", "c"]
102
+ end
103
+
104
+ it "combines the available versions, in order" do
105
+ apache_3 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "two", "version" => "3", "releases" => [{"version" => "3"}]}
106
+ apache_1 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "one", "version" => "1", "releases" => [{"version" => "1"}]}
107
+ apache_2 = { "author" => "puppetlabs", "full_name" => "puppetlabs/apache", "desc" => "two", "version" => "2", "releases" => [{"version" => "2"}]}
108
+ expect(subforge_one).to receive(:search_modules).with("puppetlabs").and_return([apache_1, apache_3])
109
+ expect(subforge_two).to receive(:search_modules).with("puppetlabs").and_return([apache_2])
110
+
111
+ result = multi_forge.search_modules("puppetlabs")
112
+
113
+ tags = result.first["releases"]
114
+ expect(tags).to eq [ {"version" => "3"}, {"version" => "2"}, {"version" => "1"} ]
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#get_module_buffer" do
120
+ context "when the module is found in a subforge" do
121
+ it "returns the module from the first subforge it's found in" do
122
+ expect(subforge_one).to receive(:get_module_buffer).with("puppetlabs", "apache", "1.0.0").and_return("puppetlabs/apache module: 1.0.0")
123
+ expect(subforge_two).not_to receive(:get_mo_bufferdule_buffer)
124
+
125
+ mod = multi_forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
126
+
127
+ expect(mod).to eq "puppetlabs/apache module: 1.0.0"
128
+ end
129
+ end
130
+
131
+ context "when the module is not found in any subforge" do
132
+ it "raises an error" do
133
+ expect(subforge_one).to receive(:get_module_buffer).with("puppetlabs", "nonexistant", "1.0.0").and_raise(ModuleNotFound)
134
+ expect(subforge_two).to receive(:get_module_buffer).with("puppetlabs", "nonexistant", "1.0.0").and_raise(ModuleNotFound)
135
+
136
+ expect {
137
+ multi_forge.get_module_buffer("puppetlabs", "nonexistant", "1.0.0")
138
+ }.to raise_exception(ModuleNotFound)
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "#get_module_metadata" do
144
+ context "when versions of the module are found in subforges" do
145
+ it "combines the metadata" do
146
+ apache_module_metadata_one = {
147
+ "full_name" => "puppetlabs-apache", "releases" => [{"version"=>"1.0.0"}]
148
+ }
149
+ apache_module_metadata_two = {
150
+ "full_name" => "puppetlabs-apache", "releases" => [{"version"=>"2.0.0"}]
151
+ }
152
+ expect(subforge_one).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(apache_module_metadata_one)
153
+ expect(subforge_two).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(apache_module_metadata_two)
154
+
155
+ metadata_list = multi_forge.get_module_metadata("puppetlabs", "apache")
156
+
157
+ expect(metadata_list).to eq({
158
+ "full_name" => "puppetlabs-apache",
159
+ "releases" => [{"version"=>"1.0.0"}, {"version"=>"2.0.0"}]
160
+ })
161
+ end
162
+ end
163
+
164
+ context "when no versions of the module are found in any subforge" do
165
+ it "raises an error" do
166
+ expect(subforge_one).to receive(:get_module_metadata).with("puppetlabs", "apache").and_raise(ModuleNotFound)
167
+ expect(subforge_two).to receive(:get_module_metadata).with("puppetlabs", "apache").and_raise(ModuleNotFound)
168
+
169
+ expect {
170
+ multi_forge.get_module_metadata("puppetlabs", "apache")
171
+ }.to raise_exception(ModuleNotFound)
172
+ end
173
+ end
174
+
175
+ context "when the same version of a module is found in multiple forges" do
176
+ it "returns the one from the first forge it appears in" do
177
+ apache_module_metadata_one = {
178
+ "full_name" => "puppetlabs-apache", "releases" => [{"version"=>"1.0.0", "forge" => "one"}]
179
+ }
180
+ apache_module_metadata_two = {
181
+ "full_name" => "puppetlabs-apache", "releases" => [{"version"=>"1.0.0", "forge" => "two"}]
182
+ }
183
+ expect(subforge_one).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(apache_module_metadata_one)
184
+ expect(subforge_two).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(apache_module_metadata_two)
185
+
186
+ metadata_list = multi_forge.get_module_metadata("puppetlabs", "apache")
187
+
188
+ expect(metadata_list).to eq({
189
+ "full_name" => "puppetlabs-apache",
190
+ "releases" => [{"version"=>"1.0.0", "forge"=>"one"}]
191
+ })
192
+ end
193
+ end
194
+ end
195
+
196
+ describe "#get_module_metadata_with_dependencies" do
197
+ context "when no versions of the module are found in any subforge" do
198
+ it "raises an error" do
199
+ expect(subforge_one).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_raise(ModuleNotFound)
200
+ expect(subforge_two).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_raise(ModuleNotFound)
201
+
202
+ expect {
203
+ multi_forge.get_module_metadata_with_dependencies("puppetlabs", "apache", nil)
204
+ }.to raise_error(ModuleNotFound)
205
+ end
206
+ end
207
+
208
+ context "when versions of the module are found in subforges" do
209
+ it "a merged hash of the metadata" do
210
+ base_metadata = {
211
+ "puppetlabs/apache" => [ ],
212
+ "puppetlabs/stdlib" => [
213
+ {
214
+ "version" => "2.4.0",
215
+ "dependencies" => [ ]
216
+ }
217
+ ],
218
+ "puppetlabs/concat" => [
219
+ {
220
+ "version" => "1.0.0",
221
+ "dependencies" => [ ]
222
+ }
223
+ ]
224
+ }
225
+ apache_module_metadata_one = base_metadata.deep_clone.tap do |meta|
226
+ meta["puppetlabs/apache"] << {
227
+ "version" => "1",
228
+ "dependencies" => [
229
+ [ "puppetlabs/concat", ">= 1.0.0" ],
230
+ [ "puppetlabs/stdlib", ">= 2.4.0" ]
231
+ ]
232
+ }
233
+ end
234
+ apache_module_metadata_two = base_metadata.deep_clone.tap do |meta|
235
+ meta["puppetlabs/apache"] << {
236
+ "version" => "2",
237
+ "dependencies" => [
238
+ [ "puppetlabs/concat", ">= 1.0.0" ],
239
+ [ "puppetlabs/stdlib", ">= 2.4.0" ]
240
+ ]
241
+ }
242
+ end
243
+ expect(subforge_one).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_return(apache_module_metadata_one)
244
+ expect(subforge_two).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_return(apache_module_metadata_two)
245
+
246
+ metadata = multi_forge.get_module_metadata_with_dependencies("puppetlabs", "apache", nil)
247
+
248
+ expect(metadata["puppetlabs/apache"]).to eq [
249
+ {
250
+ "version"=>"1",
251
+ "dependencies"=> [["puppetlabs/concat", ">= 1.0.0"], ["puppetlabs/stdlib", ">= 2.4.0"]]
252
+ },
253
+ {
254
+ "version"=>"2",
255
+ "dependencies"=> [["puppetlabs/concat", ">= 1.0.0"], ["puppetlabs/stdlib", ">= 2.4.0"]]
256
+ }
257
+ ]
258
+ end
259
+ end
260
+
261
+ context "when the same version of a module is found in multiple forges" do
262
+ it "favors the one it finds first" do
263
+ base_metadata = {
264
+ "puppetlabs/apache" => [ ],
265
+ "puppetlabs/stdlib" => [
266
+ {
267
+ "version" => "2.4.0",
268
+ "dependencies" => [ ]
269
+ }
270
+ ],
271
+ "puppetlabs/concat" => [
272
+ {
273
+ "version" => "1.0.0",
274
+ "dependencies" => [ ]
275
+ }
276
+ ]
277
+ }
278
+ apache_module_metadata_one = base_metadata.deep_clone.tap do |meta|
279
+ meta["puppetlabs/apache"] << {
280
+ "version" => "1",
281
+ "forge" => "1",
282
+ "dependencies" => [
283
+ [ "puppetlabs/concat", ">= 1.0.0" ],
284
+ [ "puppetlabs/stdlib", ">= 2.4.0" ]
285
+ ]
286
+ }
287
+ end
288
+ apache_module_metadata_two = base_metadata.deep_clone.tap do |meta|
289
+ meta["puppetlabs/apache"] << {
290
+ "version" => "1",
291
+ "forge" => "2",
292
+ "dependencies" => [
293
+ [ "puppetlabs/concat", ">= 1.0.0" ],
294
+ [ "puppetlabs/stdlib", ">= 2.4.0" ]
295
+ ]
296
+ }
297
+ end
298
+ expect(subforge_one).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_return(apache_module_metadata_one)
299
+ expect(subforge_two).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_return(apache_module_metadata_two)
300
+
301
+ metadata = multi_forge.get_module_metadata_with_dependencies("puppetlabs", "apache", nil)
302
+
303
+ expect(metadata["puppetlabs/apache"]).to eq [
304
+ {
305
+ "version"=>"1",
306
+ "forge"=>"1",
307
+ "dependencies"=> [["puppetlabs/concat", ">= 1.0.0"], ["puppetlabs/stdlib", ">= 2.4.0"]]
308
+ },
309
+ ]
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,206 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'spec_helper'
19
+
20
+ module PuppetLibrary::Forge
21
+ describe Proxy do
22
+ let(:http_client) { double('http_client') }
23
+ let(:query_cache) { PuppetLibrary::Http::Cache::InMemory.new }
24
+ let(:download_cache) { PuppetLibrary::Http::Cache::InMemory.new }
25
+ let(:forge) { Proxy.new("http://puppetforge.example.com", query_cache, download_cache, http_client) }
26
+
27
+ describe "url" do
28
+ it "defaults to HTTP, when protocol not specified" do
29
+ forge = Proxy.new("forge.puppetlabs.com", query_cache, download_cache, http_client)
30
+
31
+ expect(http_client).to receive(:get).with("http:\/\/forge.puppetlabs.com/puppetlabs/apache.json").and_return('{"puppetlabs/apache":[]}')
32
+
33
+ forge.get_module_metadata("puppetlabs", "apache")
34
+ end
35
+
36
+ it "copes with a trailing slash" do
37
+ forge = Proxy.new("forge.puppetlabs.com/", query_cache, download_cache, http_client)
38
+
39
+ expect(http_client).to receive(:get).with("http:\/\/forge.puppetlabs.com/puppetlabs/apache.json").and_return('{"puppetlabs/apache":[]}')
40
+
41
+ forge.get_module_metadata("puppetlabs", "apache")
42
+ end
43
+ end
44
+
45
+ describe "#search_modules" do
46
+ it "forwards the request directly" do
47
+ search_results = '["a","b","c"]'
48
+ expect(http_client).to receive(:get).
49
+ with("http://puppetforge.example.com/modules.json?q=apache").
50
+ and_return(search_results)
51
+
52
+ result = forge.search_modules("apache")
53
+ expect(result).to eq JSON.parse(search_results)
54
+ end
55
+
56
+ it "caches the results" do
57
+ search_results = '["a","b","c"]'
58
+ expect(http_client).to receive(:get).once.
59
+ with("http://puppetforge.example.com/modules.json?q=apache").
60
+ and_return(search_results)
61
+
62
+ forge.search_modules("apache")
63
+ forge.search_modules("apache")
64
+ end
65
+
66
+ context "when the query is nil" do
67
+ it "doesn't forward it as a request parameter" do
68
+ expect(http_client).to receive(:get).
69
+ with("http://puppetforge.example.com/modules.json").
70
+ and_return("[]")
71
+
72
+ forge.search_modules(nil)
73
+ end
74
+ end
75
+ end
76
+
77
+ describe "#get_module_buffer" do
78
+ context "module version not found" do
79
+ it "raises an error" do
80
+ expect(http_client).to receive(:get).
81
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
82
+ and_raise(OpenURI::HTTPError.new("404 Not Found", "Module not found"))
83
+
84
+ expect {
85
+ forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
86
+ }.to raise_error ModuleNotFound
87
+ end
88
+ end
89
+
90
+ context "when there is an error downloading the archive" do
91
+ it "raises an error" do
92
+ expect(http_client).to receive(:get).
93
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
94
+ and_return('{"puppetlabs/apache":[{"version":"1.0.0","file":"/puppetlabs/apache.tgz","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}')
95
+ expect(http_client).to receive(:download).
96
+ with("http://puppetforge.example.com/puppetlabs/apache.tgz").
97
+ and_raise(OpenURI::HTTPError.new("404 Not Found", "Module not found"))
98
+
99
+ expect {
100
+ forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
101
+ }.to raise_error ModuleNotFound
102
+ end
103
+ end
104
+
105
+ context "when the module is found" do
106
+ before do
107
+ allow(http_client).to receive(:get).
108
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
109
+ and_return('{"puppetlabs/apache":[{"version":"1.0.0","file":"/puppetlabs/apache.tgz","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}')
110
+ end
111
+
112
+ it "returns a buffer containing the module archive" do
113
+ file_buffer = "file buffer"
114
+ expect(http_client).to receive(:download).
115
+ with("http://puppetforge.example.com/puppetlabs/apache.tgz").
116
+ and_return(file_buffer)
117
+
118
+ result = forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
119
+ expect(result).to eq file_buffer
120
+ end
121
+
122
+ it "caches the download" do
123
+ file_buffer = "file buffer"
124
+ expect(http_client).to receive(:download).once.
125
+ with("http://puppetforge.example.com/puppetlabs/apache.tgz").
126
+ and_return(file_buffer)
127
+
128
+ forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
129
+ forge.get_module_buffer("puppetlabs", "apache", "1.0.0")
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "#get_module_metadata" do
135
+ context "when the module doesn't exist" do
136
+ it "raises an error" do
137
+ expect(http_client).to receive(:get).
138
+ with("http://puppetforge.example.com/puppetlabs/apache.json").
139
+ and_raise(OpenURI::HTTPError.new("404 Not Found", "Module not found"))
140
+
141
+ expect {
142
+ forge.get_module_metadata("puppetlabs", "apache")
143
+ }.to raise_error(ModuleNotFound)
144
+ end
145
+ end
146
+
147
+ context "when versions of the module exist" do
148
+ it "forwards the query directly" do
149
+ response = '{"puppetlabs/apache":[{"version":"1.0.0","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}'
150
+ expect(http_client).to receive(:get).
151
+ with("http://puppetforge.example.com/puppetlabs/apache.json").
152
+ and_return(response)
153
+
154
+ metadata = forge.get_module_metadata("puppetlabs", "apache")
155
+ expect(metadata).to eq JSON.parse(response)
156
+ end
157
+
158
+ it "caches requests" do
159
+ expect(http_client).to receive(:get).once.
160
+ with("http://puppetforge.example.com/puppetlabs/apache.json").
161
+ and_return('{}')
162
+
163
+ forge.get_module_metadata("puppetlabs", "apache")
164
+ forge.get_module_metadata("puppetlabs", "apache")
165
+ end
166
+ end
167
+ end
168
+
169
+ describe "#get_module_metadata_with_dependencies" do
170
+ context "the module isn't found" do
171
+ it "raises an error" do
172
+ expect(http_client).to receive(:get).
173
+ with("http://puppetforge.example.com/api/v1/releases.json?module=nonexistant/nonexistant").
174
+ and_raise(OpenURI::HTTPError.new("410 Gone", "Module not found"))
175
+
176
+ expect {
177
+ forge.get_module_metadata_with_dependencies("nonexistant", "nonexistant", nil)
178
+ }.to raise_error ModuleNotFound
179
+ end
180
+ end
181
+
182
+ context "when the module is found" do
183
+ it "forwards the request directly" do
184
+ response = '{"puppetlabs/apache":[{"version":"1.0.0","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}'
185
+ expect(http_client).to receive(:get).
186
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache&version=1.0.0").
187
+ and_return(response)
188
+
189
+ result = forge.get_module_metadata_with_dependencies("puppetlabs", "apache", "1.0.0")
190
+
191
+ expect(result).to eq JSON.parse(response)
192
+ end
193
+
194
+ it "caches the result" do
195
+ response = '{"puppetlabs/apache":[{"version":"1.0.0","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}'
196
+ expect(http_client).to receive(:get).once.
197
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache&version=1.0.0").
198
+ and_return(response)
199
+
200
+ forge.get_module_metadata_with_dependencies("puppetlabs", "apache", "1.0.0")
201
+ forge.get_module_metadata_with_dependencies("puppetlabs", "apache", "1.0.0")
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
@@ -19,14 +19,9 @@ require 'spec_helper'
19
19
 
20
20
  module PuppetLibrary
21
21
  describe PuppetLibrary do
22
- let(:module_repo) do
23
- module_repo = double(ModuleRepo::Multi)
24
- allow(ModuleRepo::Multi).to receive(:new).and_return(module_repo)
25
- return module_repo
26
- end
27
22
  let(:forge) do
28
- forge = double(Forge)
29
- allow(Forge).to receive(:new).and_return(forge)
23
+ forge = double(Forge::Multi).as_null_object
24
+ allow(Forge::Multi).to receive(:new).and_return(forge)
30
25
  return forge
31
26
  end
32
27
  let(:server) do
@@ -91,13 +86,12 @@ module PuppetLibrary
91
86
  end
92
87
 
93
88
  context "when using --proxy option" do
94
- it "adds a proxy module repository for each option specified" do
89
+ it "adds a proxy module forge for each option specified" do
95
90
  proxy1 = double('proxy1')
96
91
  proxy2 = double('proxy2')
97
- expect(ModuleRepo::Proxy).to receive(:new).with("http://forge1.example.com").and_return(proxy1)
98
- expect(ModuleRepo::Proxy).to receive(:new).with("http://forge2.example.com").and_return(proxy2)
99
- expect(Forge).to receive(:new).with(module_repo).and_return(forge)
100
- expect(module_repo).to receive(:add_repo).twice
92
+ expect(Forge::Proxy).to receive(:new).with("http://forge1.example.com").and_return(proxy1)
93
+ expect(Forge::Proxy).to receive(:new).with("http://forge2.example.com").and_return(proxy2)
94
+ expect(forge).to receive(:add_forge).twice
101
95
  expect(Rack::Server).to receive(:start).with(default_options)
102
96
 
103
97
  library.go(["--proxy", "http://forge1.example.com", "--proxy", "http://forge2.example.com"])
@@ -105,14 +99,13 @@ module PuppetLibrary
105
99
  end
106
100
 
107
101
  context "when using --module-dir option" do
108
- it "adds a module repository to the server for each module directory" do
109
- directory_repo_1 = double("directory_repo_1")
110
- directory_repo_2 = double("directory_repo_2")
111
- expect(ModuleRepo::Directory).to receive(:new).with("dir1").and_return(directory_repo_1)
112
- expect(ModuleRepo::Directory).to receive(:new).with("dir2").and_return(directory_repo_2)
113
- expect(Forge).to receive(:new).with(module_repo).and_return(forge)
114
- expect(module_repo).to receive(:add_repo).with(directory_repo_1)
115
- expect(module_repo).to receive(:add_repo).with(directory_repo_2)
102
+ it "adds a directory forge to the server for each module directory" do
103
+ directory_forge_1 = double("directory_forge_1")
104
+ directory_forge_2 = double("directory_forge_2")
105
+ expect(Forge::Directory).to receive(:new).with("dir1").and_return(directory_forge_1)
106
+ expect(Forge::Directory).to receive(:new).with("dir2").and_return(directory_forge_2)
107
+ expect(forge).to receive(:add_forge).with(directory_forge_1)
108
+ expect(forge).to receive(:add_forge).with(directory_forge_2)
116
109
  expect(Rack::Server).to receive(:start).with(default_options)
117
110
 
118
111
  library.go(["--module-dir", "dir1", "--module-dir", "dir2"])
@@ -122,9 +115,8 @@ module PuppetLibrary
122
115
  context "when no proxy URLs or module directories specified" do
123
116
  it "proxies the Puppet Forge" do
124
117
  proxy = double("proxy")
125
- expect(ModuleRepo::Proxy).to receive(:new).with("http://forge.puppetlabs.com").and_return(proxy)
126
- expect(Forge).to receive(:new).with(module_repo).and_return(forge)
127
- expect(module_repo).to receive(:add_repo).with(proxy)
118
+ expect(Forge::Proxy).to receive(:new).with("http://forge.puppetlabs.com").and_return(proxy)
119
+ expect(forge).to receive(:add_forge).with(proxy)
128
120
  expect(Rack::Server).to receive(:start).with(default_options)
129
121
 
130
122
  library.go([])
@@ -135,8 +127,8 @@ module PuppetLibrary
135
127
  expect(log).to receive(:puts).with(/Port: default/)
136
128
  expect(log).to receive(:puts).with(/Host: default/)
137
129
  expect(log).to receive(:puts).with(/Server: default/)
138
- expect(log).to receive(:puts).with(/Repositories:/)
139
- expect(log).to receive(:puts).with(/- PuppetLibrary::ModuleRepo::Directory: \.\/modules/)
130
+ expect(log).to receive(:puts).with(/Forges:/)
131
+ expect(log).to receive(:puts).with(/- PuppetLibrary::Forge::Directory: \.\/modules/)
140
132
  library.go(["--module-dir", "./modules"])
141
133
  end
142
134
  end
data/spec/server_spec.rb CHANGED
@@ -28,6 +28,29 @@ module PuppetLibrary
28
28
  Server.new(forge)
29
29
  end
30
30
 
31
+ describe "GET /modules.json" do
32
+ it "renders the search result as JSON" do
33
+ search_results = [
34
+ {
35
+ "author" => "puppetlabs",
36
+ "name" => "apache",
37
+ "tag_list" => ["apache", "httpd"],
38
+ "releases" => [{"version"=>"0.0.1"}, {"version"=>"0.0.2"}],
39
+ "full_name" => "puppetlabs/apache",
40
+ "version" => "0.0.2",
41
+ "project_url" => "http://github.com/puppetlabs/puppetlabs-apache",
42
+ "desc" => "Puppet module for Apache"
43
+ }
44
+ ]
45
+ expect(forge).to receive(:search_modules).with("apache").and_return(search_results)
46
+
47
+ get "/modules.json?q=apache"
48
+
49
+ expect(last_response.body).to eq search_results.to_json
50
+ expect(last_response).to be_ok
51
+ end
52
+ end
53
+
31
54
  describe "GET /modules/<author>-<module>-<version>.tar.gz" do
32
55
  context "when the module is on the server" do
33
56
  it "serves the module" do
@@ -45,7 +68,7 @@ module PuppetLibrary
45
68
 
46
69
  context "when the module is not on the server" do
47
70
  it "returns an error" do
48
- expect(forge).to receive(:get_module_buffer).with("puppetlabs", "apache", "1.0.0").and_raise(ModuleNotFound)
71
+ expect(forge).to receive(:get_module_buffer).with("puppetlabs", "apache", "1.0.0").and_raise(Forge::ModuleNotFound)
49
72
 
50
73
  get "/modules/puppetlabs-apache-1.0.0.tar.gz"
51
74
 
@@ -77,7 +100,7 @@ module PuppetLibrary
77
100
 
78
101
  context "when no modules found" do
79
102
  it "returns an error" do
80
- expect(forge).to receive(:get_module_metadata).with("nonexistant", "nonexistant").and_raise(ModuleNotFound)
103
+ expect(forge).to receive(:get_module_metadata).with("nonexistant", "nonexistant").and_raise(Forge::ModuleNotFound)
81
104
 
82
105
  get "/nonexistant/nonexistant.json"
83
106
 
@@ -125,7 +148,7 @@ module PuppetLibrary
125
148
 
126
149
  context "when the module can't be found" do
127
150
  it "returns an error" do
128
- expect(forge).to receive(:get_module_metadata_with_dependencies).with("nonexistant", "nonexistant", nil).and_raise(ModuleNotFound)
151
+ expect(forge).to receive(:get_module_metadata_with_dependencies).with("nonexistant", "nonexistant", nil).and_raise(Forge::ModuleNotFound)
129
152
 
130
153
  get "/api/v1/releases.json?module=nonexistant/nonexistant"
131
154