chef-gyoku 1.4.1

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.
@@ -0,0 +1,431 @@
1
+ require "spec_helper"
2
+
3
+ describe Gyoku::Hash do
4
+ describe ".to_xml" do
5
+ describe "returns SOAP request compatible XML" do
6
+ it "for a simple Hash" do
7
+ expect(to_xml(some: "user")).to eq("<some>user</some>")
8
+ end
9
+
10
+ it "for a nested Hash" do
11
+ expect(to_xml(some: {new: "user"})).to eq("<some><new>user</new></some>")
12
+ end
13
+
14
+ context "with key_converter" do
15
+ it "expect all keys change" do
16
+ expect(to_xml({some: {new: "user"}}, {key_converter: :camelcase})).to eq("<Some><New>user</New></Some>")
17
+ end
18
+
19
+ it "and key_to_convert option should change only key" do
20
+ hash = {some: {new: "user", age: 20}}
21
+ options = {key_converter: :camelcase, key_to_convert: "some"}
22
+ result = "<Some><new>user</new><age>20</age></Some>"
23
+ expect(to_xml(hash, options)).to eq(result)
24
+
25
+ hash = {some: {new: "user", age: 20}}
26
+ options = {key_converter: :camelcase, key_to_convert: "new"}
27
+ result = "<some><New>user</New><age>20</age></some>"
28
+ expect(to_xml(hash, options)).to eq(result)
29
+ end
30
+
31
+ it "with except option, dont convert this key" do
32
+ hash = {some: {new: "user", age: 20}}
33
+ options = {key_converter: :camelcase, except: "some"}
34
+ result = "<some><New>user</New><Age>20</Age></some>"
35
+ expect(to_xml(hash, options)).to eq(result)
36
+ end
37
+ end
38
+
39
+ it "for a Hash with multiple keys" do
40
+ expect(to_xml(all: "users", before: "whatever")).to include(
41
+ "<all>users</all>",
42
+ "<before>whatever</before>"
43
+ )
44
+ end
45
+
46
+ it "for a Hash containing an Array" do
47
+ expect(to_xml(some: ["user", "gorilla"])).to eq("<some>user</some><some>gorilla</some>")
48
+ end
49
+
50
+ it "for a Hash containing an Array of Hashes" do
51
+ expect(to_xml(some: [{new: "user"}, {old: "gorilla"}]))
52
+ .to eq("<some><new>user</new></some><some><old>gorilla</old></some>")
53
+ end
54
+
55
+ context "when :pretty_print option is set to true" do
56
+ it "returns prettified xml" do
57
+ hash = {some: {user: {name: "John", groups: ["admin", "editor"]}}}
58
+ options = {pretty_print: true}
59
+ result = "<some>\n <user>\n <name>John</name>\n <groups>admin</groups>\n <groups>editor</groups>\n </user>\n</some>"
60
+ expect(to_xml(hash, options)).to eq(result)
61
+ end
62
+
63
+ context "when :indent option is specified" do
64
+ it "returns prettified xml with specified indent" do
65
+ hash = {some: {user: {name: "John"}}}
66
+ options = {pretty_print: true, indent: 4}
67
+ result = "<some>\n <user>\n <name>John</name>\n </user>\n</some>"
68
+ expect(to_xml(hash, options)).to eq(result)
69
+ end
70
+ end
71
+
72
+ context "when :compact option is specified" do
73
+ it "returns prettified xml with specified compact mode" do
74
+ hash = {some: {user: {name: "John"}}}
75
+ options = {pretty_print: true, compact: false}
76
+ result = "<some>\n <user>\n <name>\n John\n </name>\n </user>\n</some>"
77
+ expect(to_xml(hash, options)).to eq(result)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ it "converts Hash key Symbols to lowerCamelCase" do
84
+ expect(to_xml(find_or_create: "user")).to eq("<findOrCreate>user</findOrCreate>")
85
+ end
86
+
87
+ it "does not convert Hash key Strings" do
88
+ expect(to_xml("find_or_create" => "user")).to eq("<find_or_create>user</find_or_create>")
89
+ end
90
+
91
+ it "converts DateTime objects to xs:dateTime compliant Strings" do
92
+ expect(to_xml(before: DateTime.new(2012, 0o3, 22, 16, 22, 33)))
93
+ .to eq("<before>2012-03-22T16:22:33+00:00</before>")
94
+ end
95
+
96
+ it "converts Objects responding to to_datetime to xs:dateTime compliant Strings" do
97
+ singleton = Object.new
98
+ def singleton.to_datetime
99
+ DateTime.new(2012, 0o3, 22, 16, 22, 33)
100
+ end
101
+
102
+ expect(to_xml(before: singleton)).to eq("<before>2012-03-22T16:22:33+00:00</before>")
103
+ end
104
+
105
+ it "calls to_s on Strings even if they respond to to_datetime" do
106
+ singleton = "gorilla"
107
+ def singleton.to_datetime
108
+ DateTime.new(2012, 0o3, 22, 16, 22, 33)
109
+ end
110
+
111
+ expect(to_xml(name: singleton)).to eq("<name>gorilla</name>")
112
+ end
113
+
114
+ it "properly serializes nil values" do
115
+ expect(to_xml(some: nil)).to eq('<some xsi:nil="true"/>')
116
+ end
117
+
118
+ it "creates self-closing tags for Hash keys ending with a forward slash" do
119
+ expect(to_xml("self-closing/" => nil)).to eq("<self-closing/>")
120
+ end
121
+
122
+ it "calls to_s on any other Object" do
123
+ [666, true, false].each do |object|
124
+ expect(to_xml(some: object)).to eq("<some>#{object}</some>")
125
+ end
126
+ end
127
+
128
+ it "defaults to escape special characters" do
129
+ result = to_xml(some: {nested: "<tag />"}, tag: "<tag />")
130
+ expect(result).to include("<tag>&lt;tag /&gt;</tag>")
131
+ expect(result).to include("<some><nested>&lt;tag /&gt;</nested></some>")
132
+ end
133
+
134
+ it "does not escape special characters for keys marked with an exclamation mark" do
135
+ result = to_xml(some: {nested!: "<tag />"}, tag!: "<tag />")
136
+ expect(result).to include("<tag><tag /></tag>")
137
+ expect(result).to include("<some><nested><tag /></nested></some>")
138
+ end
139
+
140
+ it "preserves the order of Hash keys and values specified through :order!" do
141
+ hash = {find_user: {name: "Lucy", id: 666, order!: [:id, :name]}}
142
+ result = "<findUser><id>666</id><name>Lucy</name></findUser>"
143
+ expect(to_xml(hash)).to eq(result)
144
+
145
+ hash = {find_user: {mname: "in the", lname: "Sky", fname: "Lucy", order!: [:fname, :mname, :lname]}}
146
+ result = "<findUser><fname>Lucy</fname><mname>in the</mname><lname>Sky</lname></findUser>"
147
+ expect(to_xml(hash)).to eq(result)
148
+ end
149
+
150
+ it "preserves the order of Hash keys and values specified through 'order!' (as a string key)" do
151
+ hash = {find_user: {:name => "Lucy", :id => 666, "order!" => [:id, :name]}}
152
+ result = "<findUser><id>666</id><name>Lucy</name></findUser>"
153
+ expect(to_xml(hash)).to eq(result)
154
+
155
+ hash = {find_user: {:mname => "in the", :lname => "Sky", :fname => "Lucy", "order!" => [:fname, :mname, :lname]}}
156
+ result = "<findUser><fname>Lucy</fname><mname>in the</mname><lname>Sky</lname></findUser>"
157
+ expect(to_xml(hash)).to eq(result)
158
+ end
159
+
160
+ it "uses :order! symbol values for ordering but leaves the string key 'order!' if both are present" do
161
+ hash = {find_user: {:name => "Lucy", :id => 666, "order!" => "value", :order! => [:id, :name, "order!"]}}
162
+ result = "<findUser><id>666</id><name>Lucy</name><order>value</order></findUser>"
163
+ expect(to_xml(hash)).to eq(result)
164
+ end
165
+
166
+ it "raises if the :order! Array is missing Hash keys" do
167
+ hash = {name: "Lucy", id: 666, order!: [:name]}
168
+ expect { to_xml(hash) }.to raise_error(ArgumentError, "Missing elements in :order! [:id]")
169
+ end
170
+
171
+ it "raises if the :order! Array contains missing Hash keys" do
172
+ hash = {by_name: {first_name: "Lucy", last_name: "Sky", order!: [:first_name, :middle_name, :last_name]}}
173
+ expect { to_xml(hash) }.to raise_error(ArgumentError, "Spurious elements in :order! [:middle_name]")
174
+ end
175
+
176
+ it "adds attributes to Hash keys specified through :attributes!" do
177
+ hash = {find_user: {person: "Lucy", attributes!: {person: {id: 666}}}}
178
+ result = '<findUser><person id="666">Lucy</person></findUser>'
179
+ expect(to_xml(hash)).to eq(result)
180
+
181
+ hash = {find_user: {person: "Lucy", attributes!: {person: {id: 666, city: "Hamburg"}}}}
182
+ expect(to_xml(hash)).to include('id="666"', 'city="Hamburg"')
183
+ end
184
+
185
+ it "adds attributes to duplicate Hash keys specified through :attributes!" do
186
+ hash = {find_user: {person: ["Lucy", "Anna"], attributes!: {person: {id: [1, 3]}}}}
187
+ result = '<findUser><person id="1">Lucy</person><person id="3">Anna</person></findUser>'
188
+ expect(to_xml(hash)).to eq(result)
189
+
190
+ hash = {find_user: {person: ["Lucy", "Anna"], attributes!: {person: {active: "true"}}}}
191
+ result = '<findUser><person active="true">Lucy</person><person active="true">Anna</person></findUser>'
192
+ expect(to_xml(hash)).to eq(result)
193
+ end
194
+
195
+ it "skips attribute for element without attributes if there are fewer attributes than elements" do
196
+ hash = {find_user: {person: ["Lucy", "Anna", "Beth"], attributes!: {person: {id: [1, 3]}}}}
197
+ result = '<findUser><person id="1">Lucy</person><person id="3">Anna</person><person>Beth</person></findUser>'
198
+ expect(to_xml(hash)).to eq(result)
199
+ end
200
+
201
+ it "adds attributes to self-closing tags" do
202
+ hash = {
203
+ "category/" => "",
204
+ :attributes! => {"category/" => {id: 1}}
205
+ }
206
+
207
+ expect(to_xml(hash)).to eq('<category id="1"/>')
208
+ end
209
+
210
+ it "recognizes @attribute => value along :attributes!" do
211
+ hash = {
212
+ "category" => {
213
+ :content! => "users",
214
+ :@id => 1
215
+ }
216
+ }
217
+ expect(to_xml(hash)).to eq('<category id="1">users</category>')
218
+ end
219
+
220
+ it "recognizes @attribute => value along :attributes! in selfclosed tags" do
221
+ hash = {
222
+ "category/" => {
223
+ :@id => 1
224
+ }
225
+ }
226
+ expect(to_xml(hash)).to eq('<category id="1"/>')
227
+ end
228
+
229
+ it ":@attribute => value takes over :attributes!" do
230
+ hash = {
231
+ "category/" => {
232
+ :@id => 1
233
+ },
234
+ :attributes! => {
235
+ "category/" => {
236
+ "id" => 2, # will be ignored
237
+ "type" => "admins"
238
+ }
239
+ }
240
+ }
241
+ # attribute order is undefined
242
+ expect(['<category id="1" type="admins"/>', '<category type="admins" id="1"/>']).to include to_xml(hash)
243
+
244
+ # with symbols
245
+ hash = {
246
+ "category/" => {
247
+ :@id => 1
248
+ },
249
+ :attributes! => {
250
+ "category/" => {
251
+ id: 2, # will be ignored
252
+ type: "admins"
253
+ }
254
+ }
255
+ }
256
+ expect(['<category id="1" type="admins"/>', '<category type="admins" id="1"/>']).to include to_xml(hash)
257
+ end
258
+
259
+ it "recognizes :content! => value as tag content" do
260
+ hash = {
261
+ "category" => {
262
+ content!: "users"
263
+ }
264
+ }
265
+ expect(to_xml(hash)).to eq("<category>users</category>")
266
+ end
267
+
268
+ it "recognizes :content! => value as tag content with value Fixnum" do
269
+ hash = {
270
+ "category" => {
271
+ content!: 666
272
+ }
273
+ }
274
+ expect(to_xml(hash)).to eq("<category>666</category>")
275
+ end
276
+
277
+ it "recognizes :content! => value as tag content with value true" do
278
+ hash = {
279
+ "category" => {
280
+ content!: true
281
+ }
282
+ }
283
+ expect(to_xml(hash)).to eq("<category>true</category>")
284
+ end
285
+
286
+ it "recognizes :content! => value as tag content with value false" do
287
+ hash = {
288
+ "category" => {
289
+ content!: false
290
+ }
291
+ }
292
+ expect(to_xml(hash)).to eq("<category>false</category>")
293
+ end
294
+
295
+ it "recognizes :content! => value as tag content with value DateTime" do
296
+ hash = {
297
+ "before" => {
298
+ content!: DateTime.new(2012, 0o3, 22, 16, 22, 33)
299
+ }
300
+ }
301
+ expect(to_xml(hash)).to eq("<before>2012-03-22T16:22:33+00:00</before>")
302
+ end
303
+
304
+ it "ignores :content! if self-closing mark present" do
305
+ hash = {
306
+ "category/" => {
307
+ content!: "users"
308
+ }
309
+ }
310
+ expect(to_xml(hash)).to eq("<category/>")
311
+ end
312
+
313
+ it "recognizes array of attributes" do
314
+ hash = {
315
+ "category" => [{:@name => "one"}, {:@name => "two"}]
316
+ }
317
+ expect(to_xml(hash)).to eq('<category name="one"></category><category name="two"></category>')
318
+
319
+ # issue #31.
320
+ hash = {
321
+ :order! => ["foo", "bar"],
322
+ "foo" => {:@foo => "foo"},
323
+ "bar" => {:@bar => "bar", "baz" => {}}
324
+ }
325
+ expect(to_xml(hash)).to eq('<foo foo="foo"></foo><bar bar="bar"><baz></baz></bar>')
326
+ end
327
+
328
+ it "recognizes array of attributes with content in each" do
329
+ hash = {
330
+ "foo" => [{:@name => "bar", :content! => "gyoku"}, {:@name => "baz", :@some => "attr", :content! => "rocks!"}]
331
+ }
332
+
333
+ expect([
334
+ '<foo name="bar">gyoku</foo><foo name="baz" some="attr">rocks!</foo>',
335
+ '<foo name="bar">gyoku</foo><foo some="attr" name="baz">rocks!</foo>'
336
+ ]).to include to_xml(hash)
337
+ end
338
+
339
+ it "recognizes array of attributes but ignores content in each if selfclosing" do
340
+ hash = {
341
+ "foo/" => [{:@name => "bar", :content! => "gyoku"}, {:@name => "baz", :@some => "attr", :content! => "rocks!"}]
342
+ }
343
+
344
+ expect([
345
+ '<foo name="bar"/><foo name="baz" some="attr"/>',
346
+ '<foo name="bar"/><foo some="attr" name="baz"/>'
347
+ ]).to include to_xml(hash)
348
+ end
349
+
350
+ it "recognizes array of attributes with selfclosing tag" do
351
+ hash = {
352
+ "category/" => [{:@name => "one"}, {:@name => "two"}]
353
+ }
354
+ expect(to_xml(hash)).to eq('<category name="one"/><category name="two"/>')
355
+ end
356
+
357
+ context "with :element_form_default set to :qualified and a :namespace" do
358
+ it "adds the given :namespace to every element" do
359
+ hash = {:first => {"first_name" => "Lucy"}, ":second" => {":first_name": "Anna"}, "v2:third" => {"v2:firstName" => "Danie"}}
360
+ result = to_xml hash, element_form_default: :qualified, namespace: :v1
361
+
362
+ expect(result).to include(
363
+ "<v1:first><v1:first_name>Lucy</v1:first_name></v1:first>",
364
+ "<second><firstName>Anna</firstName></second>",
365
+ "<v2:third><v2:firstName>Danie</v2:firstName></v2:third>"
366
+ )
367
+ end
368
+
369
+ it "adds given :namespace to every element in an array" do
370
+ hash = {array: [first: "Lucy", second: "Anna"]}
371
+ result = to_xml hash, element_form_default: :qualified, namespace: :v1
372
+
373
+ expect(result).to include("<v1:array>", "<v1:first>Lucy</v1:first>", "<v1:second>Anna</v1:second>")
374
+ end
375
+ end
376
+
377
+ it "does not remove special keys from the original Hash" do
378
+ hash = {
379
+ persons: {
380
+ first: "Lucy",
381
+ second: "Anna",
382
+ order!: [:second, :first],
383
+ attributes!: {first: {first: true}}
384
+ },
385
+ countries: [:de, :us],
386
+ order!: [:countries, :persons],
387
+ attributes!: {countries: {array: true}}
388
+ }
389
+
390
+ to_xml(hash)
391
+
392
+ expect(hash).to eq({
393
+ persons: {
394
+ first: "Lucy",
395
+ second: "Anna",
396
+ order!: [:second, :first],
397
+ attributes!: {first: {first: true}}
398
+ },
399
+ countries: [:de, :us],
400
+ order!: [:countries, :persons],
401
+ attributes!: {countries: {array: true}}
402
+ })
403
+ end
404
+ end
405
+
406
+ it "doesn't modify original hash parameter by deleting its attribute keys" do
407
+ hash = {person: {name: "Johnny", surname: "Bravo", "@xsi:type": "People"}}
408
+ to_xml(hash)
409
+ expect(hash).to eq({person: {name: "Johnny", surname: "Bravo", "@xsi:type": "People"}})
410
+ end
411
+
412
+ describe ".explicit_attribute?" do
413
+ subject { described_class.explicit_attribute?(key) }
414
+
415
+ context "when key starts with an @" do
416
+ let(:key) { "@" }
417
+
418
+ it { is_expected.to eq(true) }
419
+ end
420
+
421
+ context "when key does not start with an @" do
422
+ let(:key) { "NOT@" }
423
+
424
+ it { is_expected.to eq(false) }
425
+ end
426
+ end
427
+
428
+ def to_xml(hash, options = {})
429
+ Gyoku::Hash.to_xml hash, options
430
+ end
431
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Gyoku::Prettifier do
4
+ describe "#prettify" do
5
+ context "when xml is valid" do
6
+ let!(:xml) { Gyoku::Hash.build_xml(test: {pretty: "xml"}) }
7
+
8
+ it "returns prettified xml" do
9
+ expect(subject.prettify(xml)).to eql("<test>\n <pretty>xml</pretty>\n</test>")
10
+ end
11
+
12
+ context "when indent option is specified" do
13
+ it "returns prettified xml with indent" do
14
+ options = {indent: 3}
15
+ subject = Gyoku::Prettifier.new(options)
16
+ expect(subject.prettify(xml)).to eql("<test>\n <pretty>xml</pretty>\n</test>")
17
+ end
18
+ end
19
+
20
+ context "when compact option is specified" do
21
+ it "returns prettified xml with indent" do
22
+ options = {compact: false}
23
+ subject = Gyoku::Prettifier.new(options)
24
+ expect(subject.prettify(xml)).to eql("<test>\n <pretty>\n xml\n </pretty>\n</test>")
25
+ end
26
+ end
27
+ end
28
+
29
+ context "when xml is not valid" do
30
+ let!(:xml) do
31
+ Gyoku::Array.build_xml(["one", "two"], "test")
32
+ end
33
+
34
+ it "raises an error" do
35
+ expect { subject.prettify(xml) }.to raise_error REXML::ParseException
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,76 @@
1
+ require "spec_helper"
2
+
3
+ describe Gyoku::XMLKey do
4
+ describe ".create" do
5
+ it "removes exclamation marks from the end of a String" do
6
+ expect(create("value!")).to eq("value")
7
+ end
8
+
9
+ it "removes forward slashes from the end of a String" do
10
+ expect(create("self-closing/")).to eq("self-closing")
11
+ end
12
+
13
+ it "does not convert snake_case Strings" do
14
+ expect(create("lower_camel_case")).to eq("lower_camel_case")
15
+ end
16
+
17
+ it "converts snake_case Symbols to lowerCamelCase Strings" do
18
+ expect(create(:lower_camel_case)).to eq("lowerCamelCase")
19
+ expect(create(:lower_camel_case!)).to eq("lowerCamelCase")
20
+ end
21
+
22
+ context "when the converter option is set to camelcase" do
23
+ it "should replace / with ::, and turn snake case into camel case" do
24
+ input = :"hello_world_bob/how_are_you|there:foo^bar"
25
+ expected_output = "HelloWorldBob::HowAreYou|there:foo^bar"
26
+ expect(create(input, {key_converter: :camelcase})).to eq(expected_output)
27
+ end
28
+ end
29
+
30
+ context "with key_converter" do
31
+ it "accepts lambda converters" do
32
+ expect(create(:some_text, {key_converter: lambda { |k| k.reverse }})).to eq("txet_emos")
33
+ end
34
+
35
+ it "convert symbol to the specified type" do
36
+ expect(create(:some_text, {key_converter: :camelcase})).to eq("SomeText")
37
+ expect(create(:some_text, {key_converter: :upcase})).to eq("SOME_TEXT")
38
+ expect(create(:some_text, {key_converter: :none})).to eq("some_text")
39
+ end
40
+
41
+ it "when key_to_convert is defined, convert only this key" do
42
+ options = {key_converter: :camelcase, key_to_convert: "somekey"}
43
+ expect(create(:some_key, options)).to eq("someKey")
44
+
45
+ options = {key_converter: :camelcase, key_to_convert: "some_key"}
46
+ expect(create(:some_key, options)).to eq("SomeKey")
47
+ end
48
+
49
+ it "when except is defined, dont convert this key" do
50
+ options = {key_converter: :camelcase, except: "some_key"}
51
+ expect(create(:some_key, options)).to eq("someKey")
52
+ end
53
+ end
54
+
55
+ context "with :element_form_default set to :qualified and a :namespace" do
56
+ it "adds the given namespace" do
57
+ key = create :qualify, element_form_default: :qualified, namespace: :v1
58
+ expect(key).to eq("v1:qualify")
59
+ end
60
+
61
+ it "does not add the given namespace if the key starts with a colon" do
62
+ key = create ":qualify", element_form_default: :qualified, namespace: :v1
63
+ expect(key).to eq("qualify")
64
+ end
65
+
66
+ it "adds a given :namespace after converting the key" do
67
+ key = create :username, element_form_default: :qualified, namespace: :v1, key_converter: :camelcase
68
+ expect(key).to eq("v1:Username")
69
+ end
70
+ end
71
+ end
72
+
73
+ def create(key, options = {})
74
+ Gyoku::XMLKey.create(key, options)
75
+ end
76
+ end
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+
3
+ describe Gyoku::XMLValue do
4
+ describe ".create" do
5
+ context "for DateTime objects" do
6
+ it "returns an xs:dateTime compliant String" do
7
+ expect(create(DateTime.new(2012, 3, 22, 16, 22, 33))).to eq("2012-03-22T16:22:33+00:00")
8
+ end
9
+ end
10
+
11
+ context "for Date objects" do
12
+ it "returns an xs:date compliant String" do
13
+ expect(create(Date.new(2012, 3, 22))).to eq("2012-03-22")
14
+ end
15
+ end
16
+
17
+ context "for Time objects" do
18
+ it "returns an xs:time compliant String" do
19
+ expect(create(Time.local(2012, 3, 22, 16, 22, 33))).to eq("16:22:33")
20
+ end
21
+ end
22
+
23
+ it "returns the String value and escapes special characters" do
24
+ expect(create("string")).to eq("string")
25
+ expect(create("<tag>")).to eq("&lt;tag&gt;")
26
+ expect(create("at&t")).to eq("at&amp;t")
27
+ expect(create('"quotes"')).to eq("&quot;quotes&quot;")
28
+ end
29
+
30
+ it "returns the String value without escaping special characters" do
31
+ expect(create("<tag>", false)).to eq("<tag>")
32
+ end
33
+
34
+ it "returns an xs:dateTime compliant String for Objects responding to #to_datetime" do
35
+ singleton = Object.new
36
+ def singleton.to_datetime
37
+ DateTime.new 2012, 3, 22, 16, 22, 33
38
+ end
39
+
40
+ expect(create(singleton)).to eq("2012-03-22T16:22:33+00:00")
41
+ end
42
+
43
+ it "calls Proc objects and converts their return value" do
44
+ object = lambda { DateTime.new 2012, 3, 22, 16, 22, 33 }
45
+ expect(create(object)).to eq("2012-03-22T16:22:33+00:00")
46
+ end
47
+
48
+ it "hash objects get converted to xml" do
49
+ object = {document!: {"@version" => "2.0", :content! => {key!: "value", other_key: {"@attribute" => "value", :content! => {key: "value"}}}}}
50
+ expect(create(object)).to eq("<document version=\"2.0\"><key>value</key><otherKey attribute=\"value\"><key>value</key></otherKey></document>")
51
+ end
52
+
53
+ it "calls #to_s unless the Object responds to #to_datetime" do
54
+ expect(create("value")).to eq("value")
55
+ end
56
+ end
57
+
58
+ def create(object, escape_xml = true)
59
+ Gyoku::XMLValue.create object, escape_xml
60
+ end
61
+ end
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+
3
+ describe Gyoku do
4
+ describe ".xml_tag" do
5
+ it "translates Symbols to lowerCamelCase by default" do
6
+ tag = Gyoku.xml_tag(:user_name)
7
+ expect(tag).to eq("userName")
8
+ end
9
+
10
+ it "does not translate Strings" do
11
+ tag = Gyoku.xml_tag("user_name")
12
+ expect(tag).to eq("user_name")
13
+ end
14
+
15
+ it "translates Symbols by a given key_converter" do
16
+ tag = Gyoku.xml_tag(:user_name, key_converter: :upcase)
17
+ expect(tag).to eq("USER_NAME")
18
+ end
19
+
20
+ it "does not translates Strings with a given key_converter" do
21
+ tag = Gyoku.xml_tag("user_name", key_converter: :upcase)
22
+ expect(tag).to eq("user_name")
23
+ end
24
+ end
25
+
26
+ describe ".xml" do
27
+ it "translates a given Hash to XML" do
28
+ hash = {id: 1}
29
+ xml = Gyoku.xml(hash, element_form_default: :qualified)
30
+
31
+ expect(xml).to eq("<id>1</id>")
32
+ end
33
+
34
+ it "accepts a key_converter for the Hash keys" do
35
+ hash = {user_name: "finn", pass_word: "secret"}
36
+ xml = Gyoku.xml(hash, {key_converter: :upcase})
37
+
38
+ expect(xml).to include("<USER_NAME>finn</USER_NAME>")
39
+ expect(xml).to include("<PASS_WORD>secret</PASS_WORD>")
40
+ end
41
+
42
+ it "don't converts Strings keys" do
43
+ hash = {:user_name => "finn", "pass_word" => "secret"}
44
+ xml = Gyoku.xml(hash, {key_converter: :upcase})
45
+
46
+ expect(xml).to include("<USER_NAME>finn</USER_NAME>")
47
+ expect(xml).to include("<pass_word>secret</pass_word>")
48
+ end
49
+
50
+ it "when defined key_to_convert only convert this key" do
51
+ hash = {user_name: "finn", pass_word: "secret"}
52
+ options = {key_converter: :upcase, key_to_convert: "user_name"}
53
+ xml = Gyoku.xml(hash, options)
54
+
55
+ expect(xml).to include("<USER_NAME>finn</USER_NAME>")
56
+ expect(xml).to include("<passWord>secret</passWord>")
57
+ end
58
+
59
+ it "accepts key_converter for nested hash" do
60
+ hash = {user: {user_name: "finn", pass_word: "secret"}}
61
+ xml = Gyoku.xml(hash, {key_converter: :upcase})
62
+
63
+ expect(xml).to include("<USER><USER_NAME>finn</USER_NAME>")
64
+ expect(xml).to include("<PASS_WORD>secret</PASS_WORD></USER>")
65
+ end
66
+
67
+ it "does not modify the original Hash" do
68
+ hash = {
69
+ person: {
70
+ first_name: "Lucy",
71
+ last_name: "Sky",
72
+ order!: [:first_name, :last_name]
73
+ },
74
+ attributes!: {person: {id: "666"}}
75
+ }
76
+ original_hash = hash.dup
77
+
78
+ Gyoku.xml(hash)
79
+ expect(original_hash).to eq(hash)
80
+ end
81
+ end
82
+ end