package phoneutil import ( "testing" "github.com/stretchr/testify/assert" ) func TestParseAndFormatPhoneNumber(t *testing.T) { tests := []struct { name string phoneNumber string want string wantErr bool }{ { name: "valid russian phone number with +7", phoneNumber: "+79161234567", want: "+79161234567", wantErr: false, }, { name: "valid russian phone number with 8", phoneNumber: "89161234567", want: "+79161234567", wantErr: false, }, { name: "valid phone number with spaces", phoneNumber: "+7 916 123 45 67", want: "+79161234567", wantErr: false, }, { name: "valid phone number with dashes", phoneNumber: "+7-916-123-45-67", want: "+79161234567", wantErr: false, }, { name: "valid phone number with parentheses", phoneNumber: "+7 (916) 123-45-67", want: "+79161234567", wantErr: false, }, { name: "valid moscow landline", phoneNumber: "+7 495 123 45 67", want: "+74951234567", wantErr: false, }, { name: "russian mobile without country code", phoneNumber: "9161234567", want: "+79161234567", wantErr: false, }, { name: "invalid phone number - too short", phoneNumber: "1", want: "", wantErr: true, }, { name: "invalid phone number - too long", phoneNumber: "+712345678901234567890", want: "", wantErr: true, }, { name: "empty phone number", phoneNumber: "", want: "", wantErr: true, }, { name: "invalid characters", phoneNumber: "+7abc1234567", want: "", wantErr: true, }, { name: "only spaces", phoneNumber: " ", want: "", wantErr: true, }, { name: "us phone number should work with ru default", phoneNumber: "+12345678901", want: "+12345678901", wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := ParseAndFormatPhoneNumber(tt.phoneNumber) if tt.wantErr { assert.Error(t, err, "ParseAndFormatPhoneNumber() should return error") assert.Empty(t, got, "ParseAndFormatPhoneNumber() should return empty string on error") } else { assert.NoError(t, err, "ParseAndFormatPhoneNumber() should not return error") assert.Equal(t, tt.want, got, "ParseAndFormatPhoneNumber() result mismatch") } }) } } func TestParseAndFormatPhoneNumber_ErrorHandling(t *testing.T) { // Test specific error cases testCases := []struct { name string phoneNumber string }{ {"nil input", ""}, {"invalid format", "not-a-phone-number"}, {"incomplete number", "+7"}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { result, err := ParseAndFormatPhoneNumber(tc.phoneNumber) assert.Error(t, err) assert.Empty(t, result) }) } }