diff --git a/Examples/Reminders/ReminderForm.swift b/Examples/Reminders/ReminderForm.swift index a41e28e0..e4c00a21 100644 --- a/Examples/Reminders/ReminderForm.swift +++ b/Examples/Reminders/ReminderForm.swift @@ -204,17 +204,20 @@ extension Optional { } struct ReminderFormPreview: PreviewProvider { - static var previews: some View { - let (remindersList, reminder) = try! prepareDependencies { + private static var reminderDetail: (Reminder, RemindersList) = { + try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() - return try $0.defaultDatabase.write { db in + try $0.defaultDatabase.seed() + return try $0.defaultDatabase.read { db in let remindersList = try RemindersList.fetchOne(db)! - return ( - remindersList, - try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)! - ) + let reminder = try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)! + return (reminder, remindersList) } } + }() + + static var previews: some View { + let (reminder, remindersList) = reminderDetail NavigationStack { ReminderFormView(reminder: Reminder.Draft(reminder), remindersList: remindersList) .navigationTitle("Detail") diff --git a/Examples/Reminders/ReminderRow.swift b/Examples/Reminders/ReminderRow.swift index c112eaa3..fce780df 100644 --- a/Examples/Reminders/ReminderRow.swift +++ b/Examples/Reminders/ReminderRow.swift @@ -156,17 +156,20 @@ struct ReminderRow: View { } struct ReminderRowPreview: PreviewProvider { - static var previews: some View { - var reminder: Reminder! - var remindersList: RemindersList! - let _ = try! prepareDependencies { + private static var reminderDetail: (Reminder, RemindersList) = { + try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() - try $0.defaultDatabase.read { db in - reminder = try Reminder.fetchOne(db) - remindersList = try RemindersList.fetchOne(db)! + try $0.defaultDatabase.seed() + return try $0.defaultDatabase.read { db in + let reminder = try Reminder.fetchOne(db)! + let remindersList = try RemindersList.where { $0.id.eq(reminder.remindersListID) }.fetchOne(db)! + return (reminder, remindersList) } } - + }() + + static var previews: some View { + let (reminder, remindersList) = reminderDetail NavigationStack { List { ReminderRow( diff --git a/Examples/Reminders/RemindersDetail.swift b/Examples/Reminders/RemindersDetail.swift index b64d8110..cd9fe527 100644 --- a/Examples/Reminders/RemindersDetail.swift +++ b/Examples/Reminders/RemindersDetail.swift @@ -362,9 +362,10 @@ extension RemindersDetailModel.DetailType { } struct RemindersDetailPreview: PreviewProvider { - static var previews: some View { + private static var detailTypes: [RemindersDetailModel.DetailType] = { let (remindersList, tag) = try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() + try $0.defaultDatabase.seed() return try $0.defaultDatabase.read { db in ( try RemindersList.fetchOne(db)!, @@ -372,11 +373,14 @@ struct RemindersDetailPreview: PreviewProvider { ) } } - let detailTypes: [RemindersDetailModel.DetailType] = [ + return [ .all, .remindersList(remindersList), .tags([tag]), ] + }() + + static var previews: some View { ForEach(detailTypes, id: \.self) { detailType in NavigationStack { RemindersDetailView(model: RemindersDetailModel(detailType: detailType)) @@ -385,3 +389,4 @@ struct RemindersDetailPreview: PreviewProvider { } } } + diff --git a/Examples/Reminders/RemindersLists.swift b/Examples/Reminders/RemindersLists.swift index 971a8979..f50226e5 100644 --- a/Examples/Reminders/RemindersLists.swift +++ b/Examples/Reminders/RemindersLists.swift @@ -144,9 +144,7 @@ class RemindersListsModel { #if DEBUG func seedDatabaseButtonTapped() { withErrorReporting { - try database.write { db in - try db.seedSampleData() - } + try database.seed() } } #endif @@ -438,6 +436,18 @@ private struct ReminderGridCell: View { #Preview { let _ = try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() + // Create a dummy SyncMetadata table to allow the RemindersLists query to work in preview mode + try $0.defaultDatabase.write { db in + try #sql(""" + CREATE TABLE IF NOT EXISTS \(SyncMetadata.self) ( + "recordPrimaryKey" TEXT, + "recordType" TEXT, + "share" TEXT + ) STRICT + """ + ) + .execute(db) + } } NavigationStack { RemindersListsView(model: RemindersListsModel()) diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index 4be2e53d..967eb747 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -363,10 +363,6 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - - if context != .live { - try db.seedSampleData() - } } return database @@ -410,8 +406,8 @@ nonisolated func createDefaultRemindersList() { nonisolated private let logger = Logger(subsystem: "Reminders", category: "Database") #if DEBUG - extension Database { - func seedSampleData() throws { + extension DatabaseWriter { + func seed() throws { @Dependency(\.date.now) var now @Dependency(\.uuid) var uuid var remindersListIDs: [UUID] = [] @@ -422,122 +418,124 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab for _ in 0...10 { reminderIDs.append(uuid()) } - try seed { - RemindersList( - id: remindersListIDs[0], - color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255), - title: "Personal" - ) - RemindersList( - id: remindersListIDs[1], - color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255), - title: "Family" - ) - RemindersList( - id: remindersListIDs[2], - color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255), - title: "Business" - ) - Reminder( - id: reminderIDs[0], - notes: "Milk\nEggs\nApples\nOatmeal\nSpinach", - remindersListID: remindersListIDs[0], - title: "Groceries" - ) - Reminder( - id: reminderIDs[1], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - isFlagged: true, - remindersListID: remindersListIDs[0], - title: "Haircut" - ) - Reminder( - id: reminderIDs[2], - dueDate: now, - notes: "Ask about diet", - priority: .high, - remindersListID: remindersListIDs[0], - title: "Doctor appointment" - ) - Reminder( - id: reminderIDs[3], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190), - remindersListID: remindersListIDs[0], - status: .completed, - title: "Take a walk" - ) - Reminder( - id: reminderIDs[4], - dueDate: now, - remindersListID: remindersListIDs[0], - title: "Buy concert tickets" - ) - Reminder( - id: reminderIDs[5], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - isFlagged: true, - priority: .high, - remindersListID: remindersListIDs[1], - title: "Pick up kids from school" - ) - Reminder( - id: reminderIDs[6], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - priority: .low, - remindersListID: remindersListIDs[1], - status: .completed, - title: "Get laundry" - ) - Reminder( - id: reminderIDs[7], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 4), - priority: .high, - remindersListID: remindersListIDs[1], - status: .incomplete, - title: "Take out trash" - ) - Reminder( - id: reminderIDs[8], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - notes: """ + try write { db in + try db.seed { + RemindersList( + id: remindersListIDs[0], + color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255), + title: "Personal" + ) + RemindersList( + id: remindersListIDs[1], + color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255), + title: "Family" + ) + RemindersList( + id: remindersListIDs[2], + color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255), + title: "Business" + ) + Reminder( + id: reminderIDs[0], + notes: "Milk\nEggs\nApples\nOatmeal\nSpinach", + remindersListID: remindersListIDs[0], + title: "Groceries" + ) + Reminder( + id: reminderIDs[1], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + isFlagged: true, + remindersListID: remindersListIDs[0], + title: "Haircut" + ) + Reminder( + id: reminderIDs[2], + dueDate: now, + notes: "Ask about diet", + priority: .high, + remindersListID: remindersListIDs[0], + title: "Doctor appointment" + ) + Reminder( + id: reminderIDs[3], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190), + remindersListID: remindersListIDs[0], + status: .completed, + title: "Take a walk" + ) + Reminder( + id: reminderIDs[4], + dueDate: now, + remindersListID: remindersListIDs[0], + title: "Buy concert tickets" + ) + Reminder( + id: reminderIDs[5], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + isFlagged: true, + priority: .high, + remindersListID: remindersListIDs[1], + title: "Pick up kids from school" + ) + Reminder( + id: reminderIDs[6], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + priority: .low, + remindersListID: remindersListIDs[1], + status: .completed, + title: "Get laundry" + ) + Reminder( + id: reminderIDs[7], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 4), + priority: .high, + remindersListID: remindersListIDs[1], + status: .incomplete, + title: "Take out trash" + ) + Reminder( + id: reminderIDs[8], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + notes: """ Status of tax return Expenses for next year Changing payroll company """, - remindersListID: remindersListIDs[2], - title: "Call accountant" - ) - Reminder( - id: reminderIDs[9], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - priority: .medium, - remindersListID: remindersListIDs[2], - status: .completed, - title: "Send weekly emails" - ) - Reminder( - id: reminderIDs[10], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - remindersListID: remindersListIDs[2], - status: .incomplete, - title: "Prepare for WWDC" - ) - let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"] - for tagID in tagIDs { - Tag(title: tagID) + remindersListID: remindersListIDs[2], + title: "Call accountant" + ) + Reminder( + id: reminderIDs[9], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + priority: .medium, + remindersListID: remindersListIDs[2], + status: .completed, + title: "Send weekly emails" + ) + Reminder( + id: reminderIDs[10], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + remindersListID: remindersListIDs[2], + status: .incomplete, + title: "Prepare for WWDC" + ) + let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"] + for tagID in tagIDs { + Tag(title: tagID) + } + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2]) + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3]) + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6]) + ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2]) + ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3]) + ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1]) + ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5]) } - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2]) - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3]) - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6]) - ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2]) - ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3]) - ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1]) - ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5]) } } } diff --git a/Examples/Reminders/TagsForm.swift b/Examples/Reminders/TagsForm.swift index c40b777a..6fb325a8 100644 --- a/Examples/Reminders/TagsForm.swift +++ b/Examples/Reminders/TagsForm.swift @@ -164,6 +164,7 @@ private struct TagView: View { @Previewable @State var tags: [Tag] = [] let _ = try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() + try $0.defaultDatabase.seed() } TagsView(selectedTags: $tags) diff --git a/Examples/RemindersTests/Internal.swift b/Examples/RemindersTests/Internal.swift index 61c1dd30..d4a189a2 100644 --- a/Examples/RemindersTests/Internal.swift +++ b/Examples/RemindersTests/Internal.swift @@ -12,6 +12,7 @@ import Testing .dependency(\.uuid, .incrementing), .dependencies { try $0.bootstrapDatabase() + try $0.defaultDatabase.seed() try await $0.defaultSyncEngine.sendChanges() }, .snapshots(record: .failed)