puppet-library 0.0.2 → 0.1.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.
@@ -0,0 +1,63 @@
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::Http
21
+ describe Cache do
22
+
23
+ let(:cache) { Cache.new }
24
+
25
+ describe "#get" do
26
+ context "the first time it's called" do
27
+ it "returns the value from the provided block" do
28
+ greeting = cache.get("greeting") { "hello" }
29
+
30
+ expect(greeting).to eq "hello"
31
+ end
32
+ end
33
+
34
+ context "the second time it's called" do
35
+ it "returns the cached value" do
36
+ cache.get("greeting") { "hello" }
37
+ greeting = cache.get("greeting") { "hi" }
38
+
39
+ expect(greeting).to eq "hello"
40
+ end
41
+ end
42
+
43
+ context "when the cached value is falsey" do
44
+ it "returns the cached value" do
45
+ cache.get("greeting") { false }
46
+ greeting = cache.get("greeting") { true }
47
+
48
+ expect(greeting).to be false
49
+ end
50
+ end
51
+
52
+ context "when the time limit has expired" do
53
+ it "looks up the value again" do
54
+ cache = Cache.new(0)
55
+
56
+ greeting = cache.get("greeting") { "hi" }
57
+ greeting = cache.get("greeting") { "bye" }
58
+ expect(greeting).to eq "bye"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,44 @@
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::Http
21
+ describe HttpClient do
22
+ let(:client) { HttpClient.new }
23
+
24
+ before do
25
+ allow(client).to receive(:open_uri).with("http:://example.com").and_return(StringIO.new("Content"))
26
+ end
27
+
28
+ describe "#get" do
29
+ it "calls open() on the provided URL and reads the result" do
30
+ content = client.get("http:://example.com")
31
+
32
+ expect(content).to eq "Content"
33
+ end
34
+ end
35
+
36
+ describe "#download" do
37
+ it "calls open() on the provided URL" do
38
+ content = client.download("http:://example.com")
39
+
40
+ expect(content.read).to eq "Content"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
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::Http
21
+ describe Url do
22
+ describe "#normalize" do
23
+ it "leaves normal URLs alone" do
24
+ result = Url.normalize "http://localhost"
25
+ expect(result).to eq "http://localhost"
26
+ end
27
+
28
+ it "adds http:// to URI with no scheme" do
29
+ result = Url.normalize "localhost"
30
+ expect(result).to eq "http://localhost"
31
+ end
32
+
33
+ it "removes a trailing slash" do
34
+ result = Url.normalize "http://localhost/"
35
+ expect(result).to eq "http://localhost"
36
+ end
37
+ end
38
+ end
39
+ end
@@ -19,16 +19,18 @@ require 'spec_helper'
19
19
  module PuppetLibrary::ModuleRepo
20
20
  describe Directory do
21
21
  include ModuleSpecHelper
22
+ include FileUtils
22
23
 
23
- let(:module_dir) { "/tmp/#{$$}" }
24
+ let(:module_dir) { Tempfile.new("module_dir").path }
24
25
  let(:module_repo) { Directory.new(module_dir) }
25
26
 
26
27
  before do
27
- FileUtils.mkdir_p module_dir
28
+ rm_rf module_dir
29
+ mkdir_p module_dir
28
30
  end
29
31
 
30
32
  after do
31
- FileUtils.rm_rf module_dir
33
+ rm_rf module_dir
32
34
  end
33
35
 
34
36
  describe "#get_module" do
@@ -71,8 +73,10 @@ module PuppetLibrary::ModuleRepo
71
73
  metadata_list = module_repo.get_metadata("puppetlabs", "apache")
72
74
  expect(metadata_list.size).to eq 2
73
75
  metadata_list = metadata_list.sort_by {|m| m["version"] }
74
- expect(metadata_list[0]).to eq({ "name" => "puppetlabs-apache", "version" => "1.0.0" })
75
- expect(metadata_list[1]).to eq({ "name" => "puppetlabs-apache", "version" => "1.1.0" })
76
+ expect(metadata_list[0]["name"]).to eq "puppetlabs-apache"
77
+ expect(metadata_list[0]["version"]).to eq "1.0.0"
78
+ expect(metadata_list[1]["name"]).to eq "puppetlabs-apache"
79
+ expect(metadata_list[1]["version"]).to eq "1.1.0"
76
80
  end
