forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package email
2
3import (
4 "testing"
5)
6
7func TestIsValidEmail(t *testing.T) {
8 tests := []struct {
9 name string
10 email string
11 want bool
12 }{
13 // Valid emails using RFC 2606 reserved domains
14 {"standard email", "user@example.com", true},
15 {"single char local", "a@example.com", true},
16 {"dot in middle", "first.last@example.com", true},
17 {"multiple dots", "a.b.c@example.com", true},
18 {"plus tag", "user+tag@example.com", true},
19 {"numbers", "user123@example.com", true},
20 {"example.org", "user@example.org", true},
21 {"example.net", "user@example.net", true},
22
23 // Invalid format - rejected by mail.ParseAddress
24 {"empty string", "", false},
25 {"no at sign", "userexample.com", false},
26 {"no domain", "user@", false},
27 {"no local part", "@example.com", false},
28 {"double at", "user@@example.com", false},
29 {"just at sign", "@", false},
30 {"leading dot", ".user@example.com", false},
31 {"trailing dot", "user.@example.com", false},
32 {"consecutive dots", "user..name@example.com", false},
33
34 // Whitespace - rejected before parsing
35 {"space in local", "user @example.com", false},
36 {"space in domain", "user@ example.com", false},
37 {"tab", "user\t@example.com", false},
38 {"newline", "user\n@example.com", false},
39
40 // MX lookup - using RFC 2606 reserved TLDs (guaranteed no MX)
41 {"invalid TLD", "user@example.invalid", false},
42 {"test TLD", "user@mail.test", false},
43 }
44
45 for _, tt := range tests {
46 t.Run(tt.name, func(t *testing.T) {
47 got := IsValidEmail(tt.email)
48 if got != tt.want {
49 t.Errorf("IsValidEmail(%q) = %v, want %v", tt.email, got, tt.want)
50 }
51 })
52 }
53}