github.com/onsi/gomega@v1.32.0/gstruct/fields_test.go (about)

     1  package gstruct_test
     2  
     3  import (
     4  	. "github.com/onsi/ginkgo/v2"
     5  	. "github.com/onsi/gomega"
     6  	. "github.com/onsi/gomega/gstruct"
     7  )
     8  
     9  var _ = Describe("Struct", func() {
    10  	allFields := struct{ A, B string }{"a", "b"}
    11  	missingFields := struct{ A string }{"a"}
    12  	extraFields := struct{ A, B, C string }{"a", "b", "c"}
    13  	emptyFields := struct{ A, B string }{}
    14  
    15  	It("should strictly match all fields", func() {
    16  		m := MatchAllFields(Fields{
    17  			"B": Equal("b"),
    18  			"A": Equal("a"),
    19  		})
    20  		Expect(allFields).Should(m, "should match all fields")
    21  		Expect(missingFields).ShouldNot(m, "should fail with missing fields")
    22  		Expect(extraFields).ShouldNot(m, "should fail with extra fields")
    23  		Expect(emptyFields).ShouldNot(m, "should fail with empty fields")
    24  
    25  		m = MatchAllFields(Fields{
    26  			"A": Equal("a"),
    27  			"B": Equal("fail"),
    28  		})
    29  		Expect(allFields).ShouldNot(m, "should run nested matchers")
    30  	})
    31  
    32  	It("should handle empty structs", func() {
    33  		m := MatchAllFields(Fields{})
    34  		Expect(struct{}{}).Should(m, "should handle empty structs")
    35  		Expect(allFields).ShouldNot(m, "should fail with extra fields")
    36  	})
    37  
    38  	It("should ignore missing fields", func() {
    39  		m := MatchFields(IgnoreMissing, Fields{
    40  			"B": Equal("b"),
    41  			"A": Equal("a"),
    42  		})
    43  		Expect(allFields).Should(m, "should match all fields")
    44  		Expect(missingFields).Should(m, "should ignore missing fields")
    45  		Expect(extraFields).ShouldNot(m, "should fail with extra fields")
    46  		Expect(emptyFields).ShouldNot(m, "should fail with empty fields")
    47  	})
    48  
    49  	It("should ignore extra fields", func() {
    50  		m := MatchFields(IgnoreExtras, Fields{
    51  			"B": Equal("b"),
    52  			"A": Equal("a"),
    53  		})
    54  		Expect(allFields).Should(m, "should match all fields")
    55  		Expect(missingFields).ShouldNot(m, "should fail with missing fields")
    56  		Expect(extraFields).Should(m, "should ignore extra fields")
    57  		Expect(emptyFields).ShouldNot(m, "should fail with empty fields")
    58  	})
    59  
    60  	It("should ignore missing and extra fields", func() {
    61  		m := MatchFields(IgnoreMissing|IgnoreExtras, Fields{
    62  			"B": Equal("b"),
    63  			"A": Equal("a"),
    64  		})
    65  		Expect(allFields).Should(m, "should match all fields")
    66  		Expect(missingFields).Should(m, "should ignore missing fields")
    67  		Expect(extraFields).Should(m, "should ignore extra fields")
    68  		Expect(emptyFields).ShouldNot(m, "should fail with empty fields")
    69  
    70  		m = MatchFields(IgnoreMissing|IgnoreExtras, Fields{
    71  			"A": Equal("a"),
    72  			"B": Equal("fail"),
    73  		})
    74  		Expect(allFields).ShouldNot(m, "should run nested matchers")
    75  	})
    76  
    77  	It("should produce sensible error messages", func() {
    78  		m := MatchAllFields(Fields{
    79  			"B": Equal("b"),
    80  			"A": Equal("a"),
    81  		})
    82  
    83  		actual := struct{ A, C string }{A: "b", C: "c"}
    84  
    85  		//Because the order of the constituent errors can't be guaranteed,
    86  		//we do a number of checks to make sure everything's included
    87  		m.Match(actual)
    88  		Expect(m.FailureMessage(actual)).Should(HavePrefix(
    89  			"Expected\n    <string>: \nto match fields: {\n",
    90  		))
    91  		Expect(m.FailureMessage(actual)).Should(ContainSubstring(
    92  			".A:\n	Expected\n	    <string>: b\n	to equal\n	    <string>: a\n",
    93  		))
    94  		Expect(m.FailureMessage(actual)).Should(ContainSubstring(
    95  			"missing expected field B\n",
    96  		))
    97  		Expect(m.FailureMessage(actual)).Should(ContainSubstring(
    98  			".C:\n	unexpected field C: {A:b C:c}",
    99  		))
   100  	})
   101  })