package server import ( "testing" "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" "google.golang.org/grpc/status" ) func contains(array []*validate.Violation, err *validate.Violation) bool { for _, v := range array { if isEqualFieldPaths(v.Field, err.Field) && *v.ConstraintId == *err.ConstraintId && *v.Message == *err.Message { return true } } return false } func isEqualFieldPaths(violationFieldPath, errFieldPath *validate.FieldPath) bool { if len(violationFieldPath.GetElements()) != len(errFieldPath.GetElements()) { return false } for i, elem := range violationFieldPath.GetElements() { if elem != errFieldPath.GetElements()[i] { return false } } return true } func assertValidationErrors(t *testing.T, err error, expectedValidationErrors []*validate.Violation) { st := status.Convert(err) errDetails := st.Details() for _, detail := range errDetails { switch errorType := detail.(type) { case *validate.Violations: for _, violation := range errorType.Violations { ok := contains(expectedValidationErrors, violation) if !ok { t.Errorf("Received unexptected validation error: %v, expected %v", violation, expectedValidationErrors) } } } } }