Skip to content
Snippets Groups Projects
utils_test.go 1.21 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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)
    				}
    			}
    		}
    	}
    }