baha 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 (61) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +156 -0
  7. data/Rakefile +21 -0
  8. data/baha.gemspec +31 -0
  9. data/bin/baha +5 -0
  10. data/example/.gitignore +1 -0
  11. data/example/base/init.sh.erb +11 -0
  12. data/example/base/test-template.erb +22 -0
  13. data/example/example.yml +54 -0
  14. data/example/rvm/image.yml +33 -0
  15. data/example/rvm/init.sh.erb +12 -0
  16. data/lib/baha/builder.rb +130 -0
  17. data/lib/baha/cli.rb +69 -0
  18. data/lib/baha/config.rb +142 -0
  19. data/lib/baha/container_options/cmd.rb +33 -0
  20. data/lib/baha/container_options/entrypoint.rb +10 -0
  21. data/lib/baha/container_options/env.rb +21 -0
  22. data/lib/baha/container_options/exposed_ports.rb +35 -0
  23. data/lib/baha/container_options/invalid_option_error.rb +15 -0
  24. data/lib/baha/container_options/option.rb +59 -0
  25. data/lib/baha/container_options/volumes.rb +24 -0
  26. data/lib/baha/container_options.rb +38 -0
  27. data/lib/baha/image.rb +154 -0
  28. data/lib/baha/log.rb +80 -0
  29. data/lib/baha/pre_build/command.rb +51 -0
  30. data/lib/baha/pre_build/download.rb +28 -0
  31. data/lib/baha/pre_build/template.rb +48 -0
  32. data/lib/baha/pre_build.rb +47 -0
  33. data/lib/baha/version.rb +3 -0
  34. data/lib/baha/workspace.rb +13 -0
  35. data/lib/baha.rb +5 -0
  36. data/spec/builder_spec.rb +103 -0
  37. data/spec/config_spec.rb +93 -0
  38. data/spec/container_options/cmd_spec.rb +46 -0
  39. data/spec/container_options/entrypoint_spec.rb +32 -0
  40. data/spec/container_options/env_spec.rb +26 -0
  41. data/spec/container_options/exposed_ports_spec.rb +32 -0
  42. data/spec/container_options/option_spec.rb +43 -0
  43. data/spec/container_options/volumes_spec.rb +25 -0
  44. data/spec/fixtures/base_image.yml +5 -0
  45. data/spec/fixtures/config_build.yml +12 -0
  46. data/spec/fixtures/config_build_image.yml +10 -0
  47. data/spec/fixtures/config_eachimage.yml +12 -0
  48. data/spec/fixtures/config_embedded.yml +11 -0
  49. data/spec/fixtures/config_include.yml +7 -0
  50. data/spec/fixtures/config_ssl.yml +13 -0
  51. data/spec/fixtures/config_sslpath.yml +11 -0
  52. data/spec/helpers/docker_helpers.rb +31 -0
  53. data/spec/image_spec.rb +167 -0
  54. data/spec/log_spec.rb +89 -0
  55. data/spec/options_spec.rb +52 -0
  56. data/spec/pre_build/command_spec.rb +69 -0
  57. data/spec/pre_build/download_spec.rb +43 -0
  58. data/spec/pre_build/template_spec.rb +55 -0
  59. data/spec/pre_build_spec.rb +29 -0
  60. data/spec/spec_helper.rb +39 -0
  61. metadata +255 -0
