github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/validator_gravatar_test.go (about) 1 package ev 2 3 import ( 4 "errors" 5 "fmt" 6 "github.com/go-email-validator/go-email-validator/pkg/ev/evmail" 7 "github.com/go-email-validator/go-email-validator/pkg/ev/evtests" 8 "net/url" 9 "reflect" 10 "testing" 11 ) 12 13 const GravatarExistEmail = "beau@dentedreality.com.au" 14 const GravatarExistEmailURL = "https://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50?d=404" 15 16 // TODO mocking Gravatar 17 func Test_gravatarValidator_Validate(t *testing.T) { 18 evtests.FunctionalSkip(t) 19 20 type args struct { 21 email evmail.Address 22 options []KVOption 23 results []ValidationResult 24 } 25 26 tests := []struct { 27 name string 28 args args 29 want ValidationResult 30 }{ 31 { 32 name: "valid", 33 args: args{ 34 email: evmail.FromString(GravatarExistEmail), 35 results: []ValidationResult{NewValidResult(SyntaxValidatorName)}, 36 }, 37 want: NewGravatarValidationResult( 38 GravatarExistEmailURL, 39 NewValidResult(GravatarValidatorName).(*AValidationResult), 40 ), 41 }, 42 { 43 name: "invalid syntax", 44 args: args{ 45 email: evmail.FromString(""), 46 results: []ValidationResult{syntaxGetError()}, 47 }, 48 want: gravatarGetError(NewDepsError()), 49 }, 50 { 51 name: "invalid in gravatar", 52 args: args{ 53 email: evmail.FromString("some.none.exist@with.non.exist.domain"), 54 results: []ValidationResult{NewValidResult(SyntaxValidatorName)}, 55 }, 56 want: gravatarGetError(GravatarError{}), 57 }, 58 { 59 name: "expired timeout", 60 args: args{ 61 email: evmail.FromString("some.none.exist@with.non.exist.domain"), 62 results: []ValidationResult{NewValidResult(SyntaxValidatorName)}, 63 options: []KVOption{NewKVOption( 64 GravatarValidatorName, 65 NewGravatarOptions(GravatarOptionsDTO{Timeout: 1}), 66 )}, 67 }, 68 want: gravatarGetError(&url.Error{ 69 Op: "Head", 70 URL: "https://www.gravatar.com/avatar/77996abfe12fc2141488a60b29aa4844?d=404", 71 Err: errors.New("context deadline exceeded (Client.Timeout exceeded while awaiting headers)"), 72 }), 73 }, 74 } 75 for _, tt := range tests { 76 t.Run(tt.name, func(t *testing.T) { 77 var errStr string 78 var wantErrStr string 79 80 w := NewGravatarValidator() 81 gotInterface := w.Validate(NewInput(tt.args.email, tt.args.options...), tt.args.results...) 82 83 got := gotInterface.(gravatarValidationResult) 84 want := tt.want.(gravatarValidationResult) 85 86 if len(got.errors) > 0 && len(want.errors) > 0 { 87 if errOp, ok := got.errors[0].(*url.Error); ok && errOp.Err != nil { 88 errStr = errOp.Err.Error() 89 errOp.Err = nil 90 } 91 92 wantErrOp, ok := want.errors[0].(*url.Error) 93 if ok && wantErrOp.Err != nil { 94 wantErrStr = wantErrOp.Err.Error() 95 wantErrOp.Err = nil 96 } 97 } 98 99 if !reflect.DeepEqual(got, want) || got.URL() != want.URL() || errStr != wantErrStr { 100 t.Errorf("Validate() = %v, want %v", gotInterface, tt.want) 101 } 102 }) 103 } 104 } 105 106 func Test_gravatarValidator_race_parallel(t *testing.T) { 107 evtests.FunctionalSkip(t) 108 109 w := NewGravatarValidator() 110 wantStr := "context deadline exceeded (Client.Timeout exceeded while awaiting headers)" 111 for i := 0; i < 100; i++ { 112 email := evmail.NewEmailAddress(fmt.Sprintf("someNoneExistUserName%d", i), "someNonExists") 113 t.Run(email.String(), func(t *testing.T) { 114 t.Parallel() 115 116 gotInterface := w.Validate( 117 NewInput(email, NewKVOption( 118 GravatarValidatorName, 119 NewGravatarOptions(GravatarOptionsDTO{Timeout: 1}), 120 )), 121 NewValidResult(SyntaxValidatorName)) 122 123 got := gotInterface.(gravatarValidationResult) 124 gotStr := got.errors[0].(*url.Error).Err.Error() 125 126 if gotStr != wantStr { 127 t.Errorf("Validate() = %v, wantStr %v", gotStr, wantStr) 128 } 129 }) 130 } 131 } 132 133 func Test_gravatarValidator_GetDeps(t *testing.T) { 134 tests := []struct { 135 name string 136 want []ValidatorName 137 }{ 138 { 139 name: "success", 140 want: []ValidatorName{SyntaxValidatorName}, 141 }, 142 } 143 for _, tt := range tests { 144 t.Run(tt.name, func(t *testing.T) { 145 g := NewGravatarValidator() 146 if got := g.GetDeps(); !reflect.DeepEqual(got, tt.want) { 147 t.Errorf("GetDeps() = %v, want %v", got, tt.want) 148 } 149 }) 150 } 151 }