Pulse/internal/api/magic_link_store_sqlite_test.go
2026-03-18 16:06:30 +00:00

72 lines
2 KiB
Go

package api
import (
"errors"
"testing"
"time"
)
func TestSQLiteMagicLinkStore_PersistsAcrossReopen(t *testing.T) {
dir := t.TempDir()
store1, err := NewSQLiteMagicLinkStore(dir)
if err != nil {
t.Fatalf("NewSQLiteMagicLinkStore: %v", err)
}
key := []byte("0123456789abcdef0123456789abcdef")
svc1 := NewMagicLinkServiceWithKey(key, store1, nil, nil)
base := time.Date(2026, 2, 10, 12, 0, 0, 0, time.UTC)
svc1.now = func() time.Time { return base }
token, err := svc1.GenerateToken("user@example.com", "org-123")
if err != nil {
t.Fatalf("GenerateToken: %v", err)
}
svc1.Stop()
store2, err := NewSQLiteMagicLinkStore(dir)
if err != nil {
t.Fatalf("NewSQLiteMagicLinkStore reopen: %v", err)
}
svc2 := NewMagicLinkServiceWithKey(key, store2, nil, nil)
svc2.now = func() time.Time { return base.Add(1 * time.Minute) }
t.Cleanup(svc2.Stop)
got, err := svc2.ValidateToken(token)
if err != nil {
t.Fatalf("ValidateToken after reopen: %v", err)
}
if got.Email != "user@example.com" || got.OrgID != "org-123" {
t.Fatalf("unexpected token record: %+v", got)
}
}
func TestSQLiteMagicLinkStore_WrongKeyCannotValidate(t *testing.T) {
dir := t.TempDir()
store, err := NewSQLiteMagicLinkStore(dir)
if err != nil {
t.Fatalf("NewSQLiteMagicLinkStore: %v", err)
}
rightKey := []byte("0123456789abcdef0123456789abcdef")
svc := NewMagicLinkServiceWithKey(rightKey, store, nil, nil)
t.Cleanup(svc.Stop)
token, err := svc.GenerateToken("user@example.com", "org-123")
if err != nil {
t.Fatalf("GenerateToken: %v", err)
}
otherStore, err := NewSQLiteMagicLinkStore(dir)
if err != nil {
t.Fatalf("NewSQLiteMagicLinkStore reopen: %v", err)
}
wrongKey := []byte("abcdef0123456789abcdef0123456789")
svcWrong := NewMagicLinkServiceWithKey(wrongKey, otherStore, nil, nil)
t.Cleanup(svcWrong.Stop)
_, err = svcWrong.ValidateToken(token)
if !errors.Is(err, ErrMagicLinkInvalidToken) {
t.Fatalf("ValidateToken err=%v, want %v", err, ErrMagicLinkInvalidToken)
}
}