1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
#!/usr/bin/env rspec
require 'spec_helper'
require 'puppet/application/faces_base'
require 'tmpdir'
class Puppet::Application::FacesBase::Basetest < Puppet::Application::FacesBase
end
describe Puppet::Application::FacesBase do
before :all do
Puppet::Faces.define(:basetest, '0.0.1') do
option("--[no-]boolean")
option("--mandatory MANDATORY")
option("--optional [OPTIONAL]")
action :foo do
option("--action")
when_invoked { |*args| args.length }
end
end
end
let :app do
app = Puppet::Application::FacesBase::Basetest.new
app.command_line.stubs(:subcommand_name).returns('subcommand')
Puppet::Util::Log.stubs(:newdestination)
app
end
describe "#find_global_settings_argument" do
it "should not match --ca to --ca-location" do
option = mock('ca option', :optparse_args => ["--ca"])
Puppet.settings.expects(:each).yields(:ca, option)
app.find_global_settings_argument("--ca-location").should be_nil
end
end
describe "#parse_options" do
before :each do
app.command_line.stubs(:args).returns %w{}
end
describe "parsing the command line" do
context "with just an action" do
before :all do
# We have to stub Signal.trap to avoid a crazy mess where we take
# over signal handling and make it impossible to cancel the test
# suite run.
#
# It would be nice to fix this elsewhere, but it is actually hard to
# capture this in rspec 2.5 and all. :( --daniel 2011-04-08
Signal.stubs(:trap)
app.command_line.stubs(:args).returns %w{foo}
app.preinit
app.parse_options
end
it "should set the faces based on the type" do
app.face.name.should == :basetest
end
it "should set the format based on the faces default" do
app.format.should == :pson
end
it "should find the action" do
app.action.should be
app.action.name.should == :foo
end
end
it "should fail if no action is given" do
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::MissingArgument, /No action given/
end
it "should report a sensible error when options with = fail" do
app.command_line.stubs(:args).returns %w{--action=bar foo}
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::InvalidOption, /invalid option: --action/
end
it "should fail if an action option is before the action" do
app.command_line.stubs(:args).returns %w{--action foo}
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::InvalidOption, /invalid option: --action/
end
it "should fail if an unknown option is before the action" do
app.command_line.stubs(:args).returns %w{--bar foo}
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::InvalidOption, /invalid option: --bar/
end
it "should fail if an unknown option is after the action" do
app.command_line.stubs(:args).returns %w{foo --bar}
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::InvalidOption, /invalid option: --bar/
end
it "should accept --bar as an argument to a mandatory option after action" do
app.command_line.stubs(:args).returns %w{foo --mandatory --bar}
app.preinit
app.parse_options
app.action.name.should == :foo
app.options.should == { :mandatory => "--bar" }
end
it "should accept --bar as an argument to a mandatory option before action" do
app.command_line.stubs(:args).returns %w{--mandatory --bar foo}
app.preinit
app.parse_options
app.action.name.should == :foo
app.options.should == { :mandatory => "--bar" }
end
it "should not skip when --foo=bar is given" do
app.command_line.stubs(:args).returns %w{--mandatory=bar --bar foo}
expect { app.preinit; app.parse_options }.
to raise_error OptionParser::InvalidOption, /invalid option: --bar/
end
{ "boolean options before" => %w{--trace foo},
"boolean options after" => %w{foo --trace}
}.each do |name, args|
it "should accept global boolean settings #{name} the action" do
app.command_line.stubs(:args).returns args
app.preinit
app.parse_options
Puppet[:trace].should be_true
end
end
{ "before" => %w{--syslogfacility user1 foo},
" after" => %w{foo --syslogfacility user1}
}.each do |name, args|
it "should accept global settings with arguments #{name} the action" do
app.command_line.stubs(:args).returns args
app.preinit
app.parse_options
Puppet[:syslogfacility].should == "user1"
end
end
end
end
describe "#setup" do
it "should remove the action name from the arguments" do
app.command_line.stubs(:args).returns %w{--mandatory --bar foo}
app.preinit
app.parse_options
app.setup
app.arguments.should == [{ :mandatory => "--bar" }]
end
it "should pass positional arguments" do
app.command_line.stubs(:args).returns %w{--mandatory --bar foo bar baz quux}
app.preinit
app.parse_options
app.setup
app.arguments.should == ['bar', 'baz', 'quux', { :mandatory => "--bar" }]
end
end
describe "#main" do
before :each do
app.expects(:exit).with(0)
app.face = Puppet::Faces[:basetest, '0.0.1']
app.action = app.face.get_action(:foo)
app.format = :pson
app.arguments = ["myname", "myarg"]
end
it "should send the specified verb and name to the faces" do
app.face.expects(:foo).with(*app.arguments)
app.main
end
it "should use its render method to render any result" do
app.expects(:render).with(app.arguments.length + 1)
app.stubs(:puts) # meh. Don't print nil, thanks. --daniel 2011-04-12
app.main
end
end
end
|