forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAppsPageSearchResultsPresentationTests.swift
More file actions
126 lines (111 loc) · 3.66 KB
/
Copy pathAppsPageSearchResultsPresentationTests.swift
File metadata and controls
126 lines (111 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import XCTest
@testable import Omi_Computer
@MainActor
final class AppsPageSearchResultsPresentationTests: XCTestCase {
func testEmptyResultsAppearOnlyAfterACompletedQuery() {
for state in [AppFilterResultsQueryState.unknown, .loading, .failed] {
XCTAssertNotEqual(
AppsFilteredResultsPresentation.resolve(queryState: state, resultsCount: 0),
.empty,
"\(state) must not be rendered as an empty search result"
)
}
XCTAssertEqual(
AppsFilteredResultsPresentation.resolve(queryState: .completed, resultsCount: 0),
.empty
)
}
func testPendingSearchUsesLoadingPresentationBeforeResultsArrive() {
XCTAssertEqual(
AppsFilteredResultsPresentation.resolve(queryState: .unknown, resultsCount: 0),
.loading
)
XCTAssertEqual(
AppsFilteredResultsPresentation.resolve(queryState: .loading, resultsCount: 0),
.loading
)
XCTAssertEqual(
AppsFilteredResultsPresentation.resolve(queryState: .completed, resultsCount: 1),
.results
)
}
func testAllCatalogSearchAggregatesOnlyVisibleGroups() {
XCTAssertEqual(
AppsAllSearchPresentation.resolve(
importsCount: 1,
exportsCount: 2,
appsCount: 4,
marketplace: .results
),
.results(total: 7))
// Marketplace loading/failed states do not contribute cards to the All
// presentation. Local matches still render while that group resolves.
XCTAssertEqual(
AppsAllSearchPresentation.resolve(
importsCount: 1,
exportsCount: 0,
appsCount: 4,
marketplace: .loading
),
.results(total: 1))
XCTAssertEqual(
AppsAllSearchPresentation.resolve(
importsCount: 0,
exportsCount: 0,
appsCount: 4,
marketplace: .failure
),
.failure)
}
func testAllCatalogSearchUsesOneGlobalEmptyStateWhenEveryGroupIsEmpty() {
XCTAssertEqual(
AppsAllSearchPresentation.resolve(
importsCount: 0,
exportsCount: 0,
appsCount: 0,
marketplace: .empty
),
.empty)
XCTAssertEqual(
AppsAllSearchPresentation.resolve(
importsCount: 0,
exportsCount: 0,
appsCount: 0,
marketplace: .results
),
.empty)
}
func testExportSearchTrimsWhitespaceAndRanksExactTitlesFirst() {
let results = MemoryExportCatalog.matching(" notion ")
XCTAssertEqual(results.first?.destination, .notion)
XCTAssertTrue(
results.allSatisfy { entry in
[entry.resolvedTitle, entry.resolvedSubtitle, entry.resolvedDescription]
.contains { $0.localizedCaseInsensitiveContains("notion") }
})
}
func testChangingAFilterInvalidatesPreviouslyDisplayedResults() {
let provider = AppProvider()
provider.filteredApps = []
provider.hasMoreFilteredApps = true
provider.searchQuery = "calendar"
XCTAssertNil(provider.filteredApps)
XCTAssertFalse(provider.hasMoreFilteredApps)
XCTAssertEqual(provider.filteredAppsQueryState, .unknown)
}
func testClearingIndividualMarketplaceRefinementsPreservesSearchText() {
let provider = AppProvider()
provider.searchQuery = "notion"
provider.selectedCategory = "productivity"
provider.selectedCapability = "chat"
provider.showInstalledOnly = true
provider.clearCategoryFilter()
provider.selectedCapability = nil
provider.showInstalledOnly = false
XCTAssertEqual(provider.searchQuery, "notion")
XCTAssertTrue(provider.hasActiveFilters, "the preserved query remains an active search")
XCTAssertNil(provider.selectedCategory)
XCTAssertNil(provider.selectedCapability)
XCTAssertFalse(provider.showInstalledOnly)
}
}