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