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: `abc123cde356`, actualXML: `abc123cde356`, }, "MapWithFirstDiff": { expectedXML: `bcf123cde356`, actualXML: `abc123cde356`, expectErr: "XML mismatch", }, "MapWithSecondDiff": { expectedXML: `abc123cdeabc`, actualXML: `abc123cde356`, expectErr: "XML mismatch", }, "MapWithMixedDiff": { expectedXML: `cde356abc123`, actualXML: `abc123cde356`, }, "MismatchCheckforKeyValue": { expectedXML: `cdeabcabc356`, actualXML: `abc123cde356`, expectErr: "XML mismatch", }, "MixMapAndListNestedXML": { expectedXML: `mem1mem2abcabcxyzgamma`, actualXML: `mem1mem2abcabcxyzgamma`, }, "MixMapAndListNestedXMLWithDiff": { expectedXML: `mem1mem2abcabcxyzgamma`, actualXML: `mem1mem2abcabcxyzgamma`, 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: `mem1mem2abcabcxyzgamma`, actualXML: `mem1mem2abcabcxyzgamma`, }, "NestedWithNamespaceAndAttributesWithDiff": { expectedXML: `mem2mem2abcabcxyzgamma`, actualXML: `mem1mem2abcabcxyzgamma`, 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) } }) } }