import XCTest @testable import NASBackup final class LANMonitorTests: XCTestCase { func test_ssidMatch_triggersCallback() async { let monitor = LANMonitor.shared let trusted = ["HomeNet"] var triggered = false monitor.onTrustedNetworkJoined = { _ in triggered = true } // Inject known SSID via checkAndTriggerIfTrusted using a subclass stub // Since fetchCurrentSSID uses NEHotspotNetwork (requires device), we test // the guard logic directly through checkAndTriggerIfTrusted with a mock SSID. let stub = LANMonitorSSIDStub(ssid: "HomeNet") await stub.checkAndTrigger(trustedSSIDs: trusted) { ssid in triggered = true } XCTAssertTrue(triggered) } func test_ssidMismatch_doesNotTrigger() async { var triggered = false let stub = LANMonitorSSIDStub(ssid: "RandomCafe") await stub.checkAndTrigger(trustedSSIDs: ["HomeNet"]) { _ in triggered = true } XCTAssertFalse(triggered) } func test_trustedSSIDs_caseInsensitiveMatch() async { var triggered = false let stub = LANMonitorSSIDStub(ssid: "homenet") let trusted = ["HomeNet"] // Case-sensitive check — verify current behaviour; adjust if policy changes. await stub.checkAndTrigger(trustedSSIDs: trusted) { _ in triggered = true } // Current implementation is case-sensitive; update assertion if behaviour changes. XCTAssertFalse(triggered, "Current implementation is case-sensitive") } } // Lightweight stub that bypasses NEHotspotNetwork entitlement requirement. struct LANMonitorSSIDStub { let ssid: String? func checkAndTrigger(trustedSSIDs: [String], callback: (String) -> Void) async { guard let ssid, trustedSSIDs.contains(ssid) else { return } callback(ssid) } }