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  }