field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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 }