Skip to content

Conversation

@vbreuss
Copy link
Member

@vbreuss vbreuss commented Sep 16, 2025

This pull request fixes directory move notifications in the file system watcher to trigger the correct events based on the destination path. The key change ensures that when a directory is moved outside the watched directory, a delete event is properly triggered instead of a rename event.

Key changes:

  • Fixed notification filter logic to use appropriate filters for different file system object types (files vs directories)
  • Updated path matching logic to properly handle directory moves that cross watched directory boundaries
  • Added comprehensive test coverage for directory move scenarios

@vbreuss vbreuss self-assigned this Sep 16, 2025
Copilot AI review requested due to automatic review settings September 16, 2025 08:04
@vbreuss vbreuss added the bug Something isn't working label Sep 16, 2025
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This pull request fixes directory move notifications in the file system watcher to trigger the correct events based on the destination path. The key change ensures that when a directory is moved outside the watched directory, a delete event is properly triggered instead of a rename event.

  • Fixed notification filter logic to use appropriate filters for different file system object types (files vs directories)
  • Updated path matching logic to properly handle directory moves that cross watched directory boundaries
  • Added comprehensive test coverage for directory move scenarios

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
Tests/Testably.Abstractions.Tests/FileSystem/FileSystemWatcher/NotifyFiltersTests.cs Added new test cases for directory move operations within and outside watched directories
Source/Testably.Abstractions.Testing/Storage/InMemoryStorage.cs Fixed notification filter to use type-appropriate filters instead of hardcoded FileName filter
Source/Testably.Abstractions.Testing/FileSystem/FileSystemWatcherMock.cs Updated path matching and event triggering logic to handle directory moves across watched boundaries

@github-actions
Copy link

Test Results

    37 files  ± 0      37 suites  ±0   29m 46s ⏱️ + 9m 5s
44 418 tests +60  41 955 ✅ +26  2 429 💤 ±0  34 ❌ +34 
86 165 runs  +64  77 088 ✅ +30  9 043 💤 ±0  34 ❌ +34 

For more details on these failures, see this check.

Results for commit d8fc93f. ± Comparison against base commit df2e064.

This pull request removes 36390 and adds 36450 tests. Note that renamed tests count towards both.
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path2f0c9b4d-dae5-4ab6-a980-85c614807ecf")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path4482c7c4-6f45-4c88-b44d-ac9ae207a58b")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path50b2a456-c9a4-4932-bf5f-d65b1ff97663")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path801fba0b-6073-4d9c-b82f-405e957c3cee")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path93260eef-6c2b-49fd-8355-9e2e98d70e07")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathddaa5ad7-5a89-4e19-adf0-1a1247e01831")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdf6063e9-4ae4-4ba2-aa2f-359b8fec544c")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path002d21a1-122b-49c1-8053-cd04ad118114")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path1dbe5460-ee6d-41f9-824b-3f56b3a317fd")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path5358a420-6af6-4408-aaf7-4f73b3f0c942")
…
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path3c756eff-a313-44c0-991c-4974a6eafaa2")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path3d88a48d-59f3-4fb7-a4de-e7788ea51dbc")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path996a83c0-e49d-4b02-a73b-5541a763f1af")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathbde765d0-9e09-4f2d-bb5c-936122a1985e")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdab65539-71d4-4e64-81c2-1837335733ea")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe6f03ece-de10-4728-a425-bc2652b8fc9d")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathfdec6b6d-a55a-4421-9e98-8865d24a0e71")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path0081552e-1ef6-4a04-a42d-0b691fdeca7d")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path022a6921-014a-4373-b088-83fbbf2392d2")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path78134b8e-9aec-4a11-8f1a-a486255e6d5a")
…
This pull request removes 1784 skipped tests and adds 1784 skipped tests. Note that renamed tests count towards both.
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path50b2a456-c9a4-4932-bf5f-d65b1ff97663")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path93260eef-6c2b-49fd-8355-9e2e98d70e07")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathddaa5ad7-5a89-4e19-adf0-1a1247e01831")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdf6063e9-4ae4-4ba2-aa2f-359b8fec544c")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path002d21a1-122b-49c1-8053-cd04ad118114")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path5358a420-6af6-4408-aaf7-4f73b3f0c942")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathfbaf4889-a88c-41a9-963d-71fc0dc5978f")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathff00a852-4aaa-4518-9c1c-86eaae0f79d7")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path57612453-1fa2-4ae4-895c-614c0ea6c891")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path85ffc0d8-7b98-4d06-b201-11ee8061ee52")
…
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path3c756eff-a313-44c0-991c-4974a6eafaa2")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathbde765d0-9e09-4f2d-bb5c-936122a1985e")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdab65539-71d4-4e64-81c2-1837335733ea")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathfdec6b6d-a55a-4421-9e98-8865d24a0e71")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path78134b8e-9aec-4a11-8f1a-a486255e6d5a")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path7c943b8c-9fb5-42e9-99d4-a021266f31e9")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe65880dc-2af4-45f5-b8f8-3c4e2282767e")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathfba1f53f-1b59-4083-93bc-ddcb7c7c7f65")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path08cddcca-03b4-4d92-8c05-3ad842ca9f21")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path27690faa-68d3-4c6a-b214-f928a3f515d6")
…

@sonarqubecloud
Copy link

@vbreuss vbreuss enabled auto-merge (squash) September 16, 2025 09:35
@vbreuss vbreuss merged commit 0fc6b7d into main Sep 16, 2025
13 checks passed
@vbreuss vbreuss deleted the topic/fix-directory-move-in-filesystemwatcher branch September 16, 2025 09:38
@github-actions
Copy link

This is addressed in release v4.3.8.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working state: released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DirectoryMock.Move doesn't raise FileSystemWatcher.Renamed if NotifyFilters.DirectoryName is set

2 participants