fix(inplace,embed): input set back mid-flight, report inputs, ambiguous anchors
Four items owed after S5b, reported by design-dev during the anti-slop run:
- carry() measured a sent-then-changed form against its OLD DEFAULTS. An
answer set back mid-flight to the value the page first showed read as
untouched, and the swap put the just-saved value over it. A form sent and
then changed is now measured against its sent snapshot (sentSet.snapOf).
- The embed's clean-batch reload saw only our own forms. A report's own
inputs lost whatever the operator had typed into them. Unsaved text in
any control we don't own now holds the reload, and the page says so.
- Two r2b.toml rows ("D3 a stored theme...", "D3 forced light...") matched
twice, so they proved only by where the first match fell. Both are
re-anchored, and scripts/mutation_check.py now refuses any anchor that
matches more than once. A new tool control covers that.
- The r2_flow contract's C3 steps 2 and 4 now say what S5b superseded. U3
gains the report-input rule.
Mutation rows: u3_submit_all +1, r2_submit_all +1. Four rows were
re-anchored onto the moved lines.
This commit is contained in:
@@ -1819,3 +1819,33 @@ def test_a_batch_whose_refresh_fails_keeps_the_page(browser, live):
|
||||
assert _chosen(b) == {"a1": "yes", "a2": "no"}
|
||||
assert same and draft == "not sent", (same, draft)
|
||||
assert "reload" in said.lower(), said
|
||||
|
||||
|
||||
def test_a_sent_pick_set_back_to_its_first_value_mid_flight_is_kept(browser, live):
|
||||
"""design-dev's report, 2026-09-28: carry() measured a changed-after-press
|
||||
form against its OLD DEFAULTS, so an answer set back to the value the page
|
||||
first showed looked untouched — and the swap put the just-saved value
|
||||
back over the operator's last word, silently. A sent form that changed
|
||||
since its press is now measured against what it SENT."""
|
||||
from booth.marks import answer_pick
|
||||
base, root = live
|
||||
b = _set(root, 1)
|
||||
_picks(b, ("a1",))
|
||||
answer_pick(b, "a1", "no")
|
||||
page = browser.new_page()
|
||||
page.add_init_script(_HOLD_POSTS)
|
||||
page.goto(f"{base}/b/g/marks", wait_until="networkidle")
|
||||
page.locator("#mark-a1 summary.mark-change").click()
|
||||
page.check('#mark-a1 input[type=radio][value="yes"]')
|
||||
page.locator("#mark-a1 .mark-submit").click()
|
||||
page.wait_for_timeout(150)
|
||||
page.check('#mark-a1 input[type=radio][value="no"]') # back, mid-flight
|
||||
page.wait_for_function(
|
||||
"document.querySelector('#mark-a1 .mark-answer-choice') && "
|
||||
"document.querySelector('#mark-a1 .mark-answer-choice').textContent.trim() === 'yes'",
|
||||
timeout=10000)
|
||||
page.wait_for_timeout(300)
|
||||
showing = page.is_checked('#mark-a1 input[type=radio][value="no"]')
|
||||
page.close()
|
||||
assert _chosen(b) == {"a1": "yes"}
|
||||
assert showing, "the value set back mid-flight was replaced by the saved one"
|
||||
|
||||
Reference in New Issue
Block a user