field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit b3bd53e982ab254dc5baecdd38c56a78dbcb088e
parent 124919955d5a4493bd335974f68728fe719ec6cc
Author: triesap <tyson@radroots.org>
Date:   Fri, 28 Aug 2026 18:48:07 +0000

test: trust one verified submit action

- Treat one synthesized tap on a verified hittable control as the action proof.
- Materialize terminal form evidence immediately through ordinary scrolling.
- Wait for changed safe status or submit evidence after progress has cleared.
- Avoid duplicate taps and transient start-state inference entirely.

Diffstat:
MRadrootsUITests/RadrootsRemoteQualificationUITests.swift | 41+++++++++++++----------------------------
1 file changed, 13 insertions(+), 28 deletions(-)

diff --git a/RadrootsUITests/RadrootsRemoteQualificationUITests.swift b/RadrootsUITests/RadrootsRemoteQualificationUITests.swift @@ -1070,8 +1070,10 @@ final class RadrootsRemoteQualificationUITests: XCTestCase { let status = app.staticTexts.matching(identifier: "radroots.add.status").firstMatch let priorStatusLabel = status.exists ? status.label : nil let priorSubmitValue = submit.value as? String + submit.tap() + scrollTo(app, element: submit) guard - tapSubmitUntilWorkStarts( + waitForWorkToFinish( app, submit: submit, status: status, @@ -1080,15 +1082,6 @@ final class RadrootsRemoteQualificationUITests: XCTestCase { ) else { XCTFail( - "The Add submission tap did not start local work; " - + submissionDiagnostics(app, submit: submit) - ) - return nil - } - guard - waitForWorkToFinish(app) - else { - XCTFail( "The Add submission did not reach a terminal local state; " + submissionDiagnostics(app, submit: submit) ) @@ -1126,15 +1119,7 @@ final class RadrootsRemoteQualificationUITests: XCTestCase { } @MainActor - private func waitForWorkToFinish(_ app: XCUIApplication) -> Bool { - let progress = app.descendants(matching: .any)["radroots.add.progress"] - let finished = NSPredicate { _, _ in !progress.exists } - let expectation = XCTNSPredicateExpectation(predicate: finished, object: app) - return XCTWaiter.wait(for: [expectation], timeout: 180) == .completed - } - - @MainActor - private func tapSubmitUntilWorkStarts( + private func waitForWorkToFinish( _ app: XCUIApplication, submit: XCUIElement, status: XCUIElement, @@ -1142,17 +1127,17 @@ final class RadrootsRemoteQualificationUITests: XCTestCase { priorSubmitValue: String? ) -> Bool { let progress = app.descendants(matching: .any)["radroots.add.progress"] - let started = NSPredicate { _, _ in - if progress.exists { return true } - if status.exists { return status.label != priorStatusLabel } - if priorStatusLabel != nil { return true } + let finished = NSPredicate { _, _ in + guard !progress.exists else { return false } + if status.exists, !status.label.isEmpty, status.label != priorStatusLabel { + return true + } guard submit.exists else { return false } - return (submit.value as? String) != priorSubmitValue + let submitValue = submit.value as? String + return submitValue != priorSubmitValue && submitValue != "Working" } - - submit.tap() - let expectation = XCTNSPredicateExpectation(predicate: started, object: app) - return XCTWaiter.wait(for: [expectation], timeout: 10) == .completed + let expectation = XCTNSPredicateExpectation(predicate: finished, object: app) + return XCTWaiter.wait(for: [expectation], timeout: 180) == .completed } @MainActor