Files
lanework/KanbanMobileUITests/SettingsAboutUITests.swift
T
rzen adbc5ddd89 Backup bows out of the phone — the zipped-share future replaces it, later
IndieBackup comes out whole: the package, the Backup directory, the Settings section, the .kanbanbackup document type and its onOpenURL restore path. Settings is now the About section alone. The Files-app keys stay — they serve local-board visibility, not backups. Board sharing as a zipped archive is the planned replacement and is deliberately not started here.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
2026-08-08 11:25:53 -04:00

56 lines
2.7 KiB
Swift

import XCTest
/// The Settings tab's last section — `SettingsTabView`'s `IndieAbout` block: version/build (which
/// doubles as the changelog link), the License document link, and the copyright line.
final class SettingsAboutUITests: XCTestCase {
@MainActor
func testSettingsAboutSection() throws {
let (app, _) = XCUIApplication.launchedWithFixtureBoard()
app.tabBars.buttons["Settings"].tap()
// The About section is the only section in the form — a speculative swipe settles the
// list near the bottom before anything here is queried, harmless if the content already
// fit on screen.
app.swipeUp()
// `IndieAbout`'s version line is three sibling `Text` views (prefix, the tappable
// "1.0-<build>" link, suffix) — none of them wrapped in a control that would flatten them
// into one accessibility element, so the link is addressable on its own by the substring
// only it carries. `MARKETING_VERSION` for KanbanMobile is "1.0" (project.yml).
let versionLink = app.staticTexts.matching(NSPredicate(format: "label CONTAINS %@", "1.0")).firstMatch
XCTAssertTrue(
versionLink.waitForExistence(timeout: XCUIApplication.uiTimeout),
"no version label containing \"1.0\" appeared in Settings"
)
let licenseLink = app.staticTexts["License"]
XCTAssertTrue(licenseLink.waitForExistence(timeout: XCUIApplication.uiTimeout), "the License link never appeared")
let copyright = app.element(labelContaining: "2026 rzen")
XCTAssertTrue(copyright.waitForExistence(timeout: XCUIApplication.uiTimeout), "the copyright text never appeared")
// Tap the version link — opens the changelog (`IndieAbout.versionLineView`'s
// `.onTapGesture`, wired to `changelogDocument: .changelog()` in `SettingsTabView`).
app.scrollUntilHittable(versionLink)
versionLink.tap()
let changelogText = app.element(labelContaining: "August 2026")
XCTAssertTrue(
changelogText.waitForExistence(timeout: XCUIApplication.uiTimeout),
"the changelog sheet never showed \"August 2026\" (KanbanMobile/CHANGELOG.md)"
)
app.navigationBars.buttons["Done"].tap()
// Tap License — opens the bundled ISC license.
app.scrollUntilHittable(licenseLink)
licenseLink.tap()
let licenseText = app.element(labelContaining: "ISC License")
XCTAssertTrue(
licenseText.waitForExistence(timeout: XCUIApplication.uiTimeout),
"the license sheet never showed \"ISC License\" (LICENSE.md)"
)
app.navigationBars.buttons["Done"].tap()
}
}