feat: drawer remaining v1 field edits (T98.5)
Audit of chat/state/manual_edit.py target_kind dispatch found two §6.4 fields without drawer affordances despite being already-projected text columns: chat_state.narrative_anchor and chat_state.weather. Both land via new manual_edit branches (target_kind chat_narrative_anchor and chat_weather) plus paired drawer routes and Scene-section text inputs. The container properties_json blob is intentionally deferred — bounded JSON edits aren't wired through manual_edit and the drawer never surfaces multiple containers at once, so v1 leaves it out.
This commit is contained in:
@@ -456,3 +456,68 @@ def test_t98_4_delete_invokes_rewind_and_drops_cascade(client, tmp_path):
|
||||
"SELECT 1 FROM event_log WHERE id = ?", (ev_id,)
|
||||
).fetchone()
|
||||
assert row is None, f"event {ev_id} should have been deleted"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# T98.5 — remaining v1 edits (chat narrative anchor + weather).
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_t98_5_edit_chat_narrative_anchor_emits_manual_edit(client, tmp_path):
|
||||
db = tmp_path / "test.db"
|
||||
_seed_chat(db)
|
||||
|
||||
response = client.post(
|
||||
"/chats/chat_bot_a/drawer/chat/narrative-anchor",
|
||||
data={"new_value": "Late evening, after dinner"},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
|
||||
with open_db(db) as conn:
|
||||
row = conn.execute(
|
||||
"SELECT narrative_anchor FROM chat_state WHERE chat_id = ?",
|
||||
("chat_bot_a",),
|
||||
).fetchone()
|
||||
assert row[0] == "Late evening, after dinner"
|
||||
|
||||
import json as _json
|
||||
|
||||
log = conn.execute(
|
||||
"SELECT payload_json FROM event_log "
|
||||
"WHERE kind = 'manual_edit' ORDER BY id DESC LIMIT 1"
|
||||
).fetchone()
|
||||
payload = _json.loads(log[0])
|
||||
assert payload["target_kind"] == "chat_narrative_anchor"
|
||||
assert payload["target_id"] == "chat_bot_a"
|
||||
assert payload["prior_value"] == "Day 1"
|
||||
assert payload["new_value"] == "Late evening, after dinner"
|
||||
|
||||
|
||||
def test_t98_5_edit_chat_weather_emits_manual_edit(client, tmp_path):
|
||||
db = tmp_path / "test.db"
|
||||
_seed_chat(db)
|
||||
|
||||
response = client.post(
|
||||
"/chats/chat_bot_a/drawer/chat/weather",
|
||||
data={"new_value": "thunderstorm rolling in"},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
|
||||
with open_db(db) as conn:
|
||||
row = conn.execute(
|
||||
"SELECT weather FROM chat_state WHERE chat_id = ?",
|
||||
("chat_bot_a",),
|
||||
).fetchone()
|
||||
assert row[0] == "thunderstorm rolling in"
|
||||
|
||||
import json as _json
|
||||
|
||||
log = conn.execute(
|
||||
"SELECT payload_json FROM event_log "
|
||||
"WHERE kind = 'manual_edit' ORDER BY id DESC LIMIT 1"
|
||||
).fetchone()
|
||||
payload = _json.loads(log[0])
|
||||
assert payload["target_kind"] == "chat_weather"
|
||||
assert payload["target_id"] == "chat_bot_a"
|
||||
assert payload["prior_value"] == ""
|
||||
assert payload["new_value"] == "thunderstorm rolling in"
|
||||
|
||||
Reference in New Issue
Block a user