package host import ( "context" "testing" "time" "github.com/carlosframework/platform/internal/apperr" "github.com/carlosframework/platform/internal/applog" "github.com/carlosframework/platform/internal/release" ) func TestErrshipFlushWritesOneChunkPerApp(t *testing.T) { s := release.NewDirStore(t.TempDir()) now := time.Date(2026, 9, 7, 10, 0, 0, 0, time.UTC) sink := apperr.NewSink("box1", func() time.Time { return now }) sink.Add("bab", "web", apperr.Record{Source: apperr.SourceEdge, Kind: apperr.KindHTTP, Name: "500 GET /x", Host: "h1"}) sink.Add("bab", "web", apperr.Record{Source: apperr.SourceEdge, Kind: apperr.KindHTTP, Name: "500 GET /x", Host: "h1"}) pending := map[applog.AppKey][]apperr.Record{} errshipGather(sink, pending) errshipFlush(context.Background(), s, pending) if len(pending) != 0 { t.Fatalf("pending after flush = %d", len(pending)) } recs, _, err := apperr.ReadWindow(context.Background(), s, "bab", "web", apperr.Filter{Since: now.Add(-time.Minute)}, 100) if err != nil || len(recs) != 1 || recs[0].Count != 2 { t.Fatalf("read back = %+v, %v", recs, err) } } func TestErrshipFlushHoldsOnFailure(t *testing.T) { pending := map[applog.AppKey][]apperr.Record{{Acct: "bab", App: "web"}: {{TS: time.Now(), Source: apperr.SourceEdge, Name: "x", FP: "f", Box: "box1", Seq: 1}}} errshipFlush(context.Background(), failingStore{}, pending) if len(pending) != 1 { t.Fatal("a failed flush must keep its records for the next round") } }