feat(n7web): enhance control workflows and status feedback

This commit is contained in:
Miayui
2026-09-16 12:52:07 +08:00
parent 84a3cd73bb
commit 0e4328f548
45 changed files with 7317 additions and 1001 deletions
+68
View File
@@ -277,6 +277,7 @@ class FakeVehicleService:
self.calls: list[dict[str, object]] = []
self.mode_save_calls: list[dict[str, object]] = []
self.mode_trial_calls: list[dict[str, object]] = []
self.mode_scene_publish_calls: list[dict[str, object]] = []
self.fail = False
def preview_native_can(self, **kwargs: object) -> dict[str, object]:
@@ -481,6 +482,44 @@ class FakeVehicleService:
"source_request_id": source_request_id,
}
def save_mode_profile_card(
self,
mode_id: str,
name: str,
instruction: str,
source_request_id: str,
vehicle_id: str | None = None,
) -> dict[str, object]:
return {
"status": "succeeded",
"mode_profile": {
"id": mode_id,
"name": name,
"origin": "user",
"operation_count": 1,
"instruction": instruction,
},
"vehicle_id": vehicle_id,
"storage": "persistent_yaml",
"source_request_id": source_request_id,
}
def publish_saved_mode_scene(
self,
mode_id: str,
vehicle_id: str | None = None,
) -> dict[str, object]:
self.mode_scene_publish_calls.append(
{"mode_id": mode_id, "vehicle_id": vehicle_id}
)
return {
"state": "queued",
"topic": "from_pc/scenes",
"scene_id": mode_id,
"burst_count": 3,
"burst_window_ms": 1_000,
}
def trial_mode_profile_draft(
self,
name: str,
@@ -548,6 +587,7 @@ class TestCodexAssistantWebApi:
AssistantApiHandler.service.calls.clear()
AssistantApiHandler.service.mode_save_calls.clear()
AssistantApiHandler.service.mode_trial_calls.clear()
AssistantApiHandler.service.mode_scene_publish_calls.clear()
AssistantApiHandler.service.fail = False
FAKE_CODEX.available = True
FAKE_CODEX.turn_calls.clear()
@@ -1386,6 +1426,34 @@ class TestCodexAssistantWebApi:
assert saved["status"] == "succeeded"
assert saved["mode_profile"]["origin"] == "user"
assert saved["mode_profile"]["operation_count"] == 9
assert AssistantApiHandler.service.mode_scene_publish_calls == [
{"mode_id": "mode-movie", "vehicle_id": "denza_n7"}
]
assert saved["mode_scene_mqtt"] == {
"state": "queued",
"topic": "from_pc/scenes",
"scene_id": "mode-movie",
"burst_count": 3,
"burst_window_ms": 1_000,
}
update_status, _content_type, updated = self._request_json(
"/api/mode-profiles/mode-movie",
payload["mode_profile_draft"],
)
assert update_status == 200
assert updated["mode_profile"]["id"] == "mode-movie"
assert updated["mode_scene_mqtt"] == {
"state": "queued",
"topic": "from_pc/scenes",
"scene_id": "mode-movie",
"burst_count": 3,
"burst_window_ms": 1_000,
}
assert AssistantApiHandler.service.mode_scene_publish_calls == [
{"mode_id": "mode-movie", "vehicle_id": "denza_n7"},
{"mode_id": "mode-movie", "vehicle_id": "denza_n7"},
]
def test_vehicle_failure_is_recorded_and_never_overwritten_by_codex_success(self) -> None:
AssistantApiHandler.service.fail = True