hammer_cli_foreman 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/README.md +11 -3
- data/doc/developer_docs.md +13 -0
- data/doc/name_id_resolution.md +50 -0
- data/doc/option_builder.md +48 -0
- data/doc/release_notes.md +64 -0
- data/lib/hammer_cli_foreman.rb +100 -23
- data/lib/hammer_cli_foreman/architecture.rb +0 -1
- data/lib/hammer_cli_foreman/associating_commands.rb +71 -0
- data/lib/hammer_cli_foreman/auth.rb +0 -1
- data/lib/hammer_cli_foreman/commands.rb +112 -80
- data/lib/hammer_cli_foreman/common_parameter.rb +5 -3
- data/lib/hammer_cli_foreman/compute_resource.rb +0 -2
- data/lib/hammer_cli_foreman/dependency_resolver.rb +32 -0
- data/lib/hammer_cli_foreman/domain.rb +0 -1
- data/lib/hammer_cli_foreman/environment.rb +0 -2
- data/lib/hammer_cli_foreman/exception_handler.rb +3 -3
- data/lib/hammer_cli_foreman/fact.rb +1 -1
- data/lib/hammer_cli_foreman/filter.rb +102 -0
- data/lib/hammer_cli_foreman/host.rb +5 -7
- data/lib/hammer_cli_foreman/hostgroup.rb +4 -3
- data/lib/hammer_cli_foreman/id_resolver.rb +60 -51
- data/lib/hammer_cli_foreman/image.rb +0 -1
- data/lib/hammer_cli_foreman/location.rb +7 -3
- data/lib/hammer_cli_foreman/media.rb +1 -1
- data/lib/hammer_cli_foreman/model.rb +1 -1
- data/lib/hammer_cli_foreman/operating_system.rb +4 -6
- data/lib/hammer_cli_foreman/option_builders.rb +285 -0
- data/lib/hammer_cli_foreman/organization.rb +7 -3
- data/lib/hammer_cli_foreman/param_filters.rb +61 -0
- data/lib/hammer_cli_foreman/parameter.rb +5 -3
- data/lib/hammer_cli_foreman/partition_table.rb +1 -1
- data/lib/hammer_cli_foreman/puppet_class.rb +1 -1
- data/lib/hammer_cli_foreman/references.rb +16 -0
- data/lib/hammer_cli_foreman/report.rb +1 -1
- data/lib/hammer_cli_foreman/role.rb +78 -0
- data/lib/hammer_cli_foreman/smart_class_parameter.rb +1 -1
- data/lib/hammer_cli_foreman/smart_proxy.rb +17 -2
- data/lib/hammer_cli_foreman/smart_variables.rb +111 -0
- data/lib/hammer_cli_foreman/subnet.rb +1 -1
- data/lib/hammer_cli_foreman/template.rb +10 -4
- data/lib/hammer_cli_foreman/user.rb +5 -1
- data/lib/hammer_cli_foreman/usergroup.rb +58 -0
- data/lib/hammer_cli_foreman/version.rb +1 -1
- data/locale/Makefile +12 -11
- data/locale/README.md +18 -0
- data/locale/en/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en/hammer-cli-foreman.po +1584 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/en_GB/hammer-cli-foreman.po +1975 -0
- data/locale/es/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/es/hammer-cli-foreman.po +1976 -0
- data/locale/fr/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
- data/locale/fr/hammer-cli-foreman.po +1976 -0
- data/locale/hammer-cli-foreman.pot +1197 -787
- data/test/unit/api_test.rb +25 -0
- data/test/unit/architecture_test.rb +1 -0
- data/test/unit/commands_test.rb +18 -0
- data/test/unit/common_parameter_test.rb +1 -0
- data/test/unit/compute_resource_test.rb +1 -0
- data/test/unit/data/1.6/foreman_api.json +1 -0
- data/test/unit/dependency_resolver_test.rb +42 -0
- data/test/unit/domain_test.rb +1 -0
- data/test/unit/environment_test.rb +1 -0
- data/test/unit/fact_test.rb +1 -0
- data/test/unit/filter_test.rb +133 -0
- data/test/unit/helpers/command.rb +0 -13
- data/test/unit/host_test.rb +3 -0
- data/test/unit/hostgroup_test.rb +1 -0
- data/test/unit/id_resolver_test.rb +21 -68
- data/test/unit/image_test.rb +1 -1
- data/test/unit/location_test.rb +2 -0
- data/test/unit/media_test.rb +2 -0
- data/test/unit/model_test.rb +1 -0
- data/test/unit/operating_system_test.rb +1 -0
- data/test/unit/option_builders_test.rb +543 -0
- data/test/unit/organization_test.rb +1 -0
- data/test/unit/param_filters_test.rb +143 -0
- data/test/unit/partition_table_test.rb +1 -0
- data/test/unit/puppet_class_test.rb +1 -0
- data/test/unit/report_test.rb +1 -0
- data/test/unit/role_test.rb +94 -0
- data/test/unit/smart_class_parameter_test.rb +1 -0
- data/test/unit/smart_proxy_test.rb +14 -1
- data/test/unit/subnet_test.rb +1 -0
- data/test/unit/template_test.rb +1 -0
- data/test/unit/test_helper.rb +1 -1
- data/test/unit/user_test.rb +1 -0
- data/test/unit/usergroup_test.rb +80 -0
- metadata +50 -7
- data/lib/hammer_cli_foreman/searchables_option_builder.rb +0 -99
- data/test/unit/searchables_option_builder_test.rb +0 -172
data/test/unit/image_test.rb
CHANGED
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
|
2
2
|
require File.join(File.dirname(__FILE__), 'apipie_resource_mock')
|
|
3
3
|
require File.join(File.dirname(__FILE__), 'test_output_adapter')
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
require 'hammer_cli_foreman/image'
|
|
6
6
|
|
|
7
7
|
describe HammerCLIForeman::Image do
|
|
8
8
|
|
data/test/unit/location_test.rb
CHANGED
data/test/unit/media_test.rb
CHANGED
data/test/unit/model_test.rb
CHANGED
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
|
+
require File.join(File.dirname(__FILE__), 'helpers/fake_searchables')
|
|
3
|
+
|
|
4
|
+
describe HammerCLIForeman::BuildParams do
|
|
5
|
+
|
|
6
|
+
let(:params) { HammerCLIForeman::BuildParams.new }
|
|
7
|
+
|
|
8
|
+
it "creates empty hash by default" do
|
|
9
|
+
params.to_hash.must_equal( {} )
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "can be prefonfigured" do
|
|
13
|
+
preconfigured_params = HammerCLIForeman::BuildParams.new(:expand => {:only => [:a, :b]}, :without => [:c, :d])
|
|
14
|
+
preconfigured_params.expand.including(:c, :d)
|
|
15
|
+
preconfigured_params.to_hash.must_equal( {:expand => {:only => [:a, :b], :including => [:c, :d]}, :without => [:c, :d]} )
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "without" do
|
|
19
|
+
|
|
20
|
+
it "sets :without" do
|
|
21
|
+
params.without(:organization_id, :location_id)
|
|
22
|
+
params.to_hash.must_equal( {:without => [:organization_id, :location_id]} )
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "expand" do
|
|
28
|
+
|
|
29
|
+
it "can set expand all" do
|
|
30
|
+
params.expand(:all)
|
|
31
|
+
params.to_hash.must_equal( {:expand => {}} )
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "expands all by default" do
|
|
35
|
+
params.expand
|
|
36
|
+
params.to_hash.must_equal( {:expand => {}} )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "can disable expansion" do
|
|
40
|
+
params.expand(:none)
|
|
41
|
+
params.to_hash.must_equal( {:expand => {:only => []}} )
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "except" do
|
|
45
|
+
it "sets except field" do
|
|
46
|
+
params.expand.except(:organizations)
|
|
47
|
+
params.to_hash.must_equal( {:expand => {:except => [:organizations]}} )
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "including" do
|
|
52
|
+
it "sets including field" do
|
|
53
|
+
params.expand.including(:organizations)
|
|
54
|
+
params.to_hash.must_equal( {:expand => {:including => [:organizations]}} )
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "only" do
|
|
59
|
+
it "sets only field" do
|
|
60
|
+
params.expand.only(:organizations)
|
|
61
|
+
params.to_hash.must_equal( {:expand => {:only => [:organizations]}} )
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "primary" do
|
|
66
|
+
it "sets primary field" do
|
|
67
|
+
params.expand.primary(:organizations)
|
|
68
|
+
params.to_hash.must_equal( {:expand => {:primary => :organizations}} )
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe HammerCLIForeman::BuilderConfigurator do
|
|
77
|
+
|
|
78
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:operatingsystems)}
|
|
79
|
+
let(:action) { resource.action(:index)}
|
|
80
|
+
|
|
81
|
+
let(:searchables) { FakeSearchables.new(["name", "label"]) }
|
|
82
|
+
let(:resolver) { HammerCLIForeman::DependencyResolver.new }
|
|
83
|
+
let(:configurator) { HammerCLIForeman::BuilderConfigurator.new(searchables, resolver) }
|
|
84
|
+
|
|
85
|
+
let(:result_builders) { configurator.builders_for(resource, action) }
|
|
86
|
+
let(:result_classes) { result_builders.map(&:class) }
|
|
87
|
+
|
|
88
|
+
def builders_by_class(cls)
|
|
89
|
+
result_builders.select {|b| b.class == cls}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def resource_names(builders)
|
|
93
|
+
builders.map(&:resource).map(&:name)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe "simple action without ids" do
|
|
97
|
+
|
|
98
|
+
let(:action) { resource.action(:index)}
|
|
99
|
+
|
|
100
|
+
it "adds no option builder" do
|
|
101
|
+
result_classes.must_equal []
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "simple show action without dependent resources" do
|
|
107
|
+
|
|
108
|
+
let(:action) { resource.action(:show)}
|
|
109
|
+
|
|
110
|
+
it "adds searchable options builder" do
|
|
111
|
+
resource_names(builders_by_class(HammerCLIForeman::SearchablesOptionBuilder)).must_equal [:operatingsystems]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "action with dependent resources" do
|
|
117
|
+
|
|
118
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:images)}
|
|
119
|
+
let(:action) { HammerCLIForeman.foreman_resource!(:images).action(:show)}
|
|
120
|
+
|
|
121
|
+
it "adds searchable options builder" do
|
|
122
|
+
resource_names(builders_by_class(HammerCLIForeman::SearchablesOptionBuilder)).must_equal [:images]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "adds dependent searchable option builders" do
|
|
126
|
+
resource_names(builders_by_class(HammerCLIForeman::DependentSearchablesOptionBuilder)).must_equal [
|
|
127
|
+
:compute_resources
|
|
128
|
+
]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
describe HammerCLIForeman::ForemanOptionBuilder do
|
|
136
|
+
|
|
137
|
+
let(:options) {
|
|
138
|
+
[
|
|
139
|
+
HammerCLI::Options::OptionDefinition.new(["--test"], "TEST", "test"),
|
|
140
|
+
HammerCLI::Options::OptionDefinition.new(["--test2"], "TEST2", "test2")
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
let(:searchables) { FakeSearchables.new(["name", "label"]) }
|
|
144
|
+
let(:container) { HammerCLIForeman::ForemanOptionBuilder.new(searchables) }
|
|
145
|
+
let(:builder_classes) { container.builders.map(&:class) }
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
it "collects options from contained builders" do
|
|
149
|
+
builder = Object.new
|
|
150
|
+
builder.stubs(:build).returns(options)
|
|
151
|
+
|
|
152
|
+
container.builders = [builder, builder]
|
|
153
|
+
container.build.must_equal options+options
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "passes build parameters to contained builders" do
|
|
157
|
+
params = {:param => :value}
|
|
158
|
+
builder = Object.new
|
|
159
|
+
builder.expects(:build).with(params).returns(options)
|
|
160
|
+
|
|
161
|
+
container.builders = [builder]
|
|
162
|
+
container.build(params)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
context "primary searchables options expansion" do
|
|
167
|
+
let(:option_switches) { container.build(@build_options).map(&:switches) }
|
|
168
|
+
|
|
169
|
+
it "can remove original searchable builder" do
|
|
170
|
+
container.builders = [
|
|
171
|
+
HammerCLIForeman::SearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(:organizations), FakeSearchables.new(["aaa", "bbb"]))
|
|
172
|
+
]
|
|
173
|
+
@build_options = {:expand => {:primary => false}}
|
|
174
|
+
option_switches.must_equal []
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "can add custom searchable builder" do
|
|
178
|
+
container.builders = []
|
|
179
|
+
@build_options = {:expand => {:primary => :organizations}}
|
|
180
|
+
option_switches.must_equal [
|
|
181
|
+
["--name"],
|
|
182
|
+
["--label"]
|
|
183
|
+
]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "can replace original searchable builder with a custom one" do
|
|
187
|
+
container.builders = [
|
|
188
|
+
HammerCLIForeman::SearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(:locations), FakeSearchables.new(["aaa", "bbb"]))
|
|
189
|
+
]
|
|
190
|
+
@build_options = {:expand => {:primary => :organizations}}
|
|
191
|
+
option_switches.must_equal [
|
|
192
|
+
["--name"],
|
|
193
|
+
["--label"]
|
|
194
|
+
]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context "dependent searchables options expansion" do
|
|
200
|
+
let(:option_switches) { container.build(@build_options).map(&:switches) }
|
|
201
|
+
|
|
202
|
+
before :each do
|
|
203
|
+
container.builders = [
|
|
204
|
+
HammerCLIForeman::DependentSearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(:organizations), searchables),
|
|
205
|
+
HammerCLIForeman::DependentSearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(:locations), searchables)
|
|
206
|
+
]
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "does not filter searchable builders by default" do
|
|
210
|
+
@build_options = {:expand => {}}
|
|
211
|
+
option_switches.must_equal [
|
|
212
|
+
["--organization"],
|
|
213
|
+
["--organization-label"],
|
|
214
|
+
["--organization-id"],
|
|
215
|
+
["--location"],
|
|
216
|
+
["--location-label"],
|
|
217
|
+
["--location-id"]
|
|
218
|
+
]
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "adds dependent searchable builders on explicit requirement" do
|
|
222
|
+
@build_options = {:expand => {:including => [:organizations, :architectures]}}
|
|
223
|
+
option_switches.must_equal [
|
|
224
|
+
["--organization"],
|
|
225
|
+
["--organization-label"],
|
|
226
|
+
["--organization-id"],
|
|
227
|
+
["--location"],
|
|
228
|
+
["--location-label"],
|
|
229
|
+
["--location-id"],
|
|
230
|
+
["--architecture"],
|
|
231
|
+
["--architecture-label"],
|
|
232
|
+
["--architecture-id"]
|
|
233
|
+
]
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "filters dependent searchable builders on explicit requirement" do
|
|
237
|
+
@build_options = {:expand => {:except => [:organizations]}}
|
|
238
|
+
option_switches.must_equal [
|
|
239
|
+
["--location"],
|
|
240
|
+
["--location-label"],
|
|
241
|
+
["--location-id"]
|
|
242
|
+
]
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "specifies custom set of dependent searchable builders on explicit requirement" do
|
|
246
|
+
@build_options = {:expand => {:only => [:architectures, :organizations]}}
|
|
247
|
+
option_switches.must_equal [
|
|
248
|
+
["--organization"],
|
|
249
|
+
["--organization-label"],
|
|
250
|
+
["--organization-id"],
|
|
251
|
+
["--architecture"],
|
|
252
|
+
["--architecture-label"],
|
|
253
|
+
["--architecture-id"]
|
|
254
|
+
]
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
describe HammerCLIForeman::SearchablesOptionBuilder do
|
|
265
|
+
|
|
266
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:architectures) }
|
|
267
|
+
let(:searchables) { FakeSearchables.new(["name", "label"]) }
|
|
268
|
+
let(:builder) { HammerCLIForeman::SearchablesOptionBuilder.new(resource, searchables) }
|
|
269
|
+
let(:options) { builder.build }
|
|
270
|
+
|
|
271
|
+
describe "empty searchables" do
|
|
272
|
+
let(:searchables) { FakeSearchables.new([]) }
|
|
273
|
+
|
|
274
|
+
it "builds no options for empty searchables" do
|
|
275
|
+
options.must_equal []
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
describe "multiple searchables" do
|
|
280
|
+
|
|
281
|
+
it "builds correct switches" do
|
|
282
|
+
options.map(&:switches).must_equal [["--name"], ["--label"]]
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "builds correct descriptions" do
|
|
286
|
+
options.map(&:description).must_equal ["Search by name", "Search by label"]
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "builds correct types" do
|
|
290
|
+
options.map(&:type).must_equal ["NAME", "LABEL"]
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
it "builds correct attribute readers" do
|
|
294
|
+
options.map(&:read_method).must_equal [
|
|
295
|
+
"option_name",
|
|
296
|
+
"option_label"
|
|
297
|
+
]
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
it "none of the options is required" do
|
|
301
|
+
options.any?{|opt| opt.required? }.must_equal false
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
describe HammerCLIForeman::DependentSearchablesOptionBuilder do
|
|
309
|
+
|
|
310
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:architectures) }
|
|
311
|
+
let(:searchables) { FakeSearchables.new(["name", "label", "uuid"]) }
|
|
312
|
+
let(:builder) { HammerCLIForeman::DependentSearchablesOptionBuilder.new(resource, searchables) }
|
|
313
|
+
let(:builder_params) { {} }
|
|
314
|
+
let(:options) { builder.build(builder_params) }
|
|
315
|
+
|
|
316
|
+
describe "empty searchables" do
|
|
317
|
+
|
|
318
|
+
let(:searchables) { FakeSearchables.new([]) }
|
|
319
|
+
|
|
320
|
+
it "builds only id options" do
|
|
321
|
+
options.map(&:switches).must_equal [["--architecture-id"]]
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
describe "multiple searchables" do
|
|
328
|
+
|
|
329
|
+
it "creates correct switches" do
|
|
330
|
+
options.map(&:switches).must_equal [
|
|
331
|
+
["--architecture"], # first option does not have the suffix
|
|
332
|
+
["--architecture-label"], # other options with suffixes
|
|
333
|
+
["--architecture-uuid"],
|
|
334
|
+
["--architecture-id"] # additional id
|
|
335
|
+
]
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
it "creates correct option types" do
|
|
339
|
+
options.map(&:type).must_equal [
|
|
340
|
+
"ARCHITECTURE_NAME",
|
|
341
|
+
"ARCHITECTURE_LABEL",
|
|
342
|
+
"ARCHITECTURE_UUID",
|
|
343
|
+
"ARCHITECTURE_ID",
|
|
344
|
+
]
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it "creates correct descriptions" do
|
|
348
|
+
options.map(&:description).must_equal [
|
|
349
|
+
"Search by name",
|
|
350
|
+
"Search by label",
|
|
351
|
+
"Search by uuid",
|
|
352
|
+
""
|
|
353
|
+
]
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
it "creates correct attribute readers" do
|
|
357
|
+
options.map(&:read_method).must_equal [
|
|
358
|
+
"option_architecture_name",
|
|
359
|
+
"option_architecture_label",
|
|
360
|
+
"option_architecture_uuid",
|
|
361
|
+
"option_architecture_id",
|
|
362
|
+
]
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
it "none of the options is required" do
|
|
366
|
+
options.any?{|opt| opt.required? }.must_equal false
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
describe "aliasing resource names" do
|
|
372
|
+
|
|
373
|
+
let(:builder_params) { {:resource_mapping => {:architecture => :arch}} }
|
|
374
|
+
|
|
375
|
+
it "renames options" do
|
|
376
|
+
options.map(&:switches).must_equal [
|
|
377
|
+
["--arch"], # first option does not have the suffix
|
|
378
|
+
["--arch-label"], # other options with suffixes
|
|
379
|
+
["--arch-uuid"],
|
|
380
|
+
["--arch-id"] # additional id
|
|
381
|
+
]
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it "renames option types" do
|
|
385
|
+
options.map(&:type).must_equal [
|
|
386
|
+
"ARCH_NAME",
|
|
387
|
+
"ARCH_LABEL",
|
|
388
|
+
"ARCH_UUID",
|
|
389
|
+
"ARCH_ID",
|
|
390
|
+
]
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
it "keeps option accessor the same" do
|
|
394
|
+
options.map(&:attribute_name).must_equal [
|
|
395
|
+
"option_architecture_name",
|
|
396
|
+
"option_architecture_label",
|
|
397
|
+
"option_architecture_uuid",
|
|
398
|
+
"option_architecture_id"
|
|
399
|
+
]
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
describe "resources with id parameter in show action" do
|
|
405
|
+
|
|
406
|
+
before :each do
|
|
407
|
+
id_param = Object.new
|
|
408
|
+
id_param.stubs(:name).returns("id")
|
|
409
|
+
id_param.stubs(:params).returns([])
|
|
410
|
+
id_param.stubs(:description).returns("DESC")
|
|
411
|
+
|
|
412
|
+
action = Object.new
|
|
413
|
+
action.stubs(:params).returns([id_param])
|
|
414
|
+
|
|
415
|
+
resource.stubs(:action).with(:show).returns(action)
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
it "uses descriptions from the action" do
|
|
419
|
+
options.map(&:description).must_equal [
|
|
420
|
+
"Search by name",
|
|
421
|
+
"Search by label",
|
|
422
|
+
"Search by uuid",
|
|
423
|
+
"DESC"
|
|
424
|
+
]
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
describe HammerCLIForeman::SearchablesUpdateOptionBuilder do
|
|
433
|
+
|
|
434
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:architectures) }
|
|
435
|
+
let(:searchables) { FakeSearchables.new(["name"], ["label"]) }
|
|
436
|
+
let(:builder) { HammerCLIForeman::SearchablesUpdateOptionBuilder.new(resource, searchables) }
|
|
437
|
+
let(:options) { builder.build }
|
|
438
|
+
|
|
439
|
+
describe "empty searchables" do
|
|
440
|
+
let(:searchables) { FakeSearchables.new([]) }
|
|
441
|
+
|
|
442
|
+
it "builds no options for empty searchables" do
|
|
443
|
+
options.must_equal []
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
describe "multiple searchables" do
|
|
448
|
+
|
|
449
|
+
it "builds correct switches" do
|
|
450
|
+
options.map(&:switches).must_equal [["--new-label"]]
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
it "builds correct descriptions" do
|
|
454
|
+
options.map(&:description).must_equal [" "]
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
it "builds correct types" do
|
|
458
|
+
options.map(&:type).must_equal ["NEW_LABEL"]
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
it "builds correct attribute readers" do
|
|
462
|
+
options.map(&:read_method).must_equal [
|
|
463
|
+
"option_new_label"
|
|
464
|
+
]
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
it "none of the options is required" do
|
|
468
|
+
options.any?{|opt| opt.required? }.must_equal false
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
describe "resources with corresponding parameter in update action" do
|
|
473
|
+
|
|
474
|
+
before :each do
|
|
475
|
+
label_param = Object.new
|
|
476
|
+
label_param.stubs(:name).returns("label")
|
|
477
|
+
label_param.stubs(:params).returns([])
|
|
478
|
+
label_param.stubs(:description).returns("DESC")
|
|
479
|
+
|
|
480
|
+
action = Object.new
|
|
481
|
+
action.stubs(:params).returns([label_param])
|
|
482
|
+
|
|
483
|
+
resource.stubs(:action).with(:update).returns(action)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
it "uses descriptions from the action" do
|
|
487
|
+
options.map(&:description).must_equal ["DESC"]
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
describe HammerCLIForeman::IdOptionBuilder do
|
|
497
|
+
|
|
498
|
+
let(:resource) { HammerCLIForeman.foreman_resource!(:architectures) }
|
|
499
|
+
let(:builder) { HammerCLIForeman::IdOptionBuilder.new(resource) }
|
|
500
|
+
let(:options) { builder.build }
|
|
501
|
+
|
|
502
|
+
describe "resources with parameter :id in show action" do
|
|
503
|
+
|
|
504
|
+
before :each do
|
|
505
|
+
id_param = Object.new
|
|
506
|
+
id_param.stubs(:name).returns("id")
|
|
507
|
+
id_param.stubs(:params).returns([])
|
|
508
|
+
id_param.stubs(:description).returns("DESC")
|
|
509
|
+
|
|
510
|
+
action = Object.new
|
|
511
|
+
action.stubs(:params).returns([id_param])
|
|
512
|
+
|
|
513
|
+
resource.stubs(:action).with(:show).returns(action)
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
it "creates options --id" do
|
|
517
|
+
options.map(&:switches).must_equal [["--id"]]
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
it "uses description from the :id param" do
|
|
521
|
+
options.map(&:description).must_equal ["DESC"]
|
|
522
|
+
end
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
describe "resources without parameter :id in show action" do
|
|
526
|
+
|
|
527
|
+
before :each do
|
|
528
|
+
action = Object.new
|
|
529
|
+
action.stubs(:params).returns([])
|
|
530
|
+
|
|
531
|
+
resource.stubs(:action).with(:show).returns(action)
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
it "creates options --id" do
|
|
535
|
+
options.map(&:switches).must_equal [["--id"]]
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
it "uses empty description" do
|
|
539
|
+
options.map(&:description).must_equal [" "]
|
|
540
|
+
end
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
end
|