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 }