minimart 0.0.1

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 (135) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +3 -0
  6. data/README.md +198 -0
  7. data/Rakefile +45 -0
  8. data/bin/minimart +4 -0
  9. data/lib/minimart.rb +15 -0
  10. data/lib/minimart/cli.rb +93 -0
  11. data/lib/minimart/commands/mirror.rb +30 -0
  12. data/lib/minimart/commands/web.rb +91 -0
  13. data/lib/minimart/configuration.rb +46 -0
  14. data/lib/minimart/cookbook.rb +173 -0
  15. data/lib/minimart/download/cookbook.rb +70 -0
  16. data/lib/minimart/download/git_cache.rb +60 -0
  17. data/lib/minimart/download/git_repository.rb +41 -0
  18. data/lib/minimart/error.rb +32 -0
  19. data/lib/minimart/inventory_requirement/base_requirement.rb +81 -0
  20. data/lib/minimart/inventory_requirement/git_requirement.rb +87 -0
  21. data/lib/minimart/inventory_requirement/git_requirements_builder.rb +101 -0
  22. data/lib/minimart/inventory_requirement/local_path_requirement.rb +45 -0
  23. data/lib/minimart/inventory_requirement/local_requirements_builder.rb +31 -0
  24. data/lib/minimart/inventory_requirement/supermarket_requirements_builder.rb +35 -0
  25. data/lib/minimart/mirror.rb +12 -0
  26. data/lib/minimart/mirror/dependency_graph.rb +73 -0
  27. data/lib/minimart/mirror/download_metadata.rb +57 -0
  28. data/lib/minimart/mirror/inventory_builder.rb +143 -0
  29. data/lib/minimart/mirror/inventory_configuration.rb +74 -0
  30. data/lib/minimart/mirror/inventory_requirements.rb +104 -0
  31. data/lib/minimart/mirror/local_store.rb +107 -0
  32. data/lib/minimart/mirror/source.rb +57 -0
  33. data/lib/minimart/mirror/source_cookbook.rb +77 -0
  34. data/lib/minimart/mirror/sources.rb +37 -0
  35. data/lib/minimart/output.rb +34 -0
  36. data/lib/minimart/utils/archive.rb +39 -0
  37. data/lib/minimart/utils/file_helper.rb +34 -0
  38. data/lib/minimart/utils/http.rb +60 -0
  39. data/lib/minimart/version.rb +3 -0
  40. data/lib/minimart/web.rb +10 -0
  41. data/lib/minimart/web/cookbook_show_page_generator.rb +78 -0
  42. data/lib/minimart/web/cookbooks.rb +83 -0
  43. data/lib/minimart/web/dashboard_generator.rb +46 -0
  44. data/lib/minimart/web/html_generator.rb +52 -0
  45. data/lib/minimart/web/markdown_parser.rb +47 -0
  46. data/lib/minimart/web/template_helper.rb +132 -0
  47. data/lib/minimart/web/universe_generator.rb +109 -0
  48. data/minimart.gemspec +36 -0
  49. data/spec/fixtures/sample_cookbook.tar.gz +0 -0
  50. data/spec/fixtures/sample_cookbook/Berksfile +3 -0
  51. data/spec/fixtures/sample_cookbook/CHANGELOG.md +3 -0
  52. data/spec/fixtures/sample_cookbook/Gemfile +16 -0
  53. data/spec/fixtures/sample_cookbook/LICENSE +3 -0
  54. data/spec/fixtures/sample_cookbook/README.md +42 -0
  55. data/spec/fixtures/sample_cookbook/Thorfile +5 -0
  56. data/spec/fixtures/sample_cookbook/Vagrantfile +90 -0
  57. data/spec/fixtures/sample_cookbook/chefignore +94 -0
  58. data/spec/fixtures/sample_cookbook/metadata.rb +9 -0
  59. data/spec/fixtures/sample_cookbook/recipes/default.rb +8 -0
  60. data/spec/fixtures/sample_inventory.yml +16 -0
  61. data/spec/fixtures/simple_git_inventory.yml +8 -0
  62. data/spec/fixtures/simple_inventory.yml +6 -0
  63. data/spec/fixtures/simple_local_path_inventory.yml +5 -0
  64. data/spec/fixtures/universe.json +42 -0
  65. data/spec/fixtures/vcr_cassettes/local_path_cookbooks.yml +3316 -0
  66. data/spec/fixtures/vcr_cassettes/location_specific_cookbooks.yml +3316 -0
  67. data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_graph.yml +905 -0
  68. data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_installing_cookbooks.yml +4218 -0
  69. data/spec/lib/minimart/cli_spec.rb +104 -0
  70. data/spec/lib/minimart/commands/mirror_spec.rb +37 -0
  71. data/spec/lib/minimart/commands/web_spec.rb +75 -0
  72. data/spec/lib/minimart/configuration_spec.rb +54 -0
  73. data/spec/lib/minimart/cookbook_spec.rb +137 -0
  74. data/spec/lib/minimart/download/cookbook_spec.rb +135 -0
  75. data/spec/lib/minimart/download/git_cache_spec.rb +69 -0
  76. data/spec/lib/minimart/download/git_repository_spec.rb +39 -0
  77. data/spec/lib/minimart/error_spec.rb +18 -0
  78. data/spec/lib/minimart/inventory_requirement/base_requirement_spec.rb +38 -0
  79. data/spec/lib/minimart/inventory_requirement/git_requirement_spec.rb +92 -0
  80. data/spec/lib/minimart/inventory_requirement/git_requirements_builder_spec.rb +130 -0
  81. data/spec/lib/minimart/inventory_requirement/local_path_requirement_spec.rb +35 -0
  82. data/spec/lib/minimart/inventory_requirement/local_requirements_builder_spec.rb +33 -0
  83. data/spec/lib/minimart/inventory_requirement/supermarket_requirements_builder_spec.rb +69 -0
  84. data/spec/lib/minimart/mirror/dependency_graph_spec.rb +123 -0
  85. data/spec/lib/minimart/mirror/download_metadata_spec.rb +73 -0
  86. data/spec/lib/minimart/mirror/inventory_builder_spec.rb +195 -0
  87. data/spec/lib/minimart/mirror/inventory_configuration_spec.rb +86 -0
  88. data/spec/lib/minimart/mirror/inventory_requirements_spec.rb +78 -0
  89. data/spec/lib/minimart/mirror/local_store_spec.rb +64 -0
  90. data/spec/lib/minimart/mirror/source_spec.rb +54 -0
  91. data/spec/lib/minimart/mirror/sources_spec.rb +50 -0
  92. data/spec/lib/minimart/output_spec.rb +29 -0
  93. data/spec/lib/minimart/utils/archive_spec.rb +38 -0
  94. data/spec/lib/minimart/utils/file_helper_spec.rb +43 -0
  95. data/spec/lib/minimart/utils/http_spec.rb +37 -0
  96. data/spec/lib/minimart/web/cookbook_show_page_generator_spec.rb +101 -0
  97. data/spec/lib/minimart/web/cookbooks_spec.rb +70 -0
  98. data/spec/lib/minimart/web/dashboard_generator_spec.rb +33 -0
  99. data/spec/lib/minimart/web/html_generator_spec.rb +34 -0
  100. data/spec/lib/minimart/web/markdown_parser_spec.rb +54 -0
  101. data/spec/lib/minimart/web/template_helper_spec.rb +86 -0
  102. data/spec/lib/minimart/web/universe_generator_spec.rb +125 -0
  103. data/spec/spec_helper.rb +35 -0
  104. data/spec/support/file_system.rb +22 -0
  105. data/web/_assets/javascripts/app.js +164 -0
  106. data/web/_assets/javascripts/backbone.min.js +6 -0
  107. data/web/_assets/javascripts/jquery.min.js +4 -0
  108. data/web/_assets/javascripts/jquery.tabslet.min.js +9 -0
  109. data/web/_assets/javascripts/manifest.js +5 -0
  110. data/web/_assets/javascripts/underscore.min.js +5 -0
  111. data/web/_assets/stylesheets/font-awesome.min.css +4 -0
  112. data/web/_assets/stylesheets/font-mfizz.css +318 -0
  113. data/web/_assets/stylesheets/main.css +720 -0
  114. data/web/_assets/stylesheets/manifest.css +4 -0
  115. data/web/_assets/stylesheets/normalize.css +427 -0
  116. data/web/assets/fonts/FontAwesome.otf +0 -0
  117. data/web/assets/fonts/font-mfizz.eot +0 -0
  118. data/web/assets/fonts/font-mfizz.svg +1344 -0
  119. data/web/assets/fonts/font-mfizz.ttf +0 -0
  120. data/web/assets/fonts/font-mfizz.woff +0 -0
  121. data/web/assets/fonts/fontawesome-webfont.eot +0 -0
  122. data/web/assets/fonts/fontawesome-webfont.svg +520 -0
  123. data/web/assets/fonts/fontawesome-webfont.ttf +0 -0
  124. data/web/assets/fonts/fontawesome-webfont.woff +0 -0
  125. data/web/assets/images/header-slim.jpg +0 -0
  126. data/web/assets/images/icon-search.png +0 -0
  127. data/web/assets/images/mad-glory-logo.png +0 -0
  128. data/web/assets/images/main-gradient.png +0 -0
  129. data/web/assets/images/top-bar-logo.png +0 -0
  130. data/web/assets/javascripts/application.min.js +5 -0
  131. data/web/assets/stylesheets/application.min.css +4 -0
  132. data/web/templates/cookbook_show.erb +96 -0
  133. data/web/templates/dashboard.erb +81 -0
  134. data/web/templates/layout.erb +38 -0
  135. metadata +433 -0
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Mirror::InventoryConfiguration do
4
+
5
+ let(:config_file_path) { 'spec/fixtures/sample_inventory.yml' }
6
+
7
+ subject { Minimart::Mirror::InventoryConfiguration.new(config_file_path) }
8
+
9
+ describe '::new' do
10
+ context 'when the inventory config file does not exist' do
11
+ it 'should raise the proper exception' do
12
+ expect {
13
+ Minimart::Mirror::InventoryConfiguration.new('not_a_real_config.yml')
14
+ }.to raise_error(
15
+ Minimart::Error::InvalidInventoryError,
16
+ 'The inventory configuration file could not be found')
17
+ end
18
+ end
19
+
20
+ describe 'global configuration' do
21
+ let(:conf) do
22
+ {
23
+ 'configuration' => {
24
+ 'verify_ssl' => false,
25
+ 'github' => {'github' => 'config'},
26
+ 'chef' => {'chef' => 'config'}
27
+ }
28
+ }
29
+ end
30
+
31
+ before(:each) do
32
+ allow(YAML).to receive(:load).and_return(conf)
33
+ end
34
+
35
+ after(:each) do
36
+ Minimart::Configuration.verify_ssl = nil
37
+ Minimart::Configuration.github_config = nil
38
+ Minimart::Configuration.chef_server_config = nil
39
+ end
40
+
41
+ it 'should set ssl verify to the proper value' do
42
+ subject
43
+ expect(Minimart::Configuration.verify_ssl).to eq false
44
+ end
45
+
46
+ it 'should set the github config to the proper value' do
47
+ subject
48
+ expect(Minimart::Configuration.github_config).to include('github' => 'config')
49
+ end
50
+
51
+ it 'should set the chef config to the proper value' do
52
+ subject
53
+ expect(Minimart::Configuration.chef_server_config).to include('chef' => 'config')
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#sources' do
59
+ it 'should build sources' do
60
+ expect(subject.sources).to be_a Minimart::Mirror::Sources
61
+ end
62
+
63
+ it 'should build sources with the correct attributes' do
64
+ expect(subject.sources.map &:base_url).to include 'https://supermarket.getchef.com'
65
+ end
66
+ end
67
+
68
+ describe '#requirements' do
69
+ it 'should build requirements' do
70
+ expect(subject.requirements).to be_a Minimart::Mirror::InventoryRequirements
71
+ end
72
+
73
+ context 'when there are no cookbooks defined in the config file' do
74
+ before(:each) do
75
+ allow_any_instance_of(File).to receive(:read).and_return "sources: \"https://supermarket.getchef.com\""
76
+ end
77
+
78
+ it 'should raise an exception' do
79
+ expect {
80
+ subject.requirements
81
+ }.to raise_error Minimart::Error::InvalidInventoryError, 'Minimart could not find any cookbooks defined in the inventory'
82
+ end
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Mirror::InventoryRequirements do
4
+
5
+ let(:raw_requirements) do
6
+ {
7
+ 'sample_cookbook' => {'path' => 'spec/fixtures/sample_cookbook'},
8
+ 'mysql' => {
9
+ 'versions' => ['~> 5.6.1'],
10
+ 'git' => {
11
+ 'location' => 'https://github.com/opscode-cookbooks/mysql',
12
+ 'branches' => ['windows'],
13
+ 'refs' => ['git-ref-sha'],
14
+ 'tags' => ['v5.2.0']
15
+ }
16
+ }
17
+ }
18
+ end
19
+
20
+ subject do
21
+ Minimart::Mirror::InventoryRequirements.new(raw_requirements)
22
+ end
23
+
24
+ describe "::new" do
25
+ it 'should build any cookbooks for any listed versions' do
26
+ expect(subject.any? { |c| c.version_requirement == '~> 5.6.1' }).to eq true
27
+ end
28
+
29
+ it 'should build cookbooks for any git branches' do
30
+ expect(subject.any? { |c| c.respond_to?(:branch) && c.branch == 'windows' }).to eq true
31
+ end
32
+
33
+ it 'should build cookbooks for any git tags' do
34
+ expect(subject.any? { |c| c.respond_to?(:tag) && c.tag == 'v5.2.0' }).to eq true
35
+ end
36
+
37
+ it 'should build cookbooks for any git refs' do
38
+ expect(subject.any? { |c| c.respond_to?(:ref) && c.ref == 'git-ref-sha' }).to eq true
39
+ end
40
+
41
+ it 'should build any cookbooks for local paths' do
42
+ expect(subject.any? { |c| c.respond_to?(:path) && c.path == 'spec/fixtures/sample_cookbook' }).to eq true
43
+ end
44
+
45
+ context 'when no requirements can be found for a given cookbook' do
46
+ before(:each) do
47
+ raw_requirements['mysql'] = {'not-a-real-setting' => '~> 5.6.1'}
48
+ end
49
+
50
+ it 'should raise an error' do
51
+ expect {
52
+ subject
53
+ }.to raise_error Minimart::Error::InvalidInventoryError,
54
+ "Minimart could not find any requirements for 'mysql'"
55
+ end
56
+ end
57
+ end
58
+
59
+ describe '#version_required?' do
60
+ context 'when the passed in cookbook was not specified in the local inventory' do
61
+ it 'should return true' do
62
+ expect(subject.version_required?('new-book', '0.0.1')).to eq true
63
+ end
64
+ end
65
+
66
+ context 'when the passed in cookbook solves a requirement specified in the local inventory' do
67
+ it 'should return true' do
68
+ expect(subject.version_required?('mysql', '5.6.2')).to eq true
69
+ end
70
+ end
71
+
72
+ context 'when the passed in cookbook does not solve an explicitly defined requirement in the inventory' do
73
+ it 'should return false' do
74
+ expect(subject.version_required?('mysql', '5.5.0')).to eq false
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Mirror::LocalStore do
4
+
5
+ subject { Minimart::Mirror::LocalStore.new(test_directory) }
6
+
7
+ describe '::new' do
8
+ context 'when a cookbook is found in the path' do
9
+ subject { Minimart::Mirror::LocalStore.new('spec/fixtures') }
10
+
11
+ it 'should add the cookbook to the store' do
12
+ expect(subject.installed?('sample_cookbook', '1.2.3')).to eq true
13
+ end
14
+ end
15
+ end
16
+
17
+ describe "#add_cookbook_from_path" do
18
+ let(:sample_cookbook_path) { 'spec/fixtures/sample_cookbook' }
19
+
20
+ it 'should copy the sample cookbook' do
21
+ subject.add_cookbook_from_path(sample_cookbook_path)
22
+ new_cookbook_path = File.join(test_directory, 'sample_cookbook-1.2.3')
23
+ expect(Dir.exists?(new_cookbook_path)).to eq true
24
+ end
25
+
26
+ it 'should add the cookbook to the local store' do
27
+ subject.add_cookbook_from_path(sample_cookbook_path)
28
+ expect(subject.installed?('sample_cookbook', '1.2.3')).to eq true
29
+ end
30
+
31
+ it 'should store any download metadata' do
32
+ expect_any_instance_of(Minimart::Mirror::DownloadMetadata).to receive(:write).with('my' => 'data')
33
+ subject.add_cookbook_from_path(sample_cookbook_path, 'my' => 'data')
34
+ end
35
+
36
+ it 'should store the metadata in the proper path' do
37
+ subject.add_cookbook_from_path(sample_cookbook_path)
38
+ expect(File.exists?(File.join(test_directory, 'sample_cookbook-1.2.3', '.minimart.json'))).to eq true
39
+ end
40
+ end
41
+
42
+ describe '#installed?' do
43
+ context 'when a cookbook is installed' do
44
+ before(:each) do
45
+ subject.add_cookbook_to_store('sample_cookbook', '1.2.3')
46
+ end
47
+
48
+ it 'should return true for a matching version' do
49
+ expect(subject.installed?('sample_cookbook', '1.2.3')).to eq true
50
+ end
51
+
52
+ it 'should return false for a non-matching version' do
53
+ expect(subject.installed?('sample_cookbook', '10.0.0')).to eq false
54
+ end
55
+ end
56
+
57
+ context 'when a cookbook is not installed' do
58
+ it 'should return false' do
59
+ expect(subject.installed?('sample_cookbook', '1.2.3')).to eq false
60
+ end
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Mirror::Source do
4
+
5
+ let(:base_url) { 'https://fakesupermarket.com/chef' }
6
+
7
+ subject { Minimart::Mirror::Source.new(base_url) }
8
+
9
+ let(:raw_universe) { File.open('spec/fixtures/universe.json').read }
10
+
11
+ before(:each) do
12
+ stub_request(:get, "#{base_url}/universe").
13
+ to_return(status: 200, body: raw_universe)
14
+ end
15
+
16
+ describe '#find_cookbook' do
17
+ describe 'when a cookbook is present in the universe' do
18
+ it 'should return a matching cookbook' do
19
+ result = subject.find_cookbook('mysql', '5.6.1')
20
+ expect(result.name).to eq 'mysql'
21
+ expect(result.version).to eq '5.6.1'
22
+ expect(result.location_path).to eq 'https://supermarket.getchef.com/api/v1'
23
+ expect(result.download_url).to eq 'https://supermarket.getchef.com/api/v1/cookbooks/mysql/versions/5.6.1/download'
24
+ expect(result.dependencies).to eq("yum-mysql-community" => ">= 0.0.0")
25
+ end
26
+ end
27
+
28
+ describe 'when a cookbook is not present in the universe' do
29
+ it 'should return nil' do
30
+ expect(subject.find_cookbook('madeup', '0.0.1')).to be_nil
31
+ end
32
+ end
33
+
34
+ context 'when the given universe does not exist' do
35
+ before(:each) do
36
+ stub_request(:get, "#{base_url}/universe").to_return(status: 404)
37
+ end
38
+
39
+ it 'should raise the proper exception' do
40
+ expect {
41
+ subject.find_cookbook('mysql', '5.6.1')
42
+ }.to raise_error(
43
+ Minimart::Error::UniverseNotFoundError,
44
+ "no universe found for #{base_url}")
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '#to_s' do
50
+ it 'should return the base url' do
51
+ expect(subject.to_s).to eq base_url
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Mirror::Sources do
4
+
5
+ describe '::new' do
6
+ let(:source_1) { 'https://supermarket.getchef.com' }
7
+ let(:source_2) { 'https://supermarket.internal.com' }
8
+
9
+ subject do
10
+ Minimart::Mirror::Sources.new([source_1, source_2])
11
+ end
12
+
13
+ it 'should build a source with the first url provided' do
14
+ expect(subject.map &:base_url ).to include source_1
15
+ end
16
+
17
+ it 'should build a source with the second url provided' do
18
+ expect(subject.map &:base_url ).to include source_2
19
+ end
20
+ end
21
+
22
+ describe '#find_cookbook' do
23
+ subject do
24
+ Minimart::Mirror::Sources.new(['https://supermarket.internal.com'])
25
+ end
26
+
27
+ let(:cookbook) { double('cookbook', name: 'mysql', version: '1.0.0') }
28
+
29
+ before(:each) do
30
+ allow_any_instance_of(Minimart::Mirror::Source).to receive(:cookbooks).and_return [cookbook]
31
+ end
32
+
33
+ context 'when a source has the given cookbook' do
34
+ it 'should return the cookbook' do
35
+ expect(subject.find_cookbook('mysql', '1.0.0')).to eq cookbook
36
+ end
37
+ end
38
+
39
+ context 'when the cookbook cannot be found' do
40
+ it 'should raise the proper exception' do
41
+ expect {
42
+ subject.find_cookbook('mysql', '2.0.0')
43
+ }.to raise_error(
44
+ Minimart::Error::CookbookNotFound,
45
+ "The cookbook mysql with the version 2.0.0 could not be found")
46
+ end
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Output do
4
+
5
+ let(:io) { StringIO.new }
6
+ let(:output) { Minimart::Output.new(io) }
7
+
8
+ subject { io.string }
9
+
10
+ describe '#puts' do
11
+ before(:each) { output.puts 'hello world' }
12
+ it { is_expected.to include 'hello world' }
13
+ end
14
+
15
+ describe '#puts_red' do
16
+ before(:each) { output.puts_red 'hello world' }
17
+ it { is_expected.to include "\e[31mhello world\e[0m" }
18
+ end
19
+
20
+ describe '#puts_green' do
21
+ before(:each) { output.puts_green 'hello world' }
22
+ it { is_expected.to include "\e[32mhello world\e[0m" }
23
+ end
24
+
25
+ describe '#puts_yellow' do
26
+ before(:each) { output.puts_yellow 'hello world' }
27
+ it { is_expected.to include "\e[33mhello world\e[0m" }
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Utils::Archive do
4
+ describe '::extract_archive' do
5
+ let(:archive) { 'spec/fixtures/sample_cookbook.tar.gz' }
6
+
7
+ let(:extracted_readme) do
8
+ File.join(test_directory, 'sample_cookbook', 'README.md')
9
+ end
10
+
11
+ it 'should extract the contents of the archive to the passed in dir' do
12
+ Minimart::Utils::Archive.extract_archive(archive, test_directory)
13
+ expect(test_directory_contents).to include extracted_readme
14
+ end
15
+ end
16
+
17
+ describe '::pack_archive' do
18
+ let(:path) { File.expand_path('spec/fixtures/sample_cookbook') }
19
+ let(:cookbook) { Minimart::Cookbook.from_path(path) }
20
+ let(:archive) { File.expand_path(File.join(test_directory, 'sample.tar.gz')) }
21
+
22
+ before(:each) { Minimart::Utils::Archive.pack_archive(cookbook, archive) }
23
+
24
+ it 'should create the archive' do
25
+ expect(File.exists?(archive)).to eq true
26
+ end
27
+
28
+ it 'should create a directory of the cookbook name in the top level of the archive' do
29
+ Minimart::Utils::Archive.extract_archive(archive, test_directory)
30
+ expect(Dir.exists?(File.join(test_directory, 'sample_cookbook')))
31
+ end
32
+
33
+ it 'should properly compress any files' do
34
+ Minimart::Utils::Archive.extract_archive(archive, test_directory)
35
+ expect(File.exists?(File.join(test_directory, 'sample_cookbook', 'README.md'))).to eq true
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minimart::Utils::FileHelper do
4
+
5
+ subject { Minimart::Utils::FileHelper }
6
+
7
+ let(:cookbook_path) { 'spec/fixtures/sample_cookbook/' }
8
+
9
+ describe '::cookbook_path_in_directory' do
10
+ describe 'when the path passed is a cookbook' do
11
+ it 'should return the path to the cookbook' do
12
+ expect(subject.cookbook_path_in_directory(cookbook_path)).to eq cookbook_path
13
+ end
14
+ end
15
+
16
+ describe 'when a cookbook is found one level deep in the directory structure' do
17
+ it 'should return the path to the cookbook' do
18
+ expect(subject.cookbook_path_in_directory('spec/fixtures')).to eq cookbook_path
19
+ end
20
+ end
21
+
22
+ describe 'when no cookbook is found' do
23
+ it 'should return nil' do
24
+ expect(subject.cookbook_path_in_directory('spec/')).to eq nil
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '::cookbook_in_path?' do
30
+ describe 'when the path passed is a cookbook' do
31
+ it 'should return true' do
32
+ expect(subject.cookbook_in_path?('spec/fixtures/sample_cookbook')).to eq true
33
+ end
34
+ end
35
+
36
+ describe 'when the path passed is not a cookbook' do
37
+ it 'should return false' do
38
+ expect(subject.cookbook_in_path?('spec/')).to eq false
39
+ end
40
+ end
41
+ end
42
+
43
+ end