Todo repository protocol #8
@@ -1,5 +1,3 @@
|
|||||||
import Foundation
|
|
||||||
import SwiftData
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import Testing
|
import Testing
|
||||||
|
|
||||||
@@ -91,43 +89,59 @@ struct TaskListViewModelTests {
|
|||||||
|
|
||||||
// MARK: Method tests
|
// MARK: Method tests
|
||||||
|
|
||||||
@Test("deleteTasks removes a single task from model context")
|
@Test("delete removes a single todo task from repository")
|
||||||
func deleteTasksSingle() throws {
|
func deleteSingleTodo() {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
let container = try ModelContainer(
|
let todos: [Todo] = [
|
||||||
for: Todo.self,
|
|
||||||
configurations: .init(isStoredInMemoryOnly: true)
|
|
||||||
)
|
|
||||||
let context = ModelContext(container)
|
|
||||||
|
|
||||||
let viewModel = TaskListView.ViewModel(group: .today)
|
|
||||||
let todosToInsert: [Todo] = [
|
|
||||||
.init(title: "Task 1", due: .now, order: 0),
|
.init(title: "Task 1", due: .now, order: 0),
|
||||||
.init(title: "Task 2", due: .now, order: 1),
|
.init(title: "Task 2", due: .now, order: 1),
|
||||||
.init(title: "Task 3", due: .now, order: 2),
|
.init(title: "Task 3", due: .now, order: 2),
|
||||||
]
|
]
|
||||||
let countInitial = todosToInsert.count
|
let repository = MockTodoRepository(todos: todos)
|
||||||
|
let viewModel = TaskListView.ViewModel(group: .today)
|
||||||
for todo in todosToInsert {
|
|
||||||
context.insert(todo)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WHEN
|
// WHEN
|
||||||
viewModel.deleteTasks(
|
viewModel.delete(
|
||||||
todosToInsert,
|
todos,
|
||||||
at: IndexSet(integer: 1),
|
at: IndexSet(integer: 1),
|
||||||
from: context
|
from: repository
|
||||||
)
|
)
|
||||||
|
|
||||||
// THEN
|
// THEN
|
||||||
let descriptor = FetchDescriptor<Todo>()
|
#expect(repository.todos.count == 2)
|
||||||
let todos = try context.fetch(descriptor)
|
#expect(repository.todos.contains { $0.title == "Task 1" })
|
||||||
|
#expect(repository.todos.contains { $0.title == "Task 3" })
|
||||||
|
#expect(!repository.todos.contains { $0.title == "Task 2" })
|
||||||
|
}
|
||||||
|
|
||||||
#expect(countInitial == 3)
|
@Test("delete removes multiple todo tasks from repository")
|
||||||
#expect(todos.count == 2)
|
func deleteMultipleTodos() {
|
||||||
#expect(todos.contains(where: { $0.title == "Task 1" }))
|
// GIVEN
|
||||||
#expect(todos.contains(where: { $0.title == "Task 3" }))
|
let todos: [Todo] = [
|
||||||
#expect(!todos.contains(where: { $0.title == "Task 2" }))
|
.init(title: "Task 1", due: .now, order: 0),
|
||||||
|
.init(title: "Task 2", due: .now, order: 1),
|
||||||
|
.init(title: "Task 3", due: .now, order: 2),
|
||||||
|
.init(title: "Task 4", due: .now, order: 3),
|
||||||
|
.init(title: "Task 5", due: .now, order: 4),
|
||||||
|
]
|
||||||
|
|
||||||
|
let repository = MockTodoRepository(todos: todos)
|
||||||
|
let viewModel = TaskListView.ViewModel(group: .today)
|
||||||
|
|
||||||
|
// WHEN
|
||||||
|
viewModel.delete(
|
||||||
|
todos,
|
||||||
|
at: IndexSet([1, 3]),
|
||||||
|
from: repository
|
||||||
|
)
|
||||||
|
|
||||||
|
// THEN
|
||||||
|
#expect(repository.todos.count == 3)
|
||||||
|
#expect(repository.todos.contains { $0.title == "Task 1" })
|
||||||
|
#expect(repository.todos.contains { $0.title == "Task 3" })
|
||||||
|
#expect(repository.todos.contains { $0.title == "Task 5" })
|
||||||
|
#expect(!repository.todos.contains { $0.title == "Task 2" })
|
||||||
|
#expect(!repository.todos.contains { $0.title == "Task 4" })
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test("reorderTasks updates order property when moving task forward")
|
@Test("reorderTasks updates order property when moving task forward")
|
||||||
@@ -180,7 +194,7 @@ struct TaskListViewModelTests {
|
|||||||
#expect(tasks[3].order == 1)
|
#expect(tasks[3].order == 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test("toggleCompletedVisbility toggles the showCompleted property")
|
@Test("toggleCompletedVisibility toggles the showCompleted property")
|
||||||
func toggleCompletedVisibility() {
|
func toggleCompletedVisibility() {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
let viewModel = TaskListView.ViewModel(group: .today)
|
let viewModel = TaskListView.ViewModel(group: .today)
|
||||||
|
|||||||
Reference in New Issue
Block a user