RecordSerializerMovesTests.swift (2708B)
1 import CloudKit 2 import Foundation 3 import Testing 4 5 @testable import Crossmate 6 7 @Suite("RecordSerializer Moves") 8 struct RecordSerializerMovesTests { 9 10 private let gameID = UUID(uuidString: "AABBCCDD-0000-0000-0000-111122223333")! 11 private var zoneID: CKRecordZone.ID { RecordSerializer.zoneID(for: gameID) } 12 13 @Test("Moves record name uses the expected format") 14 func movesRecordNameFormat() { 15 let name = RecordSerializer.recordName( 16 forMovesInGame: gameID, 17 authorID: "alice", 18 deviceID: "deadbeef" 19 ) 20 #expect(name == "moves-\(gameID.uuidString)-alice-deadbeef") 21 } 22 23 @Test("Moves record name parses back into its three parts") 24 func movesRecordNameRoundTrip() { 25 let name = RecordSerializer.recordName( 26 forMovesInGame: gameID, 27 authorID: "alice", 28 deviceID: "deadbeef" 29 ) 30 let parsed = RecordSerializer.parseMovesRecordName(name) 31 #expect(parsed?.0 == gameID) 32 #expect(parsed?.1 == "alice") 33 #expect(parsed?.2 == "deadbeef") 34 } 35 36 @Test("Moves record round-trips through CKRecord fields") 37 func movesRecordRoundTrip() throws { 38 let cells: [GridPosition: TimestampedCell] = [ 39 GridPosition(row: 0, col: 0): TimestampedCell( 40 letter: "A", markKind: 0, checkedWrong: false, 41 updatedAt: Date(timeIntervalSince1970: 1_700_000_000), 42 authorID: "alice" 43 ), 44 GridPosition(row: 1, col: 2): TimestampedCell( 45 letter: "B", markKind: 2, checkedWrong: true, 46 updatedAt: Date(timeIntervalSince1970: 1_700_000_500), 47 authorID: nil 48 ), 49 ] 50 let view = MovesValue( 51 gameID: gameID, 52 authorID: "alice", 53 deviceID: "deadbeef", 54 cells: cells, 55 updatedAt: Date(timeIntervalSince1970: 1_700_000_500) 56 ) 57 let record = try RecordSerializer.movesRecord( 58 from: view, 59 zone: zoneID, 60 systemFields: nil 61 ) 62 let parsed = RecordSerializer.parseMovesRecord(record) 63 #expect(parsed == view) 64 } 65 66 @Test("Parsing rejects records with the wrong record type") 67 func parseRejectsWrongRecordType() { 68 let recordID = CKRecord.ID( 69 recordName: RecordSerializer.recordName( 70 forMovesInGame: gameID, 71 authorID: "alice", 72 deviceID: "deadbeef" 73 ), 74 zoneID: zoneID 75 ) 76 let record = CKRecord(recordType: "Move", recordID: recordID) 77 #expect(RecordSerializer.parseMovesRecord(record) == nil) 78 } 79 }