From 4ed4ca4ae3d5f27070ef55da0933f010d6f9dad1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 19 May 2025 16:01:42 +0200 Subject: [PATCH] update data deletes and tests to match LeStorage changes --- PadelClubData/Data/Club.swift | 10 ++----- PadelClubData/Data/Court.swift | 2 +- PadelClubData/Data/DateInterval.swift | 2 +- PadelClubData/Data/DrawLog.swift | 2 +- PadelClubData/Data/Event.swift | 8 +++-- PadelClubData/Data/GroupStage.swift | 4 +-- PadelClubData/Data/Match.swift | 4 +-- PadelClubData/Data/Round.swift | 20 ++----------- PadelClubData/Data/TeamRegistration.swift | 6 ++-- PadelClubData/Data/Tournament.swift | 12 ++++---- PadelClubData/Subscriptions/Guard.swift | 2 +- PadelClubDataTests/DeletionTests.swift | 2 +- PadelClubDataTests/PadelClubDataTests.swift | 30 +++++++++++-------- PadelClubDataTests/SyncDataAccessTests.swift | 9 ------ PadelClubDataTests/SynchronizationTests.swift | 10 +++---- 15 files changed, 50 insertions(+), 73 deletions(-) diff --git a/PadelClubData/Data/Club.swift b/PadelClubData/Data/Club.swift index c26daf1..b2146b1 100644 --- a/PadelClubData/Data/Club.swift +++ b/PadelClubData/Data/Club.swift @@ -29,15 +29,9 @@ final public class Club: BaseClub { DataStore.shared.courts.filter { $0.club == self.id }.sorted(by: \.index) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: Court.self, shouldBeSynchronized: shouldBeSynchronized) { $0.club == self.id } - -// let customizedCourts = self.customizedCourts -// for customizedCourt in customizedCourts { -// customizedCourt.deleteDependencies(store: store, shouldBeSynchronized: shouldBeSynchronized) -// } -// DataStore.shared.courts.deleteDependencies(customizedCourts, shouldBeSynchronized: shouldBeSynchronized) + store.deleteDependencies(type: Court.self, actionOption: actionOption) { ($0 as? Court)?.club == self.id } } public override func deleteUnusedSharedDependencies(store: Store) { diff --git a/PadelClubData/Data/Court.swift b/PadelClubData/Data/Court.swift index db5f774..ca020b4 100644 --- a/PadelClubData/Data/Court.swift +++ b/PadelClubData/Data/Court.swift @@ -52,7 +52,7 @@ final public class Court: BaseCourt { Store.main.findById(club) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { } } diff --git a/PadelClubData/Data/DateInterval.swift b/PadelClubData/Data/DateInterval.swift index c141a1a..88b6f11 100644 --- a/PadelClubData/Data/DateInterval.swift +++ b/PadelClubData/Data/DateInterval.swift @@ -57,7 +57,7 @@ final public class DateInterval: BaseDateInterval { date <= startDate && date <= endDate && date >= startDate && date >= endDate } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { } // enum CodingKeys: String, CodingKey { diff --git a/PadelClubData/Data/DrawLog.swift b/PadelClubData/Data/DrawLog.swift index 0671d4b..2a2de7e 100644 --- a/PadelClubData/Data/DrawLog.swift +++ b/PadelClubData/Data/DrawLog.swift @@ -74,7 +74,7 @@ final public class DrawLog: BaseDrawLog, SideStorable { return TournamentLibrary.shared.store(tournamentId: self.tournament) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { } } diff --git a/PadelClubData/Data/Event.swift b/PadelClubData/Data/Event.swift index b86bbd9..ae84c93 100644 --- a/PadelClubData/Data/Event.swift +++ b/PadelClubData/Data/Event.swift @@ -30,10 +30,12 @@ final public class Event: BaseEvent { store.deleteUnusedSharedDependencies(type: DateInterval.self, shouldBeSynchronized: false) { $0.event == self.id } } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: Tournament.self, shouldBeSynchronized: shouldBeSynchronized) { $0.event == self.id && $0.isDeleted == false } - store.deleteDependencies(type: DateInterval.self, shouldBeSynchronized: shouldBeSynchronized) { $0.event == self.id } + store.deleteDependencies(type: Tournament.self, actionOption: actionOption) { storable in + guard let tournament = storable as? Tournament else { return false } + return tournament.event == self.id && tournament.isDeleted == false } + store.deleteDependencies(type: DateInterval.self, actionOption: actionOption) { ($0 as? DateInterval)?.event == self.id } // let tournaments = self.tournaments diff --git a/PadelClubData/Data/GroupStage.swift b/PadelClubData/Data/GroupStage.swift index 414322a..ed07ab9 100644 --- a/PadelClubData/Data/GroupStage.swift +++ b/PadelClubData/Data/GroupStage.swift @@ -607,9 +607,9 @@ final public class GroupStage: BaseGroupStage, SideStorable { return teams(true).firstIndex(of: team) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: Match.self, shouldBeSynchronized: shouldBeSynchronized) { $0.groupStage == self.id } + store.deleteDependencies(type: Match.self, actionOption: actionOption) { ($0 as? Match)?.groupStage == self.id } // // let matches = self._matches() diff --git a/PadelClubData/Data/Match.swift b/PadelClubData/Data/Match.swift index 96eb38d..cdaac90 100644 --- a/PadelClubData/Data/Match.swift +++ b/PadelClubData/Data/Match.swift @@ -82,9 +82,9 @@ final public class Match: BaseMatch, SideStorable { // MARK: - - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: TeamScore.self, shouldBeSynchronized: shouldBeSynchronized) { $0.match == self.id } + store.deleteDependencies(type: TeamScore.self, actionOption: actionOption) { ($0 as? TeamScore)?.match == self.id } // let teamScores = self.teamScores // for teamScore in teamScores { diff --git a/PadelClubData/Data/Round.swift b/PadelClubData/Data/Round.swift index 053cbbd..ba9c83d 100644 --- a/PadelClubData/Data/Round.swift +++ b/PadelClubData/Data/Round.swift @@ -903,25 +903,11 @@ defer { _cachedLoserRoundsAndChildren = nil } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: Match.self, shouldBeSynchronized: shouldBeSynchronized) { $0.round == self.id } - store.deleteDependencies(type: Round.self, shouldBeSynchronized: shouldBeSynchronized) { $0.parent == self.id } + store.deleteDependencies(type: Match.self, actionOption: actionOption) { ($0 as? Match)?.round == self.id } + store.deleteDependencies(type: Round.self, actionOption: actionOption) { ($0 as? Round)?.parent == self.id } - -// let matches = self._matches() -// for match in matches { -// match.deleteDependencies(store: store, shouldBeSynchronized: shouldBeSynchronized) -// } -// -// self.tournamentStore?.matches.deleteDependencies(matches, shouldBeSynchronized: shouldBeSynchronized) -// -// let loserRounds = self.loserRounds() -// for round in loserRounds { -// round.deleteDependencies(store: store, shouldBeSynchronized: shouldBeSynchronized) -// } -// -// self.tournamentStore?.rounds.deleteDependencies(loserRounds, shouldBeSynchronized: shouldBeSynchronized) } diff --git a/PadelClubData/Data/TeamRegistration.swift b/PadelClubData/Data/TeamRegistration.swift index 8e38721..d9b5682 100644 --- a/PadelClubData/Data/TeamRegistration.swift +++ b/PadelClubData/Data/TeamRegistration.swift @@ -101,10 +101,10 @@ final public class TeamRegistration: BaseTeamRegistration, SideStorable { tournamentStore.teamScores.delete(contentOfs: ts) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { - store.deleteDependencies(type: TeamScore.self, shouldBeSynchronized: shouldBeSynchronized) { $0.teamRegistration == self.id } - store.deleteDependencies(type: PlayerRegistration.self, shouldBeSynchronized: shouldBeSynchronized) { $0.teamRegistration == self.id } + store.deleteDependencies(type: TeamScore.self, actionOption: actionOption) { ($0 as? TeamScore)?.teamRegistration == self.id } + store.deleteDependencies(type: PlayerRegistration.self, actionOption: actionOption) { ($0 as? PlayerRegistration)?.teamRegistration == self.id } // let unsortedPlayers = unsortedPlayers() // for player in unsortedPlayers { diff --git a/PadelClubData/Data/Tournament.swift b/PadelClubData/Data/Tournament.swift index 967c99b..5021950 100644 --- a/PadelClubData/Data/Tournament.swift +++ b/PadelClubData/Data/Tournament.swift @@ -32,16 +32,16 @@ final public class Tournament: BaseTournament { return TournamentLibrary.shared.store(tournamentId: self.id) } - public override func deleteDependencies(store: Store, shouldBeSynchronized: Bool) { + public override func deleteDependencies(store: Store, actionOption: ActionOption) { do { let tournamentStore = try store.alternateStore(identifier: self.id) - tournamentStore.deleteAllDependencies(type: DrawLog.self, shouldBeSynchronized: shouldBeSynchronized) - tournamentStore.deleteAllDependencies(type: TeamRegistration.self, shouldBeSynchronized: shouldBeSynchronized) - tournamentStore.deleteAllDependencies(type: GroupStage.self, shouldBeSynchronized: shouldBeSynchronized) - tournamentStore.deleteAllDependencies(type: Round.self, shouldBeSynchronized: shouldBeSynchronized) - tournamentStore.deleteAllDependencies(type: MatchScheduler.self, shouldBeSynchronized: shouldBeSynchronized) + tournamentStore.deleteAllDependencies(type: DrawLog.self, actionOption: actionOption) + tournamentStore.deleteAllDependencies(type: TeamRegistration.self, actionOption: actionOption) + tournamentStore.deleteAllDependencies(type: GroupStage.self, actionOption: actionOption) + tournamentStore.deleteAllDependencies(type: Round.self, actionOption: actionOption) + tournamentStore.deleteAllDependencies(type: MatchScheduler.self, actionOption: actionOption) } catch { Logger.error(error) } diff --git a/PadelClubData/Subscriptions/Guard.swift b/PadelClubData/Subscriptions/Guard.swift index aa77c06..949a978 100644 --- a/PadelClubData/Subscriptions/Guard.swift +++ b/PadelClubData/Subscriptions/Guard.swift @@ -48,7 +48,7 @@ import Combine } @objc func collectionDidLoad(notification: Notification) { - if let _ = notification.object as? BaseCollection { + if let _ = notification.object as? StoredCollection { self._updateBestPlan() } } diff --git a/PadelClubDataTests/DeletionTests.swift b/PadelClubDataTests/DeletionTests.swift index 9641dfa..ef8db4c 100644 --- a/PadelClubDataTests/DeletionTests.swift +++ b/PadelClubDataTests/DeletionTests.swift @@ -279,7 +279,7 @@ actor BoolChecker { return } - print("sleep...") +// print("sleep...") // Wait for 100ms before next check try? await Task.sleep(for: .milliseconds(100)) diff --git a/PadelClubDataTests/PadelClubDataTests.swift b/PadelClubDataTests/PadelClubDataTests.swift index 18acb93..9c3d9b7 100644 --- a/PadelClubDataTests/PadelClubDataTests.swift +++ b/PadelClubDataTests/PadelClubDataTests.swift @@ -41,29 +41,33 @@ struct PadelClubDataTests { } // Cleanup - let events = DataStore.shared.events - try await DataStore.shared.events.deleteAsync(contentOfs: Array(events)) - - try await DataStore.shared.events.loadDataFromServerIfAllowed(clear: true) - #expect(DataStore.shared.events.count == 0) - try await DataStore.shared.tournaments.loadDataFromServerIfAllowed(clear: true) - #expect(DataStore.shared.tournaments.count == 0) + let eventCol: SyncedCollection = await StoreCenter.main.mainStore.asyncLoadingSynchronizedCollection() + eventCol.reset() + let events: [Event] = try await StoreCenter.main.service().get() + try await eventCol.deleteAsync(contentOfs: Array(events)) + #expect(eventCol.count == 0) + + let tournamentCol: SyncedCollection = await StoreCenter.main.mainStore.asyncLoadingSynchronizedCollection() + tournamentCol.reset() + let tournaments: [Tournament] = try await StoreCenter.main.service().get() + try await tournamentCol.deleteAsync(contentOfs: Array(tournaments)) + #expect(tournamentCol.count == 0) // Create let event: Event = Event(creator: userId, club: nil, name: "test") - try await DataStore.shared.events.addOrUpdateAsync(instance: event) + try await eventCol.addOrUpdateAsync(instance: event) let tournament: Tournament = Tournament.fake() tournament.event = event.id - try await DataStore.shared.tournaments.addOrUpdateAsync(instance: tournament) + try await tournamentCol.addOrUpdateAsync(instance: tournament) // Test server content - try await DataStore.shared.events.loadDataFromServerIfAllowed(clear: true) - #expect(DataStore.shared.events.count == 1) + try await eventCol.loadDataFromServerIfAllowed(clear: true) + #expect(eventCol.count == 1) - try await DataStore.shared.tournaments.loadDataFromServerIfAllowed(clear: true) - #expect(DataStore.shared.tournaments.count == 1) + try await tournamentCol.loadDataFromServerIfAllowed(clear: true) + #expect(tournamentCol.count == 1) } diff --git a/PadelClubDataTests/SyncDataAccessTests.swift b/PadelClubDataTests/SyncDataAccessTests.swift index bce239a..36095a6 100644 --- a/PadelClubDataTests/SyncDataAccessTests.swift +++ b/PadelClubDataTests/SyncDataAccessTests.swift @@ -9,15 +9,6 @@ import Testing @testable import PadelClubData @testable import LeStorage -extension String { - - static func random(length: Int = 10) -> String { - let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - return String((0.. = await self.secondStoreCenter.mainStore.asyncLoadingSynchronizedCollection() #expect(eventCollection2.hasLoaded == true) - eventCollection2.clear() + eventCollection2.reset() // cleanup sync residues let _ = try await self.secondStoreCenter.testSynchronizeOnceAsync() @@ -121,13 +121,13 @@ struct SynchronizationTests { let eventCollectionA: SyncedCollection = await StoreCenter.main.mainStore.asyncLoadingSynchronizedCollection() try await eventCollectionA.deleteAsync(contentOfs: Array(eventCollectionA)) let eventCollectionB: SyncedCollection = await self.secondStoreCenter.mainStore.asyncLoadingSynchronizedCollection() - eventCollectionB.clear() + eventCollectionB.reset() // Setup clubs collections let clubCollectionA: SyncedCollection = await StoreCenter.main.mainStore.asyncLoadingSynchronizedCollection() try await clubCollectionA.deleteAsync(contentOfs: Array(clubCollectionA)) let clubCollectionB: SyncedCollection = await self.secondStoreCenter.mainStore.asyncLoadingSynchronizedCollection() - clubCollectionB.clear() + clubCollectionB.reset() // cleanup sync residues let _ = try await self.secondStoreCenter.testSynchronizeOnceAsync() @@ -185,7 +185,7 @@ struct SynchronizationTests { let teamRegColA: SyncedCollection = await StoreCenter.main.mainStore.asyncLoadingSynchronizedCollection() try await teamRegColA.deleteAsync(contentOfs: Array(teamRegColA)) let teamRegColB: SyncedCollection = await self.secondStoreCenter.mainStore.asyncLoadingSynchronizedCollection() - teamRegColB.clear() + teamRegColB.reset() // cleanup sync residues let _ = try await self.secondStoreCenter.testSynchronizeOnceAsync() @@ -213,7 +213,7 @@ struct SynchronizationTests { try await eventCollectionA.deleteAsync(contentOfs: Array(eventCollectionA)) let eventCollectionB: SyncedCollection = await self.secondStoreCenter.mainStore.asyncLoadingSynchronizedCollection() - eventCollectionB.clear() + eventCollectionB.reset() // cleanup sync residues let _ = try await self.secondStoreCenter.testSynchronizeOnceAsync()