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 }