crossmate

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

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 }