2
require 'puppet/module_tool'
4
require 'puppet_spec/modules'
6
describe Puppet::ModuleTool::Applications::Uninstaller, :fails_on_windows => true do
7
include PuppetSpec::Files
9
def mkmod(name, path, metadata=nil)
10
modpath = File.join(path, name)
11
FileUtils.mkdir_p(modpath)
14
File.open(File.join(modpath, 'metadata.json'), 'w') do |f|
15
f.write(metadata.to_pson)
22
describe "the behavior of the instances" do
25
@uninstaller = Puppet::ModuleTool::Applications::Uninstaller
26
FileUtils.mkdir_p(modpath1)
27
FileUtils.mkdir_p(modpath2)
28
fake_env.modulepath = [modpath1, modpath2]
31
let(:modpath1) { File.join(tmpdir("uninstaller"), "modpath1") }
32
let(:modpath2) { File.join(tmpdir("uninstaller"), "modpath2") }
33
let(:fake_env) { Puppet::Node::Environment.new('fake_env') }
34
let(:options) { {:environment => "fake_env"} }
38
:author => "puppetlabs",
39
:name => "puppetlabs/foo",
41
:source => "http://dummyurl/foo",
42
:license => "Apache2",
49
:author => "puppetlabs",
50
:name => "puppetlabs/bar",
52
:source => "http://dummyurl/bar",
53
:license => "Apache2",
58
context "when the module is not installed" do
60
@uninstaller.new('fakemod_not_installed', options).run[:result].should == :failure
64
context "when the module is installed" do
66
it "should uninstall the module" do
67
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
69
results = @uninstaller.new("puppetlabs-foo", options).run
70
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
73
it "should only uninstall the requested module" do
74
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
75
PuppetSpec::Modules.create('bar', modpath1, :metadata => bar_metadata)
77
results = @uninstaller.new("puppetlabs-foo", options).run
78
results[:affected_modules].length == 1
79
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
82
it "should uninstall fail if a module exists twice in the modpath" do
83
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
84
PuppetSpec::Modules.create('foo', modpath2, :metadata => foo_metadata)
86
@uninstaller.new('puppetlabs-foo', options).run[:result].should == :failure
89
context "when options[:version] is specified" do
91
it "should uninstall the module if the version matches" do
92
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
94
options[:version] = "1.0.0"
96
results = @uninstaller.new("puppetlabs-foo", options).run
97
results[:affected_modules].length.should == 1
98
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
99
results[:affected_modules].first.version.should == "1.0.0"
102
it "should not uninstall the module if the version does not match" do
103
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
105
options[:version] = "2.0.0"
107
@uninstaller.new("puppetlabs-foo", options).run[:result].should == :failure
111
context "when the module metadata is missing" do
113
it "should not uninstall the module" do
114
PuppetSpec::Modules.create('foo', modpath1)
116
@uninstaller.new("puppetlabs-foo", options).run[:result].should == :failure
120
context "when the module has local changes" do
122
it "should not uninstall the module" do
123
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
124
Puppet::Module.any_instance.stubs(:has_local_changes?).returns(true)
126
@uninstaller.new("puppetlabs-foo", options).run[:result].should == :failure
131
context "when the module does not have local changes" do
133
it "should uninstall the module" do
134
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
136
results = @uninstaller.new("puppetlabs-foo", options).run
137
results[:affected_modules].length.should == 1
138
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
142
context "when uninstalling the module will cause broken dependencies" do
143
it "should not uninstall the module" do
144
Puppet.settings[:modulepath] = modpath1
145
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
147
PuppetSpec::Modules.create(
153
"version_requirement" => ">= 1.0.0",
154
"name" => "puppetlabs/foo"
159
@uninstaller.new("puppetlabs-foo", options).run[:result].should == :failure
163
context "when using the --force flag" do
167
:forge_name => 'puppetlabs/fakemod',
169
:has_local_changes? => true
173
it "should ignore local changes" do
174
foo = mkmod("foo", modpath1, foo_metadata)
175
options[:force] = true
177
results = @uninstaller.new("puppetlabs-foo", options).run
178
results[:affected_modules].length.should == 1
179
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
182
it "should ignore broken dependencies" do
183
Puppet.settings[:modulepath] = modpath1
184
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
186
PuppetSpec::Modules.create(
192
"version_requirement" => ">= 1.0.0",
193
"name" => "puppetlabs/foo"
197
options[:force] = true
199
results = @uninstaller.new("puppetlabs-foo", options).run
200
results[:affected_modules].length.should == 1
201
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"