123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package matchers
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "github.com/onsi/gomega/format"
- )
- type MatchJSONMatcher struct {
- JSONToMatch interface{}
- firstFailurePath []interface{}
- }
- func (matcher *MatchJSONMatcher) Match(actual interface{}) (success bool, err error) {
- actualString, expectedString, err := matcher.prettyPrint(actual)
- if err != nil {
- return false, err
- }
- var aval interface{}
- var eval interface{}
- // this is guarded by prettyPrint
- json.Unmarshal([]byte(actualString), &aval)
- json.Unmarshal([]byte(expectedString), &eval)
- var equal bool
- equal, matcher.firstFailurePath = deepEqual(aval, eval)
- return equal, nil
- }
- func (matcher *MatchJSONMatcher) FailureMessage(actual interface{}) (message string) {
- actualString, expectedString, _ := matcher.prettyPrint(actual)
- return formattedMessage(format.Message(actualString, "to match JSON of", expectedString), matcher.firstFailurePath)
- }
- func (matcher *MatchJSONMatcher) NegatedFailureMessage(actual interface{}) (message string) {
- actualString, expectedString, _ := matcher.prettyPrint(actual)
- return formattedMessage(format.Message(actualString, "not to match JSON of", expectedString), matcher.firstFailurePath)
- }
- func (matcher *MatchJSONMatcher) prettyPrint(actual interface{}) (actualFormatted, expectedFormatted string, err error) {
- actualString, ok := toString(actual)
- if !ok {
- return "", "", fmt.Errorf("MatchJSONMatcher matcher requires a string, stringer, or []byte. Got actual:\n%s", format.Object(actual, 1))
- }
- expectedString, ok := toString(matcher.JSONToMatch)
- if !ok {
- return "", "", fmt.Errorf("MatchJSONMatcher matcher requires a string, stringer, or []byte. Got expected:\n%s", format.Object(matcher.JSONToMatch, 1))
- }
- abuf := new(bytes.Buffer)
- ebuf := new(bytes.Buffer)
- if err := json.Indent(abuf, []byte(actualString), "", " "); err != nil {
- return "", "", fmt.Errorf("Actual '%s' should be valid JSON, but it is not.\nUnderlying error:%s", actualString, err)
- }
- if err := json.Indent(ebuf, []byte(expectedString), "", " "); err != nil {
- return "", "", fmt.Errorf("Expected '%s' should be valid JSON, but it is not.\nUnderlying error:%s", expectedString, err)
- }
- return abuf.String(), ebuf.String(), nil
- }
|