77
81
  end
78
82
  end
@@ -0,0 +1,105 @@
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::ModuleRepo
21
+ describe Proxy do
22
+ let(:http_client) { double('http_client') }
23
+ let(:repo) { Proxy.new("http://puppetforge.example.com", http_client) }
24
+
25
+ describe "url" do
26
+ it "defaults to HTTP, when protocol not specified" do
27
+ repo = Proxy.new("forge.puppetlabs.com", http_client)
28
+
29
+ expect(http_client).to receive(:get).with(/http:\/\/forge.puppetlabs.com/).and_return('{"puppetlabs/apache":[]}')
30
+
31
+ repo.get_metadata("puppetlabs", "apache")
32
+ end
33
+
34
+ it "copes with a trailing slash" do
35
+ repo = Proxy.new("forge.puppetlabs.com/", http_client)
36
+
37
+ expect(http_client).to receive(:get).with(/http:\/\/forge.puppetlabs.com\/api/).and_return('{"puppetlabs/apache":[]}')
38
+
39
+ repo.get_metadata("puppetlabs", "apache")
40
+ end
41
+ end
42
+
43
+ describe "#get_module" do
44
+ context "when the module exists" do
45
+ it "downloads the module" do
46
+ expect(http_client).to receive(:get).
47
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
48
+ and_return('{"puppetlabs/apache":[{"file":"/system/releases/p/puppetlabs/puppetlabs-apache-1.2.3.tar.gz","version":"1.2.3","dependencies":[]}]}')
49
+ expect(http_client).to receive(:download).
50
+ with("http://puppetforge.example.com/system/releases/p/puppetlabs/puppetlabs-apache-1.2.3.tar.gz").
51
+ and_return("module buffer")
52
+
53
+ module_buffer = repo.get_module("puppetlabs", "apache", "1.2.3")
54
+ expect(module_buffer).to eq "module buffer"
55
+ end
56
+ end
57
+
58
+ context "when the module doesn't exist" do
59
+ it "returns nil" do
60
+ expect(http_client).to receive(:get).
61
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
62
+ and_return('{"puppetlabs/apache":[{"file":"/system/releases/p/puppetlabs/puppetlabs-apache-1.2.3.tar.gz","version":"1.2.3","dependencies":[]}]}')
63
+
64
+ module_buffer = repo.get_module("puppetlabs", "apache", "9.9.9")
65
+ expect(module_buffer).to be_nil
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#get_metadata" do
71
+ context "when the module doesn't exist" do
72
+ it "returns an empty array" do
73
+ expect(http_client).to receive(:get).
74
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
75
+ and_raise(OpenURI::HTTPError.new("404 Not Found", "Module not found"))
76
+
77
+ metadata = repo.get_metadata("puppetlabs", "apache")
78
+ expect(metadata).to be_empty
79
+ end
80
+ end
81
+
82
+ context "when versions of the module exist" do
83
+ it "returns an array of the versions" do
84
+ expect(http_client).to receive(:get).
85
+ with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
86
+ and_return('{"puppetlabs/apache":[{"version":"1.0.0","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}')
87
+
88
+ metadata = repo.get_metadata("puppetlabs", "apache")
89
+ expect(metadata.size).to eq 2
90
+ expect(metadata.first).to eq({ "name" => "puppetlabs-apache", "author" => "puppetlabs", "version" => "1.0.0", "dependencies" => [{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }, { "name" => "puppetlabs/stdlib", "version_requirement" => "~> 2.0.0" }] })
91
+ expect(metadata.last).to eq({ "name" => "puppetlabs-apache", "author" => "puppetlabs", "version" => "2.0.0", "dependencies" => [] })
92
+ end
93
+
94
+ it "caches requests" do
95
+ expect(http_client).to receive(:get).
96
+ once.with("http://puppetforge.example.com/api/v1/releases.json?module=puppetlabs/apache").
97
+ and_return('{"puppetlabs/apache":[{"version":"1.0.0","dependencies":[["puppetlabs/concat",">= 1.0.0"],["puppetlabs/stdlib","~> 2.0.0"]]},{"version":"2.0.0","dependencies":[]}]}')
98
+
99
+ repo.get_metadata("puppetlabs", "apache")
100
+ repo.get_metadata("puppetlabs", "apache")
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -42,8 +42,10 @@ module ModuleSpecHelper
42
42
  archive.add_file("#{fqn}/metadata.json", 0644) do |file|
