feat(n7web): add pet NFC workflow and glass UI
This commit is contained in:
@@ -60,8 +60,8 @@ def test_unified_console_exposes_device_id_based_nfc_authorization() -> None:
|
||||
assert '.v2-nfc-command-list' in styles
|
||||
assert '.v2-nfc-command-option' in styles
|
||||
assert '.v2-nfc-select-all' in styles
|
||||
assert 'self-extension.js?v=gscu-tcp-44' in html
|
||||
assert 'self-extension.css?v=gscu-tcp-43' in html
|
||||
assert 'self-extension.js?v=pet-acrylic-48' in html
|
||||
assert 'self-extension.css?v=pet-acrylic-48' in html
|
||||
|
||||
|
||||
def test_unified_console_exposes_gscu_tcp_configuration_and_actions() -> None:
|
||||
@@ -121,14 +121,69 @@ def test_server_exposes_nfc_snapshot_through_same_origin_extension_api() -> None
|
||||
server = (ROOT / "src" / "cognitive_agent" / "server.py").read_text(encoding="utf-8")
|
||||
|
||||
assert 'nfc = NfcReaderService()' in server
|
||||
assert 'pets = PetCardService(' in server
|
||||
assert 'path == "/api/extension/nfc/status"' in server
|
||||
assert 'path == "/api/extension/pets"' in server
|
||||
assert '"pet_cards": self.pets.snapshot()' in server
|
||||
assert 'path == "/api/extension/peripherals"' in server
|
||||
assert '"nfc": self.nfc.snapshot()' in server
|
||||
assert 'SeatDemoHandler.nfc.start()' in server
|
||||
assert 'SeatDemoHandler.pets.start()' in server
|
||||
assert 'SeatDemoHandler.pets.close()' in server
|
||||
assert 'SeatDemoHandler.nfc.close()' in server
|
||||
assert "frame-src 'self' http://*:3001" in server
|
||||
|
||||
|
||||
def test_homepage_exposes_durable_editable_pet_cards_and_nfc_only_binding() -> None:
|
||||
script = source("self-extension.js")
|
||||
styles = source("self-extension.css")
|
||||
service = (ROOT / "src" / "cognitive_agent" / "application" / "pet_cards.py").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
mqtt = (
|
||||
ROOT / "src" / "cognitive_agent" / "infrastructure" / "can" / "mqtt_transport.py"
|
||||
).read_text(encoding="utf-8")
|
||||
|
||||
assert 'class="v2-pet-card-region"' in script
|
||||
assert 'data-pet-field="pet_name"' in script
|
||||
assert 'data-pet-field="action"' in script
|
||||
assert '<output>${card.nfc_id ?' in script
|
||||
assert 'data-pet-open-nfc' not in script
|
||||
assert 'data-nfc-pet-select' in script
|
||||
assert 'data-nfc-bind-pet' in script
|
||||
assert 'bind-current-nfc' in script
|
||||
assert 'api(`pets/${encodeURIComponent(cardId)}`' in script
|
||||
assert 'burst_count' in script
|
||||
assert 'burst_window_ms' in script
|
||||
assert 'label: "已发送 3 帧"' in script
|
||||
assert 'MQTT PET CARD' not in script
|
||||
assert 'data-pet-publish-note' not in script
|
||||
assert '宠物名 <code>' not in script
|
||||
assert '宠物动作 <code>' not in script
|
||||
assert '卡片 ID <code>' not in script
|
||||
assert 'n7/pet' in script
|
||||
assert 'if (nextRevision < petCardSnapshot.revision) return false' in script
|
||||
assert '.v2-pet-card-region' in styles
|
||||
assert '.v2-pet-card-list' in styles
|
||||
assert '.v2-nfc-pet-binding' in styles
|
||||
assert 'grid-template-columns: minmax(0, 1fr);' in styles
|
||||
assert 'scrollbar-gutter: stable' in styles
|
||||
assert 'backdrop-filter: blur(18px) saturate(1.35)' in styles
|
||||
assert 'height: 58px' in styles
|
||||
|
||||
assert 'class PetCardService' in service
|
||||
assert 'PET_MQTT_TOPIC = "n7/pet"' in service
|
||||
assert 'def bind_current_nfc' in service
|
||||
assert '"pet_name": str(card["pet_name"])' in service
|
||||
assert '"nfc_id": nfc_id' in service
|
||||
assert '"action": str(card["action"])' in service
|
||||
assert 'PET_BURST_COUNT = 3' in service
|
||||
assert 'PET_BURST_WINDOW_S = 1.0' in service
|
||||
assert '"burst_complete"' in service
|
||||
assert 'MQTT_PET_TOPIC = "n7/pet"' in mqtt
|
||||
assert 'def publish_pet_message' in mqtt
|
||||
|
||||
|
||||
def test_main_parsed_control_panel_renders_validated_infrared_operations() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
Reference in New Issue
Block a user