feat: 实现受控真实下单安全边界 (#99)

This commit is contained in:
chengma
2026-08-10 16:35:38 +08:00
parent 7106f6b024
commit e960cab1fb
30 changed files with 1562 additions and 66 deletions
+61
View File
@@ -19,6 +19,10 @@ from src.android_device_service import (
AndroidWifiConversionResult,
)
from src.mock_admin_gateway import MockAdminGateway
from src.live_purchase_authorization import (
LIVE_CONFIRMATION_TEXT,
LIVE_ENABLED_KEY,
)
from src.selected_android_device_service import SELECTED_ANDROID_SERIAL_KEY
from src.settings_repository import SettingsRepository
from src.settings_ui import AndroidDeviceRow, SettingsPage
@@ -215,6 +219,63 @@ class SettingsPageEventTest(unittest.TestCase):
page.eventBinder.shutdown()
page.deleteLater()
def test_live_purchase_defaults_off_and_requires_exact_confirmation(self):
page = SettingsPage(
settings_repository=self.repository,
admin_gateway=MockAdminGateway(),
live_purchase_adapter_ready=True,
)
self.assertIn("已关闭", page.livePurchaseStatusLabel.text())
self.assertFalse(page.livePurchaseEnableButton.isEnabled())
page.livePurchaseConfirmationInput.setText("确认")
self.assertFalse(page.livePurchaseEnableButton.isEnabled())
page.livePurchaseConfirmationInput.setText(LIVE_CONFIRMATION_TEXT)
self.assertTrue(page.livePurchaseEnableButton.isEnabled())
page.eventBinder.shutdown()
page.deleteLater()
def test_enable_and_disable_live_purchase_updates_admin_capability(self):
self.repository.set_many(
{
"admin.client_id": "CLIENT-LIVE",
"admin.client_name": "采购电脑",
SELECTED_ANDROID_SERIAL_KEY: "USB-LIVE",
}
)
gateway = MockAdminGateway()
service = SequenceAndroidDeviceService([[]])
page = SettingsPage(
settings_repository=self.repository,
admin_gateway=gateway,
android_device_service=service,
live_purchase_adapter_ready=True,
)
self._wait_until(lambda: page.eventBinder._search_thread is None)
page.livePurchaseConfirmationInput.setText(LIVE_CONFIRMATION_TEXT)
page.livePurchaseEnableButton.click()
self._wait_until(
lambda: page.eventBinder._live_purchase_thread is None
)
self.assertIs(self.repository.get(LIVE_ENABLED_KEY), True)
self.assertIn("已启用", page.livePurchaseStatusLabel.text())
registered = gateway.registered_client("CLIENT-LIVE")
self.assertEqual(registered[1].purchase_mode, "live")
page.livePurchaseDisableButton.click()
self._wait_until(
lambda: page.eventBinder._live_purchase_thread is None
)
self.assertIs(self.repository.get(LIVE_ENABLED_KEY), False)
self.assertIn("已关闭", page.livePurchaseStatusLabel.text())
registered = gateway.registered_client("CLIENT-LIVE")
self.assertEqual(registered[1].purchase_mode, "dry_run")
page.eventBinder.shutdown()
page.deleteLater()
def test_save_persists_locally_and_registers_with_mock(self):
gateway = MockAdminGateway()
page = SettingsPage(