Spaces:
Paused
Paused
| import OpenClawKit | |
| import CoreLocation | |
| import Foundation | |
| import Testing | |
| @testable import OpenClaw | |
| struct MacNodeRuntimeTests { | |
| func handleInvokeRejectsUnknownCommand() async { | |
| let runtime = MacNodeRuntime() | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-1", command: "unknown.command")) | |
| #expect(response.ok == false) | |
| } | |
| func handleInvokeRejectsEmptySystemRun() async throws { | |
| let runtime = MacNodeRuntime() | |
| let params = OpenClawSystemRunParams(command: []) | |
| let json = try String(data: JSONEncoder().encode(params), encoding: .utf8) | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-2", command: OpenClawSystemCommand.run.rawValue, paramsJSON: json)) | |
| #expect(response.ok == false) | |
| } | |
| func handleInvokeRejectsEmptySystemWhich() async throws { | |
| let runtime = MacNodeRuntime() | |
| let params = OpenClawSystemWhichParams(bins: []) | |
| let json = try String(data: JSONEncoder().encode(params), encoding: .utf8) | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-2b", command: OpenClawSystemCommand.which.rawValue, paramsJSON: json)) | |
| #expect(response.ok == false) | |
| } | |
| func handleInvokeRejectsEmptyNotification() async throws { | |
| let runtime = MacNodeRuntime() | |
| let params = OpenClawSystemNotifyParams(title: "", body: "") | |
| let json = try String(data: JSONEncoder().encode(params), encoding: .utf8) | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-3", command: OpenClawSystemCommand.notify.rawValue, paramsJSON: json)) | |
| #expect(response.ok == false) | |
| } | |
| func handleInvokeCameraListRequiresEnabledCamera() async { | |
| await TestIsolation.withUserDefaultsValues([cameraEnabledKey: false]) { | |
| let runtime = MacNodeRuntime() | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-4", command: OpenClawCameraCommand.list.rawValue)) | |
| #expect(response.ok == false) | |
| #expect(response.error?.message.contains("CAMERA_DISABLED") == true) | |
| } | |
| } | |
| func handleInvokeScreenRecordUsesInjectedServices() async throws { | |
| final class FakeMainActorServices: MacNodeRuntimeMainActorServices, @unchecked Sendable { | |
| func recordScreen( | |
| screenIndex: Int?, | |
| durationMs: Int?, | |
| fps: Double?, | |
| includeAudio: Bool?, | |
| outPath: String?) async throws -> (path: String, hasAudio: Bool) | |
| { | |
| let url = FileManager().temporaryDirectory | |
| .appendingPathComponent("openclaw-test-screen-record-\(UUID().uuidString).mp4") | |
| try Data("ok".utf8).write(to: url) | |
| return (path: url.path, hasAudio: false) | |
| } | |
| func locationAuthorizationStatus() -> CLAuthorizationStatus { .authorizedAlways } | |
| func locationAccuracyAuthorization() -> CLAccuracyAuthorization { .fullAccuracy } | |
| func currentLocation( | |
| desiredAccuracy: OpenClawLocationAccuracy, | |
| maxAgeMs: Int?, | |
| timeoutMs: Int?) async throws -> CLLocation | |
| { | |
| CLLocation(latitude: 0, longitude: 0) | |
| } | |
| } | |
| let services = await MainActor.run { FakeMainActorServices() } | |
| let runtime = MacNodeRuntime(makeMainActorServices: { services }) | |
| let params = MacNodeScreenRecordParams(durationMs: 250) | |
| let json = try String(data: JSONEncoder().encode(params), encoding: .utf8) | |
| let response = await runtime.handleInvoke( | |
| BridgeInvokeRequest(id: "req-5", command: MacNodeScreenCommand.record.rawValue, paramsJSON: json)) | |
| #expect(response.ok == true) | |
| let payloadJSON = try #require(response.payloadJSON) | |
| struct Payload: Decodable { | |
| var format: String | |
| var base64: String | |
| } | |
| let payload = try JSONDecoder().decode(Payload.self, from: Data(payloadJSON.utf8)) | |
| #expect(payload.format == "mp4") | |
| #expect(!payload.base64.isEmpty) | |
| } | |
| } | |