Handle pasted memo identifiers and explain invalid review input

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a09cbb-87c6-7900-a145-4ce53ba9f1a6
This commit is contained in:
tegwick 2026-09-16 01:25:12 +02:00
parent 2692fa6f13
commit c70d63abf9
5 changed files with 46 additions and 5 deletions

View file

@ -252,3 +252,27 @@ def test_renderer_release_cannot_silently_change_under_a_memo(review):
controller.store.save_memo(memo.next_version(ui_release='informed-decision@0.1.0'))
with pytest.raises(ReviewError,match='renderer_changed'):opened(review)
assert controller.store.evidence()==[]
@pytest.mark.parametrize("padding", ["", " ", "\t\r\n", "\u00a0"])
def test_pasted_memo_id_opens_current_version(review, padding):
controller, session, app, memo, engine, _ = review
controller.store.save_memo(memo.next_version())
response = call(app, '/review', cookie=SESSION_COOKIE+'=fixture-session',
query=urlencode({'memo_id': padding+memo.id+padding}))
assert response['status'] == 200
observations = controller.store.policy_observations()
assert json.loads(observations[-1]['request'])['context']['memo_version'] == 2
assert not engine.get('fixture').entries
@pytest.mark.parametrize("query", ["memo_id=", "memo_id=+", "memo_id=%60memo-1%60",
"memo_id=memo-1&memo_id=memo-1", "memo_id=memo-1&extra=x", "memo_id=memo+1",
"memo_id=https%3A%2F%2Fdecisions.coulomb.social%2Freview", "memo_id=%FF"])
def test_invalid_memo_input_explains_correction_before_policy(review, query):
controller, _, app, _, engine, _ = review
response = call(app, '/review', cookie=SESSION_COOKIE+'=fixture-session', query=query)
assert response['status'] == 400
assert 'Enter the memo identifier only' in response['body']
assert not controller.store.policy_observations()
assert not engine.get('fixture').entries