-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathSiteEntityQueryTests.swift
More file actions
132 lines (101 loc) · 4.19 KB
/
Copy pathSiteEntityQueryTests.swift
File metadata and controls
132 lines (101 loc) · 4.19 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
127
128
129
130
131
132
import Foundation
import Testing
@testable import JetpackStatsWidgetsCore
@Suite
struct SiteEntityQueryTests {
/// Uses the `xctest` app-group prefix so `HomeWidgetCache` writes to a temporary
/// directory instead of a real security application group.
private let appGroup =
"\(HomeWidgetCache<HomeWidgetTodayData>.testAppGroupNamePrefix).site-entity-query.\(UUID().uuidString)"
private var cache: HomeWidgetCache<HomeWidgetTodayData> {
HomeWidgetCache<HomeWidgetTodayData>(appGroup: appGroup)
}
private var query: SiteEntityQuery {
SiteEntityQuery(appGroup: appGroup)
}
private func populateCache(_ sites: [HomeWidgetTodayData]) throws {
try cache.write(items: Dictionary(uniqueKeysWithValues: sites.map { ($0.siteID, $0) }))
}
private func makeSite(siteID: Int, name: String, url: String = "https://example.com") -> HomeWidgetTodayData {
HomeWidgetTodayData(
siteID: siteID,
siteName: name,
url: url,
timeZone: .current,
date: Date(),
stats: TodayWidgetStats(views: 0, visitors: 0, likes: 0, comments: 0)
)
}
// MARK: - Entity mapping
@Test
func entityFieldsMapFromWidgetData() async throws {
try populateCache([
makeSite(siteID: 1234567, name: "My Test Site", url: "https://mytestsite.wordpress.com/some/path")
])
let entities = try await query.entities(for: ["1234567"])
let entity = try #require(entities.first)
#expect(entity.id == "1234567")
#expect(entity.name == "My Test Site")
#expect(entity.domain == "mytestsite.wordpress.com")
}
@Test
func entityDomainIsNilForUnparseableURL() async throws {
try populateCache([makeSite(siteID: 1, name: "Broken", url: "")])
let entities = try await query.entities(for: ["1"])
let entity = try #require(entities.first)
#expect(entity.domain == nil)
}
// MARK: - entities(for:)
@Test
func entitiesForIdentifiersResolvesCachedSites() async throws {
try populateCache([
makeSite(siteID: 1, name: "Alpha"),
makeSite(siteID: 2, name: "Beta"),
makeSite(siteID: 3, name: "Gamma")
])
let entities = try await query.entities(for: ["1", "3"])
#expect(entities.map(\.id) == ["1", "3"])
#expect(entities.map(\.name) == ["Alpha", "Gamma"])
}
/// A configured site must never silently resolve to nothing (the widget would
/// fall back to the default site): identifiers missing from the cache are
/// preserved as placeholder entities.
@Test
func entitiesForIdentifiersPreservesUnknownIdentifiers() async throws {
try populateCache([makeSite(siteID: 1, name: "Alpha")])
let entities = try await query.entities(for: ["1", "999"])
#expect(entities.map(\.id) == ["1", "999"])
#expect(entities.first?.name == "Alpha")
#expect(entities.last?.name == "999")
}
@Test
func entitiesForIdentifiersPreservesIdentifiersWhenCacheIsMissing() async throws {
let entities = try await query.entities(for: ["1"])
#expect(entities.map(\.id) == ["1"])
}
// MARK: - suggestedEntities()
@Test
func suggestedEntitiesReturnsAllCachedSitesSortedByName() async throws {
try populateCache([
makeSite(siteID: 3, name: "zebra"),
makeSite(siteID: 1, name: "Apple"),
makeSite(siteID: 2, name: "mango")
])
let entities = try await query.suggestedEntities()
#expect(entities.map(\.name) == ["Apple", "mango", "zebra"])
}
@Test
func suggestedEntitiesBreaksNameTiesByDomain() async throws {
try populateCache([
makeSite(siteID: 1, name: "Same Name", url: "https://zzz.example.com"),
makeSite(siteID: 2, name: "Same Name", url: "https://aaa.example.com")
])
let entities = try await query.suggestedEntities()
#expect(entities.map(\.id) == ["2", "1"])
}
@Test
func suggestedEntitiesIsEmptyWhenCacheIsMissing() async throws {
let entities = try await query.suggestedEntities()
#expect(entities.isEmpty)
}
}