diff options
| -rw-r--r-- | Sora/Views/FavoritesView.swift | 9 | ||||
| -rw-r--r-- | Sora/Views/Generic/GenericListView.swift | 9 | ||||
| -rw-r--r-- | SoraTests/ViewDerivedDataTests.swift | 36 |
3 files changed, 48 insertions, 6 deletions
diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift index 1217441..1ca41d0 100644 --- a/Sora/Views/FavoritesView.swift +++ b/Sora/Views/FavoritesView.swift @@ -636,9 +636,12 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length } } - Button { - settings.removeFavorite(withID: favorite.id) - } label: { + Button( + role: .destructive, + action: { + settings.removeFavorite(withID: favorite.id) + } + ) { Label("Delete", systemImage: "trash") } } diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift index ac65da3..476bbc1 100644 --- a/Sora/Views/Generic/GenericListView.swift +++ b/Sora/Views/Generic/GenericListView.swift @@ -554,9 +554,12 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { } } - Button { - removeActionUUID(item.id) - } label: { + Button( + role: .destructive, + action: { + removeActionUUID(item.id) + } + ) { Label("Delete", systemImage: "trash") } } diff --git a/SoraTests/ViewDerivedDataTests.swift b/SoraTests/ViewDerivedDataTests.swift index 3a1d8df..32e9276 100644 --- a/SoraTests/ViewDerivedDataTests.swift +++ b/SoraTests/ViewDerivedDataTests.swift @@ -361,6 +361,42 @@ final class ViewDerivedDataTests: XCTestCase { // swiftlint:disable:this type_b ) } + func testFavoritesDeleteActionUsesDestructiveRole() throws { + let source = try loadSource(at: "Sora/Views/FavoritesView.swift") + let functionSource = try extractFunction( + named: "private func favoriteGridContent(", + from: source + ) + let destructiveDeleteActionCount = tokenCount( + matching: + #"role:\s*\.destructive[\s\S]*Label\(\s*"Delete"\s*,\s*systemImage:\s*"trash"\s*\)"#, + in: functionSource + ) + + // swiftlint:disable:next prefer_nimble + XCTAssertGreaterThan( + destructiveDeleteActionCount, + 0, + "Favorite context menu delete action should be explicitly destructive." + ) + } + + func testGenericListDeleteActionUsesDestructiveRole() throws { + let source = try loadSource(at: "Sora/Views/Generic/GenericListView.swift") + let destructiveDeleteActionCount = tokenCount( + matching: + #"role:\s*\.destructive[\s\S]*Label\(\s*"Delete"\s*,\s*systemImage:\s*"trash"\s*\)"#, + in: source + ) + + // swiftlint:disable:next prefer_nimble + XCTAssertGreaterThan( + destructiveDeleteActionCount, + 0, + "Generic list context menu delete action should be explicitly destructive." + ) + } + func testListViewsAvoidComparatorRandomShuffleSorting() throws { let listViewSource = try loadSource(at: "Sora/Views/Generic/GenericListView.swift") let favoritesViewSource = try loadSource(at: "Sora/Views/FavoritesView.swift") |