#if os(macOS) import Foundation import Testing import WebKit @testable import CodexBarCore @MainActor @Suite(.serialized) struct OpenAIDashboardScrapeScriptTests { @Test func `scraper returns structured account fields without full html`() async throws { if Self.shouldSkipOnCI() { return } let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) _ = webView.loadHTMLString(Self.bootstrapAccountHTML, baseURL: nil) try await Self.waitForFixture(webView, elementID: "account-fixture") let any = try await webView.evaluateJavaScript(openAIDashboardScrapeScript) let dict = try #require(any as? [String: Any]) #expect(dict["bodyHTML"] == nil) #expect(dict["signedInEmail"] as? String == "user@example.com") #expect(dict["authStatus"] as? String == "logged_in") #expect(dict["accountPlan"] as? String == "Pro 5x") } @Test func `usage breakdown scraper ignores neighboring client charts`() async throws { if Self.shouldSkipOnCI() { return } let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) _ = webView.loadHTMLString(Self.multiChartHTML, baseURL: nil) try await Self.waitForFixture(webView) let any = try await webView.evaluateJavaScript(openAIDashboardScrapeScript) let dict = try #require(any as? [String: Any]) let debug = dict["usageBreakdownDebug"] as? String let raw = try #require(dict["usageBreakdownJSON"] as? String, "debug: \(debug ?? "nil")") let decoded = try JSONDecoder().decode([OpenAIDashboardDailyBreakdown].self, from: Data(raw.utf8)) #expect(decoded.count == 1) #expect(decoded.first?.day == "2026-05-01") #expect(decoded.first?.totalCreditsUsed == 30) #expect((decoded.first?.services.map(\.service) ?? []) == ["Desktop", "CLI"]) } @Test func `usage breakdown scraper reports wrong chart instead of accepting it`() async throws { if Self.shouldSkipOnCI() { return } let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) _ = webView.loadHTMLString(Self.clientOnlyChartHTML, baseURL: nil) try await Self.waitForFixture(webView, elementID: "client-chart") let any = try await webView.evaluateJavaScript(openAIDashboardScrapeScript) let dict = try #require(any as? [String: Any]) #expect((dict["usageBreakdownJSON"] as? String) == nil) #expect((dict["usageBreakdownError"] as? String)?.contains("Threads and turns by client") == true) } @Test func `usage breakdown scraper rejects non english chart titles`() async throws { if Self.shouldSkipOnCI() { return } let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) _ = webView.loadHTMLString(Self.localizedUsageChartHTML, baseURL: nil) try await Self.waitForFixture(webView) let any = try await webView.evaluateJavaScript(openAIDashboardScrapeScript) let dict = try #require(any as? [String: Any]) #expect((dict["usageBreakdownJSON"] as? String) == nil) #expect( (dict["usageBreakdownError"] as? String)? .contains("No English usage breakdown chart title found") == true) } private static func shouldSkipOnCI() -> Bool { let env = ProcessInfo.processInfo.environment return env["GITHUB_ACTIONS"] == "true" || env["CI"] == "true" } private static func waitForFixture(_ webView: WKWebView, elementID: String = "usage-chart") async throws { let deadline = Date().addingTimeInterval(2) while Date() < deadline { let loaded = try? await webView.evaluateJavaScript( "document.getElementById('\(elementID)') !== null") as? Bool if loaded == true { return } try await Task.sleep(for: .milliseconds(50)) } } private static let bootstrapAccountHTML = """
Usage limits
""" private static let multiChartHTML = """

Usage breakdown

Personal usage

Daily threads by client

Product activity

Daily threads by client

Tokens by model

""" private static let clientOnlyChartHTML = """

Threads and turns by client

""" private static let localizedUsageChartHTML = """

Desglose de uso

""" } #endif