Notes move both ways, and prove a deleted table takes its cells with it
build-and-publish / build (pull_request) Successful in 2m2s

Two small things found reading it back: a note could be moved up but not down, and nothing exercised
`remove` against the real foreign keys — a delete that strands its children fails in Postgres rather
than in memory, and it's a button on the screen.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
2026-07-26 15:16:09 -05:00
co-authored by Claude Opus 5
parent 748b1cd59b
commit eb5f75bc9d
2 changed files with 25 additions and 0 deletions
@@ -87,6 +87,15 @@ const Notes = ({
>
<Icon d={ARROW_UP} />
</button>
<button
type="button"
className={iconButton}
disabled={disabled || i === notes.length - 1}
onClick={() => onChange(shift(notes, i, 1))}
aria-label="Move note down"
>
<Icon d={ARROW_DOWN} />
</button>
<button
type="button"
className={iconButton}
@@ -204,6 +204,22 @@ class CateringMenuTest {
.contains("Holiday boxes");
}
@Test
void deletingATableTakesItsColumnsLinesAndCellsWithIt() {
CateringMenu.PackageView weddings = catering.everything().packages().get(2);
catering.remove(weddings.id());
// Flushed on purpose: a delete that leaves its children behind fails against the real foreign
// keys, not in memory, and this one is a button on the admin screen.
entityManager.flush();
entityManager.clear();
assertThat(catering.everything().packages()).extracting(CateringMenu.PackageView::name)
.containsExactly("Office", "Parties");
// The page's own terms outlive any one table.
assertThat(catering.menu().notes()).hasSize(2);
}
@Test
void putsTheTablesWhereTheEditorLeftThem() {
List<CateringMenu.PackageView> tables = catering.everything().packages();