crossmate

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

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 }