issue 1858: prove each act and its line in the real store (integration, compiled only)

The lead's try runs it: an act and its line kept together, a failed act keeping neither, correct's three
writes together, the removal of old lines, and handling gone with its entry.
This commit is contained in:
jochen
2026-10-22 19:56:31 +02:00
parent 0e9004664c
commit 4071349078
@@ -269,3 +269,45 @@ func TestPgStoreKeepsTasksPromisesAndReadLater(t *testing.T) {
t.Fatalf("after removing task 1: %+v (%v), want task 2 alone, keeping its number, and no read later", all, err)
}
}
// 1858/AC4, AC7 through the real store: an act and its line are kept together, a failed act keeps neither,
// correct's three writes go together, old lines are removed, and handling goes with its entry.
func TestPgStoreKeepsEachActWithItsLine(t *testing.T) {
ctx := context.Background()
s := preparedStore(t)
at := time.Date(2026, 10, 22, 9, 0, 0, 0, time.UTC)
id, err := s.AddEntry(ctx, Entry{Account: "work", MessageID: "<h@example.com>", Folder: "INBOX", Date: at, Mark: MarkMatters,
Judged: at, Tasks: []Task{{N: 1, Line: "Book the Harbor demo room"}}})
if err != nil {
t.Fatal(err)
}
if err := s.Act(ctx, Handling{Entry: id, Item: "task 1", Handled: at}, ActionLine{What: ActHandled, Entry: id, Item: "task 1", Mode: "work", At: at}); err != nil {
t.Fatal(err)
}
if err := s.Act(ctx, Handling{Entry: id + 99, Item: ItemMail, Handled: at}, ActionLine{What: ActHandled, Entry: id + 99, Item: ItemMail, Mode: "work", At: at}); err != ErrNotFound {
t.Fatalf("an act on no entry: %v, want ErrNotFound", err)
}
hs, _ := s.Handlings(ctx)
lines, _ := s.Actions(ctx, 10)
if len(hs) != 1 || !hs[0].Handled.Equal(at) || len(lines) != 1 || lines[0].Item != "task 1" {
t.Fatalf("handlings %+v, lines %+v; want the one act and its one line", hs, lines)
}
e, _, _ := s.Entry(ctx, id)
e.Mark = MarkNeither
if _, err := s.CorrectEntry(ctx, e, Lesson{SenderAddress: "lena@harbor.example", Change: "mark: matters -> neither", Made: at},
ActionLine{What: ActCorrected, Entry: id, Item: ItemMail, Mode: "work", At: at.Add(time.Minute)}); err != nil {
t.Fatal(err)
}
if lessons, _ := s.Lessons(ctx); len(lessons) != 1 {
t.Fatalf("lessons %+v, want the correction's one", lessons)
}
if removed, err := s.RemoveActionsBefore(ctx, at.Add(30*time.Second)); err != nil || removed != 1 {
t.Fatalf("removed %d (%v), want the one line older than the bound", removed, err)
}
if _, err := s.pool.Exec(ctx, `delete from mail_entry where id = $1`, id); err != nil {
t.Fatal(err)
}
if hs, _ := s.Handlings(ctx); len(hs) != 0 {
t.Fatalf("handlings %+v after their entry went, want none", hs)
}
}