@@ -0,0 +1,167 @@
1
+ require 'spec_helper'
2
+ require 'baha/image'
3
+
4
+ describe Baha::Image do
5
+ let(:config) do
6
+ Baha::Config.new({
7
+ 'defaults' => {
8
+ 'parent' => 'ubuntu:14.04.1',
9
+ 'repository' => 'docker.example.com/baha',
10
+ 'maintainer' => 'Ishmael <ishmael@example.com>',
11
+ 'bind' => '/.baha',
12
+ 'command' => ['/bin/bash','/.baha/init.sh']
13
+ }
14
+ })
15
+ end
16
+ let(:image) do
17
+ {
18
+ 'parent' => 'ubuntu:14.04.1',
19
+ 'name' => 'base',
20
+ 'tag' => '1.0.0',
21
+ 'maintainer' => '"Captain Ahab" <ahab@example.com>',
22
+ 'bind' => '/.data',
23
+ 'command' => ['/bin/bash','/.data/setup.sh']
24
+ }
25
+ end
26
+ subject { described_class.new(config,image) }
27
+
28
+ describe "#inspect" do
29
+ its(:inspect) { should match(/^Baha::Image<(@[a-z0-9_]+=.*)+>$/) }
30
+ end
31
+
32
+ describe "#parent_id" do
33
+ let(:parent) { double('parent') }
34
+ it 'returns parent full id if available' do
35
+ allow(Baha::Image).to receive(:get_image!).and_return(parent)
36
+ allow(parent).to receive(:id).and_return('AAAA')
37
+ expect(subject.parent_id).to eq('AAAA')
38
+ end
39
+ end
40
+
41
+ describe "#parse_name" do
42
+ subject { Baha::Image.parse_name(@name)}
43
+ it 'parses full name' do
44
+ @name = "docker.example.com/repo/name:tag"
45
+ is_expected.to eq({:ns=>"docker.example.com/repo", :name=>"name", :tag=>"tag"})
46
+ end
47
+ it 'parses local name' do
48
+ @name = "name:tag"
49
+ is_expected.to eq({:ns=>nil, :name=>"name", :tag=>"tag"})
50
+ end
51
+ it 'sets default tag to latest' do
52
+ @name = "name"
53
+ is_expected.to eq({:ns=>nil, :name=>"name", :tag=>"latest"})
54
+ end
55
+ it 'raises error on invalid name' do
56
+ expect { Baha::Image.parse_name("@@@@@@") }.to raise_error(ArgumentError)
57
+ end
58
+ end
59
+
60
+ describe "#parse_with_default" do
61
+ subject { Baha::Image.parse_with_default(@name,'default.example.com/baha')}
62
+ it 'does not override repos' do
63
+ @name = "docker.example.com/repo/name:tag"
64
+ is_expected.to eq({:ns=>"docker.example.com/repo", :name=>"name", :tag=>"tag"})
65
+ end
66
+ it 'sets default namespace' do
67
+ @name = "name:tag"
68
+ is_expected.to eq({:ns=>"default.example.com/baha", :name=>"name", :tag=>"tag"})
69
+ end
70
+ end
71
+
72
+ context "when constructed" do
73
+ its(:parent) { is_expected.to eq({:ns=>"docker.example.com/baha", :name=>"ubuntu", :tag=>"14.04.1"}) }
74
+ its(:image) { is_expected.to eq({:ns=>"docker.example.com/baha", :name=>"base", :tag=>"1.0.0"}) }
75
+ its(:maintainer) { is_expected.to eq('"Captain Ahab" <ahab@example.com>') }
76
+ its(:options) { is_expected.to be_a(Hash) }
77
+ its(:bind) { is_expected.to eq('/.data')}
78
+ its(:command) { is_expected.to eq(['/bin/bash','/.data/setup.sh']) }
79
+ its(:env) { is_expected.to include(
80
+ {:parent => {:ns=>"docker.example.com/baha", :name=>"ubuntu", :tag=>"14.04.1"}},
81
+ {:maintainer => "\"Captain Ahab\" <ahab@example.com>"},
82
+ {:bind => '/.data'},
83
+ {:name => 'base'},
84
+ {:tag => '1.0.0'},
85
+ :workspace) }
86
+ end
87
+
88
+ describe "#get_image!" do
89
+ let(:image) do
90
+ {
91
+ :ns => 'docker.example.com/baha',
92
+ :name => 'base',
93
+ :tag => '1.0.0'
94
+ }
95
+ end
96
+ subject { Baha::Image.get_image!(image) }
97
+ context 'when image exists locally' do
98
+ before :example do
99
+ mock_registry([
100
+ {:id => 'BBBB', :name => 'base', :tag => '1.0.0', :pulled => true, :parent => 'AAAA', :tags => ['base:1.0.0']}
101
+ ])
102
+ end
103
+ it { should_not be_nil }
104
+ end
105
+ context 'when base image exists' do
106
+ before :example do
107
+ mock_registry([
108
+ {:id => 'BBBB', :name => 'base', :tag => '1.0.0', :parent => 'AAAA', :tags => ['base:1.0.0']}
109
+ ])
110
+ end
111
+ it { should_not be_nil }
112
+ end
113
+ context 'when base image exists remotely' do
114
+ before :example do
115
+ mock_registry([
116
+ {:id => 'BBBB', :name => 'base', :tag => '1.0.0', :parent => 'AAAA', :tags => ['docker.example.com/baha/base:1.0.0']}
117
+ ])
118
+ end
119
+ it { should_not be_nil }
120
+ end
121
+ end
122
+
123
+ describe "#needs_update?" do
124
+ context 'when parent does not exist' do
125
+ before :example do
126
+ mock_registry([])
127
+ end
128
+ it { expect{ subject.needs_update? }.to raise_error(Baha::ImageNotFoundError) }
129
+ end
130
+ context 'when base does not exist' do
131
+ before :example do
132
+ mock_registry([
133
+ {:id => 'AAAA', :name => 'ubuntu', :tag => '14.04.1', :tags => ['ubuntu:14.04.1']},
134
+ {:id => 'BBBB', :name => 'base', :tag => '1.0.0', :tags => ['base:1.0.0'], :not_found => true}
135
+ ])
136
+ end
137
+ it { expect(subject.needs_update?).to be(true) }
138
+ end
139
+ context 'when parent has changed' do
140
+ before :example do
141
+ mock_registry([
142
+ {:id => 'AAAA', :name => 'ubuntu', :tag => '14.04.1', :tags => ['ubuntu:14.04.1']},
143
+ {:id => 'CCCC', :name => 'base', :tag => '1.0.0', :parent => 'BBBB', :tags => ['docker.example.com/baha/base:1.0.0']}
144
+ ])
145
+ end
146
+ it { expect(subject.needs_update?).to be(true) }
147
+ end
148
+ context 'when tags have changed' do
149
+ before :example do
150
+ mock_registry([
151
+ {:id => 'AAAA', :name => 'ubuntu', :tag => '14.04.1', :tags => ['ubuntu:14.04.1']},
152
+ {:id => 'CCCC', :name => 'base', :tag => '1.0.0', :parent => 'BBBB', :tags => ['docker.example.com/baha/base:0.9.0']}
153
+ ])
154
+ end
155
+ it { expect(subject.needs_update?).to be(true) }
156
+ end
157
+ context 'when up to date' do
158
+ before :example do
159
+ mock_registry([
160
+ {:id => 'AAAA', :name => 'ubuntu', :tag => '14.04.1', :tags => ['ubuntu:14.04.1']},
161
+ {:id => 'BBBB', :name => 'base', :tag => '1.0.0', :parent => 'AAAA', :tags => ['docker.example.com/baha/base:1.0.0']}
162
+ ])
163
+ end
164
+ it { expect(subject.needs_update?).to be(false) }
165
+ end
166
+ end
167
+ end
data/spec/log_spec.rb ADDED
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+ require 'baha/log'
3
+ require 'stringio'
4
+
5
+ shared_examples "a logger" do |level|
6
+ subject { Baha::Log.for_name("specs") }
7
+ before do
8
+ Baha::Log.level = :debug
9
+ end
10
+ let(:loglevel) { level.to_s.upcase }
11
+ let(:regex) {
12
+ Regexp.new("^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} \\[\\s*#{loglevel}\\] specs -- Hello$")
13
+ }
14
+ context "when given a block" do
15
+ it 'prints a valid message' do
16
+ subject.send(level) { "Hello" }
17
+ expect(io.string).to match(regex)
18
+ end
19
+ end
20
+ context "when given a string" do
21
+ it 'prints a valid message' do
22
+ subject.send(level,"Hello")
23
+ expect(io.string).to match(regex)
24
+ end
25
+ end
26
+ context "when given an object" do
27
+ it 'prints object.inspect' do
28
+ subject.send(level,{ :hello => 'world' })
29
+ expect(io.string).to match("specs -- {:hello=>\"world\"}")
30
+ end
31
+ end
32
+ context "when given an exception" do
33
+ it 'prints a exception backtrace' do
34
+ begin
35
+ raise ArgumentError.new("Hello")
36
+ rescue Exception => e
37
+ subject.send(level,e)
38
+ end
39
+ expect(io.string).to match(/specs -- Hello \(ArgumentError\)\n((.+?):(\d+)(|:in `(.+)')\n)+/)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe Baha::Log do
45
+ subject { Baha::Log }
46
+
47
+ before do
48
+ Baha::Log.level = :error
49
+ end
50
+
51
+ it { expect(Baha::Log.level).to eq(:error) }
52
+
53
+ describe "#level=" do
54
+ it 'sets level' do
55
+ Baha::Log.level = "WARN"
56
+ expect(Baha::Log.level).to eq(:warn)
57
+ end
58
+ it 'raises error on invalid input type' do
59
+ expect { Baha::Log.level = 123 }.to raise_error(ArgumentError)
60
+ end
61
+ it 'raises error on invalid level' do
62
+ expect { Baha::Log.level = 'NOTALEVEL' }.to raise_error(ArgumentError)
63
+ end
64
+ end
65
+
66
+ describe "#for_name" do
67
+ subject { Baha::Log.for_name("specs") }
68
+ it { expect(subject).not_to be_nil }
69
+ its(:progname) { should eq("specs") }
70
+ end
71
+
72
+ context 'with log instance' do
73
+ let(:io) { StringIO.new }
74
+ before do
75
+ Baha::Log.logfile = io
76
+ end
77
+ it_behaves_like "a logger", :debug
78
+ it_behaves_like "a logger", :info
79
+ it_behaves_like "a logger", :warn
80
+ it_behaves_like "a logger", :error
81
+ it_behaves_like "a logger", :fatal
82
+ describe "#close!" do
83
+ before do
84
+ subject.close!
85
+ end
86
+ it { expect(io.closed?).to eq(true) }
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'baha/container_options'
3
+
4
+ describe Baha::ContainerOptions do
5
+ describe 'parse_option' do
6
+ it 'parses Cmd' do
7
+ expect(Baha::ContainerOptions::parse_option(:cmd,'/bin/bash -l')).to be_a(Baha::ContainerOptions::Cmd)
8
+ end
9
+ it 'parses Entrypoint' do
10
+ expect(Baha::ContainerOptions::parse_option(:entrypoint,['/bin/bash','-l'])).to be_a(Baha::ContainerOptions::Entrypoint)
11
+ end
12
+ it 'parses Env' do
13
+ expect(Baha::ContainerOptions::parse_option(:env,{'key' => 'value'})).to be_a(Baha::ContainerOptions::Env)
14
+ end
15
+ it 'parses raw option' do
16
+ expect(Baha::ContainerOptions::parse_option(:hostname,'host.local')).to be_a(Baha::ContainerOptions::Option)
17
+ end
18
+ it 'parses Volumes' do
19
+ expect(Baha::ContainerOptions::parse_option(:volumes,['/mnt/media'])).to be_a(Baha::ContainerOptions::Volumes)
20
+ end
21
+ it 'parses ExposedPorts' do
22
+ expect(Baha::ContainerOptions::parse_option(:exposedports,[8080,'8443/tcp'])).to be_a(Baha::ContainerOptions::ExposedPorts)
23
+ end
24
+ it 'validates values' do
25
+ expect{ Baha::ContainerOptions::parse_option(:exposedports,:notavalidvalue) }.to raise_error(Baha::ContainerOptions::InvalidOptionError)
26
+ end
27
+ end
28
+ describe 'parse_options' do
29
+ it 'parses all options' do
30
+ expected = {
31
+ :entrypoint => Baha::ContainerOptions::Entrypoint.new('/bin/bash'),
32
+ :cmd => Baha::ContainerOptions::Cmd.new('-l'),
33
+ :volumes => Baha::ContainerOptions::Volumes.new(['/mnt/data']),
34
+ :env => Baha::ContainerOptions::Env.new({'ENVKEY' => 'Hello'}),
35
+ :exposedports => Baha::ContainerOptions::ExposedPorts.new([8080,'8443/tcp']),
36
+ :hostname => Baha::ContainerOptions::Option.new('hostname','localhost.localdomain')
37
+ }
38
+ actual = Baha::ContainerOptions::parse_options({
39
+ 'entrypoint' => '/bin/bash',
40
+ 'cmd' => '-l',
41
+ 'volumes' => ['/mnt/data'],
42
+ 'env' => {'ENVKEY' => 'Hello'},
43
+ 'exposedports' => [ 8080, '8443/tcp' ],
44
+ 'hostname' => 'localhost.localdomain'
45
+ })
46
+ expect(actual).to eql(expected)
47
+ end
48
+ it 'returns empty map on nil options' do
49
+ expect(Baha::ContainerOptions::parse_options(nil)).to eql({})
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pathname'
4
+ require 'baha/pre_build'
5
+ require 'baha/pre_build/command'
6
+
7
+ describe Baha::PreBuild::Module::Command do
8
+ describe "#execute" do
9
+ let(:cmd) { ['echo','Hello'] }
10
+ let(:test) { 'test' }
11
+ let(:stdin) { double('in') }
12
+ let(:output) { double('output') }
13
+ let(:thread) { double('wait') }
14
+ let(:exit_status) { double('exit') }
15
+ let(:config) { double('config') }
16
+ let(:image) { double('image') }
17
+ before do
18
+ allow(image).to receive(:workspace).and_return(Pathname.new('/tmp'))
19
+ allow(output).to receive(:each).and_yield("OUTPUT LINE\n")
20
+ allow(thread).to receive(:value).and_return(exit_status)
21
+ allow(Open3).to receive(:popen2e).with(cmd,:chdir=>'/tmp').and_yield(stdin,output,thread)
22
+ end
23
+ subject { {'command' => cmd, :image => image, :config => config } }
24
+ it 'runs command' do
25
+ Baha::PreBuild::Module.execute(subject)
26
+ expect(Open3).to have_received(:popen2e).with(cmd,:chdir=>'/tmp')
27
+ end
28
+ context "when creates given" do
29
+ subject { {'command' => cmd,'creates' => 'file', :image => image, :config => config } }
30
+ context "and file exists" do
31
+ it 'it does not execute' do
32
+ allow_any_instance_of(Pathname).to receive(:exist?).and_return(true)
33
+ Baha::PreBuild::Module.execute(subject)
34
+ expect(Open3).not_to have_received(:popen2e).with(cmd)
35
+ end
36
+ end
37
+ context "and file does not exist" do
38
+ it 'it executes' do
39
+ allow_any_instance_of(Pathname).to receive(:exist?).and_return(false)
40
+ Baha::PreBuild::Module.execute(subject)
41
+ expect(Open3).to have_received(:popen2e).with(cmd,:chdir=>'/tmp')
42
+ end
43
+ end
44
+ end
45
+ context "when onlyif given" do
46
+ subject { {'command' => cmd,'only_if' => test, :image => image, :config => config } }
47
+ before do
48
+ allow(Open3).to receive(:popen2e).with(test,:chdir=>'/tmp').and_yield(stdin,output,thread)
49
+ allow(Open3).to receive(:popen2e).with(cmd,:chdir=>'/tmp').and_yield(stdin,output,thread)
50
+ end
51
+ context "and returns fail" do
52
+ it 'it does not execute' do
53
+ allow(exit_status).to receive(:success?).and_return(false)
54
+ Baha::PreBuild::Module.execute(subject)
55
+ expect(Open3).to have_received(:popen2e).with(test,:chdir=>'/tmp')
56
+ expect(Open3).not_to have_received(:popen2e).with(cmd,:chdir=>'/tmp')
57
+ end
58
+ end
59
+ context "and returns success" do
60
+ it 'it executes' do
61
+ allow(exit_status).to receive(:success?).and_return(true)
62
+ Baha::PreBuild::Module.execute(subject)
63
+ expect(Open3).to have_received(:popen2e).with(test,:chdir=>'/tmp')
64
+ expect(Open3).to have_received(:popen2e).with(cmd,:chdir=>'/tmp')
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pathname'
4
+ require 'baha/pre_build'
5
+ require 'baha/pre_build/download'
6
+
7
+ describe Baha::PreBuild::Module::Download do
8
+ let(:file) {
9
+ double("file")
10
+ }
11
+ let(:url) {
12
+ double("url")
13
+ }
14
+ let(:config) {
15
+ double('config')
16
+ }
17
+ let(:image) { double('image') }
18
+ subject {
19
+ {:config => config, :image => image, 'download' => 'http://www.google.com/', 'file' => 'url' }
20
+ }
21
+
22
+ describe "#execute" do
23
+ before do
24
+ allow(file).to receive(:write)
25
+ allow(url).to receive(:read).and_return('content')
26
+ allow(Baha::PreBuild::Module::Download).to receive(:open).with('http://www.google.com/','rb').and_yield(url)
27
+ allow(File).to receive(:open)
28
+ allow(File).to receive(:open).with(Pathname.new('/tmp/url'),'w').and_yield(file)
29
+ allow(image).to receive(:workspace).and_return(Pathname.new('/tmp'))
30
+ end
31
+ it 'downloads url to file' do
32
+ Baha::PreBuild::Module.execute(subject)
33
+ expect(file).to have_received(:write).with("content")
34
+ end
35
+ context "when file exists" do
36
+ it 'does not download file' do
37
+ allow_any_instance_of(Pathname).to receive(:exist?).and_return(true)
38
+ Baha::PreBuild::Module.execute(subject)
39
+ expect(file).not_to have_received(:write)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pathname'
4
+ require 'baha/pre_build'
5
+ require 'baha/pre_build/template'
6
+
7
+ describe Baha::PreBuild::Module::Template do
8
+ let(:dest) {
9
+ double("dest")
10
+ }
11
+ let(:config) {
12
+ double('config')
13
+ }
14
+ let(:image) { double('image') }
15
+ subject {
16
+ {:config => config, :image => image, 'template' => '/tmp/file', 'dest' => 'dest.txt' }
17
+ }
18
+
19
+ describe "#execute" do
20
+ before do
21
+ allow(image).to receive(:workspace).and_return(Pathname.new('/tmp'))
22
+ allow(image).to receive(:env).and_return({:name => 'test'})
23
+ allow(config).to receive(:resolve_file).and_return(nil)
24
+ allow(config).to receive(:resolve_file).with('/tmp/file').and_return('/tmp/file')
25
+ allow(config).to receive(:resolve_file).with('include.erb').and_return('/tmp/include.erb')
26
+ allow(File).to receive(:read).with('/tmp/file').and_return("<%= name %>")
27
+ allow(File).to receive(:read).with('/tmp/include.erb').and_return("included")
28
+ allow(File).to receive(:open).with(Pathname.new("/tmp/dest.txt"),"w").and_yield(dest)
29
+ allow(dest).to receive(:write)
30
+ end
31
+ it 'writes template content to dest' do
32
+ Baha::PreBuild::Module.execute(subject)
33
+ expect(dest).to have_received(:write).with("test")
34
+ end
35
+ context 'with render function' do
36
+ before do
37
+ allow(File).to receive(:read).with('/tmp/file').and_return("<%= render 'include.erb' %>")
38
+ end
39
+ it 'includes render file' do
40
+ Baha::PreBuild::Module.execute(subject)
41
+ expect(dest).to have_received(:write).with("included")
42
+ end
43
+ it 'raises error when not found' do
44
+ allow(config).to receive(:resolve_file).with('include.erb').and_return(nil)
45
+ expect { Baha::PreBuild::Module.execute(subject) }.to raise_error(ArgumentError)
46
+ end
47
+ end
48
+ context "when template not found" do
49
+ it 'raises ArgumentError' do
50
+ allow(config).to receive(:resolve_file).and_return(nil)
51
+ expect { Baha::PreBuild::Module.execute(subject) }.to raise_error(ArgumentError)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'baha/config'
3
+ require 'baha/pre_build'
4
+
5
+ describe Baha::Builder do
6
+ let(:task) do
7
+ { 'download' => '', 'url' => 'http://www.google.com', 'file' => 'out.txt' }
8
+ end
9
+ let(:badtask) do
10
+ { 'no_such_module' => 'throws error' }
11
+ end
12
+
13
+ describe "#execute" do
14
+ context 'with valid task' do
15
+ before do
16
+ allow(Baha::PreBuild::Module).to receive(:module_download)
17
+ Baha::PreBuild::Module.execute(task)
18
+ end
19
+ it 'exeecutes module' do
20
+ expect(Baha::PreBuild::Module).to have_received(:module_download).with(instance_of(Baha::PreBuild::Module))
21
+ end
22
+ end
23
+ context 'with invalid task' do
24
+ it do
25
+ expect { Baha::PreBuild::Module.execute(badtask) }.to raise_error(Baha::PreBuild::ModuleNotFoundError)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/spec/'
4
+ end
5
+
6
+ require 'bundler/setup'
7
+ Bundler.setup
8
+
9
+ require 'baha'
10
+ require 'helpers/docker_helpers.rb'
11
+ require 'rspec/its'
12
+ require 'rspec/mocks'
13
+ require 'pathname'
14
+ require 'stringio'
15
+
16
+ def fixture_path
17
+ Pathname.new(File.expand_path(File.join(__FILE__, '..', 'fixtures')))
18
+ end
19
+ def fixture(filename)
20
+ file = fixture_path + filename
21
+ raise ArgumentError.new("File #{filename} could not be found") unless file.exist?
22
+ file
23
+ end
24
+
25
+ RSpec.configure do |config|
26
+ # config.color_enabled = true
27
+ config.order = "random"
28
+
29
+ config.include DockerHelpers
30
+
31
+ # Forbid old 'should' syntax
32
+ config.expect_with :rspec do |c|
33
+ c.syntax = :expect
34
+ end
35
+
36
+ config.before(:each) do
37
+ Baha::Log.logfile = StringIO.new
38
+ end
39
+ end