1 package testing
2
3 import (
4 "strings"
5 "testing"
6 )
7
8 func TestAssertJSON(t *testing.T) {
9 cases := map[string]struct {
10 X, Y []byte
11 Equal bool
12 }{
13 "equal": {
14 X: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"},"bar":{"NoRecurse":"bar"}}}}`),
15 Y: []byte(`{"RecursiveStruct":{"RecursiveMap":{"bar":{"NoRecurse":"bar"},"foo":{"NoRecurse":"foo"}}}}`),
16 Equal: true,
17 },
18 "not equal": {
19 X: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"},"bar":{"NoRecurse":"bar"}}}}`),
20 Y: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"}}}}`),
21 Equal: false,
22 },
23 }
24
25 for name, c := range cases {
26 t.Run(name, func(t *testing.T) {
27 err := JSONEqual(c.X, c.Y)
28 if c.Equal {
29 if err != nil {
30 t.Fatalf("expect JSON to be equal, %v", err)
31 }
32 } else if err == nil {
33 t.Fatalf("expect JSON to be equal, %v", err)
34 }
35 })
36 }
37 }
38
39 func TestAssertURLFormEqual(t *testing.T) {
40 cases := map[string]struct {
41 X, Y []byte
42 Equal bool
43 }{
44 "equal": {
45 X: []byte(`Action=QueryMaps&Version=2020-01-08&MapArg.entry.1.key=foo&MapArg.entry.1.value=Foo&MapArg.entry.2.key=bar&MapArg.entry.2.value=Bar`),
46 Y: []byte(`Action=QueryMaps&Version=2020-01-08&MapArg.entry.2.key=bar&MapArg.entry.2.value=Bar&MapArg.entry.1.key=foo&MapArg.entry.1.value=Foo`),
47 Equal: true,
48 },
49 "strips insignificant whitespace": {
50 X: []byte(`Foo=Bar &Baz=Bar
51 &Bin=Foo`),
52 Y: []byte(`Foo=Bar&Baz=Bar&Bin=Foo`),
53 Equal: true,
54 },
55 "preserves significant whitespace": {
56 X: []byte(`Foo=Bar+&Baz=Bar%20&Bin=Foo%0A`),
57 Y: []byte(`Foo=Bar%20&Baz=Bar+&Bin=Foo%0A`),
58 Equal: true,
59 },
60 "missing significant whitespace not equal": {
61 X: []byte(`Foo=Bar+&Baz=Bar%20&Bin=Foo%0A%09%09%09%09&Spam=Eggs`),
62 Y: []byte(`Foo=Bar &Baz=Bar &Bin=Foo
63 &Spam=Eggs`),
64 Equal: false,
65 },
66 "not equal": {
67 X: []byte(`Action=QueryMaps&Version=2020-01-08&MapArg.entry.1.key=foo&MapArg.entry.1.value=Foo&MapArg.entry.2.key=bar&MapArg.entry.2.value=Bar`),
68 Y: []byte(`Action=QueryMaps&Version=2020-01-08&MapArg.entry.1.key=foo&MapArg.entry.1.value=Foo`),
69 Equal: false,
70 },
71 }
72
73 for name, c := range cases {
74 t.Run(name, func(t *testing.T) {
75 err := URLFormEqual(c.X, c.Y)
76 if c.Equal {
77 if err != nil {
78 t.Fatalf("expect form to be equal, %v", err)
79 }
80 } else if err == nil {
81 t.Fatalf("expect form to be equal, %v", err)
82 }
83 })
84 }
85 }
86
87 func TestEqualXMLUtil(t *testing.T) {
88 cases := map[string]struct {
89 expectedXML string
90 actualXML string
91 expectErr string
92 }{
93 "empty": {
94 expectedXML: ``,
95 actualXML: ``,
96 },
97 "emptyWithDiff": {
98 expectedXML: ``,
99 actualXML: `<Root></Root>`,
100 expectErr: "XML mismatch",
101 },
102 "simpleXML": {
103 expectedXML: `<Root></Root>`,
104 actualXML: `<Root></Root>`,
105 },
106 "simpleXMLWithDiff": {
107 expectedXML: `<Root></Root>`,
108 actualXML: `<Root>abc</Root>`,
109 expectErr: "XML mismatch",
110 },
111 "nestedXML": {
112 expectedXML: `<Root><abc>123</abc><cde>xyz</cde></Root>`,
113 actualXML: `<Root><abc>123</abc><cde>xyz</cde></Root>`,
114 },
115 "nestedXMLWithExpectedDiff": {
116 expectedXML: `<Root><abc>123</abc><cde>xyz</cde><pqr>234</pqr></Root>`,
117 actualXML: `<Root><abc>123</abc><cde>xyz</cde></Root>`,
118 expectErr: "XML mismatch",
119 },
120 "nestedXMLWithActualDiff": {
121 expectedXML: `<Root><abc>123</abc><cde>xyz</cde></Root>`,
122 actualXML: `<Root><abc>123</abc><cde>xyz</cde><pqr>234</pqr></Root>`,
123 expectErr: "XML mismatch",
124 },
125 "Array": {
126 expectedXML: `<Root><list><member><nested>xyz</nested></member><member><nested>abc</nested></member></list></Root>`,
127 actualXML: `<Root><list><member><nested>xyz</nested></member><member><nested>abc</nested></member></list></Root>`,
128 },
129 "ArrayWithSecondDiff": {
130 expectedXML: `<Root><list><member><nested>xyz</nested></member><member><nested>123</nested></member></list></Root>`,
131 actualXML: `<Root><list><member><nested>xyz</nested></member><member><nested>345</nested></member></list></Root>`,
132 expectErr: "XML mismatch",
133 },
134 "ArrayWithFirstDiff": {
135 expectedXML: `<Root><list><member><nested>abc</nested></member><member><nested>345</nested></member></list></Root>`,
136 actualXML: `<Root><list><member><nested>xyz</nested></member><member><nested>345</nested></member></list></Root>`,
137 expectErr: "XML mismatch",
138 },
139 "ArrayWithMixedDiff": {
140 expectedXML: `<Root><list><member><nested>345</nested></member><member><nested>xyz</nested></member></list></Root>`,
141 actualXML: `<Root><list><member><nested>xyz</nested></member><member><nested>345</nested></member></list></Root>`,
142 },
143 "ArrayWithRepetitiveMembers": {
144 expectedXML: `<Root><list><member><nested>xyz</nested></member><member><nested>xyz</nested></member></list></Root>`,
145 actualXML: `<Root><list><member><nested>xyz</nested></member><member><nested>xyz</nested></member></list></Root>`,
146 },
147 "Map": {
148 expectedXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
149 actualXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
150 },
151 "MapWithFirstDiff": {
152 expectedXML: `<Root><map><entry><key>bcf</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
153 actualXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
154 expectErr: "XML mismatch",
155 },
156 "MapWithSecondDiff": {
157 expectedXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>abc</value></entry></map></Root>`,
158 actualXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
159 expectErr: "XML mismatch",
160 },
161 "MapWithMixedDiff": {
162 expectedXML: `<Root><map><entry><key>cde</key><value>356</value></entry><entry><key>abc</key><value>123</value></entry></map></Root>`,
163 actualXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
164 },
165 "MismatchCheckforKeyValue": {
166 expectedXML: `<Root><map><entry><key>cde</key><value>abc</value></entry><entry><key>abc</key><value>356</value></entry></map></Root>`,
167 actualXML: `<Root><map><entry><key>abc</key><value>123</value></entry><entry><key>cde</key><value>356</value></entry></map></Root>`,
168 expectErr: "XML mismatch",
169 },
170 "MixMapAndListNestedXML": {
171 expectedXML: `<Root><list>mem1</list><list>mem2</list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
172 actualXML: `<Root><list>mem1</list><list>mem2</list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
173 },
174 "MixMapAndListNestedXMLWithDiff": {
175 expectedXML: `<Root><list>mem1</list><list>mem2</list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
176 actualXML: `<Root><list>mem1</list><list>mem2</list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><beta><x>gamma</x></beta></nested></v></map></Root>`,
177 expectErr: "XML mismatch",
178 },
179 "xmlWithNamespaceAndAttr": {
180 expectedXML: `<Root xmlns:ab="https://example.com" attr="apple">value</Root>`,
181 actualXML: `<Root xmlns:ab="https://example.com" attr="apple">value</Root>`,
182 },
183 "xmlUnorderedAttributes": {
184 expectedXML: `<Root atr="banana" attrNew="apple">v</Root>`,
185 actualXML: `<Root attrNew="apple" atr="banana">v</Root>`,
186 },
187 "xmlAttributesWithDiff": {
188 expectedXML: `<Root atr="someAtr" attrNew="apple">v</Root>`,
189 actualXML: `<Root attrNew="apple" atr="banana">v</Root>`,
190 expectErr: "XML mismatch",
191 },
192 "xmlUnorderedNamespaces": {
193 expectedXML: `<Root xmlns:ab="https://example.com" xmlns:baz="https://example2.com">v</Root>`,
194 actualXML: `<Root xmlns:baz="https://example2.com" xmlns:ab="https://example.com">v</Root>`,
195 },
196 "xmlNamespaceWithDiff": {
197 expectedXML: `<Root xmlns:ab="https://example-diff.com" xmlns:baz="https://example2.com">v</Root>`,
198 actualXML: `<Root xmlns:baz="https://example2.com" xmlns:ab="https://example.com">v</Root>`,
199 expectErr: "XML mismatch",
200 },
201 "NestedWithNamespaceAndAttributes": {
202 expectedXML: `<Root xmlns:ab="https://example.com" xmlns:un="https://example2.com" attr="test" attr2="test2"><ab:list>mem1</ab:list><ab:list>mem2</ab:list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
203 actualXML: `<Root xmlns:ab="https://example.com" xmlns:un="https://example2.com" attr="test" attr2="test2"><ab:list>mem1</ab:list><ab:list>mem2</ab:list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
204 },
205 "NestedWithNamespaceAndAttributesWithDiff": {
206 expectedXML: `<Root xmlns:ab="https://example.com" xmlns:un="https://example2.com" attr="test" attr2="test2"><list>mem2</list><ab:list>mem2</ab:list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
207 actualXML: `<Root xmlns:ab="https://example.com" xmlns:un="https://example2.com" attr="test" attr2="test2"><list>mem1</list><ab:list>mem2</ab:list><map><k>abc</k><v><nested><enorm>abc</enorm></nested></v><k>xyz</k><v><nested><alpha><x>gamma</x></alpha></nested></v></map></Root>`,
208 expectErr: "XML mismatch",
209 },
210 "MalformedXML": {
211 expectedXML: `<Root><fmap><key>a</key><key2>a2</key2><value>v</value></fmap><fmap><key>b</key><key2>b2</key2><value>w</value></fmap></Root>`,
212 actualXML: `<Root><fmap><key>a</key><key2>a2</key2><value>v</value></fmap><fmap><key>b</key><key2>b2</key2><value>w</value></fmap></Root>`,
213 expectErr: "malformed xml",
214 },
215 }
216
217 for name, c := range cases {
218 t.Run(name, func(t *testing.T) {
219 actual := []byte(c.actualXML)
220 expected := []byte(c.expectedXML)
221
222 err := XMLEqual(actual, expected)
223 if err != nil {
224 if len(c.expectErr) == 0 {
225 t.Fatalf("expected no error while parsing xml, got %v", err)
226 } else if !strings.Contains(err.Error(), c.expectErr) {
227 t.Fatalf("expected expected XML err to contain %s, got %s", c.expectErr, err.Error())
228 }
229 } else if len(c.expectErr) != 0 {
230 t.Fatalf("expected error %s, got none", c.expectErr)
231 }
232 })
233 }
234 }
235
View as plain text