from __future__ import annotations import json import subprocess import unittest from unittest.mock import patch from service.account_client import AccountManagerError, pick_web_account def _completed(payload: dict) -> subprocess.CompletedProcess[str]: return subprocess.CompletedProcess( args=["python", "account-manager"], returncode=0, stdout=json.dumps(payload, ensure_ascii=False), stderr="", ) class TestExplicitAccountLease(unittest.TestCase): @patch("service.account_client._run_argv") def test_explicit_account_id_is_reselected_with_lease(self, run_argv) -> None: account = { "id": 42, "platform_key": "target-platform", "account_label": "主账号", "login_id": "user@example.com", "profile_dir": "D:/data/profile-42", "status": "active", } leased = {**account, "lease_token": "lease-42"} run_argv.side_effect = [_completed(account), _completed(leased)] result = pick_web_account("target-platform", account_id="42") self.assertEqual(result["id"], 42) self.assertEqual(result["lease_token"], "lease-42") self.assertEqual(run_argv.call_args_list[0].args[0], ["account", "get", "42"]) pick_args = run_argv.call_args_list[1].args[0] self.assertIn("pick-web", pick_args) self.assertIn("--lease", pick_args) self.assertIn("user@example.com", pick_args) @patch("service.account_client._run_argv") def test_missing_lease_token_is_rejected(self, run_argv) -> None: account = { "id": 42, "platform_key": "target-platform", "account_label": "主账号", "login_id": "user@example.com", "profile_dir": "D:/data/profile-42", "status": "active", } run_argv.side_effect = [_completed(account), _completed(account)] with self.assertRaises(AccountManagerError) as raised: pick_web_account("target-platform", account_id="42") self.assertEqual(raised.exception.code, "LEASE_REQUIRED") if __name__ == "__main__": unittest.main()