field_ios

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

TeraScopeFixtures.swift (5231B)


      1 import Foundation
      2 @testable import TeraApp
      3 import XCTest
      4 
      5 enum TeraScopeFixtures {
      6   static func viewerCalendar(asOf: UInt64, timeZone: TimeZone = .gmt) -> TeraViewerCalendarContext {
      7     guard let date = TeraCalendarEditing.civilDate(at: asOf, timeZone: timeZone) else {
      8       preconditionFailure("Test fixture requires a supported calendar instant")
      9     }
     10     return TeraViewerCalendarContext(
     11       asOfUnixSeconds: asOf, timeZoneID: timeZone.identifier, timeZone: timeZone, civilDate: date
     12     )
     13   }
     14 
     15   static func snapshot(
     16     account: String = "a", relay: String = "first", evidence: TeraBlossomEvidence? = nil,
     17     profile: String = "simulator"
     18   ) -> TeraRuntimeSnapshot {
     19     TeraRuntimeSnapshot(
     20       identity: TeraRuntimeIdentity(publicKeyHex: String(repeating: account, count: 64), hostSignerConfigured: true),
     21       relay: TeraRelayStatus(
     22         profile: profile, state: "configured", readAvailability: "unobserved", writeAvailability: "unobserved",
     23         relays: [TeraRelayEndpointStatus(
     24           url: "wss://\(relay).example", access: .readWrite, readState: "unobserved", writeState: "unobserved",
     25           readLastAttemptUnixMilliseconds: nil, writeLastAttemptUnixMilliseconds: nil,
     26           readNextAttemptUnixMilliseconds: nil, writeNextAttemptUnixMilliseconds: nil
     27         )]
     28       ),
     29       blossomConfiguration: TeraBlossomConfigurationStatus(
     30         schemaVersion: 1, hostKind: "simulator", endpointAuthority: "loopback_development",
     31         primaryOrigin: "http://127.0.0.1:3000", fallbackOrigins: [], configFingerprint: relay
     32       ),
     33       blossomEvidence: evidence, crateName: "tera_ffi", crateVersion: "0.1.0-alpha", isClosed: false
     34     )
     35   }
     36 
     37   static func evidence(observedAt: UInt64) -> TeraBlossomEvidence {
     38     TeraBlossomEvidence(
     39       schemaVersion: 2, origin: "http://127.0.0.1:3000", configFingerprint: "first",
     40       state: "reachable", lastSuccessfulState: "probe", transportSecurity: "loopback_plaintext",
     41       observedAtUnixMilliseconds: observedAt, httpStatus: 200, errorCode: nil, serverErrorCode: nil,
     42       errorPhase: nil, retryable: false, possibleOrphan: false, attempts: 1
     43     )
     44   }
     45 
     46   static func card(_ id: String) -> TeraTodayCard {
     47     card(id, timing: nil)
     48   }
     49 
     50   static func card(_ id: String, timing: TeraCalendarTiming?) -> TeraTodayCard {
     51     TeraTodayCard(
     52       id: id, type: timing == nil ? .update : .event, sourceEventID: id, sourceAddress: nil,
     53       authorPublicKey: String(repeating: "a", count: 64), contractID: "test.update",
     54       title: nil, content: id, authoredAtUnixSeconds: 1, effectiveAtUnixSeconds: 1,
     55       calendarTiming: timing, location: nil,
     56       priceAmount: nil, priceCurrency: nil, priceUnit: nil, quantity: nil, foodSummary: nil,
     57       foodPublishedAtUnixSeconds: nil, foodStatus: nil, contextRank: 1, inclusionReason: "local",
     58       media: [], lifecycle: .active, rankDigest: nil, authorProfile: nil, thread: [],
     59       localOperationID: nil, localOperationState: nil
     60     )
     61   }
     62 
     63   static func draft(_ text: String, revision: UInt64 = 1) -> TeraDraftStatus {
     64     var form = TeraAddForm.empty(.createUpdate)
     65     form.content = text
     66     return TeraDraftStatus(
     67       id: "draft", revision: revision, authorPublicKey: String(repeating: "a", count: 64),
     68       kind: .add, commandType: .createUpdate, form: form, state: .draft,
     69       cardID: "card", operationID: nil, createdAtUnixMilliseconds: 1,
     70       updatedAtUnixMilliseconds: revision, media: [], settlement: nil, isRevision: false
     71     )
     72   }
     73 
     74   static func reference() -> TeraMediaReference {
     75     TeraMediaReference(
     76       referenceFingerprint: String(repeating: "e", count: 64), url: "https://media.example/image.png",
     77       sha256: String(repeating: "b", count: 64), mediaType: "image/png", width: 1, height: 1,
     78       byteSize: 68, alt: "Test pixel", verification: .unavailable
     79     )
     80   }
     81 
     82   static func artifact(_ id: String, corrupt: Bool = false) throws -> TeraVerifiedMediaArtifact {
     83     let pixel = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jWZkAAAAASUVORK5CYII=") ?? Data()
     84     let bytes = corrupt ? Data([0, 1, 2]) : pixel
     85     return try XCTUnwrap(TeraVerifiedMediaArtifact(
     86       artifactID: String(repeating: id, count: 64), bytes: bytes,
     87       byteSize: UInt64(bytes.count), mediaType: "image/png", width: 1, height: 1
     88     ))
     89   }
     90 
     91   static func failure() -> TeraRuntimeFailure {
     92     .local(operation: "test.scope", code: "test.scope.failed", safeMessage: "A controlled request failed.")
     93   }
     94 
     95   @MainActor
     96   static func eventually(_ condition: () -> Bool, file: StaticString = #filePath, line: UInt = #line) async {
     97     let deadline = ContinuousClock.now.advanced(by: .seconds(5))
     98     while !condition(), ContinuousClock.now < deadline {
     99       await Task.yield()
    100     }
    101     XCTAssertTrue(condition(), file: file, line: line)
    102   }
    103 
    104   @MainActor
    105   static func client(_ backend: TeraScopeBackend) async throws -> TeraRuntimeClient {
    106     let configuration = TeraRuntimeClientTests().makeConfiguration(generation: "aa")
    107     let client = TeraRuntimeClient { _ in
    108       await TeraRuntimeBackendStart(backend: backend, snapshot: backend.value)
    109     }
    110     _ = try await client.start(configuration: configuration)
    111     return client
    112   }
    113 }