carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package release
2
3import (
4 "context"
5 "strings"
6 "testing"
7 "time"
8)
9
10func TestRetentionRoundTrip(t *testing.T) {
11 ctx := context.Background()
12 s := NewDirStore(t.TempDir())
13 now := time.Date(2026, 8, 10, 12, 0, 0, 0, time.UTC)
14
15 // Absent is legal forever: off, not an error.
16 got, err := GetRetention(ctx, s, "bab", "kass")
17 if err != nil || got != nil {
18 t.Fatalf("absent retention = %v, %v; want nil, nil", got, err)
19 }
20
21 if err := SetRetention(ctx, s, "bab", "kass", 50, "alice@keymail.dev", now); err != nil {
22 t.Fatal(err)
23 }
24 got, err = GetRetention(ctx, s, "bab", "kass")
25 if err != nil {
26 t.Fatal(err)
27 }
28 if got == nil || got.Keep != 50 || got.SetBy != "alice@keymail.dev" || !got.SetAt.Equal(now) {
29 t.Fatalf("retention = %+v, want keep 50 by alice", got)
30 }
31
32 // Overwrite: a second set replaces the first (CAS re-read, not create-only).
33 if err := SetRetention(ctx, s, "bab", "kass", 30, "bob@keymail.dev", now.Add(time.Hour)); err != nil {
34 t.Fatal(err)
35 }
36 got, _ = GetRetention(ctx, s, "bab", "kass")
37 if got == nil || got.Keep != 30 {
38 t.Fatalf("after overwrite = %+v, want keep 30", got)
39 }
40
41 // Clear: record gone, absent again, and clearing twice is a no-op
42 // (Delete is idempotent by store contract).
43 if err := ClearRetention(ctx, s, "bab", "kass"); err != nil {
44 t.Fatal(err)
45 }
46 if err := ClearRetention(ctx, s, "bab", "kass"); err != nil {
47 t.Fatal(err)
48 }
49 if got, err := GetRetention(ctx, s, "bab", "kass"); err != nil || got != nil {
50 t.Fatalf("after clear = %v, %v; want nil, nil", got, err)
51 }
52}
53
54func TestSetRetentionRefusesBelowFloor(t *testing.T) {
55 s := NewDirStore(t.TempDir())
56 err := SetRetention(context.Background(), s, "bab", "kass", KeepFloor-1, "x", time.Now())
57 if err == nil || !strings.Contains(err.Error(), "20") {
58 t.Fatalf("keep below floor = %v, want an error naming the floor", err)
59 }
60}
61
62// A record that lies about identity is never guessed at (provision.Record's
63// rule): wrong app in the body, or an unknown schema, refuses.
64func TestGetRetentionRefusesLiesAndUnknownSchema(t *testing.T) {
65 ctx := context.Background()
66 s := NewDirStore(t.TempDir())
67 put := func(body string) {
68 if _, err := s.Put(ctx, RetentionKey("bab", "kass"), []byte(body), ""); err != nil {
69 t.Fatal(err)
70 }
71 t.Cleanup(func() { s.Delete(ctx, RetentionKey("bab", "kass")) })
72 }
73 put(`{"schema":1,"app":"other","keep":50,"set_at":"2026-08-10T12:00:00Z"}`)
74 if _, err := GetRetention(ctx, s, "bab", "kass"); err == nil {
75 t.Fatal("a body naming a different app was accepted")
76 }
77 s.Delete(ctx, RetentionKey("bab", "kass"))
78 put(`{"schema":2,"app":"kass","keep":50,"set_at":"2026-08-10T12:00:00Z"}`)
79 if _, err := GetRetention(ctx, s, "bab", "kass"); err == nil {
80 t.Fatal("an unknown schema was accepted")
81 }
82 s.Delete(ctx, RetentionKey("bab", "kass"))
83 // Keep below floor in a stored record is corrupt, not a policy.
84 put(`{"schema":1,"app":"kass","keep":3,"set_at":"2026-08-10T12:00:00Z"}`)
85 if _, err := GetRetention(ctx, s, "bab", "kass"); err == nil {
86 t.Fatal("a stored keep below the floor was accepted")
87 }
88}
89