burlap 1.0.0

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +38 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +21 -0
  8. data/README.md +16 -0
  9. data/Rakefile +31 -0
  10. data/burlap.gemspec +32 -0
  11. data/lib/active_support/ordered_hash.rb +179 -0
  12. data/lib/burlap/array.rb +18 -0
  13. data/lib/burlap/base_tag.rb +105 -0
  14. data/lib/burlap/call.rb +38 -0
  15. data/lib/burlap/core_ext/array.rb +7 -0
  16. data/lib/burlap/core_ext/boolean.rb +11 -0
  17. data/lib/burlap/core_ext/float.rb +5 -0
  18. data/lib/burlap/core_ext/hash.rb +5 -0
  19. data/lib/burlap/core_ext/integer.rb +10 -0
  20. data/lib/burlap/core_ext/nil.rb +5 -0
  21. data/lib/burlap/core_ext/object.rb +13 -0
  22. data/lib/burlap/core_ext/string.rb +5 -0
  23. data/lib/burlap/core_ext/symbol.rb +6 -0
  24. data/lib/burlap/core_ext/time.rb +5 -0
  25. data/lib/burlap/core_ext.rb +10 -0
  26. data/lib/burlap/default_resolver.rb +100 -0
  27. data/lib/burlap/error.rb +3 -0
  28. data/lib/burlap/fault.rb +6 -0
  29. data/lib/burlap/hash.rb +72 -0
  30. data/lib/burlap/listener.rb +34 -0
  31. data/lib/burlap/node.rb +48 -0
  32. data/lib/burlap/version.rb +3 -0
  33. data/lib/burlap.rb +47 -0
  34. data/lib/core_ext/time_burlap_iso8601.rb +32 -0
  35. data/spec/burlap/array_spec.rb +28 -0
  36. data/spec/burlap/call_spec.rb +126 -0
  37. data/spec/burlap/core_ext/array_spec.rb +123 -0
  38. data/spec/burlap/core_ext/class_spec.rb +24 -0
  39. data/spec/burlap/core_ext/false_class_spec.rb +17 -0
  40. data/spec/burlap/core_ext/float_spec.rb +15 -0
  41. data/spec/burlap/core_ext/hash_spec.rb +15 -0
  42. data/spec/burlap/core_ext/integer_spec.rb +28 -0
  43. data/spec/burlap/core_ext/nil_class_spec.rb +15 -0
  44. data/spec/burlap/core_ext/object_spec.rb +62 -0
  45. data/spec/burlap/core_ext/string_spec.rb +27 -0
  46. data/spec/burlap/core_ext/symbol_spec.rb +15 -0
  47. data/spec/burlap/core_ext/time_spec.rb +23 -0
  48. data/spec/burlap/core_ext/true_class_spec.rb +17 -0
  49. data/spec/burlap/default_resolver_spec.rb +140 -0
  50. data/spec/burlap/error_spec.rb +7 -0
  51. data/spec/burlap/hash_spec.rb +234 -0
  52. data/spec/burlap/listener_spec.rb +31 -0
  53. data/spec/burlap/node_spec.rb +39 -0
  54. data/spec/burlap_spec.rb +55 -0
  55. data/spec/data/no_such_method.burlap +1 -0
  56. data/spec/data/record_not_found.burlap +1 -0
  57. data/spec/spec_helper.rb +13 -0
  58. metadata +224 -0
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Hash do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { { some: "hash" }.to_burlap }
6
+
7
+ it "returns a string" do
8
+ expect(burlap).to be_a_kind_of(String)
9
+ end
10
+
11
+ it "is correct" do
12
+ expect(burlap).to eq("<map><type></type><string>some</string><string>hash</string></map>")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Integer do
4
+ describe "#to_burlap" do
5
+ # https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
6
+ # maximum value an int can have, 2**31-1.
7
+ # minimum value an int can have, -2**31.
8
+ context "when within 32bit signed limits" do
9
+ it "encodes the Integer as 'int'" do
10
+ expect(5.to_burlap).to eq("<int>5</int>")
11
+ expect(-5.to_burlap).to eq("<int>-5</int>")
12
+
13
+ expect(2_147_483_647.to_burlap).to eq("<int>2147483647</int>")
14
+ expect(-2_147_483_648.to_burlap).to eq("<int>-2147483648</int>")
15
+ end
16
+ end
17
+
18
+ context "when outside 32bit signed limits" do
19
+ it "encodes the Integer as 'java.math.BigDecimal'" do
20
+ expect(2_147_483_648.to_burlap).to eq("<map><type>java.math.BigDecimal</type><string>value</string><string>2147483648</string></map>")
21
+ expect(-2_147_483_649.to_burlap).to eq("<map><type>java.math.BigDecimal</type><string>value</string><string>-2147483649</string></map>")
22
+
23
+ expect(999_999_999_999_999_999.to_burlap).to eq("<map><type>java.math.BigDecimal</type><string>value</string><string>999999999999999999</string></map>")
24
+ expect(-999_999_999_999_999_999.to_burlap).to eq("<map><type>java.math.BigDecimal</type><string>value</string><string>-999999999999999999</string></map>")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe NilClass do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { nil.to_burlap }
6
+
7
+ it "returns a string" do
8
+ expect(burlap).to be_a_kind_of(String)
9
+ end
10
+
11
+ it "is correct" do
12
+ expect(burlap).to eq("<null></null>")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,62 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Object do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { described_class.new.to_burlap }
6
+
7
+ it "returns a string" do
8
+ expect(burlap).to be_a_kind_of(String)
9
+ end
10
+
11
+ it "invokes Burlap::Hash with type of classname" do
12
+ hash = instance_double(Burlap::Hash)
13
+ expect(Burlap::Hash).to receive(:[]).with([], "Object").and_return(hash)
14
+ expect(hash).to receive(:to_burlap).and_return("<my>xml</my>")
15
+
16
+ expect(burlap).to eq("<my>xml</my>")
17
+ end
18
+
19
+ context "with instance variables" do
20
+ subject(:burlap) { InstanceVariablesObject.new.to_burlap }
21
+
22
+ let(:klass) do
23
+ Class.new do
24
+ def initialize
25
+ @one = 1
26
+ @two = "something here"
27
+ @three = :bingo
28
+ end
29
+ end
30
+ end
31
+
32
+ before do
33
+ stub_const("InstanceVariablesObject", klass)
34
+ @doc = Nokogiri::XML(@result)
35
+ end
36
+
37
+ it "returns a string" do
38
+ expect(burlap).to be_a_kind_of(String)
39
+ end
40
+
41
+ it "decompiles into burlap" do
42
+ xml_string = <<-XML
43
+ <map>
44
+ <type>InstanceVariablesObject</type>
45
+
46
+ <string>one</string>
47
+ <int>1</int>
48
+
49
+ <string>three</string>
50
+ <string>bingo</string>
51
+
52
+ <string>two</string>
53
+ <string>something here</string>
54
+ </map>
55
+ XML
56
+
57
+ format_xml_as_burlap(xml_string)
58
+ expect(burlap).to eq(xml_string)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe String do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { input_string.to_burlap }
6
+
7
+ context "with normal string" do
8
+ let(:input_string) { "some string" }
9
+
10
+ it "returns a string" do
11
+ expect(burlap).to be_a_kind_of(described_class)
12
+ end
13
+
14
+ it "is correct" do
15
+ expect(burlap).to eq("<string>some string</string>")
16
+ end
17
+ end
18
+
19
+ context "with html unsafe content" do
20
+ let(:input_string) { "<script type='text/js'>hello</script>" }
21
+
22
+ it "returns escaped html" do
23
+ expect(burlap).to match(%r{&lt;script type='text/js'&gt;hello&lt;/script&gt;})
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Symbol do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { :some_value.to_burlap }
6
+
7
+ it "returns a string" do
8
+ expect(burlap).to be_a_kind_of(String)
9
+ end
10
+
11
+ it "is correct" do
12
+ expect(burlap).to eq("<string>some_value</string>")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Time do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { described_class.utc(2011, 9, 11, 10, 0).to_burlap }
6
+
7
+ it "returns a string" do
8
+ expect(burlap).to be_a_kind_of(String)
9
+ end
10
+
11
+ it "is correct" do
12
+ expect(burlap).to eq("<date>20110911T100000.000Z</date>")
13
+ end
14
+
15
+ it "does not contain dashes" do
16
+ expect(burlap).not_to include("-")
17
+ end
18
+
19
+ it "does not contain colons" do
20
+ expect(burlap).not_to include(":")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TrueClass do
4
+ describe "#to_burlap" do
5
+ before do
6
+ @result = true.to_burlap
7
+ end
8
+
9
+ it "returns a string" do
10
+ expect(@result).to be_a_kind_of(String)
11
+ end
12
+
13
+ it "is correct" do
14
+ expect(@result).to eq("<boolean>1</boolean>")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,140 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Burlap::DefaultResolver do
4
+ subject(:resolver) { described_class.new }
5
+
6
+ describe "#mappings" do
7
+ it "defaults to a hash" do
8
+ expect(resolver.mappings).to eq({})
9
+ end
10
+
11
+ context "when passed a name and block" do
12
+ it "stores a single mapping" do
13
+ expect(resolver.mappings["first"]).to be_nil
14
+
15
+ resolver.mappings("first") do
16
+ "result of call"
17
+ end
18
+
19
+ result = resolver.mappings["first"]
20
+
21
+ expect(result).not_to be_nil
22
+ expect(result).to be_a_kind_of(Proc)
23
+ expect(result.call).to eq("result of call")
24
+ end
25
+ end
26
+
27
+ context "when passed more than one name at once" do
28
+ it "stores the same block against multiple mappings" do
29
+ resolver.mappings("first", "second") do
30
+ "result of call"
31
+ end
32
+
33
+ result = resolver.mappings["first"]
34
+ expect(result).not_to be_nil
35
+ expect(result).to respond_to(:call)
36
+ expect(result.call).to eq("result of call")
37
+
38
+ result = resolver.mappings["second"]
39
+ expect(result).not_to be_nil
40
+ expect(result).to respond_to(:call)
41
+ expect(result.call).to eq("result of call")
42
+ end
43
+ end
44
+ end
45
+
46
+ describe ".convert_to_native" do
47
+ subject(:resolver) { Burlap.resolver }
48
+
49
+ context "when input is 'int'" do
50
+ let(:burlap_tag) { Burlap::BaseTag.new(name: "int", value: "15") }
51
+
52
+ it "is parsed into ruby" do
53
+ expect(resolver.convert_to_native(burlap_tag)).to eq(15)
54
+ end
55
+ end
56
+
57
+ context "when input is 'double" do
58
+ let(:burlap_tag) { Burlap::BaseTag.new(name: "double", value: "1.5") }
59
+
60
+ it "is parsed into ruby" do
61
+ expect(resolver.convert_to_native(burlap_tag)).to eq(1.5)
62
+ end
63
+ end
64
+
65
+ context "when input is 'string" do
66
+ let(:burlap_tag) { Burlap::BaseTag.new(name: "string", value: "some string value") }
67
+
68
+ it "is parsed into ruby" do
69
+ expect(resolver.convert_to_native(burlap_tag)).to eq("some string value")
70
+ end
71
+ end
72
+
73
+ context "when input is 'null" do
74
+ let(:burlap_tag) { Burlap::BaseTag.new(name: "null", value: "") }
75
+
76
+ it "is parsed into ruby" do
77
+ expect(resolver.convert_to_native(burlap_tag)).to eq(nil)
78
+ end
79
+ end
80
+
81
+ context "when input is 'with 'boolean'" do
82
+ let(:burlap_tag) { Burlap::BaseTag.new(name: "boolean", value: value) }
83
+
84
+ context "with true (1)" do
85
+ let(:value) { "1" }
86
+
87
+ it "parses true" do
88
+ expect(resolver.convert_to_native(burlap_tag)).to be(true)
89
+ end
90
+ end
91
+
92
+ context "with false (0)" do
93
+ let(:value) { "0" }
94
+
95
+ it "parses false" do
96
+ expect(resolver.convert_to_native(burlap_tag)).to be(false)
97
+ end
98
+ end
99
+ end
100
+
101
+ describe ".parse" do
102
+ subject(:parsed_burlap) { Burlap.parse(burlap) }
103
+
104
+ context "with empty array" do
105
+ let(:burlap) { "<list><type>[java.lang.Integer</type><length>0</length></list>" }
106
+
107
+ it "parses an empty array" do
108
+ expect(parsed_burlap).to eq([])
109
+ end
110
+ end
111
+
112
+ context "when single element" do
113
+ let(:burlap) { "<list><type>[string</type><length>1</length><string>1</string></list>" }
114
+
115
+ it "parses an array" do
116
+ expect(parsed_burlap).to eq(["1"])
117
+ end
118
+ end
119
+
120
+ context "when multiple elements" do
121
+ let(:burlap) { %{<list><type></type><length>3</length><int>0</int><double>1.3</double><string>foobar</string></list>} }
122
+
123
+ it "parses an array" do
124
+ expect(parsed_burlap).to eq([0, 1.3, "foobar"])
125
+ end
126
+ end
127
+
128
+ context "with 'base64' encoded" do
129
+ let(:burlap) { "<base64>#{encoded}</base64>" }
130
+ let(:decoded) { "some string of some text" }
131
+ let(:encoded) { Base64.encode64(decoded) }
132
+
133
+ it "parses and return as a string" do
134
+ expect(parsed_burlap).to be_a_kind_of(String)
135
+ expect(parsed_burlap).to eq(decoded)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Burlap::Error do
4
+ it "inherits from standard error" do
5
+ expect(described_class.ancestors).to include(StandardError)
6
+ end
7
+ end
@@ -0,0 +1,234 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Burlap::Hash do
4
+ it "inherits from ordered hash" do
5
+ expect(described_class.ancestors).to include(ActiveSupport::OrderedHash)
6
+ end
7
+
8
+ it { is_expected.to respond_to(:__type__) }
9
+ it { is_expected.to respond_to(:__type__=) }
10
+
11
+ describe "#__type__" do
12
+ it "defaults to an empty string" do
13
+ expect(described_class.new.__type__).to eq("")
14
+ end
15
+ end
16
+
17
+ describe "#[]" do
18
+ subject(:burlap_hash) { described_class[input] }
19
+
20
+ context "when input is a Hash" do
21
+ let(:input) { {} }
22
+
23
+ it "is compatible with Hash#[]" do
24
+ expect(burlap_hash.keys).to eq([])
25
+ expect(burlap_hash.values).to eq([])
26
+ end
27
+
28
+ it "is empty string" do
29
+ expect(burlap_hash.__type__).to eq("")
30
+ end
31
+ end
32
+
33
+ context "when one argument is given" do
34
+ let(:input) { { "one" => "two", "three" => "four" } }
35
+
36
+ it "is compatible with Hash#[]" do
37
+ expect(burlap_hash.keys).to eq(%w[one three])
38
+ expect(burlap_hash.values).to eq(%w[two four])
39
+ end
40
+
41
+ it "is empty string" do
42
+ expect(burlap_hash.__type__).to eq("")
43
+ end
44
+ end
45
+
46
+ context "when a __type__ is passed" do
47
+ let(:input) { { some: "options", __type__: "is ignored" } }
48
+
49
+ it "is compatible with Hash#[]" do
50
+ expect(burlap_hash.keys).to eq(%i[some __type__])
51
+ expect(burlap_hash.values).to eq(["options", "is ignored"])
52
+ end
53
+
54
+ it "is empty string" do
55
+ expect(burlap_hash.__type__).to eq("")
56
+ end
57
+ end
58
+
59
+ context "when a second argument sets type directly" do
60
+ subject(:burlap_hash) { described_class[input, "com.java.hashmap"] }
61
+
62
+ context "without a passed __type__" do
63
+ let(:input) { { some: "options" } }
64
+
65
+ it "is compatible with Hash#[]" do
66
+ expect(burlap_hash.keys).to eq([:some])
67
+ expect(burlap_hash.values).to eq(["options"])
68
+ end
69
+
70
+ it "sets __type__ directly" do
71
+ expect(burlap_hash.__type__).to eq("com.java.hashmap")
72
+ end
73
+ end
74
+
75
+ context "with a passed __type__" do
76
+ let(:input) { { some: "options", __type__: "is ignored" } }
77
+
78
+ it "is compatible with Hash#[]" do
79
+ expect(burlap_hash.keys).to eq(%i[some __type__])
80
+ expect(burlap_hash.values).to eq(["options", "is ignored"])
81
+ end
82
+
83
+ it "sets __type__ directly" do
84
+ expect(burlap_hash.__type__).to eq("com.java.hashmap")
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ describe "#inspect" do
91
+ subject(:burlap_hash) { described_class[[%w[one two], [:three, 4]], "Fred"] }
92
+
93
+ it "does not contain OrderedHash" do
94
+ expect(burlap_hash.inspect).not_to include("OrderedHash")
95
+ end
96
+
97
+ it "starts with Burlap::Hash" do
98
+ expect(burlap_hash.inspect).to match(/#<Burlap::Hash/)
99
+ end
100
+
101
+ it "contains the hash, inspected" do
102
+ expect(burlap_hash.inspect).to include(%({"one"=>"two", :three=>4}))
103
+ end
104
+
105
+ it "contains the type, inspected" do
106
+ expect(burlap_hash.inspect).to include(%{__type__="Fred"})
107
+ end
108
+ end
109
+
110
+ describe "#to_burlap" do
111
+ subject(:burlap) { burlap_hash.to_burlap }
112
+
113
+ let(:burlap_hash) { described_class[{ value: "something" }, "org.ruby-lang.string"] }
114
+
115
+ context "wrapping a string" do
116
+ # <map>
117
+ # <type>org.ruby-lang.string</type>
118
+ # <string>value</string>
119
+ # <string>something</string>
120
+ # </map>
121
+
122
+ it "returns a string" do
123
+ expect(burlap).to be_a_kind_of(String)
124
+ end
125
+
126
+ it "has a map root" do
127
+ expect(burlap).to match(/^<map>/)
128
+ expect(burlap).to match(%r{</map>$})
129
+ end
130
+
131
+ it "has a nested type node" do
132
+ expect(burlap).to match(%r{<type>org.ruby-lang.string</type>})
133
+ end
134
+
135
+ it "has nested value nodes" do
136
+ expect(burlap).to match(%r{<string>value</string>})
137
+ expect(burlap).to match(%r{<string>something</string>})
138
+ end
139
+ end
140
+
141
+ context "wrapping multiple keys" do
142
+ let(:burlap_hash) { described_class[[["name", "caius durling"], ["age", 101]], "burlap.user"] }
143
+
144
+ before do
145
+ @doc = Nokogiri::XML(burlap)
146
+ end
147
+
148
+ it "returns a string" do
149
+ expect(burlap).to be_a_kind_of(String)
150
+ end
151
+
152
+ it "is correct" do
153
+ xml_string = <<-XML
154
+ <map>
155
+ <type>burlap.user</type>
156
+ <string>name</string>
157
+ <string>caius durling</string>
158
+ <string>age</string>
159
+ <int>101</int>
160
+ </map>
161
+ XML
162
+
163
+ format_xml_as_burlap(xml_string)
164
+ expect(burlap).to eq(xml_string)
165
+ end
166
+
167
+ it "has a type element" do
168
+ expect(burlap).to match(%r{<type>burlap.user</type>})
169
+ end
170
+
171
+ it "has a name keypair" do
172
+ expect(burlap).to match(%r{<string>name</string><string>caius durling</string>})
173
+ end
174
+
175
+ it "has an age keypair" do
176
+ expect(burlap).to match(%r{<string>age</string><int>101</int>})
177
+ end
178
+ end
179
+
180
+ context "wrapping nested keys" do
181
+ let(:burlap_hash) { described_class[[["people", { "name" => "caius durling", "age" => 101 }]], "burlap-peoples"] }
182
+
183
+ it "returns a string" do
184
+ expect(burlap).to be_a_kind_of(String)
185
+ end
186
+
187
+ it "is generated properly, including nested elements" do
188
+ xml_string = <<-XML
189
+ <map>
190
+ <type>burlap-peoples</type>
191
+
192
+ <string>people</string>
193
+ <map>
194
+ <type></type>
195
+
196
+ <string>name</string>
197
+ <string>caius durling</string>
198
+
199
+ <string>age</string>
200
+ <int>101</int>
201
+ </map>
202
+
203
+ </map>
204
+ XML
205
+ xml_string.gsub!(/(^|\n)\s*/m, "")
206
+ expect(burlap).to eq(xml_string)
207
+ end
208
+ end
209
+
210
+ context "wrapping empty arrays" do
211
+ let(:burlap_hash) { described_class[{ numbers: [] }] }
212
+
213
+ it "returns a string" do
214
+ expect(burlap).to be_a_kind_of(String)
215
+ end
216
+
217
+ it "is generated properly" do
218
+ xml_string = <<-XML
219
+ <map>
220
+ <type></type>
221
+
222
+ <string>numbers</string>
223
+ <list>
224
+ <type></type>
225
+ <length>0</length>
226
+ </list>
227
+ </map>
228
+ XML
229
+ xml_string.gsub!(/(^|\n)\s*/m, "")
230
+ expect(burlap).to eq(xml_string)
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Burlap::Listener do
4
+ describe ".parse" do
5
+ subject(:result) { Burlap.parse(reply) }
6
+
7
+ context "when response is no such method" do
8
+ let(:reply) { File.read("spec/data/no_such_method.burlap") }
9
+
10
+ before { raise if reply.nil? }
11
+
12
+ it "parses successfully" do
13
+ expect(result).to be_a_kind_of(OpenStruct)
14
+ expect(result.code).to eq("NoSuchMethodException")
15
+ expect(result.message).to eq("The service has no method named: getUserID")
16
+ end
17
+ end
18
+
19
+ describe "when response is record not found" do
20
+ let(:reply) { File.read("spec/data/record_not_found.burlap") }
21
+
22
+ before { raise if reply.nil? }
23
+
24
+ it "parses successfully" do
25
+ expect(result).to be_a_kind_of(Burlap::Fault)
26
+ expect(result.code).to eq("ServiceException")
27
+ expect(result.message).to eq("No row with the given identifier exists: [com.sapienter.jbilling.server.user.db.UserDTO#21]")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Burlap::Node do
4
+ describe "#to_burlap" do
5
+ subject(:burlap) { described_class.new(name: "name", value: value).to_burlap }
6
+
7
+ context "with a string" do
8
+ let(:value) { "updateUser" }
9
+
10
+ it "returns a string" do
11
+ expect(burlap).to be_a_kind_of(String)
12
+ end
13
+
14
+ it "puts name in brackets" do
15
+ expect(burlap).to eq("<name>updateUser</name>")
16
+ end
17
+ end
18
+
19
+ context "with UTF8 characters" do
20
+ let(:value) { "Håva" }
21
+
22
+ it "uses decimal escaping for utf8 characters" do
23
+ expect(burlap).to eq(%{<name>H&#229;va</name>})
24
+ end
25
+ end
26
+
27
+ context "with nested XML" do
28
+ let(:value) { "<length>1</length>" }
29
+
30
+ it "returns a string" do
31
+ expect(burlap).to be_a_kind_of(String)
32
+ end
33
+
34
+ it "does not escape the value containing XML" do
35
+ expect(burlap).to eq("<name><length>1</length></name>")
36
+ end
37
+ end
38
+ end
39
+ end