test(daemon): cover coordinator publication gaps
- commit
- 7c1f5df80d8c24ff52369281b91cf2dbaa1df74c
- author
- brice · · 2026-07-11 20:00 UTC
- parent
- 25059b8
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +32 -2
A internal/usecase/daemon/render_coordinator_publication_test.go +28 -0
| @@ -0,0 +1,28 @@ | |||
| 1 | + | package daemon | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "testing" | |
| 5 | + | ||
| 6 | + | "github.com/stretchr/testify/require" | |
| 7 | + | ) | |
| 8 | + | ||
| 9 | + | func TestCoordinatorRejectsStaleAttachmentInvalidationAfterReplacement(t *testing.T) { | |
| 10 | + | var invalidations []renderInvalidation | |
| 11 | + | rc := newRenderCoordinator(renderCoordinatorOptions{ | |
| 12 | + | onInvalidate: func(inv renderInvalidation) { invalidations = append(invalidations, inv) }, | |
| 13 | + | }) | |
| 14 | + | old := &attachedClient{} | |
| 15 | + | replacement := &attachedClient{} | |
| 16 | + | rc.attach(old) | |
| 17 | + | rc.noteReplace(old, replacement) | |
| 18 | + | ||
| 19 | + | // This models a PR #71 resize callback that passed its sendMu generation | |
| 20 | + | // check immediately before a replacement was published. | |
| 21 | + | rc.invalidateForAttachment(old, renderInvalidation{producer: "stale resize"}) | |
| 22 | + | require.Empty(t, invalidations) | |
| 23 | + | ||
| 24 | + | // Pane/session producers carry no attachment and remain coordinator-owned. | |
| 25 | + | rc.invalidateForAttachment(nil, renderInvalidation{producer: "pane"}) | |
| 26 | + | require.Len(t, invalidations, 1) | |
| 27 | + | require.Equal(t, "pane", invalidations[0].producer) | |
| 28 | + | } | |
| @@ -0,0 +1,28 @@ | |||||
| 1 | + | package daemon | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "testing" | |||
| 5 | + | ||||
| 6 | + | "github.com/stretchr/testify/require" | |||
| 7 | + | ) | |||
| 8 | + | ||||
| 9 | + | func TestCoordinatorRejectsStaleAttachmentInvalidationAfterReplacement(t *testing.T) { | |||
| 10 | + | var invalidations []renderInvalidation | |||
| 11 | + | rc := newRenderCoordinator(renderCoordinatorOptions{ | |||
| 12 | + | onInvalidate: func(inv renderInvalidation) { invalidations = append(invalidations, inv) }, | |||
| 13 | + | }) | |||
| 14 | + | old := &attachedClient{} | |||
| 15 | + | replacement := &attachedClient{} | |||
| 16 | + | rc.attach(old) | |||
| 17 | + | rc.noteReplace(old, replacement) | |||
| 18 | + | ||||
| 19 | + | // This models a PR #71 resize callback that passed its sendMu generation | |||
| 20 | + | // check immediately before a replacement was published. | |||
| 21 | + | rc.invalidateForAttachment(old, renderInvalidation{producer: "stale resize"}) | |||
| 22 | + | require.Empty(t, invalidations) | |||
| 23 | + | ||||
| 24 | + | // Pane/session producers carry no attachment and remain coordinator-owned. | |||
| 25 | + | rc.invalidateForAttachment(nil, renderInvalidation{producer: "pane"}) | |||
| 26 | + | require.Len(t, invalidations, 1) | |||
| 27 | + | require.Equal(t, "pane", invalidations[0].producer) | |||
| 28 | + | } | |||
M internal/usecase/daemon/render_coordinator_test.go +4 -2
| @@ -1315,11 +1315,13 @@ func TestRenderCoordinatorRetainsPR71ResizeDispatch(t *testing.T) { | |||
| 1315 | 1315 | clk := newCoordinatorMockClock(t, 4) | |
| 1316 | 1316 | d.clock = clk.clock | |
| 1317 | 1317 | invs := make(chan renderInvalidation, 4) | |
| 1318 | - | sess.installRenderCoordinator(newRenderCoordinator(renderCoordinatorOptions{ | |
| 1318 | + | rc := newRenderCoordinator(renderCoordinatorOptions{ | |
| 1319 | 1319 | clock: clk.clock, | |
| 1320 | 1320 | wake: func(renderWake) {}, | |
| 1321 | 1321 | onInvalidate: func(inv renderInvalidation) { invs <- inv }, | |
| 1322 | - | })) | |
| 1322 | + | }) | |
| 1323 | + | rc.attach(ac) | |
| 1324 | + | sess.installRenderCoordinator(rc) | |
| 1323 | 1325 | return d, sess, ac, sends, clk, invs | |
| 1324 | 1326 | } | |
| 1325 | 1327 | ||
| @@ -1315,11 +1315,13 @@ func TestRenderCoordinatorRetainsPR71ResizeDispatch(t *testing.T) { | |||||
| 1315 | clk := newCoordinatorMockClock(t, 4) | 1315 | clk := newCoordinatorMockClock(t, 4) | ||
| 1316 | d.clock = clk.clock | 1316 | d.clock = clk.clock | ||
| 1317 | invs := make(chan renderInvalidation, 4) | 1317 | invs := make(chan renderInvalidation, 4) | ||
| 1318 | - | sess.installRenderCoordinator(newRenderCoordinator(renderCoordinatorOptions{ | 1318 | + | rc := newRenderCoordinator(renderCoordinatorOptions{ |
| 1319 | clock: clk.clock, | 1319 | clock: clk.clock, | ||
| 1320 | wake: func(renderWake) {}, | 1320 | wake: func(renderWake) {}, | ||
| 1321 | onInvalidate: func(inv renderInvalidation) { invs <- inv }, | 1321 | onInvalidate: func(inv renderInvalidation) { invs <- inv }, | ||
| 1322 | - | })) | 1322 | + | }) |
| 1323 | + | rc.attach(ac) | |||
| 1324 | + | sess.installRenderCoordinator(rc) | |||
| 1323 | return d, sess, ac, sends, clk, invs | 1325 | return d, sess, ac, sends, clk, invs | ||
| 1324 | } | 1326 | } | ||
| 1325 | 1327 | ||||