package auth import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestGeneratePairingToken_Format(t *testing.T) { tok, err := GeneratePairingToken() require.NoError(t, err) assert.True(t, IsValidPairingToken(tok), "產生的 token 應符合 pairing 正則:got %q", tok) assert.Len(t, tok, len(PairingTokenPrefix)+PairingTokenHexLen) } func TestGenerateSessionToken_Format(t *testing.T) { tok, err := GenerateSessionToken() require.NoError(t, err) assert.True(t, IsValidSessionToken(tok), "產生的 token 應符合 session 正則:got %q", tok) assert.Len(t, tok, len(SessionTokenPrefix)+SessionTokenHexLen) } func TestGeneratePairingToken_Unique(t *testing.T) { // 產生 100 次應不會碰撞(熵極低)。 seen := make(map[string]struct{}, 100) for i := 0; i < 100; i++ { tok, err := GeneratePairingToken() require.NoError(t, err) _, dup := seen[tok] require.False(t, dup, "pairing token 不應重複產生:%s", tok) seen[tok] = struct{}{} } } func TestIsValidPairingToken(t *testing.T) { cases := []struct { name string token string valid bool }{ {"正確格式", "vAc_0123456789abcdef0123456789abcdef", true}, {"大寫 hex 不允許", "vAc_0123456789ABCDEF0123456789ABCDEF", false}, {"前綴錯誤", "vAs_0123456789abcdef0123456789abcdef", false}, {"長度太短", "vAc_0123456789abcdef", false}, {"長度太長", "vAc_0123456789abcdef0123456789abcdef00", false}, {"含非 hex 字元", "vAc_0123456789abcdef0123456789abcdeZ0", false}, {"空字串", "", false}, {"僅前綴", "vAc_", false}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.valid, IsValidPairingToken(tc.token)) }) } } func TestIsValidSessionToken(t *testing.T) { goodSession := "vAs_" + "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" assert.True(t, IsValidSessionToken(goodSession)) assert.False(t, IsValidSessionToken("vAs_short")) assert.False(t, IsValidSessionToken("vAc_0123456789abcdef0123456789abcdef")) } func TestHashToken_Deterministic(t *testing.T) { h1 := HashToken("vAc_abc") h2 := HashToken("vAc_abc") assert.Equal(t, h1, h2, "同樣輸入應得同樣 hash") assert.NotEqual(t, HashToken("vAc_abc"), HashToken("vAc_def")) assert.Len(t, h1, 64, "sha256 hex 長度應為 64") }