Todo repository protocol #8

Merged
javier merged 11 commits from app/repository-protocol into main 2026-02-11 18:22:26 +00:00
Showing only changes of commit 3dab65ce0a - Show all commits
@@ -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)