package domain import ( "testing" "github.com/stretchr/testify/assert" ) func TestValidateEmail(t *testing.T) { tests := []struct { name string email string wantErr bool }{ { name: "valid email", email: "test@example.com", wantErr: false, }, { name: "valid email with subdomain", email: "user@mail.example.com", wantErr: false, }, { name: "invalid email - no @", email: "testexample.com", wantErr: true, }, { name: "invalid email - no domain", email: "test@", wantErr: true, }, { name: "empty email", email: "", wantErr: true, }, { name: "email with spaces", email: " test@example.com ", wantErr: false, // Should be trimmed }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidateEmail(tt.email) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestValidatePhone(t *testing.T) { tests := []struct { name string phone string wantErr bool }{ { name: "valid phone with country code", phone: "+1234567890", wantErr: false, }, { name: "valid phone without country code", phone: "1234567890", wantErr: false, }, { name: "invalid phone - too short", phone: "12", wantErr: true, }, { name: "invalid phone - contains letters", phone: "123-abc-4567", wantErr: true, }, { name: "empty phone", phone: "", wantErr: true, }, { name: "phone with spaces", phone: " +1234567890 ", wantErr: false, // Should be trimmed }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidatePhone(tt.phone) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestValidatePassword(t *testing.T) { tests := []struct { name string password string wantErr bool }{ { name: "valid password", password: "password123", wantErr: false, }, { name: "password too short", password: "123", wantErr: true, }, { name: "password too long", password: string(make([]byte, MaxPasswordLength+1)), wantErr: true, }, { name: "empty password", password: "", wantErr: true, }, { name: "minimum length password", password: "12345678", wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidatePassword(tt.password) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestValidateStringLength(t *testing.T) { tests := []struct { name string value string min int max int wantErr bool }{ { name: "valid length", value: "hello", min: 3, max: 10, wantErr: false, }, { name: "too short", value: "hi", min: 3, max: 10, wantErr: true, }, { name: "too long", value: "hello world", min: 3, max: 5, wantErr: true, }, { name: "empty value", value: "", min: 1, max: 10, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidateStringLength("test", tt.value, tt.min, tt.max) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestValidateRequired(t *testing.T) { tests := []struct { name string value string wantErr bool }{ { name: "valid value", value: "hello", wantErr: false, }, { name: "empty value", value: "", wantErr: true, }, { name: "whitespace only", value: " ", wantErr: true, }, { name: "value with spaces", value: " hello ", wantErr: false, // Should be trimmed }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := ValidateRequired("test", tt.value) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } }