nugrant 2.1.2 → 2.1.4

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 (71) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +23 -23
  3. data/.travis.yml +15 -10
  4. data/CHANGELOG.md +347 -338
  5. data/CONTRIBUTORS.md +7 -5
  6. data/Gemfile +13 -13
  7. data/README.md +601 -601
  8. data/lib/nugrant/bag.rb +264 -264
  9. data/lib/nugrant/config.rb +201 -201
  10. data/lib/nugrant/helper/bag.rb +38 -38
  11. data/lib/nugrant/helper/env/exporter.rb +195 -195
  12. data/lib/nugrant/helper/env/namer.rb +47 -47
  13. data/lib/nugrant/helper/parameters.rb +12 -12
  14. data/lib/nugrant/helper/stack.rb +86 -86
  15. data/lib/nugrant/mixin/parameters.rb +178 -178
  16. data/lib/nugrant/parameters.rb +29 -29
  17. data/lib/nugrant/vagrant/errors.rb +35 -35
  18. data/lib/nugrant/vagrant/v2/action/auto_export.rb +45 -45
  19. data/lib/nugrant/vagrant/v2/action.rb +17 -17
  20. data/lib/nugrant/vagrant/v2/command/env.rb +118 -118
  21. data/lib/nugrant/vagrant/v2/command/parameters.rb +153 -153
  22. data/lib/nugrant/vagrant/v2/command/restricted_keys.rb +64 -64
  23. data/lib/nugrant/vagrant/v2/command/root.rb +95 -95
  24. data/lib/nugrant/vagrant/v2/config/user.rb +29 -29
  25. data/lib/nugrant/vagrant/v2/helper.rb +96 -96
  26. data/lib/nugrant/vagrant/v2/plugin.rb +34 -34
  27. data/lib/nugrant/version.rb +3 -3
  28. data/lib/nugrant.rb +31 -31
  29. data/locales/en.yml +24 -24
  30. data/locales/fr.yml +24 -24
  31. data/nugrant.gemspec +32 -32
  32. data/test/lib/nugrant/helper/env/test_exporter.rb +238 -238
  33. data/test/lib/nugrant/helper/test_bag.rb +16 -16
  34. data/test/lib/nugrant/helper/test_parameters.rb +17 -17
  35. data/test/lib/nugrant/helper/test_stack.rb +152 -152
  36. data/test/lib/nugrant/test_bag.rb +450 -450
  37. data/test/lib/nugrant/test_config.rb +201 -201
  38. data/test/lib/nugrant/test_parameters.rb +438 -438
  39. data/test/lib/test_helper.rb +3 -3
  40. data/test/resources/README.md +52 -52
  41. data/test/resources/json/params_current_1.json +6 -6
  42. data/test/resources/json/params_current_2.json +29 -29
  43. data/test/resources/json/params_user_nil_values.json +9 -9
  44. data/test/resources/vagrantfiles/v2.auto_export +13 -13
  45. data/test/resources/vagrantfiles/v2.bag_inside_array +15 -15
  46. data/test/resources/vagrantfiles/v2.defaults_mixed_string_symbols +18 -18
  47. data/test/resources/vagrantfiles/v2.defaults_null_values_in_vagrantuser +23 -23
  48. data/test/resources/vagrantfiles/v2.defaults_using_string +18 -18
  49. data/test/resources/vagrantfiles/v2.defaults_using_symbol +18 -18
  50. data/test/resources/vagrantfiles/v2.empty +2 -2
  51. data/test/resources/vagrantfiles/v2.fake +29 -29
  52. data/test/resources/vagrantfiles/v2.missing_parameter +3 -3
  53. data/test/resources/vagrantfiles/v2.real +22 -22
  54. data/test/resources/yaml/params_array.yml +5 -5
  55. data/test/resources/yaml/params_boolean.yml +1 -1
  56. data/test/resources/yaml/params_combinations.yml +72 -72
  57. data/test/resources/yaml/params_current_1.yml +4 -4
  58. data/test/resources/yaml/params_current_2.yml +23 -23
  59. data/test/resources/yaml/params_defaults_at_root.yml +1 -1
  60. data/test/resources/yaml/params_defaults_not_at_root.yml +2 -2
  61. data/test/resources/yaml/params_list.yml +2 -2
  62. data/test/resources/yaml/params_numeric_key.yml +3 -3
  63. data/test/resources/yaml/params_simple.yml +1 -1
  64. data/test/resources/yaml/params_system_1.yml +4 -4
  65. data/test/resources/yaml/params_system_2.yml +25 -25
  66. data/test/resources/yaml/params_unix_eol.yml +3 -3
  67. data/test/resources/yaml/params_user_1.yml +4 -4
  68. data/test/resources/yaml/params_user_2.yml +23 -23
  69. data/test/resources/yaml/params_user_nil_values.yml +5 -5
  70. data/test/resources/yaml/params_windows_eol.yml +3 -3
  71. metadata +12 -13
