package ledger import ( "os" "testing" ) func TestAppendAndRead(t *testing.T) { f, err := os.CreateTemp("", "ledger-test-*.jsonl") if err != nil { t.Fatalf("tempfile: %v", err) } path := f.Name() f.Close() defer os.Remove(path) l := New(path, "stream-1") // ensure empty read evs, err := l.ReadAll() if err != nil { t.Fatalf("read empty: %v", err) } if len(evs) != 0 { t.Fatalf("expected 0 events, got %d", len(evs)) } e1, err := l.Append("route_decision", map[string]any{"tier": "fast"}) if err != nil { t.Fatalf("append1: %v", err) } if l.LastHash == nil || *l.LastHash != e1.Hash { t.Fatalf("lasthash not set after append1") } e2, err := l.Append("final_output_emitted", map[string]any{"result": "ok"}) if err != nil { t.Fatalf("append2: %v", err) } if l.LastHash == nil || *l.LastHash != e2.Hash { t.Fatalf("lasthash not set after append2") } if e2.PrevHash == nil || *e2.PrevHash != e1.Hash { t.Fatalf("prevhash chain broken") } evs, err = l.ReadAll() if err != nil { t.Fatalf("read: %v", err) } if len(evs) != 2 { t.Fatalf("expected 2 events, got %d", len(evs)) } if evs[0].Hash != e1.Hash || evs[1].Hash != e2.Hash { t.Fatalf("readback hashes mismatch") } }