puppet-library 0.9.1 → 0.10.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 (37) hide show
  1. checksums.yaml +7 -7
  2. data/CHANGELOG.yml +1 -0
  3. data/README.md +9 -4
  4. data/Rakefile +44 -23
  5. data/TODO.yml +3 -4
  6. data/config.ru +28 -3
  7. data/lib/puppet_library/forge/cache.rb +19 -0
  8. data/lib/puppet_library/forge/directory.rb +16 -0
  9. data/lib/puppet_library/forge/git_repository.rb +57 -49
  10. data/lib/puppet_library/forge/proxy.rb +18 -4
  11. data/lib/puppet_library/forge/source.rb +10 -0
  12. data/lib/puppet_library/puppet_library.rb +1 -1
  13. data/lib/puppet_library/server.rb +12 -3
  14. data/lib/puppet_library/util/git.rb +103 -0
  15. data/lib/puppet_library/util/patches.rb +104 -0
  16. data/lib/puppet_library/util/temp_dir.rb +42 -0
  17. data/lib/puppet_library/util.rb +4 -70
  18. data/lib/puppet_library/version.rb +1 -1
  19. data/spec/archive/archive_reader_spec.rb +9 -2
  20. data/spec/archive/archiver_spec.rb +4 -0
  21. data/spec/forge/cache_spec.rb +4 -0
  22. data/spec/forge/directory_spec.rb +4 -0
  23. data/spec/forge/git_repository_spec.rb +5 -2
  24. data/spec/forge/source_spec.rb +4 -0
  25. data/spec/integration_test_helper.rb +42 -0
  26. data/spec/util/git_spec.rb +143 -0
  27. data/spec/util/patches_spec.rb +86 -0
  28. data/spec/util/temp_dir_spec.rb +35 -0
  29. data/test/directory_forge_integration_test.rb +96 -0
  30. data/test/offline_git_repo_forge_integration_test.rb +122 -0
  31. data/test/offline_proxy_forge_integration_test.rb +126 -0
  32. data/test/online_git_repo_forge_integration_test.rb +89 -0
  33. data/test/online_proxy_forge_integration_test.rb +93 -0
  34. data/test/source_forge_integration_test.rb +96 -0
  35. metadata +292 -118
  36. data/spec/util_spec.rb +0 -43
  37. data/test/librarian_puppet_integration_test.rb +0 -349
