OpenedLeaseTests.swift (2459B)
1 import Foundation 2 import Testing 3 4 @testable import Crossmate 5 6 @Suite("Opened lease payload") 7 struct OpenedLeaseTests { 8 @Test("Round-trips through its JSON payload") 9 func roundTrip() throws { 10 let lease = OpenedLease(leaseMs: 300_000, sentAtMs: 1_715_000_000_000) 11 let encoded = try #require(lease.encoded()) 12 let decoded = try #require(OpenedLease.decode(encoded)) 13 #expect(decoded.leaseMs == lease.leaseMs) 14 #expect(decoded.sentAtMs == lease.sentAtMs) 15 } 16 17 @Test("A .closed lease (zero duration) round-trips") 18 func closedRoundTrips() throws { 19 let lease = OpenedLease(leaseMs: 0, sentAtMs: 42) 20 let decoded = try #require(OpenedLease.decode(lease.encoded())) 21 #expect(decoded.leaseMs == 0) 22 #expect(decoded.sentAtMs == 42) 23 } 24 25 @Test("decode is nil for missing or malformed payload") 26 func decodeNilOnGarbage() { 27 #expect(OpenedLease.decode(nil) == nil) 28 #expect(OpenedLease.decode("") == nil) 29 #expect(OpenedLease.decode("not json") == nil) 30 #expect(OpenedLease.decode("{\"leaseMs\":1}") == nil) 31 } 32 } 33 34 @Suite("Ping scope payload") 35 struct PingScopePayloadTests { 36 @Test("Round-trips through its JSON payload") 37 func roundTrip() throws { 38 for scope in [PingScope.square, .word, .puzzle] { 39 let encoded = try #require( 40 PingScopePayload(scope: scope.rawValue).encoded() 41 ) 42 let decoded = try #require(PingScopePayload.decode(encoded)) 43 #expect(PingScope(rawValue: decoded.scope) == scope) 44 } 45 } 46 47 @Test("decode is nil for missing or malformed payload") 48 func decodeNilOnGarbage() { 49 #expect(PingScopePayload.decode(nil) == nil) 50 #expect(PingScopePayload.decode("") == nil) 51 #expect(PingScopePayload.decode("not json") == nil) 52 } 53 54 @Test("Other kinds' payloads don't false-match as a scope payload") 55 func crossKindIsolation() { 56 // A lease payload has no `scope` key. 57 let lease = OpenedLease(leaseMs: 300_000, sentAtMs: 1).encoded() 58 #expect(PingScopePayload.decode(lease) == nil) 59 // …and a scope payload isn't a valid lease. 60 let scope = PingScopePayload(scope: "word").encoded() 61 #expect(OpenedLease.decode(scope) == nil) 62 // An invite-shaped payload also has no `scope` key. 63 #expect(PingScopePayload.decode(#"{"gameShareURL":"https://x"}"#) == nil) 64 } 65 }