Files
W04_048_Zagar_Database/internal/auth/session_test.go
T

70 lines
1.5 KiB
Go

package auth
import (
"errors"
"strings"
"testing"
"unicode"
)
func TestGenerateToken(t *testing.T) {
const n = 1000
tokens := make([]string, 0, n)
for i := 0; i < n; i++ {
tok, err := GenerateToken()
if err != nil {
t.Fatalf("GenerateToken returned error on call %d: %v", i, err)
}
tokens = append(tokens, tok)
}
t.Run("all tokens are non-empty", func(t *testing.T) {
for i, tok := range tokens {
if tok == "" {
t.Fatalf("token %d is empty", i)
}
}
})
t.Run("all tokens are distinct", func(t *testing.T) {
seen := make(map[string]struct{}, len(tokens))
for i, tok := range tokens {
if _, dup := seen[tok]; dup {
t.Fatalf("token %d is a duplicate: %q", i, tok)
}
seen[tok] = struct{}{}
}
})
t.Run("no token contains whitespace", func(t *testing.T) {
for i, tok := range tokens {
if strings.IndexFunc(tok, unicode.IsSpace) >= 0 {
t.Fatalf("token %d contains whitespace: %q", i, tok)
}
}
})
t.Run("every token is at least 32 characters", func(t *testing.T) {
for i, tok := range tokens {
if len(tok) < 32 {
t.Fatalf("token %d has length %d, want >= 32", i, len(tok))
}
}
})
}
type failingReader struct{}
func (failingReader) Read([]byte) (int, error) { return 0, errors.New("read failed") }
func TestGenerateTokenReadError(t *testing.T) {
tok, err := generateToken(failingReader{})
if err == nil {
t.Fatal("expected an error when the random source fails")
}
if tok != "" {
t.Fatalf("expected empty token on error, got %q", tok)
}
}