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]) } } }