From b11b33b63c30e63f5b170fbee301e6026dc5fb71 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 9 Dec 2025 19:51:51 +0100 Subject: [PATCH] test(overlay): cover token guard outcomes --- .../Sources/Clawdis/VoiceWakeOverlay.swift | 26 ++++++++++++------- .../VoiceWakeOverlayTests.swift | 21 +++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 apps/macos/Tests/ClawdisIPCTests/VoiceWakeOverlayTests.swift diff --git a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift index 7f0f9d385..e96d6060b 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift @@ -259,23 +259,31 @@ final class VoiceWakeOverlayController: ObservableObject { // MARK: - Private private func guardToken(_ token: UUID?, context: String) -> Bool { - guard let active = self.activeToken else { - self.logger.log(level: .info, "overlay drop \(context, privacy: .public) no_active") - return false - } - if let token, token != active { + switch Self.evaluateToken(active: self.activeToken, incoming: token) { + case .accept: + return true + case .dismiss: self.logger.log( level: .info, """ overlay drop \(context, privacy: .public) token_mismatch \ - active=\(active.uuidString, privacy: .public) \ - got=\(token.uuidString, privacy: .public) + active=\(self.activeToken?.uuidString ?? "nil", privacy: .public) \ + got=\(token?.uuidString ?? "nil", privacy: .public) """) - // If tokens diverge, clear the stale overlay so the UI can resync. self.dismiss(reason: .explicit, outcome: .empty) return false + case .drop: + self.logger.log(level: .info, "overlay drop \(context, privacy: .public) no_active") + return false } - return true + } + + enum GuardOutcome { case accept, dismiss, drop } + + nonisolated static func evaluateToken(active: UUID?, incoming: UUID?) -> GuardOutcome { + guard let active else { return .drop } + if let incoming, incoming != active { return .dismiss } + return .accept } private func present() { diff --git a/apps/macos/Tests/ClawdisIPCTests/VoiceWakeOverlayTests.swift b/apps/macos/Tests/ClawdisIPCTests/VoiceWakeOverlayTests.swift new file mode 100644 index 000000000..bbdea1d20 --- /dev/null +++ b/apps/macos/Tests/ClawdisIPCTests/VoiceWakeOverlayTests.swift @@ -0,0 +1,21 @@ +import Foundation +import Testing +@testable import Clawdis + +@Suite struct VoiceWakeOverlayTests { + @Test func guardTokenDropsWhenNoActive() { + let outcome = VoiceWakeOverlayController.evaluateToken(active: nil, incoming: UUID()) + #expect(outcome == .drop) + } + + @Test func guardTokenAcceptsMatching() { + let token = UUID() + let outcome = VoiceWakeOverlayController.evaluateToken(active: token, incoming: token) + #expect(outcome == .accept) + } + + @Test func guardTokenDismissesMismatch() { + let outcome = VoiceWakeOverlayController.evaluateToken(active: UUID(), incoming: UUID()) + #expect(outcome == .dismiss) + } +}