88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
"""真实下单授权服务测试;不连接 Admin 或手机。"""
|
|||
|
|
|
||
|
|
import os
|
||
|
|
import tempfile
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from src.live_purchase_authorization import (
|
||
|
|
LIVE_CONFIRMATION_TEXT,
|
||
|
|
LIVE_ENABLED_KEY,
|
||
|
|
LivePurchaseAuthorizationService,
|
||
|
|
)
|
||
|
|
from src.settings_repository import SettingsRepository
|
||
|
|
|
||
|
|
|
||
|
|
class LivePurchaseAuthorizationTest(unittest.TestCase):
|
||
|
|
def setUp(self) -> None:
|
||
|
|
self.temporary_directory = tempfile.TemporaryDirectory()
|
||
|
|
repository = SettingsRepository(
|
||
|
|
Path(self.temporary_directory.name) / "client.db"
|
||
|
|
)
|
||
|
|
self.repository = repository
|
||
|
|
self.service = LivePurchaseAuthorizationService(repository)
|
||
|
|
|
||
|
|
def tearDown(self) -> None:
|
||
|
|
self.temporary_directory.cleanup()
|
||
|
|
|
||
|
|
def test_missing_setting_and_environment_always_default_to_dry_run(self):
|
||
|
|
os.environ["CMAUTOBUY_PURCHASE_MODE"] = "live"
|
||
|
|
try:
|
||
|
|
self.assertFalse(self.service.load().enabled)
|
||
|
|
self.assertEqual(
|
||
|
|
self.service.purchase_mode_for(
|
||
|
|
"CLIENT-1", "USB-1", live_adapter_ready=True
|
||
|
|
),
|
||
|
|
"dry_run",
|
||
|
|
)
|
||
|
|
finally:
|
||
|
|
os.environ.pop("CMAUTOBUY_PURCHASE_MODE", None)
|
||
|
|
|
||
|
|
def test_enable_requires_exact_confirmation_and_binds_identity(self):
|
||
|
|
with self.assertRaisesRegex(ValueError, LIVE_CONFIRMATION_TEXT):
|
||
|
|
self.service.enable("CLIENT-1", "USB-1", "确认")
|
||
|
|
self.assertIsNone(self.repository.get(LIVE_ENABLED_KEY))
|
||
|
|
|
||
|
|
authorization = self.service.enable(
|
||
|
|
"CLIENT-1", "USB-1", LIVE_CONFIRMATION_TEXT
|
||
|
|
)
|
||
|
|
|
||
|
|
self.assertTrue(authorization.enabled)
|
||
|
|
self.assertTrue(authorization.matches("CLIENT-1", "USB-1"))
|
||
|
|
self.assertEqual(
|
||
|
|
self.service.purchase_mode_for(
|
||
|
|
"CLIENT-1", "USB-1", live_adapter_ready=True
|
||
|
|
),
|
||
|
|
"live",
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_binding_mismatch_or_missing_adapter_stays_dry_run(self):
|
||
|
|
self.service.enable("CLIENT-1", "USB-1", LIVE_CONFIRMATION_TEXT)
|
||
|
|
|
||
|
|
self.assertEqual(
|
||
|
|
self.service.purchase_mode_for(
|
||
|
|
"CLIENT-2", "USB-1", live_adapter_ready=True
|
||
|
|
),
|
||
|
|
"dry_run",
|
||
|
|
)
|
||
|
|
self.assertEqual(
|
||
|
|
self.service.purchase_mode_for(
|
||
|
|
"CLIENT-1", "USB-2", live_adapter_ready=True
|
||
|
|
),
|
||
|
|
"dry_run",
|
||
|
|
)
|
||
|
|
self.assertEqual(
|
||
|
|
self.service.purchase_mode_for(
|
||
|
|
"CLIENT-1", "USB-1", live_adapter_ready=False
|
||
|
|
),
|
||
|
|
"dry_run",
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_disable_is_immediate_and_does_not_require_confirmation(self):
|
||
|
|
self.service.enable("CLIENT-1", "USB-1", LIVE_CONFIRMATION_TEXT)
|
||
|
|
|
||
|
|
authorization = self.service.disable()
|
||
|
|
|
||
|
|
self.assertFalse(authorization.enabled)
|
||
|
|
self.assertFalse(self.service.load().enabled)
|