package store import ( "path/filepath" "testing" ) func newTestStore(t *testing.T) *Store { t.Helper() s, err := Open(filepath.Join(t.TempDir(), "test.db")) if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = s.Close() }) return s } func TestSignupLoginSession(t *testing.T) { s := newTestStore(t) u, err := s.Signup("Maya Chen", "Maya@Acme.io", "secret123", "") if err != nil { t.Fatal(err) } if u.Role != "Owner" || u.Email != "maya@acme.io" { t.Errorf("unexpected user %+v", u) } if u.WorkspaceSlug == "" || u.WorkspaceID == "" { t.Error("expected a workspace to be created") } // duplicate email if _, err := s.Signup("X", "maya@acme.io", "secret123", ""); err != ErrEmailTaken { t.Errorf("expected ErrEmailTaken, got %v", err) } // wrong password if _, err := s.Login("maya@acme.io", "nope"); err != ErrInvalidLogin { t.Errorf("expected ErrInvalidLogin, got %v", err) } // correct login (case-insensitive email) lu, err := s.Login("MAYA@acme.io", "secret123") if err != nil { t.Fatal(err) } if lu.ID != u.ID { t.Errorf("login returned different user") } // session lifecycle tok, err := s.CreateSession(u.ID) if err != nil { t.Fatal(err) } su, err := s.UserBySession(tok) if err != nil || su.ID != u.ID { t.Fatalf("UserBySession failed: %v", err) } if err := s.DeleteSession(tok); err != nil { t.Fatal(err) } if _, err := s.UserBySession(tok); err != ErrNotFound { t.Errorf("expected ErrNotFound after delete, got %v", err) } } func TestUniqueWorkspaceSlug(t *testing.T) { s := newTestStore(t) if _, err := s.Signup("Acme", "a@x.io", "secret123", "Acme"); err != nil { t.Fatal(err) } u2, err := s.Signup("Acme Two", "b@x.io", "secret123", "Acme") if err != nil { t.Fatal(err) } if u2.WorkspaceSlug == "acme" { t.Error("expected a de-duplicated workspace slug") } }