feat: 实现受控真实下单安全边界 (#99)
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user