@@ -0,0 +1,96 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "directory forge" do
24
+ include ModuleSpecHelper
25
+
26
+ let(:port) { Ports.next! }
27
+ let(:module_dir) { Tempdir.create("module_dir") }
28
+ let(:project_dir) { Tempdir.create("project_dir") }
29
+ let(:start_dir) { pwd }
30
+ let(:disk_server) do
31
+ Server.configure do |server|
32
+ server.forge Forge::Directory do |forge|
33
+ forge.path = module_dir
34
+ end
35
+ end
36
+ end
37
+ let(:disk_rack_server) do
38
+ Rack::Server.new(
39
+ :app => disk_server,
40
+ :Host => "localhost",
41
+ :Port => port,
42
+ :server => "webrick"
43
+ )
44
+ end
45
+ let(:disk_server_runner) do
46
+ Thread.new do
47
+ disk_rack_server.start
48
+ end
49
+ end
50
+
51
+ before do
52
+ # Initialize to catch wiring errors
53
+ disk_rack_server
54
+
55
+ # Start the servers
56
+ disk_server_runner
57
+ start_dir
58
+ cd project_dir
59
+ end
60
+
61
+ after do
62
+ rm_rf module_dir
63
+ rm_rf project_dir
64
+ cd start_dir
65
+ end
66
+
67
+ it "services queries, downloads and searches from a directory" do
68
+ add_module("puppetlabs", "apache", "1.0.0") do |metadata|
69
+ metadata["dependencies"] << { "name" => "puppetlabs/concat", "version_requirement" => ">= 2.0.0" }
70
+ metadata["dependencies"] << { "name" => "puppetlabs/stdlib", "version_requirement" => "~> 3.0.0" }
71
+ end
72
+ add_module("puppetlabs", "concat", "2.0.0")
73
+ add_module("puppetlabs", "stdlib", "3.0.0")
74
+
75
+ write_puppetfile <<-EOF
76
+ forge 'http://localhost:#{port}'
77
+ mod 'puppetlabs/apache'
78
+ EOF
79
+
80
+ # Install modules
81
+ system "librarian-puppet install" or fail "call to puppet-library failed"
82
+ expect("apache").to be_installed
83
+ expect("concat").to be_installed
84
+ expect("stdlib").to be_installed
85
+
86
+ # Search
87
+ search_results = JSON.parse(open("http://localhost:#{port}/modules.json").read)
88
+ found_modules = Hash[search_results.map do |result|
89
+ [ result["full_name"], result["version"] ]
90
+ end]
91
+ expect(found_modules["puppetlabs/apache"]).to eq "1.0.0"
92
+ expect(found_modules["puppetlabs/concat"]).to eq "2.0.0"
93
+ expect(found_modules["puppetlabs/stdlib"]).to eq "3.0.0"
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,122 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "offline git repo forge" do
24
+ @@repo_path = Tempdir.create("git-repo")
25
+ @@versions = [ "0.9.0", "1.0.0-rc1", "1.0.0" ]
26
+ @@tags = @@versions + [ "xxx" ]
27
+
28
+ before :all do
29
+ def git(command)
30
+ git_command = "git --git-dir=#{@@repo_path}/.git --work-tree=#{@@repo_path} #{command}"
31
+ `#{git_command}`
32
+ unless $?.success?
33
+ raise "Failed to run command: \"#{git_command}\""
34
+ end
35
+ end
36
+
37
+ git "init"
38
+ git "config user.name tester"
39
+ git "config user.email tester@example.com"
40
+ @@versions.zip(@@tags).each do |(version, tag)|
41
+ File.open(File.join(@@repo_path, "Modulefile"), "w") do |modulefile|
42
+ modulefile.write <<-MODULEFILE
43
+ name 'puppetlabs-apache'
44
+ version '#{version}'
45
+ author 'puppetlabs'
46
+ MODULEFILE
47
+ end
48
+ git "add ."
49
+ git "commit --message='Version #{version}'"
50
+ git "tag #{tag}"
51
+ end
52
+ end
53
+
54
+ after :all do
55
+ rm_rf @@repo_path
56
+ end
57
+
58
+ include ModuleSpecHelper
59
+
60
+ let(:port) { Ports.next! }
61
+ let(:project_dir) { Tempdir.create("project_dir") }
62
+ let(:start_dir) { pwd }
63
+ let(:git_server) do
64
+ Server.configure do |server|
65
+ server.forge Forge::GitRepository do |forge|
66
+ forge.source = @@repo_path
67
+ forge.include_tags = /^[0-9.]+/
68
+ end
69
+ end
70
+ end
71
+ let(:git_rack_server) do
72
+ Rack::Server.new(
73
+ :app => git_server,
74
+ :Host => "localhost",
75
+ :Port => port,
76
+ :server => "webrick"
77
+ )
78
+ end
79
+ let(:git_server_runner) do
80
+ Thread.new do
81
+ git_rack_server.start
82
+ end
83
+ end
84
+
85
+ before do
86
+ # Initialize to catch wiring errors
87
+ git_rack_server
88
+
89
+ # Start the servers
90
+ git_server_runner
91
+ start_dir
92
+ cd project_dir
93
+ end
94
+
95
+ after do
96
+ rm_rf project_dir
97
+ cd start_dir
98
+ end
99
+
100
+ it "services queries, downloads and searches from a git repository" do
101
+ write_puppetfile <<-EOF
102
+ forge 'http://localhost:#{port}'
103
+ mod 'puppetlabs/apache'
104
+ EOF
105
+
106
+ # Install modules
107
+ system "librarian-puppet install" or fail "call to puppet-library failed"
108
+ expect("apache").to be_installed
109
+
110
+ # Search
111
+ search_results = JSON.parse(open("http://localhost:#{port}/modules.json").read)
112
+ apache_result = search_results.first
113
+ expect(apache_result["full_name"]).to eq "puppetlabs/apache"
114
+ expect(apache_result["releases"]).to eq [{"version"=>"1.0.0"}, {"version"=>"1.0.0-rc1"}, {"version"=>"0.9.0"}]
115
+
116
+ # Download
117
+ archive = open("http://localhost:#{port}/modules/puppetlabs-apache-0.9.0.tar.gz")
118
+ expect(archive).to be_tgz_with /Modulefile/, /puppetlabs-apache/
119
+ expect(archive).to be_tgz_with /metadata.json/, /"name":"puppetlabs-apache"/
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,126 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "offline proxy", :no_1_8 => true do
24
+ include ModuleSpecHelper
25
+
26
+ let(:proxy_port) { Ports.next! }
27
+ let(:disk_port) { Ports.next! }
28
+ let(:module_dir) { Tempdir.create("module_dir") }
29
+ let(:project_dir) { Tempdir.create("project_dir") }
30
+ let(:cache_dir) { Tempdir.create("cache_dir") }
31
+ let(:start_dir) { pwd }
32
+ let(:disk_server) do
33
+ Server.configure do |server|
34
+ server.forge Forge::Directory do |forge|
35
+ forge.path = module_dir
36
+ end
37
+ end
38
+ end
39
+ let(:disk_rack_server) do
40
+ Rack::Server.new(
41
+ :app => disk_server,
42
+ :Host => "localhost",
43
+ :Port => disk_port,
44
+ :server => "webrick"
45
+ )
46
+ end
47
+ let(:disk_server_runner) do
48
+ Thread.new do
49
+ disk_rack_server.start
50
+ end
51
+ end
52
+ let(:proxy_server) do
53
+ Server.configure do |server|
54
+ server.forge Forge::Cache do |forge|
55
+ forge.url = "http://localhost:#{disk_port}"
56
+ forge.path = cache_dir
57
+ end
58
+ end
59
+ end
60
+ let(:proxy_rack_server) do
61
+ Rack::Server.new(
62
+ :app => proxy_server,
63
+ :Host => "localhost",
64
+ :Port => proxy_port,
65
+ :server => "webrick"
66
+ )
67
+ end
68
+ let(:proxy_server_runner) do
69
+ Thread.new do
70
+ proxy_rack_server.start
71
+ end
72
+ end
73
+
74
+ before do
75
+ # Initialize to catch wiring errors
76
+ disk_rack_server
77
+ proxy_rack_server
78
+
79
+ # Start the servers
80
+ disk_server_runner
81
+ proxy_server_runner
82
+ start_dir
83
+ cd project_dir
84
+ end
85
+
86
+ after do
87
+ rm_rf module_dir
88
+ rm_rf project_dir
89
+ rm_rf cache_dir
90
+ cd start_dir
91
+ end
92
+
93
+ it "services queries, downloads and searches through a proxy to a directory" do
94
+ add_module("puppetlabs", "apache", "1.0.0") do |metadata|
95
+ metadata["dependencies"] << { "name" => "puppetlabs/concat", "version_requirement" => ">= 2.0.0" }
96
+ metadata["dependencies"] << { "name" => "puppetlabs/stdlib", "version_requirement" => "~> 3.0.0" }
97
+ end
98
+ add_module("puppetlabs", "concat", "2.0.0")
99
+ add_module("puppetlabs", "stdlib", "3.0.0")
100
+
101
+ write_puppetfile <<-EOF
102
+ forge 'http://localhost:#{proxy_port}'
103
+ mod 'puppetlabs/apache'
104
+ EOF
105
+
106
+ # Install modules through the proxy
107
+ system "librarian-puppet install" or fail "call to puppet-library failed"
108
+ expect("apache").to be_installed
109
+ expect("concat").to be_installed
110
+ expect("stdlib").to be_installed
111
+
112
+ expect("puppetlabs-apache-1.0.0.tar.gz").to be_cached
113
+ expect("puppetlabs-concat-2.0.0.tar.gz").to be_cached
114
+ expect("puppetlabs-stdlib-3.0.0.tar.gz").to be_cached
115
+
116
+ # Search through the proxy
117
+ search_results = JSON.parse(open("http://localhost:#{proxy_port}/modules.json").read)
118
+ found_modules = Hash[search_results.map do |result|
119
+ [ result["full_name"], result["version"] ]
120
+ end]
121
+ expect(found_modules["puppetlabs/apache"]).to eq "1.0.0"
122
+ expect(found_modules["puppetlabs/concat"]).to eq "2.0.0"
123
+ expect(found_modules["puppetlabs/stdlib"]).to eq "3.0.0"
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,89 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "online git repo forge", :online => true do
24
+
25
+ include ModuleSpecHelper
26
+
27
+ let(:port) { Ports.next! }
28
+ let(:project_dir) { Tempdir.create("project_dir") }
29
+ let(:start_dir) { pwd }
30
+ let(:git_server) do
31
+ Server.configure do |server|
32
+ server.forge Forge::GitRepository do |forge|
33
+ forge.source = "https://github.com/puppetlabs/puppetlabs-stdlib.git"
34
+ forge.include_tags = /^[0-9.]+/
35
+ end
36
+ end
37
+ end
38
+ let(:git_rack_server) do
39
+ Rack::Server.new(
40
+ :app => git_server,
41
+ :Host => "localhost",
42
+ :Port => port,
43
+ :server => "webrick"
44
+ )
45
+ end
46
+ let(:git_server_runner) do
47
+ Thread.new do
48
+ git_rack_server.start
49
+ end
50
+ end
51
+
52
+ before do
53
+ # Initialize to catch wiring errors
54
+ git_rack_server
55
+
56
+ # Start the servers
57
+ git_server_runner
58
+ start_dir
59
+ cd project_dir
60
+ end
61
+
62
+ after do
63
+ rm_rf project_dir
64
+ cd start_dir
65
+ end
66
+
67
+ it "services queries, downloads and searches from a git repository" do
68
+ write_puppetfile <<-EOF
69
+ forge 'http://localhost:#{port}'
70
+ mod 'puppetlabs/stdlib'
71
+ EOF
72
+
73
+ # Install modules
74
+ system "librarian-puppet install" or fail "call to puppet-library failed"
75
+ expect("stdlib").to be_installed
76
+
77
+ # Search
78
+ search_results = JSON.parse(open("http://localhost:#{port}/modules.json").read)
79
+ stdlib_result = search_results.first
80
+ expect(stdlib_result["full_name"]).to eq "puppetlabs/stdlib"
81
+ expect(stdlib_result["releases"]).to include({"version"=>"4.0.2"})
82
+
83
+ # Download
84
+ archive = open("http://localhost:#{port}/modules/puppetlabs-stdlib-4.0.2.tar.gz")
85
+ expect(archive).to be_tgz_with /Modulefile/, /puppetlabs-stdlib/
86
+ expect(archive).to be_tgz_with /metadata.json/, /"name":"puppetlabs-stdlib"/
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,93 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "online proxy", :online => true do
24
+ include ModuleSpecHelper
25
+
26
+ let(:port) { Ports.next! }
27
+ let(:project_dir) { Tempdir.create("project_dir") }
28
+ let(:module_dir) { Tempdir.create("module_dir") }
29
+ let(:cache_dir) { Tempdir.create("cache_dir") }
30
+ let(:start_dir) { pwd }
31
+ let(:proxy_server) do
32
+ Server.configure do |server|
33
+ server.forge Forge::Directory do |forge|
34
+ forge.path = module_dir
35
+ end
36
+ server.forge Forge::Cache do |forge|
37
+ forge.url = "http://forge.puppetlabs.com"
38
+ forge.path = cache_dir
39
+ end
40
+ end
41
+ end
42
+ let(:proxy_rack_server) do
43
+ Rack::Server.new(
44
+ :app => proxy_server,
45
+ :Host => "localhost",
46
+ :Port => port,
47
+ :server => "webrick"
48
+ )
49
+ end
50
+ let(:proxy_server_runner) do
51
+ Thread.new do
52
+ proxy_rack_server.start
53
+ end
54
+ end
55
+
56
+ before do
57
+ # Initialize to catch wiring errors
58
+ proxy_rack_server
59
+
60
+ # Start the server
61
+ proxy_server_runner
62
+ start_dir
63
+ cd project_dir
64
+ end
65
+
66
+ after do
67
+ rm_rf module_dir
68
+ rm_rf project_dir
69
+ rm_rf cache_dir
70
+ cd start_dir
71
+ end
72
+
73
+ it "services queries, downloads and searches through a proxy to a remote forge" do
74
+ add_module("drrb", "tomcat", "1.0.0") do |metadata|
75
+ metadata["dependencies"] << { "name" => "puppetlabs/apache", "version_requirement" => "0.9.0" }
76
+ end
77
+
78
+ write_puppetfile <<-EOF
79
+ forge 'http://localhost:#{port}'
80
+ mod 'drrb/tomcat'
81
+ EOF
82
+
83
+ # Install modules through the proxy
84
+ system "librarian-puppet install" or fail "call to puppet-library failed"
85
+ expect("tomcat").to be_installed
86
+ expect("apache").to be_installed
87
+ expect("concat").to be_installed
88
+ expect("stdlib").to be_installed
89
+
90
+ expect("puppetlabs-apache-*.tar.gz").to be_cached
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,96 @@
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
+ require 'integration_test_helper'
20
+ require 'open-uri'
21
+
22
+ module PuppetLibrary
23
+ describe "source forge" do
24
+ include ModuleSpecHelper
25
+
26
+ let(:port) { Ports.next! }
27
+ let(:module_dir) { Tempdir.create("module_dir") }
28
+ let(:project_dir) { Tempdir.create("project_dir") }
29
+ let(:start_dir) { pwd }
30
+ let(:source_forge) { Forge::Source.new(module_dir) }
31
+ let(:source_server) do
32
+ Server.configure do |server|
33
+ server.forge source_forge
34
+ end
35
+ end
36
+ let(:source_rack_server) do
37
+ Rack::Server.new(
38
+ :app => source_server,
39
+ :Host => "localhost",
40
+ :Port => port,
41
+ :server => "webrick"
42
+ )
43
+ end
44
+ let(:source_server_runner) do
45
+ Thread.new do
46
+ source_rack_server.start
47
+ end
48
+ end
49
+
50
+ before do
51
+ # Initialize to catch wiring errors
52
+ source_rack_server
53
+
54
+ # Start the servers
55
+ source_server_runner
56
+ start_dir
57
+ cd project_dir
58
+ end
59
+
60
+ after do
61
+ rm_rf module_dir
62
+ rm_rf project_dir
63
+ cd start_dir
64
+ end
65
+
66
+ it "services queries, downloads and searches from a directory containg a module's source" do
67
+ add_file "Modulefile", <<-EOF
68
+ name 'puppetlabs-ficticious'
69
+ version '0.2.0'
70
+ author 'puppetlabs'
71
+ description 'Fake module'
72
+ EOF
73
+
74
+ write_puppetfile <<-EOF
75
+ forge 'http://localhost:#{port}'
76
+ mod 'puppetlabs/ficticious'
77
+ EOF
78
+
79
+ # Install modules
80
+ system "librarian-puppet install" or fail "call to puppet-library failed"
81
+ expect("ficticious").to be_installed
82
+
83
+ # Search
84
+ search_results = JSON.parse(open("http://localhost:#{port}/modules.json").read)
85
+ found_modules = Hash[search_results.map do |result|
86
+ [ result["full_name"], result["version"] ]
87
+ end]
88
+ expect(found_modules["puppetlabs/ficticious"]).to eq "0.2.0"
89
+
90
+ # Download
91
+ archive = open("http://localhost:#{port}/modules/puppetlabs-ficticious-0.2.0.tar.gz")
92
+ expect(archive).to be_tgz_with /Modulefile/, /puppetlabs-ficticious/
93
+ expect(archive).to be_tgz_with /metadata.json/, /"name":"puppetlabs-ficticious"/
94
+ end
95
+ end
96
+ end