login_test.go

 1package tui
 2
 3import (
 4	"testing"
 5)
 6
 7func TestValidPort(t *testing.T) {
 8	tests := []struct {
 9		name     string
10		input    string
11		fallback int
12		want     int
13	}{
14		{"empty string returns fallback", "", 993, 993},
15		{"valid port 993", "993", 143, 993},
16		{"valid port 1 (minimum)", "1", 993, 1},
17		{"valid port 65535 (maximum)", "65535", 993, 65535},
18		{"valid port 587", "587", 25, 587},
19		{"valid port 995", "995", 110, 995},
20		{"port 0 is invalid, returns fallback", "0", 993, 993},
21		{"negative port is invalid", "-1", 993, 993},
22		{"port over 65535 is invalid", "70000", 993, 993},
23		{"non-numeric returns fallback", "abc", 993, 993},
24		{"port with spaces returns fallback", " 993 ", 993, 993},
25		{"port 8080", "8080", 993, 8080},
26		{"large negative number", "-99999", 993, 993},
27		{"very large number", "9999999", 993, 993},
28	}
29
30	for _, tt := range tests {
31		t.Run(tt.name, func(t *testing.T) {
32			got := validPort(tt.input, tt.fallback)
33			if got != tt.want {
34				t.Errorf("validPort(%q, %d) = %d, want %d", tt.input, tt.fallback, got, tt.want)
35			}
36		})
37	}
38}
39
40func TestValidPortDifferentFallbacks(t *testing.T) {
41	if got := validPort("", 143); got != 143 {
42		t.Errorf("empty with fallback 143 = %d, want 143", got)
43	}
44	if got := validPort("", 587); got != 587 {
45		t.Errorf("empty with fallback 587 = %d, want 587", got)
46	}
47	if got := validPort("", 995); got != 995 {
48		t.Errorf("empty with fallback 995 = %d, want 995", got)
49	}
50	if got := validPort("bad", 25); got != 25 {
51		t.Errorf("invalid with fallback 25 = %d, want 25", got)
52	}
53}
54
55func TestSubmitFormPortValidation(t *testing.T) {
56	m := NewLogin(true)
57
58	tests := []struct {
59		name     string
60		portVal  string
61		want     int
62		fallback int
63	}{
64		{"valid custom port 143", "143", 143, 993},
65		{"invalid port 0 falls back", "0", 993, 993},
66		{"invalid negative port falls back", "-1", 993, 993},
67		{"invalid overflow port falls back", "70000", 993, 993},
68		{"non-numeric port falls back", "abc", 993, 993},
69		{"empty port uses default", "", 993, 993},
70		{"boundary port 1", "1", 1, 993},
71		{"boundary port 65535", "65535", 65535, 993},
72	}
73
74	for _, tt := range tests {
75		t.Run(tt.name, func(t *testing.T) {
76			m.inputs[inputIMAPPort].SetValue(tt.portVal)
77			fn := m.submitForm()
78			msg := fn().(Credentials)
79			if msg.IMAPPort != tt.want {
80				t.Errorf("IMAPPort for input %q = %d, want %d", tt.portVal, msg.IMAPPort, tt.want)
81			}
82		})
83	}
84}