feat: 接入远程订阅策略门禁 T-705
Tests / Python 3.11 / Windows (push) Has been cancelled

This commit is contained in:
chengma
2026-07-28 15:42:19 +08:00
parent 593c6f77cb
commit df9da63841
15 changed files with 925 additions and 73 deletions
+186
View File
@@ -17,6 +17,7 @@ from app import (
accounts,
ai,
appconfig,
client_policy,
db,
image_paths,
image_studio,
@@ -2010,6 +2011,30 @@ class GuiTests(TempDirMixin, unittest.TestCase):
self.assertTrue(allowed)
write_log.assert_called_once()
def test_startup_update_gate_returns_client_policy_to_startup(self):
policy = client_policy.parse_client_policy(
{
"policy_version": 1,
"subscription_check_enabled": False,
"subscription_enforcement_enabled": False,
"updated_at": "2026-07-28T15:19:19+08:00",
}
)
result = update_check.UpdateCheckResult(
current_version="1.0.0",
checked=True,
client_policy=policy,
)
captured = []
allowed = gui._run_startup_update_gate(
checker=lambda: result,
result_callback=captured.append,
)
self.assertTrue(allowed)
self.assertEqual([result], captured)
def test_status_callbacks_classify_success_warning_and_failure(self):
with self.make_temp_dir() as temp_dir:
statuses = []
@@ -11364,6 +11389,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
account_name="新账号",
plan_name="测试套餐",
expires_at="2026-08-20T23:59:59+08:00",
real_entitlement_allowed=True,
)
with mock.patch.object(main_window.QTimer, "singleShot"):
@@ -11405,6 +11431,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
account_name="新账号",
plan_name="测试套餐",
expires_at="2026-08-20T23:59:59+08:00",
real_entitlement_allowed=True,
)
fake_box, boxes = self.make_fake_message_box("开始配置店铺")
@@ -11466,6 +11493,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
account_name="主账号",
plan_name="专业版",
expires_at="2026-08-20T23:59:59+08:00",
real_entitlement_allowed=True,
)
window._apply_subscription_status(status)
@@ -11491,6 +11519,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
grace_expires_at="2026-08-23T23:59:59+08:00",
manage_url="https://cm.example.com/subscription",
notice_id="private-notice",
real_entitlement_allowed=True,
)
window._apply_subscription_status(grace)
@@ -11544,6 +11573,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
account_name="主账号",
plan_name="测试",
expires_at="2026-08-21T23:59:59+08:00",
real_entitlement_allowed=True,
)
with mock.patch.object(
@@ -11666,6 +11696,161 @@ class GuiTests(TempDirMixin, unittest.TestCase):
settings_tab.subscription_check_button.text(),
)
def test_remote_policy_off_skips_check_and_keeps_workflows_available(self):
policy = client_policy.ClientPolicy(
policy_version=1,
subscription_check_enabled=False,
subscription_enforcement_enabled=False,
updated_at="2026-07-28T15:19:19+08:00",
)
with self.make_temp_dir() as temp_dir:
window = MainWindow(
config=self.make_config(temp_dir),
subscription_policy=policy,
)
self.addCleanup(window.close)
settings_tab = window._settings_tab()
with mock.patch(
"app.gui.main_window.SubscriptionCheckWorker",
) as worker_factory:
window.begin_subscription_check()
worker_factory.assert_not_called()
self.assertFalse(settings_tab.subscription_check_button.isHidden())
self.assertFalse(settings_tab.subscription_check_button.isEnabled())
self.assertEqual(
"会员检测暂未启用",
settings_tab.subscription_check_button.text(),
)
self.assertTrue(
all(
window.tabs.isTabEnabled(index)
for index in range(window.tabs.count())
)
)
self.assertTrue(window.ensure_subscription_for_new_submit("开始 AI 生成"))
def test_enforcement_uses_classified_subscription_windows(self):
expected = [
(subscription.STATUS_REQUIRED, "尚未开通会员套餐", "前往会员中心"),
(subscription.STATUS_REVOKED, "会员套餐已失效", "前往会员中心"),
(
subscription.STATUS_ACCOUNT_DISABLED,
"会员账号当前不可用",
"前往会员中心",
),
(
subscription.STATUS_UNAVAILABLE,
"暂时无法验证会员状态",
"打开设置",
),
]
with self.make_temp_dir() as temp_dir:
window = MainWindow(config=self.make_config(temp_dir))
self.addCleanup(window.close)
fake_box, boxes = self.make_sequence_message_box(
[selected for _state, _title, selected in expected]
)
with mock.patch.object(
main_window,
"QMessageBox",
fake_box,
), mock.patch.object(
main_window.QDesktopServices,
"openUrl",
return_value=True,
) as open_url:
for state, _title, _selected in expected:
window._apply_subscription_status(
subscription.SubscriptionStatus(
state,
manage_url=(
"https://cm.example.com/user/subscriptions/cmshopee"
if state != subscription.STATUS_UNAVAILABLE
else ""
),
)
)
self.assertEqual(
[title for _state, title, _selected in expected],
[box.title for box in boxes],
)
self.assertEqual(3, open_url.call_count)
self.assertEqual(
TAB_TITLES.index("设置"),
window.tabs.currentIndex(),
)
def test_subscription_window_state_is_deduplicated_until_entitlement_recovers(self):
with self.make_temp_dir() as temp_dir:
window = MainWindow(config=self.make_config(temp_dir))
self.addCleanup(window.close)
fake_box, boxes = self.make_sequence_message_box(
["前往会员中心", "打开设置", "前往会员中心"]
)
required = subscription.SubscriptionStatus(
subscription.STATUS_REQUIRED,
manage_url="https://cm.example.com/user/subscriptions/cmshopee",
)
unavailable = subscription.SubscriptionStatus(
subscription.STATUS_UNAVAILABLE
)
active = subscription.SubscriptionStatus(
subscription.STATUS_ACTIVE,
account_name="主账号",
plan_name="测试",
expires_at="2026-08-21T23:59:59+08:00",
real_entitlement_allowed=True,
)
with mock.patch.object(
main_window,
"QMessageBox",
fake_box,
), mock.patch.object(
main_window.QDesktopServices,
"openUrl",
return_value=True,
):
window._apply_subscription_status(required)
window._apply_subscription_status(unavailable)
window._apply_subscription_status(required)
window._apply_subscription_status(active)
window._apply_subscription_status(required)
self.assertEqual(
[
"尚未开通会员套餐",
"暂时无法验证会员状态",
"尚未开通会员套餐",
],
[box.title for box in boxes],
)
def test_invalid_key_uses_activation_dialog_in_enforcement_mode(self):
with self.make_temp_dir() as temp_dir:
window = MainWindow(config=self.make_config(temp_dir))
self.addCleanup(window.close)
with mock.patch.object(
MembershipActivationDialog,
"focus_api_key",
) as focus_api_key:
window._apply_subscription_status(
subscription.SubscriptionStatus(
subscription.STATUS_KEY_INVALID
)
)
self.assertIsNotNone(window._activation_dialog)
focus_api_key.assert_called_once_with()
self.assertEqual(
TAB_TITLES.index("设置"),
window.tabs.currentIndex(),
)
@mock.patch.object(main_window, "SUBSCRIPTION_ENFORCEMENT_ENABLED", False)
def test_main_window_observation_mode_checks_without_restricting_workflows(self):
self.assertTrue(main_window.SUBSCRIPTION_CHECK_ENABLED)
@@ -11741,6 +11926,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
plan_name="测试",
expires_at="2026-08-21T23:59:59+08:00",
notice_id="subscription-test-plan",
real_entitlement_allowed=True,
)
with mock.patch.object(window, "_show_subscription_notice_once") as notice: