...

Source file src/github.com/aws/smithy-go/testing/document_test.go

Documentation: github.com/aws/smithy-go/testing

     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