43
43
  content = {
44
44
  "name" => full_name,
45
- "version" => version
45
+ "version" => version,
46
+ "dependencies" => []
46
47
  }
48
+ yield(content) if block_given?
47
49
  file.write content.to_json
48
50
  end
49
51
  end
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # Puppet Library
3
- # Copyright (C) 2013 drrb
3
+ # Copyright (C) 2014 drrb
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by
@@ -24,14 +24,19 @@ module PuppetLibrary
24
24
  allow(ModuleRepo::Multi).to receive(:new).and_return(module_repo)
25
25
  return module_repo
26
26
  end
27
+ let(:forge) do
28
+ forge = double(Forge)
29
+ allow(Forge).to receive(:new).and_return(forge)
30
+ return forge
31
+ end
27
32
  let(:server) do
28
33
  server = double(Server)
29
- allow(Server).to receive(:new).and_return(server)
34
+ allow(Server).to receive(:new).with(forge).and_return(server)
30
35
  return server
31
36
  end
32
37
  let(:log) { double('log').as_null_object }
33
38
  let(:library) { PuppetLibrary.new(log) }
34
- let(:default_options) {{ :app => server, :Host => "0.0.0.0", :Port => "9292"}}
39
+ let(:default_options) {{ :app => server, :Host => nil, :Port => nil, :server => nil }}
35
40
  before do
36
41
  allow(Rack::Server).to receive(:start)
37
42
  end
@@ -45,7 +50,7 @@ module PuppetLibrary
45
50
  end
46
51
 
47
52
  describe "#go" do
48
- context "when specifying a bad option" do
53
+ context "when using a bad option" do
49
54
  it "prints the usage" do
50
55
  expect(log).to receive(:puts).with(/invalid option: --die\nUsage:/)
51
56
 
@@ -53,7 +58,7 @@ module PuppetLibrary
53
58
  end
54
59
  end
55
60
 
56
- context "when specifying no options" do
61
+ context "when using no options" do
57
62
  it "runs the server with the default options" do
58
63
  expect(Rack::Server).to receive(:start).with(default_options)
59
64
 
@@ -61,7 +66,7 @@ module PuppetLibrary
61
66
  end
62
67
  end
63
68
 
64
- context "when specifying --port option" do
69
+ context "when using --port option" do
65
70
  it "runs the server with the specified port" do
66
71
  expect(Rack::Server).to receive(:start).with(default_options_with(:Port => "8080"))
67
72
 
@@ -69,7 +74,15 @@ module PuppetLibrary
69
74
  end
70
75
  end
71
76
 
72
- context "when specifying --bind-host option" do
77
+ context "when using --server option" do
78
+ it "runs the app on the specified server" do
79
+ expect(Rack::Server).to receive(:start).with(default_options_with(:server => "thin"))
80
+
81
+ library.go(["--server", "thin"])
82
+ end
83
+ end
84
+
85
+ context "when using --bind-host option" do
73
86
  it "runs the server with the specified bind host" do
74
87
  expect(Rack::Server).to receive(:start).with(default_options_with(:Host => "localhost"))
75
88
 
@@ -77,18 +90,54 @@ module PuppetLibrary
77
90
  end
78
91
  end
79
92
 
80
- it "adds a module repository to the server for each module directory" do
81
- expect(Server).to receive(:new).with(module_repo).and_return(server)
82
- expect(module_repo).to receive(:add_repo).twice
83
- expect(Rack::Server).to receive(:start).with(default_options)
93
+ context "when using --proxy option" do
94
+ it "adds a proxy module repository for each option specified" do
95
+ proxy1 = double('proxy1')
96
+ 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
101
+ expect(Rack::Server).to receive(:start).with(default_options)
102
+
103
+ library.go(["--proxy", "http://forge1.example.com", "--proxy", "http://forge2.example.com"])
104
+ end
105
+ end
106
+
107
+ 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)
116
+ expect(Rack::Server).to receive(:start).with(default_options)
117
+
118
+ library.go(["--module-dir", "dir1", "--module-dir", "dir2"])
119
+ end
120
+ end
84
121
 
