package db
import (
"context"
"errors"
"testing"
"time"
)
func TestIndexStamp(t *testing.T) {
s, _, cleanup := newTestStore(t)
defer cleanup()
ctx := context.Background()
space := mkSpace(t, s, ctx, "bigbes", "rfcs")
// Never indexed is ErrNotFound, not a zero rev: the reconciler must read it
// as stale.
if _, err := s.GetIndexStamp(ctx, space.ID); !errors.Is(err, ErrNotFound) {
t.Fatalf("unindexed space = %v, want ErrNotFound", err)
}
st, err := s.SetIndexStamp(ctx, space.ID, "rev1")
if err != nil {
t.Fatalf("set stamp: %v", err)
}
if st.SpaceID != space.ID || st.Rev != "rev1" || st.IndexedAt.IsZero() {
t.Fatalf("unexpected stamp: %+v", st)
}
got, err := s.GetIndexStamp(ctx, space.ID)
if err != nil {
t.Fatalf("get stamp: %v", err)
}
if got.Rev != "rev1" {
t.Fatalf("rev = %q, want rev1", got.Rev)
}
// Re-stamping the same space updates in place.
if _, err := s.SetIndexStamp(ctx, space.ID, "rev2"); err != nil {
t.Fatalf("re-stamp: %v", err)
}
got, err = s.GetIndexStamp(ctx, space.ID)
if err != nil {
t.Fatalf("get stamp: %v", err)
}
if got.Rev != "rev2" {
t.Fatalf("rev = %q, want rev2", got.Rev)
}
if !got.IndexedAt.After(st.IndexedAt) && !got.IndexedAt.Equal(st.IndexedAt) {
t.Fatalf("indexed_at went backwards: %v -> %v", st.IndexedAt, got.IndexedAt)
}
// The stamp is per space and cascades with it.
other := mkSpace(t, s, ctx, "bigbes", "notes")
if _, err := s.GetIndexStamp(ctx, other.ID); !errors.Is(err, ErrNotFound) {
t.Fatalf("other space stamp = %v, want ErrNotFound", err)
}
}
func TestDigestMark(t *testing.T) {
s, _, cleanup := newTestStore(t)
defer cleanup()
ctx := context.Background()
if _, err := s.GetDigestMark(ctx, "bigbes"); !errors.Is(err, ErrNotFound) {
t.Fatalf("never looked = %v, want ErrNotFound", err)
}
first := time.Now().UTC().Add(-time.Hour).Truncate(time.Microsecond)
if err := s.SetDigestMark(ctx, "bigbes", first); err != nil {
t.Fatalf("set mark: %v", err)
}
got, err := s.GetDigestMark(ctx, "bigbes")
if err != nil {
t.Fatalf("get mark: %v", err)
}
if !got.Equal(first) {
t.Fatalf("mark = %v, want %v", got, first)
}
second := first.Add(30 * time.Minute)
if err := s.SetDigestMark(ctx, "bigbes", second); err != nil {
t.Fatalf("move mark: %v", err)
}
got, err = s.GetDigestMark(ctx, "bigbes")
if err != nil {
t.Fatalf("get mark: %v", err)
}
if !got.Equal(second) {
t.Fatalf("mark = %v, want %v", got, second)
}
if _, err := s.GetDigestMark(ctx, "someone"); !errors.Is(err, ErrNotFound) {
t.Fatalf("other owner = %v, want ErrNotFound", err)
}
}