Files
cmautobuy/client/test/test_live_purchase_authorization.py
T

88 lines
2.9 KiB
Python
Raw Normal View History

"""真实下单授权服务测试;不连接 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)