feat(n7web): enhance control workflows and status feedback
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user