forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
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}