crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

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 }