@@ -1,438 +1,438 @@
1
- require 'minitest/autorun'
2
-
3
- require 'nugrant'
4
- require 'nugrant/helper/parameters'
5
- require 'nugrant/parameters'
6
-
7
- module Nugrant
8
- class TestParameters < ::Minitest::Test
9
-
10
- @@FORMATS = [:json, :yaml]
11
- @@INVALID_PATH = "impossible_file_path.yamljson.impossible"
12
-
13
- def test_params_level_1()
14
- formats.each do |format|
15
- parameters = create_parameters(format, "params_current_1", "params_user_1", "params_system_1")
16
-
17
- assert_level(parameters, {
18
- :'1.1.1' => "current",
19
- :'1.1.0' => "current",
20
- :'1.0.1' => "current",
21
- :'0.1.1' => "user",
22
- :'1.0.0' => "current",
23
- :'0.1.0' => "user",
24
- :'0.0.1' => "system",
25
- })
26
- end
27
- end
28
-
29
- def test_params_level_2()
30
- formats.each do |format|
31
- parameters = create_parameters(format, "params_current_2", "params_user_2", "params_system_2")
32
-
33
- run_second_level(parameters, :'1.1.1', {
34
- :'1.1.1' => "current",
35
- :'1.1.0' => "current",
36
- :'1.0.1' => "current",
37
- :'0.1.1' => "user",
38
- :'1.0.0' => "current",
39
- :'0.1.0' => "user",
40
- :'0.0.1' => "system",
41
- })
42
-
43
- run_second_level(parameters, :'1.1.0', {
44
- :'1.1.1' => "current",
45
- :'1.1.0' => "current",
46
- :'1.0.1' => "current",
47
- :'0.1.1' => "user",
48
- :'1.0.0' => "current",
49
- :'0.1.0' => "user",
50
- })
51
-
52
- run_second_level(parameters, :'1.0.1', {
53
- :'1.1.1' => "current",
54
- :'1.1.0' => "current",
55
- :'1.0.1' => "current",
56
- :'0.1.1' => "system",
57
- :'1.0.0' => "current",
58
- :'0.0.1' => "system",
59
- })
60
-
61
- run_second_level(parameters, :'0.1.1', {
62
- :'1.1.1' => "user",
63
- :'1.1.0' => "user",
64
- :'1.0.1' => "system",
65
- :'0.1.1' => "user",
66
- :'0.1.0' => "user",
67
- :'0.0.1' => "system",
68
- })
69
-
70
- run_second_level(parameters, :'1.0.0', {
71
- :'1.1.1' => "current",
72
- :'1.1.0' => "current",
73
- :'1.0.1' => "current",
74
- :'1.0.0' => "current",
75
- })
76
-
77
- run_second_level(parameters, :'0.1.0', {
78
- :'1.1.1' => "user",
79
- :'1.1.0' => "user",
80
- :'0.1.1' => "user",
81
- :'0.1.0' => "user",
82
- })
83
-
84
- run_second_level(parameters, :'0.0.1', {
85
- :'1.1.1' => "system",
86
- :'1.0.1' => "system",
87
- :'0.1.1' => "system",
88
- :'0.0.1' => "system",
89
- })
90
-
91
- assert_key_error(parameters, :'0.0.0')
92
- end
93
- end
94
-
95
- def run_second_level(parameters, key, results)
96
- assert_level(parameters.send(key), results)
97
- assert_level(parameters[key], results)
98
-
99
- assert_key_error(parameters, :'0.0.0')
100
- end
101
-
102
- def test_params_array()
103
- file_path = "params_array"
104
- formats.each do |format|
105
- parameters = create_parameters(format, file_path, invalid_path, invalid_path)
106
-
107
- assert_equal(["1", "2", "3"], parameters[:level1][:level2])
108
- end
109
- end
110
-
111
- def test_file_nil()
112
- run_test_file_invalid(nil)
113
- end
114
-
115
- def test_file_does_not_exist()
116
- run_test_file_invalid("impossible_file_path.yml.impossible")
117
- end
118
-
119
- def run_test_file_invalid(invalid_value)
120
- formats.each do |format|
121
- parameters = create_parameters(format, "params_simple", invalid_path, invalid_path)
122
- assert_all_access_equal("value", parameters, "test")
123
-
124
- parameters = create_parameters(format, invalid_path, "params_simple", invalid_path)
125
- assert_all_access_equal("value", parameters, "test")
126
-
127
- parameters = create_parameters(format, invalid_path, invalid_path, "params_simple")
128
- assert_all_access_equal("value", parameters, "test")
129
-
130
- parameters = create_parameters(format, invalid_path, invalid_path, invalid_path)
131
- assert(parameters)
132
- end
133
- end
134
-
135
- def test_params_windows_eol()
136
- run_test_params_eol("params_windows_eol")
137
- end
138
-
139
- def test_params_unix_eol()
140
- run_test_params_eol("params_unix_eol")
141
- end
142
-
143
- def run_test_params_eol(file_path)
144
- formats.each do |format|
145
- parameters = create_parameters(format, file_path, invalid_path, invalid_path)
146
-
147
- assert_all_access_equal("value1", parameters, 'level1')
148
- assert_all_access_equal("value2", parameters['level2'], 'first')
149
- end
150
- end
151
-
152
- def test_restricted_defaults_usage()
153
- formats.each do |format|
154
- parameters = create_parameters(format, "params_defaults_at_root", invalid_path, invalid_path)
155
-
156
- assert_all_access_equal("value", parameters, :defaults)
157
- end
158
-
159
- formats.each do |format|
160
- parameters = create_parameters(format, "params_defaults_not_at_root", invalid_path, invalid_path)
161
-
162
- assert_all_access_equal("value", parameters.level, :defaults)
163
- end
164
- end
165
-
166
- def test_defaults()
167
- formats.each do |format|
168
- parameters = create_parameters(format, "params_simple", invalid_path, invalid_path)
169
- parameters.defaults = {:test => "override1", :level => "new1"}
170
-
171
- assert_all_access_equal("value", parameters, 'test')
172
- assert_all_access_equal("new1", parameters, 'level')
173
- end
174
- end
175
-
176
- def test_empty_file()
177
- formats.each do |format|
178
- parameters = create_parameters(format, "params_empty", invalid_path, invalid_path)
179
- parameters.defaults = {:test => "value"}
180
-
181
- assert_all_access_equal("value", parameters, 'test')
182
- end
183
- end
184
-
185
- def test_file_not_hash()
186
- ["boolean", "list"].each do |wrong_type|
187
- formats.each do |format|
188
- parameters = create_parameters(format, "params_#{wrong_type}", invalid_path, invalid_path)
189
- parameters.defaults = {:test => "value"}
190
-
191
- assert_all_access_equal("value", parameters, 'test')
192
- end
193
- end
194
- end
195
-
196
- def test_nil_values()
197
- formats.each do |format|
198
- parameters = create_parameters(format, "params_user_nil_values", invalid_path, invalid_path)
199
- parameters.defaults = {:nil => "Not nil", :deep => {:nil => "Not nil", :deeper => {:nil => "Not nil"}}}
200
-
201
- assert_all_access_equal("Not nil", parameters[:deep][:deeper], :nil)
202
- assert_all_access_equal("Not nil", parameters[:deep], :nil)
203
- assert_all_access_equal("Not nil", parameters, :nil)
204
- end
205
-
206
- formats.each do |format|
207
- parameters = create_parameters(format, "params_user_nil_values", invalid_path, invalid_path)
208
-
209
- assert_all_access_equal(nil, parameters[:deep][:deeper], :nil)
210
- assert_all_access_equal(nil, parameters[:deep], :nil)
211
- assert_all_access_equal(nil, parameters, :nil)
212
- end
213
- end
214
-
215
- def test_restricted_keys_are_still_accessible
216
- keys = Helper::Parameters.restricted_keys()
217
- elements = Hash[
218
- keys.map do |key|
219
- [key, "#{key.to_s} - value"]
220
- end
221
- ]
222
-
223
- parameters = create_parameters(:json, invalid_path, invalid_path, invalid_path)
224
- parameters.defaults = elements
225
-
226
- keys.each do |key|
227
- assert_equal("#{key.to_s} - value", parameters[key.to_s], "parameters[#{key.to_s}]")
228
- assert_equal("#{key.to_s} - value", parameters[key.to_sym], "parameters[#{key.to_sym}]")
229
- end
230
- end
231
-
232
- def test_enumerable_method_insensitive()
233
- parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
234
- parameters.defaults = {"test" => "override1", :level => :new1}
235
-
236
- assert_equal(1, parameters.count([:test, "value"]))
237
- assert_equal(1, parameters.count(["test", "value"]))
238
- assert_equal(0, parameters.count(["test"]))
239
- assert_equal(0, parameters.count([]))
240
- assert_equal(0, parameters.count(:a))
241
- assert_equal(0, parameters.count(nil))
242
-
243
- assert_equal(0, parameters.find_index([:test, "value"]))
244
- assert_equal(0, parameters.find_index(["test", "value"]))
245
- assert_equal(nil, parameters.find_index(["test"]))
246
- assert_equal(nil, parameters.find_index([]))
247
- assert_equal(nil, parameters.find_index(:a))
248
- assert_equal(nil, parameters.find_index(nil))
249
- assert_equal(0, parameters.find_index() { |key, value| key == :test and value == "value" })
250
-
251
- assert_equal(false, parameters.include?([:test, "value"]))
252
- assert_equal(false, parameters.include?(["test", "value"]))
253
- end
254
-
255
- def test_hash_method_insensitive()
256
- parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
257
- parameters.defaults = {"test" => "override1", :level => :new1}
258
-
259
- assert_equal([:test, "value"], parameters.assoc("test"))
260
- assert_equal([:test, "value"], parameters.assoc(:test))
261
-
262
- # compare_by_identity ?
263
-
264
- parameters.delete("test")
265
- assert_equal(nil, parameters.assoc("test"))
266
- assert_equal(nil, parameters.assoc(:test))
267
-
268
- parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
269
- parameters.defaults = {"test" => "override1", :level => :new1}
270
-
271
- assert_equal([[:test, "value"], [:level, :new1]], parameters.collect {|key, value| [key, value]})
272
-
273
- assert_equal("value", parameters.fetch("test"))
274
- assert_equal("value", parameters.fetch("test", "default"))
275
- assert_equal("default", parameters.fetch("unknown", "default"))
276
-
277
- assert_equal(true, parameters.has_key?("test"))
278
- assert_equal(true, parameters.has_key?(:test))
279
-
280
- assert_equal(true, parameters.include?("test"))
281
- assert_equal(true, parameters.include?(:test))
282
-
283
- assert_equal(true, parameters.member?("test"))
284
- assert_equal(true, parameters.member?(:test))
285
-
286
- parameters.store("another", "different")
287
- assert_equal(true, parameters.member?("another"))
288
- assert_equal(true, parameters.member?(:another))
289
- end
290
-
291
- def test_defaults_not_overwritten_on_array_merge_strategy_change
292
- parameters = create_parameters(:json, "params_array", invalid_path, invalid_path)
293
- parameters.defaults = {"level1" => {"level2" => ["4", "5", "6"]}}
294
-
295
- parameters.array_merge_strategy = :concat
296
-
297
- assert_equal(["4", "5", "6"], parameters.defaults().level1.level2)
298
- assert_equal(["1", "2", "3", "4", "5", "6"], parameters.level1.level2)
299
- end
300
-
301
- def test_merge()
302
- parameters1 = create_parameters(:json, "params_current_1", invalid_path, invalid_path, {
303
- "0.1.1" => "default",
304
- "0.1.0" => "default",
305
- "0.0.1" => "default",
306
- })
307
-
308
- parameters2 = create_parameters(:json, "params_current_1", invalid_path, "params_system_1", {
309
- "0.1.0" => "default_overriden",
310
- })
311
-
312
- parameters3 = parameters1.merge(parameters2)
313
-
314
- refute_same(parameters1, parameters3)
315
- refute_same(parameters2, parameters3)
316
-
317
- assert_equal(Nugrant::Parameters, parameters3.class)
318
-
319
- assert_level(parameters3, {
320
- :'1.1.1' => "current",
321
- :'1.1.0' => "current",
322
- :'1.0.1' => "current",
323
- :'0.1.1' => "system",
324
- :'1.0.0' => "current",
325
- :'0.1.0' => "default_overriden",
326
- :'0.0.1' => "system",
327
- })
328
- end
329
-
330
- def test_merge!()
331
- parameters1 = create_parameters(:json, "params_current_1", invalid_path, invalid_path, {
332
- "0.1.1" => "default",
333
- "0.1.0" => "default",
334
- "0.0.1" => "default",
335
- })
336
-
337
- parameters2 = create_parameters(:json, "params_current_1", invalid_path, "params_system_1", {
338
- "0.1.0" => "default_overriden",
339
- })
340
-
341
- parameters3 = parameters1.merge!(parameters2)
342
-
343
- assert_same(parameters1, parameters3)
344
- refute_same(parameters2, parameters3)
345
-
346
- assert_equal(Nugrant::Parameters, parameters3.class)
347
-
348
- assert_level(parameters3, {
349
- :'1.1.1' => "current",
350
- :'1.1.0' => "current",
351
- :'1.0.1' => "current",
352
- :'0.1.1' => "system",
353
- :'1.0.0' => "current",
354
- :'0.1.0' => "default_overriden",
355
- :'0.0.1' => "system",
356
- })
357
- end
358
-
359
- def test_merge_with_different_array_merge_strategy()
360
- parameters1 = create_parameters(:json, "params_array", invalid_path, invalid_path, {
361
- "level1" => {
362
- "level2" => ["3", "4", "5"]
363
- }
364
- }, :array_merge_strategy => :replace)
365
-
366
- parameters2 = create_parameters(:json, "params_array", invalid_path, invalid_path, {
367
- "level1" => {
368
- "level2" => ["3", "6", "7"]
369
- }
370
- }, :array_merge_strategy => :concat)
371
-
372
- parameters3 = parameters1.merge(parameters2)
373
-
374
- assert_equal(["1", "2", "3", "3", "6", "7"], parameters3.level1.level2)
375
- end
376
-
377
- def test_numeric_key_in_yaml_converted_to_symbol()
378
- parameters = create_parameters(:yaml, "params_numeric_key", invalid_path, invalid_path)
379
-
380
- assert_equal("value1", parameters.servers[:'1'])
381
- end
382
-
383
- ## Helpers & Assertions
384
-
385
- def create_parameters(format, current_filename, user_filename, system_filename, defaults = {}, options = {})
386
- extension = case format
387
- when :json
388
- "json"
389
- when :yml, :yaml
390
- "yml"
391
- else
392
- raise ArgumentError, "Format [#{format}] is currently not supported"
393
- end
394
-
395
- resource_path = File.expand_path("#{File.dirname(__FILE__)}/../../resources/#{format}")
396
-
397
- current_path = "#{resource_path}/#{current_filename}.#{extension}" if current_filename
398
- user_path = "#{resource_path}/#{user_filename}.#{extension}" if user_filename
399
- system_path = "#{resource_path}/#{system_filename}.#{extension}" if system_filename
400
-
401
- return Nugrant::Parameters.new(defaults, {
402
- :format => format,
403
- :current_path => current_path,
404
- :user_path => user_path,
405
- :system_path => system_path,
406
- :array_merge_strategy => options[:array_merge_strategy]
407
- })
408
- end
409
-
410
- def assert_all_access_equal(expected, parameters, key)
411
- assert_equal(expected, parameters.method_missing(key.to_sym), "parameters.#{key.to_s}")
412
- assert_equal(expected, parameters[key.to_s], "parameters[#{key.to_s}]")
413
- assert_equal(expected, parameters[key.to_sym], "parameters[#{key.to_sym}]")
414
- end
415
-
416
- def assert_level(parameters, results)
417
- results.each do |key, value|
418
- assert_all_access_equal(value, parameters, key)
419
- end
420
-
421
- assert_key_error(parameters, "0.0.0")
422
- end
423
-
424
- def assert_key_error(parameters, key)
425
- assert_raises(KeyError) do
426
- parameters[key]
427
- end
428
- end
429
-
430
- def formats()
431
- @@FORMATS
432
- end
433
-
434
- def invalid_path()
435
- @@INVALID_PATH
436
- end
437
- end
438
- end
1
+ require 'minitest/autorun'
2
+
3
+ require 'nugrant'
4
+ require 'nugrant/helper/parameters'
5
+ require 'nugrant/parameters'
6
+
7
+ module Nugrant
8
+ class TestParameters < ::Minitest::Test
9
+
10
+ @@FORMATS = [:json, :yaml]
11
+ @@INVALID_PATH = "impossible_file_path.yamljson.impossible"
12
+
13
+ def test_params_level_1()
14
+ formats.each do |format|
15
+ parameters = create_parameters(format, "params_current_1", "params_user_1", "params_system_1")
16
+
17
+ assert_level(parameters, {
18
+ :'1.1.1' => "current",
19
+ :'1.1.0' => "current",
20
+ :'1.0.1' => "current",
21
+ :'0.1.1' => "user",
22
+ :'1.0.0' => "current",
23
+ :'0.1.0' => "user",
24
+ :'0.0.1' => "system",
25
+ })
26
+ end
27
+ end
28
+
29
+ def test_params_level_2()
30
+ formats.each do |format|
31
+ parameters = create_parameters(format, "params_current_2", "params_user_2", "params_system_2")
32
+
33
+ run_second_level(parameters, :'1.1.1', {
34
+ :'1.1.1' => "current",
35
+ :'1.1.0' => "current",
36
+ :'1.0.1' => "current",
37
+ :'0.1.1' => "user",
38
+ :'1.0.0' => "current",
39
+ :'0.1.0' => "user",
40
+ :'0.0.1' => "system",
41
+ })
42
+
43
+ run_second_level(parameters, :'1.1.0', {
44
+ :'1.1.1' => "current",
45
+ :'1.1.0' => "current",
46
+ :'1.0.1' => "current",
47
+ :'0.1.1' => "user",
48
+ :'1.0.0' => "current",
49
+ :'0.1.0' => "user",
50
+ })
51
+
52
+ run_second_level(parameters, :'1.0.1', {
53
+ :'1.1.1' => "current",
54
+ :'1.1.0' => "current",
55
+ :'1.0.1' => "current",
56
+ :'0.1.1' => "system",
57
+ :'1.0.0' => "current",
58
+ :'0.0.1' => "system",
59
+ })
60
+
61
+ run_second_level(parameters, :'0.1.1', {
62
+ :'1.1.1' => "user",
63
+ :'1.1.0' => "user",
64
+ :'1.0.1' => "system",
65
+ :'0.1.1' => "user",
66
+ :'0.1.0' => "user",
67
+ :'0.0.1' => "system",
68
+ })
69
+
70
+ run_second_level(parameters, :'1.0.0', {
71
+ :'1.1.1' => "current",
72
+ :'1.1.0' => "current",
73
+ :'1.0.1' => "current",
74
+ :'1.0.0' => "current",
75
+ })
76
+
77
+ run_second_level(parameters, :'0.1.0', {
78
+ :'1.1.1' => "user",
79
+ :'1.1.0' => "user",
80
+ :'0.1.1' => "user",
81
+ :'0.1.0' => "user",
82
+ })
83
+
84
+ run_second_level(parameters, :'0.0.1', {
85
+ :'1.1.1' => "system",
86
+ :'1.0.1' => "system",
87
+ :'0.1.1' => "system",
88
+ :'0.0.1' => "system",
89
+ })
90
+
91
+ assert_key_error(parameters, :'0.0.0')
92
+ end
93
+ end
94
+
95
+ def run_second_level(parameters, key, results)
96
+ assert_level(parameters.send(key), results)
97
+ assert_level(parameters[key], results)
98
+
99
+ assert_key_error(parameters, :'0.0.0')
100
+ end
101
+
102
+ def test_params_array()
103
+ file_path = "params_array"
104
+ formats.each do |format|
105
+ parameters = create_parameters(format, file_path, invalid_path, invalid_path)
106
+
107
+ assert_equal(["1", "2", "3"], parameters[:level1][:level2])
108
+ end
109
+ end
110
+
111
+ def test_file_nil()
112
+ run_test_file_invalid(nil)
113
+ end
114
+
115
+ def test_file_does_not_exist()
116
+ run_test_file_invalid("impossible_file_path.yml.impossible")
117
+ end
118
+
119
+ def run_test_file_invalid(invalid_value)
120
+ formats.each do |format|
121
+ parameters = create_parameters(format, "params_simple", invalid_path, invalid_path)
122
+ assert_all_access_equal("value", parameters, "test")
123
+
124
+ parameters = create_parameters(format, invalid_path, "params_simple", invalid_path)
125
+ assert_all_access_equal("value", parameters, "test")
126
+
127
+ parameters = create_parameters(format, invalid_path, invalid_path, "params_simple")
128
+ assert_all_access_equal("value", parameters, "test")
129
+
130
+ parameters = create_parameters(format, invalid_path, invalid_path, invalid_path)
131
+ assert(parameters)
132
+ end
133
+ end
134
+
135
+ def test_params_windows_eol()
136
+ run_test_params_eol("params_windows_eol")
137
+ end
138
+
139
+ def test_params_unix_eol()
140
+ run_test_params_eol("params_unix_eol")
141
+ end
142
+
143
+ def run_test_params_eol(file_path)
144
+ formats.each do |format|
145
+ parameters = create_parameters(format, file_path, invalid_path, invalid_path)
146
+
147
+ assert_all_access_equal("value1", parameters, 'level1')
148
+ assert_all_access_equal("value2", parameters['level2'], 'first')
149
+ end
150
+ end
151
+
152
+ def test_restricted_defaults_usage()
153
+ formats.each do |format|
154
+ parameters = create_parameters(format, "params_defaults_at_root", invalid_path, invalid_path)
155
+
156
+ assert_all_access_equal("value", parameters, :defaults)
157
+ end
158
+
159
+ formats.each do |format|
160
+ parameters = create_parameters(format, "params_defaults_not_at_root", invalid_path, invalid_path)
161
+
162
+ assert_all_access_equal("value", parameters.level, :defaults)
163
+ end
164
+ end
165
+
166
+ def test_defaults()
167
+ formats.each do |format|
168
+ parameters = create_parameters(format, "params_simple", invalid_path, invalid_path)
169
+ parameters.defaults = {:test => "override1", :level => "new1"}
170
+
171
+ assert_all_access_equal("value", parameters, 'test')
172
+ assert_all_access_equal("new1", parameters, 'level')
173
+ end
174
+ end
175
+
176
+ def test_empty_file()
177
+ formats.each do |format|
178
+ parameters = create_parameters(format, "params_empty", invalid_path, invalid_path)
179
+ parameters.defaults = {:test => "value"}
180
+
181
+ assert_all_access_equal("value", parameters, 'test')
182
+ end
183
+ end
184
+
185
+ def test_file_not_hash()
186
+ ["boolean", "list"].each do |wrong_type|
187
+ formats.each do |format|
188
+ parameters = create_parameters(format, "params_#{wrong_type}", invalid_path, invalid_path)
189
+ parameters.defaults = {:test => "value"}
190
+
191
+ assert_all_access_equal("value", parameters, 'test')
192
+ end
193
+ end
194
+ end
195
+
196
+ def test_nil_values()
197
+ formats.each do |format|
198
+ parameters = create_parameters(format, "params_user_nil_values", invalid_path, invalid_path)
199
+ parameters.defaults = {:nil => "Not nil", :deep => {:nil => "Not nil", :deeper => {:nil => "Not nil"}}}
200
+
201
+ assert_all_access_equal("Not nil", parameters[:deep][:deeper], :nil)
202
+ assert_all_access_equal("Not nil", parameters[:deep], :nil)
203
+ assert_all_access_equal("Not nil", parameters, :nil)
204
+ end
205
+
206
+ formats.each do |format|
207
+ parameters = create_parameters(format, "params_user_nil_values", invalid_path, invalid_path)
208
+
209
+ assert_all_access_equal(nil, parameters[:deep][:deeper], :nil)
210
+ assert_all_access_equal(nil, parameters[:deep], :nil)
211
+ assert_all_access_equal(nil, parameters, :nil)
212
+ end
213
+ end
214
+
215
+ def test_restricted_keys_are_still_accessible
216
+ keys = Helper::Parameters.restricted_keys()
217
+ elements = Hash[
218
+ keys.map do |key|
219
+ [key, "#{key.to_s} - value"]
220
+ end
221
+ ]
222
+
223
+ parameters = create_parameters(:json, invalid_path, invalid_path, invalid_path)
224
+ parameters.defaults = elements
225
+
226
+ keys.each do |key|
227
+ assert_equal("#{key.to_s} - value", parameters[key.to_s], "parameters[#{key.to_s}]")
228
+ assert_equal("#{key.to_s} - value", parameters[key.to_sym], "parameters[#{key.to_sym}]")
229
+ end
230
+ end
231
+
232
+ def test_enumerable_method_insensitive()
233
+ parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
234
+ parameters.defaults = {"test" => "override1", :level => :new1}
235
+
236
+ assert_equal(1, parameters.count([:test, "value"]))
237
+ assert_equal(1, parameters.count(["test", "value"]))
238
+ assert_equal(0, parameters.count(["test"]))
239
+ assert_equal(0, parameters.count([]))
240
+ assert_equal(0, parameters.count(:a))
241
+ assert_equal(0, parameters.count(nil))
242
+
243
+ assert_equal(0, parameters.find_index([:test, "value"]))
244
+ assert_equal(0, parameters.find_index(["test", "value"]))
245
+ assert_equal(nil, parameters.find_index(["test"]))
246
+ assert_equal(nil, parameters.find_index([]))
247
+ assert_equal(nil, parameters.find_index(:a))
248
+ assert_equal(nil, parameters.find_index(nil))
249
+ assert_equal(0, parameters.find_index() { |key, value| key == :test and value == "value" })
250
+
251
+ assert_equal(false, parameters.include?([:test, "value"]))
252
+ assert_equal(false, parameters.include?(["test", "value"]))
253
+ end
254
+
255
+ def test_hash_method_insensitive()
256
+ parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
257
+ parameters.defaults = {"test" => "override1", :level => :new1}
258
+
259
+ assert_equal([:test, "value"], parameters.assoc("test"))
260
+ assert_equal([:test, "value"], parameters.assoc(:test))
261
+
262
+ # compare_by_identity ?
263
+
264
+ parameters.delete("test")
265
+ assert_equal(nil, parameters.assoc("test"))
266
+ assert_equal(nil, parameters.assoc(:test))
267
+
268
+ parameters = create_parameters(:json, "params_simple", invalid_path, invalid_path)
269
+ parameters.defaults = {"test" => "override1", :level => :new1}
270
+
271
+ assert_equal([[:test, "value"], [:level, :new1]], parameters.collect {|key, value| [key, value]})
272
+
273
+ assert_equal("value", parameters.fetch("test"))
274
+ assert_equal("value", parameters.fetch("test", "default"))
275
+ assert_equal("default", parameters.fetch("unknown", "default"))
276
+
277
+ assert_equal(true, parameters.has_key?("test"))
278
+ assert_equal(true, parameters.has_key?(:test))
279
+
280
+ assert_equal(true, parameters.include?("test"))
281
+ assert_equal(true, parameters.include?(:test))
282
+
283
+ assert_equal(true, parameters.member?("test"))
284
+ assert_equal(true, parameters.member?(:test))
285
+
286
+ parameters.store("another", "different")
287
+ assert_equal(true, parameters.member?("another"))
288
+ assert_equal(true, parameters.member?(:another))
289
+ end
290
+
291
+ def test_defaults_not_overwritten_on_array_merge_strategy_change
292
+ parameters = create_parameters(:json, "params_array", invalid_path, invalid_path)
293
+ parameters.defaults = {"level1" => {"level2" => ["4", "5", "6"]}}
294
+
295
+ parameters.array_merge_strategy = :concat
296
+
297
+ assert_equal(["4", "5", "6"], parameters.defaults().level1.level2)
298
+ assert_equal(["1", "2", "3", "4", "5", "6"], parameters.level1.level2)
299
+ end
300
+
301
+ def test_merge()
302
+ parameters1 = create_parameters(:json, "params_current_1", invalid_path, invalid_path, {
303
+ "0.1.1" => "default",
304
+ "0.1.0" => "default",
305
+ "0.0.1" => "default",
306
+ })
307
+
308
+ parameters2 = create_parameters(:json, "params_current_1", invalid_path, "params_system_1", {
309
+ "0.1.0" => "default_overriden",
310
+ })
311
+
312
+ parameters3 = parameters1.merge(parameters2)
313
+
314
+ refute_same(parameters1, parameters3)
315
+ refute_same(parameters2, parameters3)
316
+
317
+ assert_equal(Nugrant::Parameters, parameters3.class)
318
+
319
+ assert_level(parameters3, {
320
+ :'1.1.1' => "current",
321
+ :'1.1.0' => "current",
322
+ :'1.0.1' => "current",
323
+ :'0.1.1' => "system",
324
+ :'1.0.0' => "current",
325
+ :'0.1.0' => "default_overriden",
326
+ :'0.0.1' => "system",
327
+ })
328
+ end
329
+
330
+ def test_merge!()
331
+ parameters1 = create_parameters(:json, "params_current_1", invalid_path, invalid_path, {
332
+ "0.1.1" => "default",
333
+ "0.1.0" => "default",
334
+ "0.0.1" => "default",
335
+ })
336
+
337
+ parameters2 = create_parameters(:json, "params_current_1", invalid_path, "params_system_1", {
338
+ "0.1.0" => "default_overriden",
339
+ })
340
+
341
+ parameters3 = parameters1.merge!(parameters2)
342
+
343
+ assert_same(parameters1, parameters3)
344
+ refute_same(parameters2, parameters3)
345
+
346
+ assert_equal(Nugrant::Parameters, parameters3.class)
347
+
348
+ assert_level(parameters3, {
349
+ :'1.1.1' => "current",
350
+ :'1.1.0' => "current",
351
+ :'1.0.1' => "current",
352
+ :'0.1.1' => "system",
353
+ :'1.0.0' => "current",
354
+ :'0.1.0' => "default_overriden",
355
+ :'0.0.1' => "system",
356
+ })
357
+ end
358
+
359
+ def test_merge_with_different_array_merge_strategy()
360
+ parameters1 = create_parameters(:json, "params_array", invalid_path, invalid_path, {
361
+ "level1" => {
362
+ "level2" => ["3", "4", "5"]
363
+ }
364
+ }, :array_merge_strategy => :replace)
365
+
366
+ parameters2 = create_parameters(:json, "params_array", invalid_path, invalid_path, {
367
+ "level1" => {
368
+ "level2" => ["3", "6", "7"]
369
+ }
370
+ }, :array_merge_strategy => :concat)
371
+
372
+ parameters3 = parameters1.merge(parameters2)
373
+
374
+ assert_equal(["1", "2", "3", "3", "6", "7"], parameters3.level1.level2)
375
+ end
376
+
377
+ def test_numeric_key_in_yaml_converted_to_symbol()
378
+ parameters = create_parameters(:yaml, "params_numeric_key", invalid_path, invalid_path)
379
+
380
+ assert_equal("value1", parameters.servers[:'1'])
381
+ end
382
+
383
+ ## Helpers & Assertions
384
+
385
+ def create_parameters(format, current_filename, user_filename, system_filename, defaults = {}, options = {})
386
+ extension = case format
387
+ when :json
388
+ "json"
389
+ when :yml, :yaml
390
+ "yml"
391
+ else
392
+ raise ArgumentError, "Format [#{format}] is currently not supported"
393
+ end
394
+
395
+ resource_path = File.expand_path("#{File.dirname(__FILE__)}/../../resources/#{format}")
396
+
397
+ current_path = "#{resource_path}/#{current_filename}.#{extension}" if current_filename
398
+ user_path = "#{resource_path}/#{user_filename}.#{extension}" if user_filename
399
+ system_path = "#{resource_path}/#{system_filename}.#{extension}" if system_filename
400
+
401
+ return Nugrant::Parameters.new(defaults, {
402
+ :format => format,
403
+ :current_path => current_path,
404
+ :user_path => user_path,
405
+ :system_path => system_path,
406
+ :array_merge_strategy => options[:array_merge_strategy]
407
+ })
408
+ end
409
+
410
+ def assert_all_access_equal(expected, parameters, key)
411
+ assert_equal(expected, parameters.method_missing(key.to_sym), "parameters.#{key.to_s}")
412
+ assert_equal(expected, parameters[key.to_s], "parameters[#{key.to_s}]")
413
+ assert_equal(expected, parameters[key.to_sym], "parameters[#{key.to_sym}]")
414
+ end
415
+
416
+ def assert_level(parameters, results)
417
+ results.each do |key, value|
418
+ assert_all_access_equal(value, parameters, key)
419
+ end
420
+
421
+ assert_key_error(parameters, "0.0.0")
422
+ end
423
+
424
+ def assert_key_error(parameters, key)
425
+ assert_raises(KeyError) do
426
+ parameters[key]
427
+ end
428
+ end
429
+
430
+ def formats()
431
+ @@FORMATS
432
+ end
433
+
434
+ def invalid_path()
435
+ @@INVALID_PATH
436
+ end
437
+ end
438
+ end