-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWidgetTodoSnapshotRepositoryImplTests.swift
More file actions
169 lines (146 loc) · 5.15 KB
/
Copy pathWidgetTodoSnapshotRepositoryImplTests.swift
File metadata and controls
169 lines (146 loc) · 5.15 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//
// WidgetTodoSnapshotRepositoryImplTests.swift
// DevLogDataTests
//
// Created by opfic on 6/8/26.
//
import Foundation
import Testing
import DevLogCore
import DevLogDomain
@testable import DevLogData
struct WidgetTodoSnapshotRepositoryImplTests {
@Test("Today 위젯 Todo 조회는 기존 TodoRepository query와 snapshot 매핑을 사용한다")
func today_위젯_todo_조회는_기존_todorepository_query와_snapshot_매핑을_사용한다() async throws {
let repositorySpy = TodoRepositorySpy()
let repository = WidgetTodoSnapshotRepositoryImpl(repository: repositorySpy)
let now = Date(timeIntervalSince1970: 100)
let todo = makeTodo(id: "today", createdAt: now, dueDate: now)
await repositorySpy.setTodos([todo], for: .dueDate)
let snapshots = try await repository.fetchTodayTodos(
dueDateFilter: .withDueDate,
sortTarget: .dueDate,
sortOrder: .oldest,
pageSize: 100
)
let queries = await repositorySpy.calledQueries()
#expect(snapshots == [makeSnapshot(id: "today", createdAt: now, dueDate: now)])
#expect(queries == [
TodoQuery(
completionFilter: .incomplete,
dueDateFilter: .withDueDate,
sortTarget: .dueDate,
sortOrder: .oldest,
pageSize: 100,
fetchAllPages: true
)
])
}
@Test("Heatmap 위젯 Todo 조회는 기존 TodoRepository query와 snapshot 매핑을 사용한다")
func heatmap_위젯_todo_조회는_기존_todorepository_query와_snapshot_매핑을_사용한다() async throws {
let repositorySpy = TodoRepositorySpy()
let repository = WidgetTodoSnapshotRepositoryImpl(repository: repositorySpy)
let quarterStart = Date(timeIntervalSince1970: 100)
let nextQuarterStart = Date(timeIntervalSince1970: 200)
let todo = makeTodo(id: "created", createdAt: quarterStart)
await repositorySpy.setTodos([todo], for: .createdAt)
let snapshots = try await repository.fetchHeatmapTodos(
sortTarget: .createdAt,
quarterStart: quarterStart,
nextQuarterStart: nextQuarterStart,
pageSize: 100
)
let queries = await repositorySpy.calledQueries()
#expect(snapshots == [makeSnapshot(id: "created", createdAt: quarterStart)])
#expect(queries == [
TodoQuery(
sortDateFrom: quarterStart,
sortDateTo: nextQuarterStart,
includesDeleted: true,
sortTarget: .createdAt,
pageSize: 100,
fetchAllPages: true
)
])
}
private func makeTodo(
id: String,
createdAt: Date,
completedAt: Date? = nil,
deletedAt: Date? = nil,
dueDate: Date? = nil
) -> Todo {
Todo(
id: id,
isPinned: false,
isCompleted: completedAt != nil,
isChecked: false,
number: 1,
title: id,
content: "",
createdAt: createdAt,
updatedAt: createdAt,
completedAt: completedAt,
deletedAt: deletedAt,
dueDate: dueDate,
tags: [],
category: .system(.feature)
)
}
private func makeSnapshot(
id: String,
createdAt: Date,
completedAt: Date? = nil,
deletedAt: Date? = nil,
dueDate: Date? = nil
) -> WidgetTodoSnapshot {
WidgetTodoSnapshot(
id: id,
number: 1,
title: id,
isPinned: false,
createdAt: createdAt,
completedAt: completedAt,
deletedAt: deletedAt,
dueDate: dueDate
)
}
}
private actor TodoRepositorySpy: TodoRepository {
private var queries = [TodoQuery]()
private var todosBySortTarget = [TodoQuery.SortTarget: [Todo]]()
func setTodos(_ todos: [Todo], for sortTarget: TodoQuery.SortTarget) {
todosBySortTarget[sortTarget] = todos
}
func fetchTodos(_ query: TodoQuery, cursor: TodoCursor?) async throws -> TodoPage {
queries.append(query)
return TodoPage(
items: todosBySortTarget[query.sortTarget] ?? [],
nextCursor: nil
)
}
func fetchTodo(_ todoId: String) async throws -> Todo {
throw TodoRepositorySpyError.unexpectedCall
}
func fetchReferences(_ numbers: [Int]) async throws -> [Int: TodoReference] {
throw TodoRepositorySpyError.unexpectedCall
}
func upsertTodo(_ todo: Todo) async throws {
throw TodoRepositorySpyError.unexpectedCall
}
func upsertTodo(_ todoDraft: TodoDraft) async throws {
throw TodoRepositorySpyError.unexpectedCall
}
func deleteTodo(_ todoId: String) async throws {
throw TodoRepositorySpyError.unexpectedCall
}
func undoDeleteTodo(_ todoId: String) async throws {
throw TodoRepositorySpyError.unexpectedCall
}
func calledQueries() -> [TodoQuery] {
queries
}
}
private enum TodoRepositorySpyError: Error {
case unexpectedCall
}