优化后端
This commit is contained in:
@@ -135,6 +135,32 @@ class SeatWebApiTests(unittest.TestCase):
|
||||
unauthenticated.open(f"{self.base_url}/api/runtime", timeout=3)
|
||||
self.assertEqual(caught.exception.code, 401)
|
||||
|
||||
with self.assertRaises(urllib.error.HTTPError) as state_denied:
|
||||
unauthenticated.open(
|
||||
f"{self.base_url}/api/hardware/vehicle-state?"
|
||||
"conversation_id=conv-unauthenticated-state&"
|
||||
"control_transport=wireless_mqtt",
|
||||
timeout=3,
|
||||
)
|
||||
self.assertEqual(state_denied.exception.code, 401)
|
||||
|
||||
control_request = urllib.request.Request(
|
||||
f"{self.base_url}/api/can/commands",
|
||||
method="POST",
|
||||
headers={"Content-Type": "application/json"},
|
||||
data=json.dumps(
|
||||
{
|
||||
"commands": ["reading_light power on"],
|
||||
"conversation_id": "conv-unauthenticated-control",
|
||||
"execution_mode": "hardware",
|
||||
"control_transport": "wireless_mqtt",
|
||||
}
|
||||
).encode("utf-8"),
|
||||
)
|
||||
with self.assertRaises(urllib.error.HTTPError) as control_denied:
|
||||
unauthenticated.open(control_request, timeout=3)
|
||||
self.assertEqual(control_denied.exception.code, 401)
|
||||
|
||||
def test_n7_mode_scene_catalog_is_public_and_read_only(self) -> None:
|
||||
unauthenticated = urllib.request.build_opener()
|
||||
|
||||
@@ -667,18 +693,18 @@ operations:
|
||||
def test_static_console_and_runtime_endpoint(self) -> None:
|
||||
with self.opener.open(f"{self.base_url}/", timeout=3) as response:
|
||||
html = response.read().decode("utf-8")
|
||||
with self.opener.open(f"{self.base_url}/app.js?v=dual-seat-131", timeout=3) as response:
|
||||
with self.opener.open(f"{self.base_url}/app.js?v=dual-seat-135", timeout=3) as response:
|
||||
app_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/gesture-control.js?v=android-pad-9", timeout=3
|
||||
) as response:
|
||||
gesture_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/console-v2.js?v=local-first-66", timeout=3
|
||||
f"{self.base_url}/console-v2.js?v=local-first-70", timeout=3
|
||||
) as response:
|
||||
console_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/console-v2.css?v=delivery-state-68", timeout=3
|
||||
f"{self.base_url}/console-v2.css?v=delivery-state-69", timeout=3
|
||||
) as response:
|
||||
console_styles = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
@@ -694,7 +720,7 @@ operations:
|
||||
) as response:
|
||||
speech_worklet = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/self-extension.js?v=gscu-tcp-43", timeout=3
|
||||
f"{self.base_url}/self-extension.js?v=gscu-tcp-44", timeout=3
|
||||
) as response:
|
||||
extension_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
@@ -702,7 +728,7 @@ operations:
|
||||
) as response:
|
||||
extension_styles = response.read().decode("utf-8").replace("\r\n", "\n")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/assistant-chat.js?v=codex-assistant-27", timeout=3
|
||||
f"{self.base_url}/assistant-chat.js?v=codex-assistant-32", timeout=3
|
||||
) as response:
|
||||
assistant_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
@@ -743,12 +769,12 @@ operations:
|
||||
self.assertIn("CMD 0x431 · FB 0x41A · CH1", html)
|
||||
self.assertIn("CMD 0x431 · FB 0x388 · CH1", html)
|
||||
self.assertNotIn("透明车体 · 实体设备", html)
|
||||
self.assertIn('src="/app.js?v=dual-seat-131"', html)
|
||||
self.assertIn('src="/app.js?v=dual-seat-135"', html)
|
||||
self.assertIn('href="/styles.css?v=dual-seat-23"', html)
|
||||
self.assertIn('src="/gesture-control.js?v=android-pad-9"', html)
|
||||
self.assertNotIn('class="vehicle-system-hud"', html)
|
||||
self.assertIn('src="/console-v2.js?v=local-first-66"', html)
|
||||
self.assertIn('href="/console-v2.css?v=delivery-state-68"', html)
|
||||
self.assertIn('src="/console-v2.js?v=local-first-70"', html)
|
||||
self.assertIn('href="/console-v2.css?v=delivery-state-69"', html)
|
||||
self.assertIn('src="/speech-input.js?v=sensevoice-13"', html)
|
||||
self.assertIn('href="/speech-input.css?v=sensevoice-7"', html)
|
||||
self.assertIn('id="speechDictationButton"', html)
|
||||
@@ -756,7 +782,7 @@ operations:
|
||||
self.assertIn('<body class="console-v2">', html)
|
||||
self.assertIn('id="v2BootScreen"', html)
|
||||
self.assertIn('正在加载车机控制与实时状态', html)
|
||||
self.assertIn('src="/self-extension.js?v=gscu-tcp-43"', html)
|
||||
self.assertIn('src="/self-extension.js?v=gscu-tcp-44"', html)
|
||||
self.assertIn('href="/self-extension.css?v=gscu-tcp-43"', html)
|
||||
self.assertNotIn("self-calibration", html)
|
||||
self.assertNotIn("self-repair", html)
|
||||
@@ -764,8 +790,8 @@ operations:
|
||||
self.assertNotIn("滚动查看更多", html)
|
||||
self.assertIn('aria-label="发送消息"', html)
|
||||
self.assertIn('id="assistantTranscript"', html)
|
||||
self.assertIn('href="/assistant-chat.css?v=codex-assistant-26"', html)
|
||||
self.assertIn('src="/assistant-chat.js?v=codex-assistant-27"', html)
|
||||
self.assertIn('href="/assistant-chat.css?v=codex-assistant-28"', html)
|
||||
self.assertIn('src="/assistant-chat.js?v=codex-assistant-32"', html)
|
||||
self.assertIn('href="/energy-monitor.css?v=energy-monitor-4"', html)
|
||||
self.assertIn('src="/energy-monitor.js?v=energy-monitor-4"', html)
|
||||
self.assertNotIn('"admin"', console_script)
|
||||
@@ -803,8 +829,12 @@ operations:
|
||||
'if (ui.activeModule === "self-extension" && role !== "user"',
|
||||
console_script,
|
||||
)
|
||||
self.assertIn('511工程-智能座舱', console_script)
|
||||
self.assertIn('网页控制链路', console_script)
|
||||
self.assertNotIn('511工程-智能座舱', console_script)
|
||||
self.assertNotIn('网页控制链路', console_script)
|
||||
self.assertIn('function buildModuleSwitcher(mainPanel, modeRail)', console_script)
|
||||
self.assertIn('if (modeRailBar) modeRailBar.prepend(switcher)', console_script)
|
||||
self.assertNotIn('class="v2-sync-sidebar-heading"', console_script)
|
||||
self.assertIn('function appendDispatchedControls(message, result = {})', assistant_script)
|
||||
self.assertIn('["self-orchestration", "self-extension"]', console_script)
|
||||
self.assertNotIn('label: "自诊断"', console_script)
|
||||
self.assertNotIn('runtimeControls.id = "v2RuntimeControls"', console_script)
|
||||
@@ -1043,14 +1073,14 @@ operations:
|
||||
self.assertIn("CAN 指令已提交,等待车辆状态确认", console_script)
|
||||
self.assertIn('canvas.addEventListener("webglcontextlost"', app_script)
|
||||
self.assertIn('"cognitive-agent:module-change"', app_script)
|
||||
self.assertIn('const CACHE_VERSION = "cognitive-agent-pad-v282"', service_worker)
|
||||
self.assertIn('/console-v2.css?v=delivery-state-68', service_worker)
|
||||
self.assertIn('/console-v2.js?v=local-first-66', service_worker)
|
||||
self.assertIn('/assistant-chat.css?v=codex-assistant-26', service_worker)
|
||||
self.assertIn('/assistant-chat.js?v=codex-assistant-27', service_worker)
|
||||
self.assertIn('const CACHE_VERSION = "cognitive-agent-pad-v290"', service_worker)
|
||||
self.assertIn('/console-v2.css?v=delivery-state-69', service_worker)
|
||||
self.assertIn('/console-v2.js?v=local-first-70', service_worker)
|
||||
self.assertIn('/assistant-chat.css?v=codex-assistant-28', service_worker)
|
||||
self.assertIn('/assistant-chat.js?v=codex-assistant-32', service_worker)
|
||||
self.assertIn('/energy-monitor.css?v=energy-monitor-4', service_worker)
|
||||
self.assertIn('/energy-monitor.js?v=energy-monitor-4', service_worker)
|
||||
self.assertIn('"/app.js?v=dual-seat-131"', service_worker)
|
||||
self.assertIn('"/app.js?v=dual-seat-135"', service_worker)
|
||||
self.assertIn('"/speech-input.js?v=sensevoice-13"', service_worker)
|
||||
self.assertIn('"/speech-input.css?v=sensevoice-7"', service_worker)
|
||||
self.assertIn('"/speech-audio-worklet.js?v=sensevoice-5"', service_worker)
|
||||
@@ -1507,7 +1537,7 @@ operations:
|
||||
) as response:
|
||||
extension_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/app.js?v=dual-seat-131", timeout=3
|
||||
f"{self.base_url}/app.js?v=dual-seat-135", timeout=3
|
||||
) as response:
|
||||
app_script = response.read().decode("utf-8")
|
||||
|
||||
@@ -3100,6 +3130,53 @@ operations:
|
||||
self.assertEqual(payload["source"], "wireless_mqtt_ch1")
|
||||
self.assertEqual(payload["capture_sequence"], 17)
|
||||
|
||||
def test_wireless_state_http_bypasses_only_the_physical_bench_lease(self) -> None:
|
||||
cases = (
|
||||
("seat-state", "synchronize_hardware_state", "conv-http-mqtt-seat-state"),
|
||||
("vehicle-state", "synchronize_vehicle_state", "conv-http-mqtt-vehicle-state"),
|
||||
)
|
||||
for endpoint, method_name, conversation_id in cases:
|
||||
with self.subTest(endpoint=endpoint):
|
||||
with patch.object(
|
||||
self.service,
|
||||
method_name,
|
||||
return_value={"status": "succeeded", "source": "wireless_mqtt"},
|
||||
) as synchronize:
|
||||
request = urllib.request.Request(
|
||||
f"{self.base_url}/api/hardware/{endpoint}?"
|
||||
f"conversation_id={conversation_id}&vehicle_id=denza_n7&"
|
||||
"control_transport=wireless_mqtt&"
|
||||
"hardware_client_id=hwc-e2e-state-reader",
|
||||
headers={"X-Forwarded-For": "203.0.113.25"},
|
||||
)
|
||||
with self.opener.open(request, timeout=3) as response:
|
||||
self.assertEqual(response.status, 200)
|
||||
|
||||
synchronize.assert_called_once_with(
|
||||
conversation_id,
|
||||
"denza_n7",
|
||||
control_transport="wireless_mqtt",
|
||||
hardware_client_id="hwc-e2e-state-reader",
|
||||
hardware_access_bypass=True,
|
||||
)
|
||||
|
||||
with patch.object(
|
||||
self.service,
|
||||
"synchronize_vehicle_state",
|
||||
return_value={"status": "succeeded", "source": "physical_can_ch1"},
|
||||
) as synchronize_wired:
|
||||
request = urllib.request.Request(
|
||||
f"{self.base_url}/api/hardware/vehicle-state?"
|
||||
"conversation_id=conv-http-wired-state&vehicle_id=denza_n7&"
|
||||
"control_transport=wired_can&"
|
||||
"hardware_client_id=hwc-e2e-state-reader",
|
||||
headers={"X-Forwarded-For": "203.0.113.25"},
|
||||
)
|
||||
with self.opener.open(request, timeout=3) as response:
|
||||
self.assertEqual(response.status, 200)
|
||||
|
||||
self.assertFalse(synchronize_wired.call_args.kwargs["hardware_access_bypass"])
|
||||
|
||||
def test_gpt_http_failure_falls_back_without_returning_502(self) -> None:
|
||||
original_api_key = self.service.openai.api_key
|
||||
self.service.openai.api_key = "test-key"
|
||||
|
||||
Reference in New Issue
Block a user