85
- library.go(["--module-dir", "dir1", "--module-dir", "dir2"])
122
+ context "when no proxy URLs or module directories specified" do
123
+ it "proxies the Puppet Forge" do
124
+ 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)
128
+ expect(Rack::Server).to receive(:start).with(default_options)
129
+
130
+ library.go([])
131
+ end
86
132
  end
87
133
 
88
134
  it "logs the server options" do
89
- expect(log).to receive(:puts).with(/Port: 9292/)
90
- expect(log).to receive(:puts).with(/Host: 0\.0\.0\.0/)
91
- library.go([])
135
+ expect(log).to receive(:puts).with(/Port: default/)
136
+ expect(log).to receive(:puts).with(/Host: default/)
137
+ 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/)
140
+ library.go(["--module-dir", "./modules"])
92
141
  end
93
142
  end
94
143
  end
data/spec/server_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # Puppet Library
3
- # Copyright (C) 2013 drrb
3
+ # Copyright (C) 2014 drrb
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by
@@ -22,30 +22,17 @@ require 'rack/test'
22
22
  module PuppetLibrary
23
23
  describe Server do
24
24
  include Rack::Test::Methods
25
- include ModuleSpecHelper
26
25
 
27
- let(:module_dir) { "/tmp/#{$$}" }
28
- let(:module_repo) { double(ModuleRepo) }
26
+ let(:forge) { double(Forge) }
29
27
  let(:app) do
30
- Server.new(module_repo)
31
- end
32
-
33
- before do
34
- FileUtils.mkdir_p module_dir
35
- end
36
-
37
- after do
38
- FileUtils.rm_rf module_dir
28
+ Server.new(forge)
39
29
  end
40
30
 
41
31
  describe "GET /modules/<author>-<module>-<version>.tar.gz" do
42
32
  context "when the module is on the server" do
43
- before do
44
- add_module("puppetlabs", "apache", "1.0.0")
45
- end
46
33
  it "serves the module" do
47
34
  file_buffer = StringIO.new("module content")
48
- expect(module_repo).to receive(:get_module).with("puppetlabs", "apache", "1.0.0").and_return(file_buffer)
35
+ expect(forge).to receive(:get_module_buffer).with("puppetlabs", "apache", "1.0.0").and_return(file_buffer)
49
36
 
50
37
  get "/modules/puppetlabs-apache-1.0.0.tar.gz"
51
38
 
@@ -58,7 +45,7 @@ module PuppetLibrary
58
45
 
59
46
  context "when the module is not on the server" do
60
47
  it "returns an error" do
61
- expect(module_repo).to receive(:get_module).with("puppetlabs", "apache", "1.0.0").and_return(nil)
48
+ expect(forge).to receive(:get_module_buffer).with("puppetlabs", "apache", "1.0.0").and_raise(ModuleNotFound)
62
49
 
63
50
  get "/modules/puppetlabs-apache-1.0.0.tar.gz"
64
51
 
@@ -70,32 +57,27 @@ module PuppetLibrary
70
57
 
71
58
  describe "GET /<author>/<module>.json" do
72
59
  it "gets module metadata for all versions" do
73
- metadata = [ {
74
- "author" => "puppetlabs",
75
- "name" => "puppetlabs-apache",
76
- "description" => "Apache module",
77
- "version" => "1.0.0"
78
- }, {
60
+ metadata = {
79
61
  "author" => "puppetlabs",
80
- "name" => "puppetlabs-apache",
81
- "description" => "Apache module",
82
- "version" => "1.1.0"
83
- } ]
84
- expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").and_return(metadata)
62
+ "full_name" => "puppetlabs/apache",
63
+ "name" => "apache",
64
+ "desc" => "Puppet module for Apache",
65
+ "releases" => [
66
+ { "version" => "0.10.0" },
67
+ { "version" => "0.9.0" },
68
+ ]
69
+ }
70
+ expect(forge).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(metadata)
85
71
 
86
72
  get "/puppetlabs/apache.json"
87
73
 
88
- expect(last_response.body).to include('"author":"puppetlabs"')
89
- expect(last_response.body).to include('"full_name":"puppetlabs/apache"')
90
- expect(last_response.body).to include('"name":"apache"')
91
- expect(last_response.body).to include('"desc":"Apache module"')
92
- expect(last_response.body).to include('"releases":[{"version":"1.0.0"},{"version":"1.1.0"}]')
74
+ expect(last_response.body).to eq metadata.to_json
93
75
  expect(last_response).to be_ok
