package db
import (
"context"
"errors"
"testing"
"sourcecraft.dev/bigbes/sr-ht-spec/core"
)
func TestSpaceLifecycle(t *testing.T) {
s, _, cleanup := newTestStore(t)
defer cleanup()
ctx := context.Background()
ref := core.SpaceRef{Owner: "bigbes", Name: "rfcs"}
sp, err := s.CreateSpace(ctx, ref)
if err != nil {
t.Fatalf("create space: %v", err)
}
if sp.ID == 0 {
t.Fatal("expected a non-zero space id")
}
if sp.Created.IsZero() {
t.Fatal("expected created to be set")
}
if sp.Ref != ref {
t.Fatalf("ref round-trip: got %v, want %v", sp.Ref, ref)
}
// (owner, name) is unique.
if _, err := s.CreateSpace(ctx, ref); !errors.Is(err, ErrSpaceExists) {
t.Fatalf("duplicate space = %v, want ErrSpaceExists", err)
}
// Same name under a different owner is fine.
if _, err := s.CreateSpace(ctx, core.SpaceRef{Owner: "someone", Name: "rfcs"}); err != nil {
t.Fatalf("same name, different owner: %v", err)
}
got, err := s.GetSpace(ctx, ref)
if err != nil {
t.Fatalf("get space: %v", err)
}
if got.ID != sp.ID || got.Ref != ref {
t.Fatalf("get space returned %+v, want id=%d ref=%v", got, sp.ID, ref)
}
byID, err := s.GetSpaceByID(ctx, sp.ID)
if err != nil {
t.Fatalf("get space by id: %v", err)
}
if byID.Ref != ref {
t.Fatalf("get by id returned %v, want %v", byID.Ref, ref)
}
if _, err := s.GetSpace(ctx, core.SpaceRef{Owner: "bigbes", Name: "absent"}); !errors.Is(err, ErrNotFound) {
t.Fatalf("missing space = %v, want ErrNotFound", err)
}
if _, err := s.GetSpaceByID(ctx, 99999); !errors.Is(err, ErrNotFound) {
t.Fatalf("missing space id = %v, want ErrNotFound", err)
}
mkSpace(t, s, ctx, "bigbes", "notes")
spaces, err := s.ListSpaces(ctx)
if err != nil {
t.Fatalf("list spaces: %v", err)
}
if len(spaces) != 3 {
t.Fatalf("expected 3 spaces, got %d", len(spaces))
}
// Ordered by owner then name.
want := []string{"~bigbes/notes", "~bigbes/rfcs", "~someone/rfcs"}
for i, sp := range spaces {
if sp.Ref.String() != want[i] {
t.Errorf("spaces[%d] = %s, want %s", i, sp.Ref, want[i])
}
}
}