TeraPublicationTargetTests.swift (3793B)
1 @testable import TeraApp 2 import TeraKitBindings 3 import XCTest 4 5 extension TeraPublicationTargets { 6 static func fixture(accepted: Bool = false) -> Self { 7 Self(requiresDelivery: false, policy: .any, targets: [ 8 TeraPublicationTarget(id: String(repeating: "a", count: 64), endpoint: "wss://relay.example", 9 attempted: accepted, accepted: accepted, delivered: false, rejected: false, 10 uncertain: false, readBackObservedAtUnixMilliseconds: nil), 11 ], readBackAvailable: true, readBackComplete: true) 12 } 13 } 14 15 final class TeraPublicationTargetTests: XCTestCase { 16 private func wire() -> FfiPublicationTargetDetails { 17 FfiPublicationTargetDetails(requiresDelivery: false, policy: .any, targets: [ 18 FfiPublicationTargetEvidence(fingerprint: String(repeating: "a", count: 64), endpoint: "wss://a.example", 19 attempted: true, accepted: true, delivered: false, rejected: false, uncertain: false, 20 readBackObservedAtUnixMs: nil), 21 FfiPublicationTargetEvidence(fingerprint: String(repeating: "b", count: 64), endpoint: "wss://b.example", 22 attempted: true, accepted: false, delivered: false, rejected: true, uncertain: false, 23 readBackObservedAtUnixMs: nil), 24 FfiPublicationTargetEvidence(fingerprint: String(repeating: "c", count: 64), endpoint: "wss://c.example", 25 attempted: true, accepted: false, delivered: false, rejected: false, uncertain: true, 26 readBackObservedAtUnixMs: 100), 27 ], readBackAvailable: true, readBackComplete: true) 28 } 29 30 func testMixedReceiptsAndReadBackStaySeparate() throws { 31 let value = try TeraPublicationTargets.decode(wire()) 32 XCTAssertEqual(value.policy, .any) 33 XCTAssertTrue(value.policySummary.contains("any one")) 34 XCTAssertEqual(value.targets.filter(\.accepted).count, 1) 35 XCTAssertTrue(value.targets[1].summary.contains("refusal")) 36 XCTAssertTrue(value.targets[2].summary.contains("uncertain")) 37 XCTAssertEqual(value.targets[2].readBackObservedAtUnixMilliseconds, 100) 38 XCTAssertFalse(value.targets[2].accepted) 39 XCTAssertTrue(value.follows(value)) 40 } 41 42 func testMalformedTargetsAndPolicyFailClosed() { 43 var value = wire() 44 value.targets.append(value.targets[0]) 45 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 46 value = wire(); value.targets[0].attempted = false 47 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 48 value = wire(); value.policy = .quorum(threshold: 4) 49 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 50 value = wire(); value.policy = .required(fingerprints: [String(repeating: "d", count: 64)]) 51 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 52 value = wire(); value.readBackAvailable = false 53 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 54 value = wire(); value.targets[0].fingerprint = "bad" 55 XCTAssertThrowsError(try TeraPublicationTargets.decode(value)) 56 } 57 58 func testLaterStatusCannotEraseAcceptanceOrChangeSavedDestinations() throws { 59 let original = try TeraPublicationTargets.decode(wire()) 60 var value = wire(); value.targets[0].accepted = false 61 XCTAssertFalse(try TeraPublicationTargets.decode(value).follows(original)) 62 value = wire(); value.targets.removeLast() 63 XCTAssertFalse(try TeraPublicationTargets.decode(value).follows(original)) 64 value = wire(); value.policy = .all 65 XCTAssertFalse(try TeraPublicationTargets.decode(value).follows(original)) 66 value = wire(); value.readBackComplete = false 67 XCTAssertTrue(try TeraPublicationTargets.decode(value).follows(original)) 68 } 69 }