From f987b35a9e2b573f995ce0f111b8b2db8be5e48d Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sun, 22 Mar 2026 18:10:18 +0100 Subject: [PATCH] Add integration tests for discarding dir changes when filtering by path When discarding a directory, we only want to discard those files that are visible in the current filter view. The tests show that this already works correctly for discarding all changes, but it doesn't for discarding only unstaged changes: in this case, untracked files are handled correctly, but changes to tracked files are discarded without respecting the filter. --- .../discard_all_dir_changes_when_filtering.go | 69 ++++++++++++++++ ...ard_unstaged_dir_changes_when_filtering.go | 79 +++++++++++++++++++ pkg/integration/tests/test_list.go | 2 + 3 files changed, 150 insertions(+) create mode 100644 pkg/integration/tests/file/discard_all_dir_changes_when_filtering.go create mode 100644 pkg/integration/tests/file/discard_unstaged_dir_changes_when_filtering.go diff --git a/pkg/integration/tests/file/discard_all_dir_changes_when_filtering.go b/pkg/integration/tests/file/discard_all_dir_changes_when_filtering.go new file mode 100644 index 000000000..6b3ae906e --- /dev/null +++ b/pkg/integration/tests/file/discard_all_dir_changes_when_filtering.go @@ -0,0 +1,69 @@ +package file + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var DiscardAllDirChangesWhenFiltering = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Discarding changes in a directory when filtering by path", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) { + }, + SetupRepo: func(shell *Shell) { + shell.CreateDir("dir") + shell.CreateFileAndAdd("dir/file-one", "original content\n") + shell.CreateFileAndAdd("dir/file-two", "original content\n") + + shell.Commit("first commit") + + shell.UpdateFileAndAdd("dir/file-one", "original content\nnew content\n") + shell.UpdateFileAndAdd("dir/file-two", "original content\nnew content\n") + shell.UpdateFile("dir/file-one", "original content\nnew content\neven newer content\n") + shell.UpdateFile("dir/file-two", "original content\nnew content\neven newer content\n") + + shell.CreateFile("dir/unstaged-file-one", "unstaged file") + shell.CreateFile("dir/unstaged-file-two", "unstaged file") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Files(). + IsFocused(). + Lines( + Equals("▼ dir").IsSelected(), + Equals(" MM file-one"), + Equals(" MM file-two"), + Equals(" ?? unstaged-file-one"), + Equals(" ?? unstaged-file-two"), + ). + Press(keys.Universal.StartSearch). + Tap(func() { + t.ExpectSearch(). + Type("one"). + Confirm() + }). + Lines( + Equals("▼ dir").IsSelected(), + Equals(" MM file-one"), + Equals(" ?? unstaged-file-one"), + ). + Press(keys.Universal.Remove). + Tap(func() { + t.ExpectPopup().Menu(). + Title(Equals("Discard changes")). + Select(Contains("Discard all changes")). + Confirm() + }). + Press(keys.Universal.Return). // Cancel filtering + Lines( + Equals("▼ dir").IsSelected(), + Equals(" MM file-two"), + Equals(" ?? unstaged-file-two"), + ) + + t.FileSystem().FileContent("dir/file-one", Equals("original content\n")) + t.FileSystem().FileContent("dir/file-two", Equals("original content\nnew content\neven newer content\n")) + t.FileSystem().PathNotPresent("dir/unstaged-file-one") + t.FileSystem().FileContent("dir/unstaged-file-two", Equals("unstaged file")) + }, +}) diff --git a/pkg/integration/tests/file/discard_unstaged_dir_changes_when_filtering.go b/pkg/integration/tests/file/discard_unstaged_dir_changes_when_filtering.go new file mode 100644 index 000000000..4996f699e --- /dev/null +++ b/pkg/integration/tests/file/discard_unstaged_dir_changes_when_filtering.go @@ -0,0 +1,79 @@ +package file + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var DiscardUnstagedDirChangesWhenFiltering = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Discarding unstaged changes in a directory when filtering by path", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) { + }, + SetupRepo: func(shell *Shell) { + shell.CreateDir("dir") + shell.CreateFileAndAdd("dir/file-one", "original content\n") + shell.CreateFileAndAdd("dir/file-two", "original content\n") + + shell.Commit("first commit") + + shell.UpdateFileAndAdd("dir/file-one", "original content\nnew content\n") + shell.UpdateFileAndAdd("dir/file-two", "original content\nnew content\n") + shell.UpdateFile("dir/file-one", "original content\nnew content\neven newer content\n") + shell.UpdateFile("dir/file-two", "original content\nnew content\neven newer content\n") + + shell.CreateFile("dir/unstaged-file-one", "unstaged file") + shell.CreateFile("dir/unstaged-file-two", "unstaged file") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Files(). + IsFocused(). + Lines( + Equals("▼ dir").IsSelected(), + Equals(" MM file-one"), + Equals(" MM file-two"), + Equals(" ?? unstaged-file-one"), + Equals(" ?? unstaged-file-two"), + ). + Press(keys.Universal.StartSearch). + Tap(func() { + t.ExpectSearch(). + Type("one"). + Confirm() + }). + Lines( + Equals("▼ dir").IsSelected(), + Equals(" MM file-one"), + Equals(" ?? unstaged-file-one"), + ). + Press(keys.Universal.Remove). + Tap(func() { + t.ExpectPopup().Menu(). + Title(Equals("Discard changes")). + Select(Contains("Discard unstaged changes")). + Confirm() + }). + Press(keys.Universal.Return). // Cancel filtering + Lines( + /* EXPECTED: + Equals("▼ dir").IsSelected(), + Equals(" M file-one"), + Equals(" MM file-two"), + Equals(" ?? unstaged-file-two"), + ACTUAL: */ + Equals("▼ dir").IsSelected(), + Equals(" M file-one"), + Equals(" M file-two"), + Equals(" ?? unstaged-file-two"), + ) + + t.FileSystem().FileContent("dir/file-one", Equals("original content\nnew content\n")) + /* EXPECTED: + t.FileSystem().FileContent("dir/file-two", Equals("original content\nnew content\neven newer content\n")) + ACTUAL: */ + t.FileSystem().FileContent("dir/file-two", Equals("original content\nnew content\n")) + t.FileSystem().PathNotPresent("dir/unstaged-file-one") + t.FileSystem().FileContent("dir/unstaged-file-two", Equals("unstaged file")) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 85183406b..3d8edfb56 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -215,9 +215,11 @@ var tests = []*components.IntegrationTest{ file.CopyMenu, file.DirWithUntrackedFile, file.DiscardAllDirChanges, + file.DiscardAllDirChangesWhenFiltering, file.DiscardRangeSelect, file.DiscardStagedChanges, file.DiscardUnstagedDirChanges, + file.DiscardUnstagedDirChangesWhenFiltering, file.DiscardUnstagedFileChanges, file.DiscardUnstagedRangeSelect, file.DiscardVariousChanges,