field_ios

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

FieldDocumentInterchangeUITestProbe.swift (4950B)


      1 import Foundation
      2 import RadrootsKit
      3 
      4 enum FieldDocumentInterchangeUITestProbe {
      5     private static let enabledKey = "RADROOTS_FIELD_IOS_UI_TEST_DOCUMENT_INTERCHANGE_PROBE"
      6     private static let importFixture = RadrootsFileReference(
      7         scope: .temporary,
      8         relativePath: "ui_tests/document_interchange/relay_import.json"
      9     )
     10     private static let invalidImportFixture = RadrootsFileReference(
     11         scope: .temporary,
     12         relativePath: "ui_tests/document_interchange/invalid_relay_import.json"
     13     )
     14 
     15     static var isRequested: Bool {
     16         ProcessInfo.processInfo.environment[enabledKey] == "true"
     17     }
     18 
     19     static func relayImportDocument(bundleIdentifier: String) throws -> RadrootsImportedDocument? {
     20         guard isRequested else {
     21             return nil
     22         }
     23         let data = relayImportFixtureData()
     24         try FieldLocalState.fileAccess(bundleIdentifier: bundleIdentifier).write(
     25             .inline(data),
     26             to: importFixture
     27         )
     28         return try RadrootsImportedDocument(
     29             file: importFixture,
     30             originalURL: nil,
     31             suggestedFilename: "radroots-relays.json",
     32             mediaType: "application/json",
     33             sizeBytes: UInt64(data.count)
     34         )
     35     }
     36 
     37     static func startupValue(
     38         bundleIdentifier: String,
     39         infoJSONString: String,
     40         relays: [String],
     41         connectedCount: UInt32,
     42         connectingCount: UInt32,
     43         lastError: String?
     44     ) throws -> String? {
     45         guard isRequested else {
     46             return nil
     47         }
     48         let interchange = try FieldDocumentInterchange(bundleIdentifier: bundleIdentifier)
     49         let fileAccess = try FieldLocalState.fileAccess(bundleIdentifier: bundleIdentifier)
     50         let diagnosticsExport = try interchange.prepareDiagnosticsExport(
     51             infoJSONString: infoJSONString,
     52             relays: relays,
     53             connectedCount: connectedCount,
     54             connectingCount: connectingCount,
     55             lastError: lastError
     56         )
     57         let diagnosticsFileExists = try fileAccess.preparedExportExists(diagnosticsExport)
     58         try fileAccess.releasePreparedExport(diagnosticsExport)
     59         let diagnosticsReleaseRemovedFile = !(try fileAccess.preparedExportExists(diagnosticsExport))
     60         let relayExport = try interchange.prepareRelayConfigExport(relays: relays)
     61         let relayExportFileExists = try fileAccess.preparedExportExists(relayExport)
     62         try fileAccess.releasePreparedExport(relayExport)
     63         try fileAccess.write(
     64             .inline(relayImportFixtureData()),
     65             to: importFixture
     66         )
     67         let importedRelays = try interchange.importedRelayConfig(from: importFixture)
     68         try fileAccess.write(
     69             .inline(invalidRelayImportFixtureData()),
     70             to: invalidImportFixture
     71         )
     72         let rejectedInvalidImport = invalidImportWasRejected(interchange)
     73         let shareRequest = try interchange.publicPostShareRequest(content: "  public field update  ")
     74         let shareTextTrimmed = shareRequest.items == [.text("public field update")]
     75         return [
     76             "diagnostics_filename=\(diagnosticsExport.suggestedFilename)",
     77             "diagnostics_media_type=\(diagnosticsExport.mediaType ?? "")",
     78             "diagnostics_file_exists=\(diagnosticsFileExists)",
     79             "diagnostics_release_removed_file=\(diagnosticsReleaseRemovedFile)",
     80             "relay_export_filename=\(relayExport.suggestedFilename)",
     81             "relay_export_media_type=\(relayExport.mediaType ?? "")",
     82             "relay_export_file_exists=\(relayExportFileExists)",
     83             "relay_import_count=\(importedRelays.count)",
     84             "relay_import_contains_production=\(importedRelays.contains("wss://radroots.org"))",
     85             "relay_import_rejected_invalid=\(rejectedInvalidImport)",
     86             "share_subject=\(shareRequest.subject ?? "")",
     87             "share_text_trimmed=\(shareTextTrimmed)"
     88         ].joined(separator: ";")
     89     }
     90 
     91     private static func invalidImportWasRejected(_ interchange: FieldDocumentInterchange) -> Bool {
     92         do {
     93             _ = try interchange.importedRelayConfig(from: invalidImportFixture)
     94             return false
     95         } catch {
     96             return true
     97         }
     98     }
     99 
    100     private static func relayImportFixtureData() -> Data {
    101         Data(
    102             """
    103             {
    104               "format": "radroots_field_ios_relay_config_v1",
    105               "relays": [
    106                 "wss://radroots.org",
    107                 "ws://127.0.0.1:8080",
    108                 "wss://radroots.org"
    109               ]
    110             }
    111             """.utf8
    112         )
    113     }
    114 
    115     private static func invalidRelayImportFixtureData() -> Data {
    116         Data(
    117             """
    118             {
    119               "format": "radroots_field_ios_relay_config_v1",
    120               "relays": [
    121                 "https://radroots.org"
    122               ]
    123             }
    124             """.utf8
    125         )
    126     }
    127 }