1package url
2
3import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/assert"
8)
9
10func TestShouldReuseRelayPane(t *testing.T) {
11 const u = "https://claude.com/cai/login/app-google-auth?open_in_browser=1&hop_nonce=XYZ"
12 opened := time.Date(2026, 1, 1, 12, 0, 0, 0, time.UTC)
13
14 tests := []struct {
15 name string
16 recorded string
17 requested string
18 now time.Time
19 window time.Duration
20 want bool
21 }{
22 {"same url within window", u, u, opened.Add(30 * time.Second), RelayReuseWindow, true},
23 {"same url at exact window boundary", u, u, opened.Add(RelayReuseWindow), RelayReuseWindow, true},
24 {"same url just after window", u, u, opened.Add(RelayReuseWindow + time.Nanosecond), RelayReuseWindow, false},
25 {"different nonce", u, "https://claude.com/cai/login/app-google-auth?open_in_browser=1&hop_nonce=ABC", opened.Add(time.Second), RelayReuseWindow, false},
26 {"different host", u, "https://example.com/", opened.Add(time.Second), RelayReuseWindow, false},
27 {"equivalent after normalization", "example.com/path", "https://example.com/path", opened.Add(time.Second), RelayReuseWindow, true},
28 {"surrounding whitespace ignored", u, " " + u + "\n", opened.Add(time.Second), RelayReuseWindow, true},
29 {"empty requested", "", "", opened, RelayReuseWindow, false},
30 {"empty recorded", "", u, opened, RelayReuseWindow, false},
31 {"recorded in the future", u, u, opened.Add(-time.Second), RelayReuseWindow, false},
32 {"zero window", u, u, opened, 0, false},
33 {"negative window", u, u, opened, -time.Second, false},
34 }
35 for _, tt := range tests {
36 t.Run(tt.name, func(t *testing.T) {
37 assert.Equal(t, tt.want, ShouldReuseRelayPane(tt.recorded, opened, tt.requested, tt.now, tt.window))
38 })
39 }
40}
41
42func TestRelayURLKey_Normalizes(t *testing.T) {
43 assert.Equal(t, "https://example.com", RelayURLKey(" example.com "))
44 assert.Empty(t, RelayURLKey(" "))
45}