- PrintPanelService: PMPrinterCreateFromPrinterID(CUPS queue id) -> PMSessionSetCurrentPMPrinter -> session default settings/page format. - NSPrinter(name: displayName) fallback when PM binding fails; display name resolved via lpoptions printer-info (docs/11 #188). - Default button 'Use Settings' (capture, not print); cancel -> nil. - PMPrinter released on every path via defer. - UITestHooks: printPanelResult stub (ICCERY_TEST_PRINT_PANEL=ok/cancel + PANEL_OPTIONS/PANEL_PRINTER), printPanelStubbed gate, cupsBinaryDir + lpArgvOutURL env seams; CupsService injected via AppEnvironment. Never opens System Settings / CUPS web UI / NSWorkspace. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
72 lines
2.4 KiB
Swift
72 lines
2.4 KiB
Swift
import Testing
|
|
import Foundation
|
|
@testable import ICCeryCore
|
|
@testable import ICCery
|
|
|
|
/// Issue 13 — panel outcome mapping (cancel → nil, ok → result).
|
|
/// The real `NSPrintPanel` is never run in tests; these exercise the
|
|
/// `UITestHooks` seam the UI tests rely on.
|
|
@Suite("PrintPanelStub")
|
|
struct PrintPanelStubTests {
|
|
|
|
private func withEnv(
|
|
_ vars: [String: String?],
|
|
_ body: () throws -> Void
|
|
) rethrows {
|
|
var saved: [String: String?] = [:]
|
|
for key in vars.keys {
|
|
saved[key] = ProcessInfo.processInfo.environment[key]
|
|
}
|
|
for (key, value) in vars {
|
|
if let value { setenv(key, value, 1) } else { unsetenv(key) }
|
|
}
|
|
defer {
|
|
for (key, value) in saved {
|
|
if let value { setenv(key, value, 1) } else { unsetenv(key) }
|
|
}
|
|
}
|
|
try body()
|
|
}
|
|
|
|
@Test("Cancel returns nil — not an error")
|
|
func cancelIsNil() throws {
|
|
try withEnv([
|
|
"ICCERY_UI_TESTING": "1",
|
|
"ICCERY_TEST_PRINT_PANEL": "cancel",
|
|
]) {
|
|
#expect(UITestHooks.printPanelStubbed)
|
|
#expect(UITestHooks.printPanelResult(forQueue: "q") == nil)
|
|
}
|
|
}
|
|
|
|
@Test("OK returns captured options + selected printer")
|
|
func okResult() throws {
|
|
try withEnv([
|
|
"ICCERY_UI_TESTING": "1",
|
|
"ICCERY_TEST_PRINT_PANEL": "ok",
|
|
"ICCERY_TEST_PANEL_OPTIONS": "MediaType=Photo InputSlot=Rear",
|
|
"ICCERY_TEST_PANEL_PRINTER": "Other_Queue",
|
|
]) {
|
|
let result = UITestHooks.printPanelResult(forQueue: "q")
|
|
#expect(result?.selectedPrinter == "Other_Queue")
|
|
#expect(result?.options.cupsOptions == "MediaType=Photo InputSlot=Rear")
|
|
#expect(result?.options.mediaType == "Photo")
|
|
#expect(result?.options.ppdUncorrectedPassthrough == true)
|
|
}
|
|
}
|
|
|
|
@Test("OK defaults selected printer to the opened queue")
|
|
func okDefaultsPrinter() throws {
|
|
try withEnv([
|
|
"ICCERY_UI_TESTING": "1",
|
|
"ICCERY_TEST_PRINT_PANEL": "ok",
|
|
"ICCERY_TEST_PANEL_OPTIONS": nil,
|
|
"ICCERY_TEST_PANEL_PRINTER": nil,
|
|
]) {
|
|
let result = UITestHooks.printPanelResult(forQueue: "My_Queue")
|
|
#expect(result?.selectedPrinter == "My_Queue")
|
|
#expect(result?.options.cupsOptions == nil)
|
|
}
|
|
}
|
|
}
|