94
76
  end
95
77
 
96
78
  context "when no modules found" do
97
79
  it "returns an error" do
98
- expect(module_repo).to receive(:get_metadata).with("nonexistant", "nonexistant").and_return([])
80
+ expect(forge).to receive(:get_module_metadata).with("nonexistant", "nonexistant").and_raise(ModuleNotFound)
99
81
 
100
82
  get "/nonexistant/nonexistant.json"
101
83
 
@@ -107,57 +89,43 @@ module PuppetLibrary
107
89
 
108
90
  describe "GET /api/v1/releases.json" do
109
91
  it "gets metadata for module and dependencies" do
110
- apache_metadata = [ {
111
- "author" => "puppetlabs",
112
- "name" => "puppetlabs-apache",
113
- "description" => "Apache module",
114
- "version" => "1.0.0",
115
- "dependencies" => [
116
- { "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
117
- { "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
118
- ]
119
- }, {
120
- "author" => "puppetlabs",
121
- "name" => "puppetlabs-apache",
122
- "description" => "Apache module",
123
- "version" => "1.1.0",
124
- "dependencies" => [
125
- { "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
126
- { "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
92
+ metadata = {
93
+ "puppetlabs/apache" => [
94
+ {
95
+ "file" => "/system/releases/p/puppetlabs/puppetlabs-apache-0.9.0.tar.gz",
96
+ "version" => "0.9.0",
97
+ "dependencies" => [
98
+ [ "puppetlabs/concat", ">= 1.0.0" ],
99
+ [ "puppetlabs/stdlib", ">= 2.4.0" ]
100
+ ]
101
+ }
102
+ ],
103
+ "puppetlabs/stdlib" => [
104
+ {
105
+ "file" => "/system/releases/p/puppetlabs/puppetlabs-stdlib-3.0.0.tar.gz",
106
+ "version" => "3.0.0",
107
+ "dependencies" => [ ]
108
+ }
109
+ ],
110
+ "puppetlabs/concat" => [
111
+ {
112
+ "file" => "/system/releases/p/puppetlabs/puppetlabs-concat-1.0.0-rc1.tar.gz",
113
+ "version" => "1.0.0-rc1",
114
+ "dependencies" => [ ]
115
+ }
127
116
  ]
128
- } ]
129
- stdlib_metadata = [ {
130
- "author" => "puppetlabs",
131
- "name" => "puppetlabs-stdlib",
132
- "description" => "Stdlib module",
133
- "version" => "2.0.0",
134
- "dependencies" => [ ]
135
- } ]
136
- concat_metadata = [ {
137
- "author" => "puppetlabs",
138
- "name" => "puppetlabs-concat",
139
- "description" => "Concat module",
140
- "version" => "1.0.0",
141
- "dependencies" => [ ]
142
- } ]
143
- expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").and_return(apache_metadata)
144
- expect(module_repo).to receive(:get_metadata).with("puppetlabs", "stdlib").and_return(stdlib_metadata)
145
- expect(module_repo).to receive(:get_metadata).with("puppetlabs", "concat").and_return(concat_metadata)
117
+ }
118
+ expect(forge).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache").and_return(metadata)
146
119
 
147
120
  get "/api/v1/releases.json?module=puppetlabs/apache"
148
121
 
149
- response = JSON.parse(last_response.body)
150
- expect(response.keys.sort).to eq(["puppetlabs/apache", "puppetlabs/concat", "puppetlabs/stdlib"])
151
- expect(response["puppetlabs/apache"].size).to eq(2)
152
- expect(response["puppetlabs/apache"][0]["file"]).to eq("/modules/puppetlabs-apache-1.0.0.tar.gz")
153
- expect(response["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
154
- expect(response["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
122
+ expect(last_response.body).to eq metadata.to_json
155
123
  expect(last_response).to be_ok
156
124
  end
157
125
 
158
126
  context "when the module can't be found" do
159
127
  it "returns an error" do
160
- expect(module_repo).to receive(:get_metadata).with("nonexistant", "nonexistant").and_return([])
128
+ expect(forge).to receive(:get_module_metadata_with_dependencies).with("nonexistant", "nonexistant").and_raise(ModuleNotFound)
161
129
 
162
130
  get "/api/v1/releases.json?module=nonexistant/nonexistant"
163
131