FriendControllerNicknameReplayTests.swift (3194B)
1 import CloudKit 2 import CoreData 3 import Foundation 4 import Testing 5 6 @testable import Crossmate 7 8 @Suite("FriendController nickname replay", .serialized) 9 @MainActor 10 struct FriendControllerNicknameReplayTests { 11 @Test("Post-bootstrap replay applies an existing account nickname decision") 12 func replayAppliesExistingNicknameDecision() async throws { 13 let persistence = makeTestPersistence() 14 let ctx = persistence.viewContext 15 let friend = FriendEntity(context: ctx) 16 friend.authorID = "_bob" 17 friend.pairKey = FriendZone.pairKey("_alice", "_bob") 18 friend.createdAt = Date() 19 try ctx.save() 20 21 let fetchedZone = CKRecordZone.ID( 22 zoneName: RecordSerializer.accountZoneID.zoneName, 23 ownerName: "_alice" 24 ) 25 let decision = RecordSerializer.decisionRecord( 26 kind: RecordSerializer.nicknameDecisionKind, 27 key: "_bob", 28 payload: "Bobby", 29 zone: fetchedZone, 30 version: 1 31 ) 32 var requestedRecordID: CKRecord.ID? 33 let controller = FriendController( 34 container: CloudContainer.container, 35 persistence: persistence, 36 syncEngine: SyncEngine( 37 container: CloudContainer.container, 38 persistence: persistence 39 ), 40 fetchAccountDecisionRecord: { recordID in 41 requestedRecordID = recordID 42 return decision 43 } 44 ) 45 46 await controller.applyAccountNicknameDecisionIfPresent(for: "_bob") 47 48 #expect(requestedRecordID?.recordName == RecordSerializer.decisionRecordName( 49 kind: RecordSerializer.nicknameDecisionKind, 50 key: "_bob" 51 )) 52 #expect(requestedRecordID?.zoneID.zoneName == RecordSerializer.accountZoneID.zoneName) 53 #expect(friend.nickname == "Bobby") 54 #expect(friend.nicknameVersion == 1) 55 } 56 57 @Test("Post-bootstrap replay keeps a newer local nickname") 58 func replayKeepsNewerLocalNickname() async throws { 59 let persistence = makeTestPersistence() 60 let ctx = persistence.viewContext 61 let friend = FriendEntity(context: ctx) 62 friend.authorID = "_bob" 63 friend.pairKey = FriendZone.pairKey("_alice", "_bob") 64 friend.createdAt = Date() 65 friend.nickname = "Robert" 66 friend.nicknameVersion = 2 67 try ctx.save() 68 69 let decision = RecordSerializer.decisionRecord( 70 kind: RecordSerializer.nicknameDecisionKind, 71 key: "_bob", 72 payload: "Bobby", 73 zone: RecordSerializer.accountZoneID, 74 version: 1 75 ) 76 let controller = FriendController( 77 container: CloudContainer.container, 78 persistence: persistence, 79 syncEngine: SyncEngine( 80 container: CloudContainer.container, 81 persistence: persistence 82 ), 83 fetchAccountDecisionRecord: { _ in decision } 84 ) 85 86 await controller.applyAccountNicknameDecisionIfPresent(for: "_bob") 87 88 #expect(friend.nickname == "Robert") 89 #expect(friend.nicknameVersion == 2) 90 } 91 }