From b34691777d7a5b851f55a3d1085fdb8df9a07f32 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sun, 4 Oct 2026 16:21:28 +0200 Subject: [PATCH] Add a test for the task that ReadToEnd holds while it calls back ReadToEnd marks its task as done before it calls then. Its callers enqueue their follow-up work onto the UI thread from then, so for a moment in between, no task is busy. Co-Authored-By: Claude Opus 5.5 (1M context) --- pkg/tasks/tasks_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/tasks/tasks_test.go b/pkg/tasks/tasks_test.go index c50a54cac..2c2806b8e 100644 --- a/pkg/tasks/tasks_test.go +++ b/pkg/tasks/tasks_test.go @@ -522,3 +522,28 @@ func TestQueuedReadRequestsAreAnsweredWhenTheTaskStops(t *testing.T) { assert.EqualValues(t, 2, answered.Load()) } + +// The callers of ReadToEnd hand their follow-up work to the UI thread from then, and +// that work holds a task of its own from the moment it is enqueued. If the task that +// ReadToEnd holds were done before then runs, lazygit would count as idle for a moment +// in between, and an integration test would carry on before the follow-up work is done. +func TestReadToEndHoldsItsTaskUntilThenReturns(t *testing.T) { + noop := func() {} + task := gocui.NewFakeTask() + + manager := NewViewBufferManager( + utils.NewDummyLog(), bytes.NewBuffer(nil), noop, noop, noop, noop, noop, noop, + func() gocui.Task { return task }, + func(f func()) error { f(); return nil }, + ) + + // With no command task serving read requests, ReadToEnd answers right away. + var statusDuringThen gocui.TaskStatus + manager.ReadToEnd(func() { statusDuringThen = task.Status() }) + + /* EXPECTED: + assert.Equal(t, gocui.TaskStatusBusy, statusDuringThen) + ACTUAL: */ + assert.Equal(t, gocui.TaskStatusDone, statusDuringThen) + assert.Equal(t, gocui.TaskStatusDone, task.Status()) +}