minimart 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.travis.yml +13 -0
- data/Gemfile +3 -0
- data/README.md +198 -0
- data/Rakefile +45 -0
- data/bin/minimart +4 -0
- data/lib/minimart.rb +15 -0
- data/lib/minimart/cli.rb +93 -0
- data/lib/minimart/commands/mirror.rb +30 -0
- data/lib/minimart/commands/web.rb +91 -0
- data/lib/minimart/configuration.rb +46 -0
- data/lib/minimart/cookbook.rb +173 -0
- data/lib/minimart/download/cookbook.rb +70 -0
- data/lib/minimart/download/git_cache.rb +60 -0
- data/lib/minimart/download/git_repository.rb +41 -0
- data/lib/minimart/error.rb +32 -0
- data/lib/minimart/inventory_requirement/base_requirement.rb +81 -0
- data/lib/minimart/inventory_requirement/git_requirement.rb +87 -0
- data/lib/minimart/inventory_requirement/git_requirements_builder.rb +101 -0
- data/lib/minimart/inventory_requirement/local_path_requirement.rb +45 -0
- data/lib/minimart/inventory_requirement/local_requirements_builder.rb +31 -0
- data/lib/minimart/inventory_requirement/supermarket_requirements_builder.rb +35 -0
- data/lib/minimart/mirror.rb +12 -0
- data/lib/minimart/mirror/dependency_graph.rb +73 -0
- data/lib/minimart/mirror/download_metadata.rb +57 -0
- data/lib/minimart/mirror/inventory_builder.rb +143 -0
- data/lib/minimart/mirror/inventory_configuration.rb +74 -0
- data/lib/minimart/mirror/inventory_requirements.rb +104 -0
- data/lib/minimart/mirror/local_store.rb +107 -0
- data/lib/minimart/mirror/source.rb +57 -0
- data/lib/minimart/mirror/source_cookbook.rb +77 -0
- data/lib/minimart/mirror/sources.rb +37 -0
- data/lib/minimart/output.rb +34 -0
- data/lib/minimart/utils/archive.rb +39 -0
- data/lib/minimart/utils/file_helper.rb +34 -0
- data/lib/minimart/utils/http.rb +60 -0
- data/lib/minimart/version.rb +3 -0
- data/lib/minimart/web.rb +10 -0
- data/lib/minimart/web/cookbook_show_page_generator.rb +78 -0
- data/lib/minimart/web/cookbooks.rb +83 -0
- data/lib/minimart/web/dashboard_generator.rb +46 -0
- data/lib/minimart/web/html_generator.rb +52 -0
- data/lib/minimart/web/markdown_parser.rb +47 -0
- data/lib/minimart/web/template_helper.rb +132 -0
- data/lib/minimart/web/universe_generator.rb +109 -0
- data/minimart.gemspec +36 -0
- data/spec/fixtures/sample_cookbook.tar.gz +0 -0
- data/spec/fixtures/sample_cookbook/Berksfile +3 -0
- data/spec/fixtures/sample_cookbook/CHANGELOG.md +3 -0
- data/spec/fixtures/sample_cookbook/Gemfile +16 -0
- data/spec/fixtures/sample_cookbook/LICENSE +3 -0
- data/spec/fixtures/sample_cookbook/README.md +42 -0
- data/spec/fixtures/sample_cookbook/Thorfile +5 -0
- data/spec/fixtures/sample_cookbook/Vagrantfile +90 -0
- data/spec/fixtures/sample_cookbook/chefignore +94 -0
- data/spec/fixtures/sample_cookbook/metadata.rb +9 -0
- data/spec/fixtures/sample_cookbook/recipes/default.rb +8 -0
- data/spec/fixtures/sample_inventory.yml +16 -0
- data/spec/fixtures/simple_git_inventory.yml +8 -0
- data/spec/fixtures/simple_inventory.yml +6 -0
- data/spec/fixtures/simple_local_path_inventory.yml +5 -0
- data/spec/fixtures/universe.json +42 -0
- data/spec/fixtures/vcr_cassettes/local_path_cookbooks.yml +3316 -0
- data/spec/fixtures/vcr_cassettes/location_specific_cookbooks.yml +3316 -0
- data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_graph.yml +905 -0
- data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_installing_cookbooks.yml +4218 -0
- data/spec/lib/minimart/cli_spec.rb +104 -0
- data/spec/lib/minimart/commands/mirror_spec.rb +37 -0
- data/spec/lib/minimart/commands/web_spec.rb +75 -0
- data/spec/lib/minimart/configuration_spec.rb +54 -0
- data/spec/lib/minimart/cookbook_spec.rb +137 -0
- data/spec/lib/minimart/download/cookbook_spec.rb +135 -0
- data/spec/lib/minimart/download/git_cache_spec.rb +69 -0
- data/spec/lib/minimart/download/git_repository_spec.rb +39 -0
- data/spec/lib/minimart/error_spec.rb +18 -0
- data/spec/lib/minimart/inventory_requirement/base_requirement_spec.rb +38 -0
- data/spec/lib/minimart/inventory_requirement/git_requirement_spec.rb +92 -0
- data/spec/lib/minimart/inventory_requirement/git_requirements_builder_spec.rb +130 -0
- data/spec/lib/minimart/inventory_requirement/local_path_requirement_spec.rb +35 -0
- data/spec/lib/minimart/inventory_requirement/local_requirements_builder_spec.rb +33 -0
- data/spec/lib/minimart/inventory_requirement/supermarket_requirements_builder_spec.rb +69 -0
- data/spec/lib/minimart/mirror/dependency_graph_spec.rb +123 -0
- data/spec/lib/minimart/mirror/download_metadata_spec.rb +73 -0
- data/spec/lib/minimart/mirror/inventory_builder_spec.rb +195 -0
- data/spec/lib/minimart/mirror/inventory_configuration_spec.rb +86 -0
- data/spec/lib/minimart/mirror/inventory_requirements_spec.rb +78 -0
- data/spec/lib/minimart/mirror/local_store_spec.rb +64 -0
- data/spec/lib/minimart/mirror/source_spec.rb +54 -0
- data/spec/lib/minimart/mirror/sources_spec.rb +50 -0
- data/spec/lib/minimart/output_spec.rb +29 -0
- data/spec/lib/minimart/utils/archive_spec.rb +38 -0
- data/spec/lib/minimart/utils/file_helper_spec.rb +43 -0
- data/spec/lib/minimart/utils/http_spec.rb +37 -0
- data/spec/lib/minimart/web/cookbook_show_page_generator_spec.rb +101 -0
- data/spec/lib/minimart/web/cookbooks_spec.rb +70 -0
- data/spec/lib/minimart/web/dashboard_generator_spec.rb +33 -0
- data/spec/lib/minimart/web/html_generator_spec.rb +34 -0
- data/spec/lib/minimart/web/markdown_parser_spec.rb +54 -0
- data/spec/lib/minimart/web/template_helper_spec.rb +86 -0
- data/spec/lib/minimart/web/universe_generator_spec.rb +125 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/support/file_system.rb +22 -0
- data/web/_assets/javascripts/app.js +164 -0
- data/web/_assets/javascripts/backbone.min.js +6 -0
- data/web/_assets/javascripts/jquery.min.js +4 -0
- data/web/_assets/javascripts/jquery.tabslet.min.js +9 -0
- data/web/_assets/javascripts/manifest.js +5 -0
- data/web/_assets/javascripts/underscore.min.js +5 -0
- data/web/_assets/stylesheets/font-awesome.min.css +4 -0
- data/web/_assets/stylesheets/font-mfizz.css +318 -0
- data/web/_assets/stylesheets/main.css +720 -0
- data/web/_assets/stylesheets/manifest.css +4 -0
- data/web/_assets/stylesheets/normalize.css +427 -0
- data/web/assets/fonts/FontAwesome.otf +0 -0
- data/web/assets/fonts/font-mfizz.eot +0 -0
- data/web/assets/fonts/font-mfizz.svg +1344 -0
- data/web/assets/fonts/font-mfizz.ttf +0 -0
- data/web/assets/fonts/font-mfizz.woff +0 -0
- data/web/assets/fonts/fontawesome-webfont.eot +0 -0
- data/web/assets/fonts/fontawesome-webfont.svg +520 -0
- data/web/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/web/assets/fonts/fontawesome-webfont.woff +0 -0
- data/web/assets/images/header-slim.jpg +0 -0
- data/web/assets/images/icon-search.png +0 -0
- data/web/assets/images/mad-glory-logo.png +0 -0
- data/web/assets/images/main-gradient.png +0 -0
- data/web/assets/images/top-bar-logo.png +0 -0
- data/web/assets/javascripts/application.min.js +5 -0
- data/web/assets/stylesheets/application.min.css +4 -0
- data/web/templates/cookbook_show.erb +96 -0
- data/web/templates/dashboard.erb +81 -0
- data/web/templates/layout.erb +38 -0
- metadata +433 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Minimart::Utils::Http do
|
4
|
+
describe '::get_json' do
|
5
|
+
pending
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '::get' do
|
9
|
+
pending
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '::get_binary' do
|
13
|
+
pending
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '::build_url' do
|
17
|
+
context 'when no protocol is provided' do
|
18
|
+
subject { described_class.build_url('example.com') }
|
19
|
+
it { is_expected.to eq 'http://example.com' }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when a protocol is provided' do
|
23
|
+
subject { described_class.build_url('git://example.com') }
|
24
|
+
it { is_expected.to eq 'git://example.com' }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when a sub url is provided' do
|
28
|
+
subject { described_class.build_url('http://example.com', 'path') }
|
29
|
+
it { is_expected.to eq 'http://example.com/path' }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when the path has a leading slash' do
|
33
|
+
subject { described_class.build_url('http://example.com/', '/path') }
|
34
|
+
it { is_expected.to eq 'http://example.com/path' }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minimart/web/cookbook_show_page_generator'
|
3
|
+
|
4
|
+
describe Minimart::Web::CookbookShowPageGenerator do
|
5
|
+
let(:cookbooks) do
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:web_directory) { test_directory }
|
10
|
+
|
11
|
+
subject do
|
12
|
+
Minimart::Web::CookbookShowPageGenerator.new(
|
13
|
+
web_directory: web_directory,
|
14
|
+
cookbooks: cookbooks)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#generate' do
|
18
|
+
let(:cookbooks_directory) { File.join(web_directory, 'cookbooks') }
|
19
|
+
let(:cookbook_directory) { File.join(cookbooks_directory, 'sample_cookbook') }
|
20
|
+
let(:cookbook_file) { File.join(cookbook_directory, '1.2.3.html') }
|
21
|
+
let(:view_content) { File.open(cookbook_file).read }
|
22
|
+
|
23
|
+
it 'should generate a directory for the cookbook provided' do
|
24
|
+
subject.generate
|
25
|
+
expect(Dir.exists?(cookbook_directory)).to eq true
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when the web command was previously run' do
|
29
|
+
let(:cookbook_directory) { File.join(cookbooks_directory, 'existing-cookbook') }
|
30
|
+
|
31
|
+
before(:each) do
|
32
|
+
FileUtils.mkdir_p(cookbooks_directory)
|
33
|
+
FileUtils.mkdir_p(cookbook_directory)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should remove any existing files' do
|
37
|
+
subject.generate
|
38
|
+
expect(Dir.exists?(cookbook_directory)).to eq false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should generate an html file for the cookbook version' do
|
43
|
+
subject.generate
|
44
|
+
expect(File.exists?(cookbook_file)).to eq true
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should have a proper link back to the home page' do
|
48
|
+
subject.generate
|
49
|
+
expect(view_content).to match(%{href="../../index.html"})
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should have a form for the search action with the proper path' do
|
53
|
+
subject.generate
|
54
|
+
expect(view_content).to match(%{action="../../index.html#search/"})
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should have the proper relative path to any loaded assets' do
|
58
|
+
subject.generate
|
59
|
+
expect(view_content).to match %{href="../../assets/}
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should display the name of the cookbook' do
|
63
|
+
subject.generate
|
64
|
+
expect(view_content).to match 'sample_cookbook'
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should display the version of the cookbook' do
|
68
|
+
subject.generate
|
69
|
+
expect(view_content).to match '1.2.3'
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should display a link to download the cookbook' do
|
73
|
+
subject.generate
|
74
|
+
expect(view_content).to match %{href="../../cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz"}
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should display any dependencies the cookbook has' do
|
78
|
+
subject.generate
|
79
|
+
expect(view_content).to match 'yum > 3.0.0'
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when minimart has the dependent cookbook' do
|
83
|
+
let(:yum) do
|
84
|
+
res = cookbooks.individual_cookbooks.first.dup
|
85
|
+
allow(res).to receive(:name).and_return('yum')
|
86
|
+
allow(res).to receive(:version).and_return('3.2.0')
|
87
|
+
res
|
88
|
+
end
|
89
|
+
|
90
|
+
before(:each) do
|
91
|
+
cookbooks.add(yum)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should build a link for the dependent cookbook' do
|
95
|
+
subject.generate
|
96
|
+
expect(view_content).to match %{href="../../cookbooks/yum/3.2.0.html"}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minimart/web/cookbooks'
|
3
|
+
|
4
|
+
describe Minimart::Web::Cookbooks do
|
5
|
+
|
6
|
+
let(:inventory_directory) { 'spec/fixtures/' }
|
7
|
+
let(:data_path) { File.join(directory, 'data.json') }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
Minimart::Web::Cookbooks.new(inventory_directory: inventory_directory)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '::new' do
|
14
|
+
it 'should set the #inventory_directory' do
|
15
|
+
expect(subject.inventory_directory).to eq inventory_directory
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should build a data structure with the proper cookbooks' do
|
19
|
+
expect(subject.keys).to include 'sample_cookbook'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should load the cookbooks provided' do
|
23
|
+
expect(subject['sample_cookbook'].first).to be_a Minimart::Cookbook
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when there are multiple versions of the same cookbook' do
|
27
|
+
let(:cookbook_one) do
|
28
|
+
c = Minimart::Cookbook.new(nil)
|
29
|
+
allow(c).to receive(:name).and_return 'test-book'
|
30
|
+
allow(c).to receive(:version).and_return '1.9.0'
|
31
|
+
c
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:cookbook_two) do
|
35
|
+
c = Minimart::Cookbook.new(nil)
|
36
|
+
allow(c).to receive(:name).and_return 'test-book'
|
37
|
+
allow(c).to receive(:version).and_return '1.19.0'
|
38
|
+
c
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:cookbooks) { [cookbook_one, cookbook_two] }
|
42
|
+
|
43
|
+
before(:each) do
|
44
|
+
allow_any_instance_of(Minimart::Web::Cookbooks).to receive(:cookbooks).and_return cookbooks
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should load both cookbooks' do
|
48
|
+
expect(subject['test-book'].size).to eq 2
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should properly sort them in version descending order' do
|
52
|
+
expect(subject['test-book'][0].version).to eq '1.19.0'
|
53
|
+
expect(subject['test-book'][1].version).to eq '1.9.0'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '::to_json' do
|
59
|
+
let(:result) { JSON.parse(subject.to_json) }
|
60
|
+
|
61
|
+
it 'should return the proper data structure as JSON' do
|
62
|
+
expect(result.first['name']).to eq 'sample_cookbook'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should include the number of versions available' do
|
66
|
+
expect(result.first['available_versions']).to eq 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minimart/web/dashboard_generator'
|
3
|
+
|
4
|
+
describe Minimart::Web::DashboardGenerator do
|
5
|
+
let(:cookbooks) do
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:web_directory) { test_directory }
|
10
|
+
|
11
|
+
subject do
|
12
|
+
Minimart::Web::DashboardGenerator.new(
|
13
|
+
web_directory: web_directory,
|
14
|
+
cookbooks: cookbooks)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#generate' do
|
18
|
+
it 'should create an index.html file in the web directory' do
|
19
|
+
subject.generate
|
20
|
+
expect(File.exists?(File.join(web_directory, 'index.html'))).to eq true
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should have a proper link back to the home page' do
|
24
|
+
subject.generate
|
25
|
+
expect(subject.template_content).to match(%{href="index.html"})
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have the proper relative path to any loaded assets' do
|
29
|
+
subject.generate
|
30
|
+
expect(subject.template_content).to match %{href="assets/}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minimart/web/html_generator'
|
3
|
+
|
4
|
+
describe Minimart::Web::HtmlGenerator do
|
5
|
+
let(:cookbooks) do
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:web_directory) { test_directory }
|
10
|
+
|
11
|
+
subject do
|
12
|
+
Minimart::Web::HtmlGenerator.new(
|
13
|
+
web_directory: web_directory,
|
14
|
+
cookbooks: cookbooks)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#generate' do
|
18
|
+
it 'should copy any available assets' do
|
19
|
+
subject.generate
|
20
|
+
expect(Dir.exists?(File.join(web_directory, 'assets'))).to eq true
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should generate the dashboard page' do
|
24
|
+
expect_any_instance_of(Minimart::Web::DashboardGenerator).to receive(:generate)
|
25
|
+
subject.generate
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should generate show pages for any of the cookbooks' do
|
29
|
+
expect_any_instance_of(Minimart::Web::CookbookShowPageGenerator).to receive(:generate)
|
30
|
+
subject.generate
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Minimart::Web::MarkdownParser do
|
4
|
+
|
5
|
+
describe '::parse' do
|
6
|
+
context 'when the file does not have a markdown extension' do
|
7
|
+
let(:contents) { 'file contents here' }
|
8
|
+
|
9
|
+
let(:file) do
|
10
|
+
File.join(test_directory, 'readme.rdoc').tap do |file_name|
|
11
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return the file contents' do
|
16
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to eq contents
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not attempt to parse the file' do
|
20
|
+
expect(Minimart::Web::MarkdownParser).to_not receive(:new)
|
21
|
+
Minimart::Web::MarkdownParser.parse(file)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when the file has a .md extension' do
|
26
|
+
let(:contents) { '# Title' }
|
27
|
+
|
28
|
+
let(:file) do
|
29
|
+
File.join(test_directory, 'readme.md').tap do |file_name|
|
30
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should parse the contents as markdown' do
|
35
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to match '<h1>Title</h1>'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when the file has a .markdown extension' do
|
40
|
+
let(:contents) { '# Title' }
|
41
|
+
|
42
|
+
let(:file) do
|
43
|
+
File.join(test_directory, 'readme.markdown').tap do |file_name|
|
44
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should parse the contents as markdown' do
|
49
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to match '<h1>Title</h1>'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Minimart::Web::TemplateHelper do
|
4
|
+
let(:klass) do
|
5
|
+
k = Class.new
|
6
|
+
k.extend(Minimart::Web::TemplateHelper)
|
7
|
+
k
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#platform_icon' do
|
11
|
+
describe 'amazon' do
|
12
|
+
subject { klass.platform_icon('amazon') }
|
13
|
+
it { is_expected.to eq 'aws' }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'centos' do
|
17
|
+
subject { klass.platform_icon('centos') }
|
18
|
+
it { is_expected.to eq 'centos' }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'debian' do
|
22
|
+
subject { klass.platform_icon('debian') }
|
23
|
+
it { is_expected.to eq 'debian' }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'fedora' do
|
27
|
+
subject { klass.platform_icon('fedora') }
|
28
|
+
it { is_expected.to eq 'fedora' }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'freebsd' do
|
32
|
+
subject { klass.platform_icon('freebsd') }
|
33
|
+
it { is_expected.to eq 'freebsd' }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'linuxmint' do
|
37
|
+
subject { klass.platform_icon('linuxmint') }
|
38
|
+
it { is_expected.to eq 'linux-mint' }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'mac_os_x' do
|
42
|
+
subject { klass.platform_icon('mac_os_x') }
|
43
|
+
it { is_expected.to eq 'apple' }
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'oracle' do
|
47
|
+
subject { klass.platform_icon('oracle') }
|
48
|
+
it { is_expected.to eq 'oracle' }
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'raspbian' do
|
52
|
+
subject { klass.platform_icon('raspbian') }
|
53
|
+
it { is_expected.to eq 'raspberrypi' }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'redhat' do
|
57
|
+
subject { klass.platform_icon('redhat') }
|
58
|
+
it { is_expected.to eq 'redhat' }
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'solaris' do
|
62
|
+
subject { klass.platform_icon('solaris') }
|
63
|
+
it { is_expected.to eq 'solaris' }
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'suse' do
|
67
|
+
subject { klass.platform_icon('suse') }
|
68
|
+
it { is_expected.to eq 'suse' }
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'ubuntu' do
|
72
|
+
subject { klass.platform_icon('ubuntu') }
|
73
|
+
it { is_expected.to eq 'ubuntu' }
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'windows' do
|
77
|
+
subject { klass.platform_icon('windows') }
|
78
|
+
it { is_expected.to eq 'windows' }
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'unknown' do
|
82
|
+
subject { klass.platform_icon('made-up-os') }
|
83
|
+
it { is_expected.to eq 'laptop' }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'minimart/web/universe_generator'
|
3
|
+
require 'minimart/web/cookbooks'
|
4
|
+
require 'minimart/cookbook'
|
5
|
+
|
6
|
+
describe Minimart::Web::UniverseGenerator do
|
7
|
+
|
8
|
+
let(:web_directory) { test_directory }
|
9
|
+
let(:endpoint) { 'example.com' }
|
10
|
+
|
11
|
+
let(:cookbook) do
|
12
|
+
instance_double(Minimart::Cookbook,
|
13
|
+
name: 'sample_cookbook',
|
14
|
+
version: '1.2.3',
|
15
|
+
web_friendly_version: '1_2_3',
|
16
|
+
dependencies: {'mysql' => '> 0.0'},
|
17
|
+
path: Pathname.new('/spec/fixtures/sample_cookbook'),
|
18
|
+
to_s: 'sample_cookbook-1.2.3')
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:cookbooks) do
|
22
|
+
instance_double(Minimart::Web::Cookbooks, individual_cookbooks: [cookbook])
|
23
|
+
end
|
24
|
+
|
25
|
+
subject do
|
26
|
+
Minimart::Web::UniverseGenerator.new(
|
27
|
+
web_directory: web_directory,
|
28
|
+
endpoint: endpoint,
|
29
|
+
cookbooks: cookbooks)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '::new' do
|
33
|
+
it 'should assign #web_directory' do
|
34
|
+
expect(subject.web_directory).to eq web_directory
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should assign #endpoint' do
|
38
|
+
expect(subject.endpoint).to eq endpoint
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should assign #cookbooks' do
|
42
|
+
expect(subject.cookbooks).to eq cookbooks
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should build an empty universe' do
|
46
|
+
expect(subject.universe.empty?).to eq true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#generate' do
|
51
|
+
let(:cookbook_files_dir) { File.join(web_directory, 'cookbook_files') }
|
52
|
+
let(:cookbook_dir) { File.join(cookbook_files_dir, 'sample_cookbook') }
|
53
|
+
let(:universe_file) { File.join(web_directory, 'universe') }
|
54
|
+
|
55
|
+
before(:each) do
|
56
|
+
allow(Minimart::Utils::Archive).to receive(:pack_archive)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should make a cookbook_files directory in the web directory' do
|
60
|
+
subject.generate
|
61
|
+
expect(Dir.exists?(cookbook_files_dir)).to eq true
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when a cookbook files directory already exists' do
|
65
|
+
let(:cookbook_dir) { File.join(cookbook_files_dir, 'existing-cookbook') }
|
66
|
+
|
67
|
+
before(:each) do
|
68
|
+
FileUtils.mkdir_p(cookbook_files_dir)
|
69
|
+
FileUtils.mkdir_p(cookbook_dir)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should remove the contents' do
|
73
|
+
subject.generate
|
74
|
+
expect(Dir.exists?(cookbook_dir)).to eq false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should make a sub-directory for any cookbooks provided' do
|
79
|
+
subject.generate
|
80
|
+
expect(Dir.exists?(cookbook_dir)).to eq true
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should make a sub-directory for any versions of cookbooks provided' do
|
84
|
+
subject.generate
|
85
|
+
expect(Dir.exists?(File.join(cookbook_dir, '1_2_3'))).to eq true
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should generate an archive for the cookbook in the correct path' do
|
89
|
+
expect(Minimart::Utils::Archive).to receive(:pack_archive).with(
|
90
|
+
cookbook,
|
91
|
+
File.join(cookbook_dir, '1_2_3/sample_cookbook-1.2.3.tar.gz'))
|
92
|
+
|
93
|
+
subject.generate
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should write a universe file in the proper directory' do
|
97
|
+
subject.generate
|
98
|
+
expect(File.exists?(universe_file)).to eq true
|
99
|
+
end
|
100
|
+
|
101
|
+
describe 'universe contents' do
|
102
|
+
let(:universe_contents) { JSON.parse(File.open(universe_file).read) }
|
103
|
+
let(:cookbook_info) { universe_contents['sample_cookbook']['1.2.3'] }
|
104
|
+
|
105
|
+
before(:each) { subject.generate }
|
106
|
+
|
107
|
+
it 'should give the cookbook the proper location type' do
|
108
|
+
expect(cookbook_info['location_type']).to eq 'uri'
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should give the cookbook the proper location path' do
|
112
|
+
expect(cookbook_info['location_path']).to eq 'http://example.com/cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz'
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should give the cookbook the proper download url' do
|
116
|
+
expect(cookbook_info['download_url']).to eq 'http://example.com/cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz'
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should include any dependencies' do
|
120
|
+
expect(cookbook_info['dependencies']).to eq('mysql' => '> 0.0')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|