mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-30 02:00:19 +00:00
7b06b0f218
Bumps the github-dependencies group with 2 updates: [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) and [github.com/onsi/gomega](https://github.com/onsi/gomega). Updates `github.com/onsi/ginkgo/v2` from 2.20.2 to 2.21.0 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.20.2...v2.21.0) Updates `github.com/onsi/gomega` from 1.34.2 to 1.35.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.34.2...v1.35.1) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
110 lines
3.7 KiB
Go
110 lines
3.7 KiB
Go
package matchers
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"github.com/onsi/gomega/format"
|
|
)
|
|
|
|
// missingFieldError represents a missing field extraction error that
|
|
// HaveExistingFieldMatcher can ignore, as opposed to other, sever field
|
|
// extraction errors, such as nil pointers, et cetera.
|
|
type missingFieldError string
|
|
|
|
func (e missingFieldError) Error() string {
|
|
return string(e)
|
|
}
|
|
|
|
func extractField(actual interface{}, field string, matchername string) (any, error) {
|
|
fields := strings.SplitN(field, ".", 2)
|
|
actualValue := reflect.ValueOf(actual)
|
|
|
|
if actualValue.Kind() == reflect.Ptr {
|
|
actualValue = actualValue.Elem()
|
|
}
|
|
if actualValue == (reflect.Value{}) {
|
|
return nil, fmt.Errorf("%s encountered nil while dereferencing a pointer of type %T.", matchername, actual)
|
|
}
|
|
|
|
if actualValue.Kind() != reflect.Struct {
|
|
return nil, fmt.Errorf("%s encountered:\n%s\nWhich is not a struct.", matchername, format.Object(actual, 1))
|
|
}
|
|
|
|
var extractedValue reflect.Value
|
|
|
|
if strings.HasSuffix(fields[0], "()") {
|
|
extractedValue = actualValue.MethodByName(strings.TrimSuffix(fields[0], "()"))
|
|
if extractedValue == (reflect.Value{}) && actualValue.CanAddr() {
|
|
extractedValue = actualValue.Addr().MethodByName(strings.TrimSuffix(fields[0], "()"))
|
|
}
|
|
if extractedValue == (reflect.Value{}) {
|
|
return nil, missingFieldError(fmt.Sprintf("%s could not find method named '%s' in struct of type %T.", matchername, fields[0], actual))
|
|
}
|
|
t := extractedValue.Type()
|
|
if t.NumIn() != 0 || t.NumOut() != 1 {
|
|
return nil, fmt.Errorf("%s found an invalid method named '%s' in struct of type %T.\nMethods must take no arguments and return exactly one value.", matchername, fields[0], actual)
|
|
}
|
|
extractedValue = extractedValue.Call([]reflect.Value{})[0]
|
|
} else {
|
|
extractedValue = actualValue.FieldByName(fields[0])
|
|
if extractedValue == (reflect.Value{}) {
|
|
return nil, missingFieldError(fmt.Sprintf("%s could not find field named '%s' in struct:\n%s", matchername, fields[0], format.Object(actual, 1)))
|
|
}
|
|
}
|
|
|
|
if len(fields) == 1 {
|
|
return extractedValue.Interface(), nil
|
|
} else {
|
|
return extractField(extractedValue.Interface(), fields[1], matchername)
|
|
}
|
|
}
|
|
|
|
type HaveFieldMatcher struct {
|
|
Field string
|
|
Expected interface{}
|
|
}
|
|
|
|
func (matcher *HaveFieldMatcher) expectedMatcher() omegaMatcher {
|
|
var isMatcher bool
|
|
expectedMatcher, isMatcher := matcher.Expected.(omegaMatcher)
|
|
if !isMatcher {
|
|
expectedMatcher = &EqualMatcher{Expected: matcher.Expected}
|
|
}
|
|
return expectedMatcher
|
|
}
|
|
|
|
func (matcher *HaveFieldMatcher) Match(actual interface{}) (success bool, err error) {
|
|
extractedField, err := extractField(actual, matcher.Field, "HaveField")
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return matcher.expectedMatcher().Match(extractedField)
|
|
}
|
|
|
|
func (matcher *HaveFieldMatcher) FailureMessage(actual interface{}) (message string) {
|
|
extractedField, err := extractField(actual, matcher.Field, "HaveField")
|
|
if err != nil {
|
|
// this really shouldn't happen
|
|
return fmt.Sprintf("Failed to extract field '%s': %s", matcher.Field, err)
|
|
}
|
|
message = fmt.Sprintf("Value for field '%s' failed to satisfy matcher.\n", matcher.Field)
|
|
message += matcher.expectedMatcher().FailureMessage(extractedField)
|
|
|
|
return message
|
|
}
|
|
|
|
func (matcher *HaveFieldMatcher) NegatedFailureMessage(actual interface{}) (message string) {
|
|
extractedField, err := extractField(actual, matcher.Field, "HaveField")
|
|
if err != nil {
|
|
// this really shouldn't happen
|
|
return fmt.Sprintf("Failed to extract field '%s': %s", matcher.Field, err)
|
|
}
|
|
message = fmt.Sprintf("Value for field '%s' satisfied matcher, but should not have.\n", matcher.Field)
|
|
message += matcher.expectedMatcher().NegatedFailureMessage(extractedField)
|
|
|
|
return message
|
|
}
|