import XCTest @testable import MultiSimAdmin final class DeviceServiceTests: XCTestCase { func testLoadsAndFlattensWhitelistedReadSections() async throws { let store = InstanceSessionStore() let client = DeviceTestClient() let service = DeviceService(client: client, sessions: store) let instance = Self.instance() await store.set(instance.id, origin: instance.endpoint.directOrigin!, cookie: "simadmin_session=token") let snapshot = try await service.snapshot(instance) XCTAssertEqual(client.routes, [.device, .sim, .network, .stats, .statsCpu, .connectivity]) XCTAssertEqual(snapshot.sections[0].values["model"], "SIMBox 8") XCTAssertEqual(snapshot.sections[0].values["online"], "是") XCTAssertEqual(snapshot.sections[1].values["phone_numbers"], "13800138000") XCTAssertEqual(snapshot.sections[2].values["operator_name"], "中国移动") XCTAssertEqual(snapshot.sections[3].values["uptime_uptime_seconds"], "86400") XCTAssertEqual(snapshot.sections[4].values["core_count"], "4") XCTAssertEqual(snapshot.sections[5].values["state"], "connected") } func testBuildsRunningSummaryFromUpstreamSections() async throws { let store = InstanceSessionStore() let client = DeviceTestClient() let service = DeviceService(client: client, sessions: store) let instance = Self.instance() await store.set(instance.id, origin: instance.endpoint.directOrigin!, cookie: "simadmin_session=token") let summary = try await service.summary(instance) XCTAssertEqual(summary.deviceName, "SIMBox 8") XCTAssertEqual(summary.phoneNumber, "13800138000") XCTAssertEqual(summary.operatorName, "中国移动") XCTAssertEqual(summary.connectivity, "connected") XCTAssertEqual(summary.firmwareVersion, "2.4.1") XCTAssertEqual(summary.totalStorageBytes, 1024) XCTAssertEqual(summary.availableStorageBytes, 512) XCTAssertEqual(summary.downloadRateBytesPerSecond, 128) XCTAssertEqual(summary.uploadRateBytesPerSecond, 64) XCTAssertEqual(summary.messagesToday, 12) XCTAssertEqual(summary.uptimeSeconds, 86400) } private static func instance() -> Instance { Instance( id: UUID(), name: "Device Node", origin: URL(string: "http://192.168.1.20:3000")!, configRevision: 1, createdAt: Date(), updatedAt: Date() ) } } private final class DeviceTestClient: SimAdminClientProtocol, @unchecked Sendable { var routes: [UpstreamRoute] = [] func send(_ route: UpstreamRoute, baseURL: URL, cookie: String?) async throws -> UpstreamResponse { routes.append(route) guard cookie == "simadmin_session=token" else { throw UpstreamError.unauthorized } let payload: [UpstreamRoute: String] = [ .device: #"{"data":{"model":"SIMBox 8","online":true,"firmware_version":"2.4.1"}}"#, .sim: #"{"data":{"phone_numbers":["13800138000"],"iccid":"123"}}"#, .network: #"{"data":{"operator_name":"中国移动","registration_status":"registered"}}"#, .stats: #"{"data":{"uptime":{"uptime_seconds":86400},"disk_total_bytes":1024,"disk_available_bytes":512}}"#, .statsCpu: #"{"data":{"core_count":4,"model_name":"ARM CPU"}}"#, .connectivity: #"{"data":{"state":"connected","latency_ms":21,"download":128,"upload":64,"messages_today":12}}"# ] guard let json = payload[route] else { throw UpstreamError.notSupported } return UpstreamResponse(status: 200, data: Data(json.utf8)) } }