Files
felhom.eu/hub/internal/store/pbsdr_test.go
T

44 lines
1.5 KiB
Go

package store
import (
"database/sql"
"testing"
)
// The host-scoped consume-once contract (PBS DR SLICE 1): exactly one read per stored value,
// a re-save resets the consumed flag (re-issue supersedes), absence is sql.ErrNoRows.
func TestHostPBSSecret_ConsumeOnce(t *testing.T) {
s := newTestStore(t)
if _, err := s.ConsumeHostPBSSecret("h1"); err != sql.ErrNoRows {
t.Fatalf("consume with nothing stored = %v, want sql.ErrNoRows", err)
}
if err := s.SaveHostPBSSecret("h1", "secret-1"); err != nil {
t.Fatalf("save: %v", err)
}
got, err := s.ConsumeHostPBSSecret("h1")
if err != nil || got != "secret-1" {
t.Fatalf("first consume = (%q, %v), want (secret-1, nil)", got, err)
}
// Single use: the second consume MUST be ErrNoRows (red-proof: dropping the consumed_at
// UPDATE in ConsumeHostPBSSecret makes this assert fail with the value returned again).
if got, err := s.ConsumeHostPBSSecret("h1"); err != sql.ErrNoRows {
t.Fatalf("second consume = (%q, %v), want sql.ErrNoRows — consume-once broken", got, err)
}
// Re-issue path: a fresh save resets consumption and serves the NEW value once.
if err := s.SaveHostPBSSecret("h1", "secret-2"); err != nil {
t.Fatalf("re-save: %v", err)
}
got, err = s.ConsumeHostPBSSecret("h1")
if err != nil || got != "secret-2" {
t.Fatalf("post-reissue consume = (%q, %v), want (secret-2, nil)", got, err)
}
// Host isolation: h2 never sees h1's rows.
if _, err := s.ConsumeHostPBSSecret("h2"); err != sql.ErrNoRows {
t.Fatalf("foreign host consume = %v, want sql.ErrNoRows", err)
}
}