import Testing
import Foundation
@testable import Proat

/// Tests voor de deadline-race die de lokale failover aanstuurt.
/// De race is de kern van de nieuwe logica: een snel cloud-antwoord moet
/// gewoon doorkomen, een trage/hangende cloud moet binnen de drempel afbreken
/// zodat we kunnen terugvallen op lokaal Whisper.
struct FailoverTranscriptionServiceTests {

    @Test func returnsResultWhenTaskBeatsDeadline() async throws {
        let task = Task<String, Error> { "voxtral-resultaat" }
        let result = try await raceAgainstDeadline(task, seconds: 5.0)
        #expect(result == "voxtral-resultaat")
    }

    @Test func throwsTimeoutWhenTaskExceedsDeadline() async {
        let slow = Task<String, Error> {
            try await Task.sleep(nanoseconds: 10_000_000_000) // 10s
            return "te-laat"
        }
        defer { slow.cancel() }

        await #expect(throws: TranscriptionFailoverTimeout.self) {
            _ = try await raceAgainstDeadline(slow, seconds: 0.1)
        }
    }

    @Test func propagatesTaskErrorBeforeDeadline() async {
        struct Boom: Error {}
        let failing = Task<String, Error> { throw Boom() }

        await #expect(throws: Boom.self) {
            _ = try await raceAgainstDeadline(failing, seconds: 5.0)
        }
    }
}
