package testing
import (
"strings"
"testing"
)
func TestAssertJSON(t *testing.T) {
cases := map[string]struct {
X, Y []byte
Equal bool
}{
"equal": {
X: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"},"bar":{"NoRecurse":"bar"}}}}`),
Y: []byte(`{"RecursiveStruct":{"RecursiveMap":{"bar":{"NoRecurse":"bar"},"foo":{"NoRecurse":"foo"}}}}`),
Equal: true,
},
"not equal": {
X: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"},"bar":{"NoRecurse":"bar"}}}}`),
Y: []byte(`{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"}}}}`),
Equal: false,
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
err := JSONEqual(c.X, c.Y)
if c.Equal {
if err != nil {
t.Fatalf("expect JSON to be equal, %v", err)
}
} else if err == nil {
t.Fatalf("expect JSON to be equal, %v", err)
}
})
}
}
func TestAssertURLFormEqual(t *testing.T) {
cases := map[string]struct {
X, Y []byte
Equal bool
}{
"equal": {
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`),
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`),
Equal: true,
},
"strips insignificant whitespace": {
X: []byte(`Foo=Bar &Baz=Bar
&Bin=Foo`),
Y: []byte(`Foo=Bar&Baz=Bar&Bin=Foo`),
Equal: true,
},
"preserves significant whitespace": {
X: []byte(`Foo=Bar+&Baz=Bar%20&Bin=Foo%0A`),
Y: []byte(`Foo=Bar%20&Baz=Bar+&Bin=Foo%0A`),
Equal: true,
},
"missing significant whitespace not equal": {
X: []byte(`Foo=Bar+&Baz=Bar%20&Bin=Foo%0A%09%09%09%09&Spam=Eggs`),
Y: []byte(`Foo=Bar &Baz=Bar &Bin=Foo
&Spam=Eggs`),
Equal: false,
},
"not equal": {
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`),
Y: []byte(`Action=QueryMaps&Version=2020-01-08&MapArg.entry.1.key=foo&MapArg.entry.1.value=Foo`),
Equal: false,
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
err := URLFormEqual(c.X, c.Y)
if c.Equal {
if err != nil {
t.Fatalf("expect form to be equal, %v", err)
}
} else if err == nil {
t.Fatalf("expect form to be equal, %v", err)
}
})
}
}
func TestEqualXMLUtil(t *testing.T) {
cases := map[string]struct {
expectedXML string
actualXML string
expectErr string
}{
"empty": {
expectedXML: ``,
actualXML: ``,
},
"emptyWithDiff": {
expectedXML: ``,
actualXML: ``,
expectErr: "XML mismatch",
},
"simpleXML": {
expectedXML: ``,
actualXML: ``,
},
"simpleXMLWithDiff": {
expectedXML: ``,
actualXML: `abc`,
expectErr: "XML mismatch",
},
"nestedXML": {
expectedXML: `123xyz`,
actualXML: `123xyz`,
},
"nestedXMLWithExpectedDiff": {
expectedXML: `123xyz234`,
actualXML: `123xyz`,
expectErr: "XML mismatch",
},
"nestedXMLWithActualDiff": {
expectedXML: `123xyz`,
actualXML: `123xyz234`,
expectErr: "XML mismatch",
},
"Array": {
expectedXML: `xyzabc
`,
actualXML: `xyzabc
`,
},
"ArrayWithSecondDiff": {
expectedXML: `xyz123
`,
actualXML: `xyz345
`,
expectErr: "XML mismatch",
},
"ArrayWithFirstDiff": {
expectedXML: `abc345
`,
actualXML: `xyz345
`,
expectErr: "XML mismatch",
},
"ArrayWithMixedDiff": {
expectedXML: `345xyz
`,
actualXML: `xyz345
`,
},
"ArrayWithRepetitiveMembers": {
expectedXML: `xyzxyz
`,
actualXML: `xyzxyz
`,
},
"Map": {
expectedXML: ``,
actualXML: ``,
},
"MapWithFirstDiff": {
expectedXML: ``,
actualXML: ``,
expectErr: "XML mismatch",
},
"MapWithSecondDiff": {
expectedXML: ``,
actualXML: ``,
expectErr: "XML mismatch",
},
"MapWithMixedDiff": {
expectedXML: ``,
actualXML: ``,
},
"MismatchCheckforKeyValue": {
expectedXML: ``,
actualXML: ``,
expectErr: "XML mismatch",
},
"MixMapAndListNestedXML": {
expectedXML: `mem1
mem2
`,
actualXML: `mem1
mem2
`,
},
"MixMapAndListNestedXMLWithDiff": {
expectedXML: `mem1
mem2
`,
actualXML: `mem1
mem2
`,
expectErr: "XML mismatch",
},
"xmlWithNamespaceAndAttr": {
expectedXML: `value`,
actualXML: `value`,
},
"xmlUnorderedAttributes": {
expectedXML: `v`,
actualXML: `v`,
},
"xmlAttributesWithDiff": {
expectedXML: `v`,
actualXML: `v`,
expectErr: "XML mismatch",
},
"xmlUnorderedNamespaces": {
expectedXML: `v`,
actualXML: `v`,
},
"xmlNamespaceWithDiff": {
expectedXML: `v`,
actualXML: `v`,
expectErr: "XML mismatch",
},
"NestedWithNamespaceAndAttributes": {
expectedXML: `mem1mem2`,
actualXML: `mem1mem2`,
},
"NestedWithNamespaceAndAttributesWithDiff": {
expectedXML: `mem2
mem2`,
actualXML: `mem1
mem2`,
expectErr: "XML mismatch",
},
"MalformedXML": {
expectedXML: `aa2vbb2w`,
actualXML: `aa2vbb2w`,
expectErr: "malformed xml",
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
actual := []byte(c.actualXML)
expected := []byte(c.expectedXML)
err := XMLEqual(actual, expected)
if err != nil {
if len(c.expectErr) == 0 {
t.Fatalf("expected no error while parsing xml, got %v", err)
} else if !strings.Contains(err.Error(), c.expectErr) {
t.Fatalf("expected expected XML err to contain %s, got %s", c.expectErr, err.Error())
}
} else if len(c.expectErr) != 0 {
t.Fatalf("expected error %s, got none", c.expectErr)
}
})
}
}