spec/unit/action/deploy/module_spec.rb in r10k-3.9.0 vs spec/unit/action/deploy/module_spec.rb in r10k-3.9.1

- old
+ new

@@ -2,55 +2,55 @@ require 'r10k/action/deploy/module' describe R10K::Action::Deploy::Module do - subject { described_class.new({config: "/some/nonexistent/path"}, []) } + subject { described_class.new({config: "/some/nonexistent/path"}, [], {}) } it_behaves_like "a deploy action that requires a config file" it_behaves_like "a deploy action that can be write locked" describe "initializing" do it "accepts an environment option" do - described_class.new({environment: "production"}, []) + described_class.new({environment: "production"}, [], {}) end it "can accept a no-force option" do - described_class.new({:'no-force' => true}, []) + described_class.new({:'no-force' => true}, [], {}) end it 'can accept a generate-types option' do - described_class.new({ 'generate-types': true }, []) + described_class.new({ 'generate-types': true }, [], {}) end it 'can accept a puppet-path option' do - described_class.new({ 'puppet-path': '/nonexistent' }, []) + described_class.new({ 'puppet-path': '/nonexistent' }, [], {}) end it 'can accept a puppet-conf option' do - described_class.new({ 'puppet-conf': '/nonexistent' }, []) + described_class.new({ 'puppet-conf': '/nonexistent' }, [], {}) end it 'can accept a cachedir option' do - described_class.new({ cachedir: '/nonexistent' }, []) + described_class.new({ cachedir: '/nonexistent' }, [], {}) end it 'can accept a private-key option' do - described_class.new({ 'private-key': '/nonexistent' }, []) + described_class.new({ 'private-key': '/nonexistent' }, [], {}) end it 'can accept a token option' do - described_class.new({ 'oauth-token': '/nonexistent' }, []) + described_class.new({ 'oauth-token': '/nonexistent' }, [], {}) end end describe "with no-force" do - subject { described_class.new({ config: "/some/nonexistent/path", :'no-force' => true}, [] )} + subject { described_class.new({ config: "/some/nonexistent/path", :'no-force' => true}, [], {}) } it "tries to preserve local modifications" do - expect(subject.force).to equal(false) + expect(subject.settings[:overrides][:modules][:force]).to equal(false) end end describe 'generate-types' do let(:deployment) do @@ -74,53 +74,54 @@ described_class.new( { config: '/some/nonexistent/path', 'generate-types': true }, - %w[first] + %w[first], + {} ) end before do + @modules = [] allow(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block| - expect(environment.puppetfile).to receive(:modules).and_return( - [R10K::Module::Local.new(environment.name, '/fakedir', [], environment)] - ) + mod = R10K::Module::Local.new(environment.name, '/fakedir', {}, environment) + if mod.name == 'first' + expect(environment).to receive(:generate_types!) + else + expect(environment).not_to receive(:generate_types!) + end + @modules << mod + expect(environment.puppetfile).to receive(:modules).and_return([mod]).twice original.call(environment, &block) end end it 'generate_types is true' do - expect(subject.instance_variable_get(:@generate_types)).to eq(true) + expect(subject.settings[:overrides][:environments][:generate_types]).to eq(true) end it 'only calls puppet generate types on environments with specified module' do - expect(subject).to receive(:visit_module).and_wrap_original do |original, mod, &block| - if mod.name == 'first' - expect(mod.environment).to receive(:generate_types!) - else - expect(mod.environment).not_to receive(:generate_types!) - end - original.call(mod, &block) - end.twice subject.call + expect(@modules.length).to be(2) end end context 'with generate-types disabled' do subject do described_class.new( { config: '/some/nonexistent/path', 'generate-types': false }, - %w[first] + %w[first], + {} ) end it 'generate_types is false' do - expect(subject.instance_variable_get(:@generate_types)).to eq(false) + expect(subject.settings[:overrides][:environments][:generate_types]).to eq(false) end it 'does not call puppet generate types' do |it| expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block| expect(environment).not_to receive(:generate_types!) @@ -131,48 +132,155 @@ end end describe 'with puppet-path' do - subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-path': '/nonexistent' }, []) } + subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-path': '/nonexistent' }, [], {}) } it 'sets puppet_path' do expect(subject.instance_variable_get(:@puppet_path)).to eq('/nonexistent') end end describe 'with puppet-conf' do - subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-conf': '/nonexistent' }, []) } + subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-conf': '/nonexistent' }, [], {}) } it 'sets puppet_conf' do expect(subject.instance_variable_get(:@puppet_conf)).to eq('/nonexistent') end end describe 'with cachedir' do - subject { described_class.new({ config: '/some/nonexistent/path', cachedir: '/nonexistent' }, []) } + subject { described_class.new({ config: '/some/nonexistent/path', cachedir: '/nonexistent' }, [], {}) } it 'sets cachedir' do expect(subject.instance_variable_get(:@cachedir)).to eq('/nonexistent') end end describe 'with private-key' do - subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, []) } + subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, [], {}) } it 'sets private_key' do expect(subject.instance_variable_get(:@private_key)).to eq('/nonexistent') end end describe 'with oauth-token' do - subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, []) } + subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, [], {}) } it 'sets token_path' do expect(subject.instance_variable_get(:@oauth_token)).to eq('/nonexistent') end end + + describe 'with modules' do + + subject { described_class.new({ config: '/some/nonexistent/path' }, ['mod1', 'mod2'], {}) } + + let(:cache) { instance_double("R10K::Git::Cache", 'sanitized_dirname' => 'foo', 'cached?' => true, 'sync' => true) } + let(:repo) { instance_double("R10K::Git::StatefulRepository", cache: cache, resolve: 'main') } + + it 'does not sync modules not given' do + allow(R10K::Deployment).to receive(:new).and_wrap_original do |original, settings, &block| + original.call(settings.merge({ + sources: { + main: { + remote: 'git://not/a/remote', + basedir: '/not/a/basedir', + type: 'git' + } + } + })) + end + + allow(R10K::Git::StatefulRepository).to receive(:new).and_return(repo) + allow(R10K::Git).to receive_message_chain(:cache, :generate).and_return(cache) + allow_any_instance_of(R10K::Source::Git).to receive(:branch_names).and_return([R10K::Environment::Name.new('first', {})]) + + expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block| + pf = environment.puppetfile + expect(pf).to receive(:load) do + pf.add_module('mod1', { git: 'git://remote' }) + pf.add_module('mod2', { git: 'git://remote' }) + pf.add_module('mod3', { git: 'git://remote' }) + end + + pf.modules.each do |mod| + if ['mod1', 'mod2'].include?(mod.name) + expect(mod.should_sync?).to be(true) + else + expect(mod.should_sync?).to be(false) + end + expect(mod).to receive(:sync).and_call_original + end + + original.call(environment, &block) + end + + expect(repo).to receive(:sync).twice + + subject.call + end + end + + describe 'with environments' do + subject { described_class.new({ config: '/some/nonexistent/path', environment: 'first' }, ['mod1'], {}) } + + let(:cache) { instance_double("R10K::Git::Cache", 'sanitized_dirname' => 'foo', 'cached?' => true, 'sync' => true) } + let(:repo) { instance_double("R10K::Git::StatefulRepository", cache: cache, resolve: 'main') } + + it 'only syncs to the given environments' do + allow(R10K::Deployment).to receive(:new).and_wrap_original do |original, settings, &block| + original.call(settings.merge({ + sources: { + main: { + remote: 'git://not/a/remote', + basedir: '/not/a/basedir', + type: 'git' + } + } + })) + end + + allow(R10K::Git::StatefulRepository).to receive(:new).and_return(repo) + allow(R10K::Git).to receive_message_chain(:cache, :generate).and_return(cache) + allow_any_instance_of(R10K::Source::Git).to receive(:branch_names).and_return([R10K::Environment::Name.new('first', {}), + R10K::Environment::Name.new('second', {})]) + + expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block| + pf = environment.puppetfile + + if environment.name == 'first' + expect(pf).to receive(:load) do + pf.add_module('mod1', { git: 'git://remote' }) + pf.add_module('mod2', { git: 'git://remote' }) + end + + pf.modules.each do |mod| + if mod.name == 'mod1' + expect(mod.should_sync?).to be(true) + else + expect(mod.should_sync?).to be(false) + end + expect(mod).to receive(:sync).and_call_original + end + else + expect(pf).not_to receive(:load) + end + + original.call(environment, &block) + end.twice + + expect(repo).to receive(:sync).once + expect(subject.logger).to receive(:debug1).with(/Updating modules.*in environment.*first/i) + expect(subject.logger).to receive(:debug1).with(/skipping environment.*second/i) + + subject.call + end + end end +