On the runner SDK the Picker label inherits the control accessibility identifier, so the .any query for presetSelect matches both a StaticText and the PopUpButton and .frame resolution fails. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
89 lines
2.9 KiB
Swift
89 lines
2.9 KiB
Swift
import XCTest
|
|
|
|
/// About and help chrome UI tests (issue #31).
|
|
@MainActor
|
|
final class AboutHelpUITests: XCTestCase {
|
|
|
|
private var app: XCUIApplication!
|
|
|
|
override func setUp() async throws {
|
|
continueAfterFailure = false
|
|
app = XCUIApplication()
|
|
app.launchEnvironment = ["ICCERY_UI_TESTING": "1"]
|
|
}
|
|
|
|
override func tearDown() async throws {
|
|
app?.terminate()
|
|
app = nil
|
|
}
|
|
|
|
private func element(_ id: String) -> XCUIElement {
|
|
let inApp = app.descendants(matching: .any)[id].firstMatch
|
|
if inApp.exists { return inApp }
|
|
return app.sheets.firstMatch.descendants(matching: .any)[id].firstMatch
|
|
}
|
|
|
|
private func waitFor(_ id: String, timeout: TimeInterval = 10) -> XCUIElement {
|
|
let deadline = Date().addingTimeInterval(timeout)
|
|
while Date() < deadline {
|
|
let el = element(id)
|
|
if el.exists { return el }
|
|
RunLoop.current.run(until: Date().addingTimeInterval(0.1))
|
|
}
|
|
let el = element(id)
|
|
XCTAssertTrue(el.exists, "Expected element \(id)")
|
|
return el
|
|
}
|
|
|
|
private func launchApp() {
|
|
app.launch()
|
|
if !app.wait(for: .runningForeground, timeout: 10) {
|
|
app.activate()
|
|
}
|
|
}
|
|
|
|
func testAboutDialogShowsVersionAndBuildDate() throws {
|
|
launchApp()
|
|
|
|
let openAbout = app.buttons["openAboutBtn"]
|
|
if !openAbout.waitForExistence(timeout: 10) {
|
|
// CI triage (#128): print the a11y tree so an empty or
|
|
// unexpected hierarchy shows up directly in the job log.
|
|
print("AXTREE-BEGIN windows=\(app.windows.count)\n\(app.debugDescription)\nAXTREE-END")
|
|
}
|
|
XCTAssertTrue(openAbout.exists)
|
|
openAbout.click()
|
|
|
|
_ = waitFor("aboutVersion", timeout: 10)
|
|
XCTAssertTrue(element("aboutBuildDate").exists)
|
|
|
|
let close = waitFor("closeAboutBtn", timeout: 10)
|
|
close.click()
|
|
|
|
XCTAssertFalse(element("aboutDialog").exists)
|
|
}
|
|
|
|
func testHelpOverlaysDoNotChangeSidebarHeight() throws {
|
|
launchApp()
|
|
|
|
let toggle = app.buttons["btnToggleAllHelp"]
|
|
XCTAssertTrue(toggle.waitForExistence(timeout: 10))
|
|
|
|
// SDK 13.1 emits no AXGroup for the sidebar root, and an
|
|
// identifier on the container clobbers child identifiers
|
|
// (#130) — measure a stable sidebar child instead. Query the
|
|
// pop-up by type: the Picker's "Preset" label inherits the same
|
|
// identifier, so an .any query matches twice.
|
|
let sidebarChild = app.popUpButtons["presetSelect"]
|
|
XCTAssertTrue(sidebarChild.waitForExistence(timeout: 10))
|
|
let before = sidebarChild.frame
|
|
|
|
toggle.click()
|
|
let after = sidebarChild.frame
|
|
|
|
XCTAssertEqual(before, after,
|
|
"Toggling global help must not reflow the sidebar.")
|
|
XCTAssertTrue(app.descendants(matching: .any)["openSettingsBtn"].exists)
|
|
}
|
|
}
|