github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/validator_mx_test.go (about)

     1  package ev
     2  
     3  import (
     4  	"github.com/go-email-validator/go-email-validator/pkg/ev/evmail"
     5  	"github.com/go-email-validator/go-email-validator/pkg/ev/evsmtp"
     6  	"github.com/go-email-validator/go-email-validator/pkg/ev/utils"
     7  	mockevmail "github.com/go-email-validator/go-email-validator/test/mock/ev/evmail"
     8  	"github.com/stretchr/testify/require"
     9  	"net"
    10  	"reflect"
    11  	"testing"
    12  )
    13  
    14  func mockLookupMX(t *testing.T, domainExpected string, ret evsmtp.MXs, err error) evsmtp.FuncLookupMX {
    15  	return func(domain string) ([]*net.MX, error) {
    16  		require.Equal(t, domainExpected, domain)
    17  
    18  		return ret, err
    19  	}
    20  }
    21  
    22  func Test_mxValidator_Validate(t *testing.T) {
    23  	type fields struct {
    24  		lookupMX evsmtp.FuncLookupMX
    25  	}
    26  	type args struct {
    27  		email evmail.Address
    28  	}
    29  
    30  	mxs := evsmtp.MXs{&net.MX{}}
    31  
    32  	tests := []struct {
    33  		name   string
    34  		fields fields
    35  		args   args
    36  		want   ValidationResult
    37  	}{
    38  		{
    39  			name: "existed domain",
    40  			fields: fields{
    41  				lookupMX: mockLookupMX(t, validEmail.Domain(), mxs, nil),
    42  			},
    43  			args: args{
    44  				email: validEmail,
    45  			},
    46  			want: NewMXValidationResult(
    47  				mxs,
    48  				NewResult(true, nil, nil, MXValidatorName).(*AValidationResult),
    49  			),
    50  		},
    51  		{
    52  			name: "empty mx list",
    53  			fields: fields{
    54  				lookupMX: mockLookupMX(t, validEmail.Domain(), nil, nil),
    55  			},
    56  			args: args{
    57  				email: validEmail,
    58  			},
    59  			want: NewMXValidationResult(
    60  				nil,
    61  				NewResult(false, utils.Errs(EmptyMXsError{}), nil, MXValidatorName).(*AValidationResult),
    62  			),
    63  		},
    64  		{
    65  			name: "unexisted domain",
    66  			fields: fields{
    67  				lookupMX: mockLookupMX(t, validEmail.Domain(), nil, errorSimple),
    68  			},
    69  			args: args{
    70  				email: validEmail,
    71  			},
    72  			want: NewMXValidationResult(
    73  				nil,
    74  				NewResult(false, utils.Errs(errorSimple), nil, MXValidatorName).(*AValidationResult),
    75  			),
    76  		},
    77  		{
    78  			name: "unexisted domain with mxs",
    79  			fields: fields{
    80  				lookupMX: mockLookupMX(t, validEmail.Domain(), mxs, errorSimple),
    81  			},
    82  			args: args{
    83  				email: validEmail,
    84  			},
    85  			want: NewMXValidationResult(
    86  				mxs,
    87  				NewResult(false, utils.Errs(errorSimple), nil, MXValidatorName).(*AValidationResult),
    88  			),
    89  		},
    90  	}
    91  	for _, tt := range tests {
    92  		t.Run(tt.name, func(t *testing.T) {
    93  			v := NewMXValidator(tt.fields.lookupMX)
    94  			if got := v.Validate(NewInput(tt.args.email)); !reflect.DeepEqual(got, tt.want) {
    95  				t.Errorf("Validate() = %v, want %v", got, tt.want)
    96  			}
    97  		})
    98  	}
    99  }
   100  
   101  func BenchmarkSMTPValidator_Validate_MX(b *testing.B) {
   102  	email := evmail.FromString(mockevmail.ValidEmailString)
   103  
   104  	depValidator := NewDepValidator(
   105  		map[ValidatorName]Validator{
   106  			SyntaxValidatorName: DefaultNewMXValidator(),
   107  			MXValidatorName:     NewSyntaxValidator(),
   108  		},
   109  	)
   110  
   111  	b.ResetTimer()
   112  	for i := 0; i < b.N; i++ {
   113  		depValidator.Validate(NewInput(email))
   114  	}
   115  }