16ef0f31e3
Keep deploy/basic docs only; integrate sq.bz121.com license client; encrypt strategy/trade/key_monitor/options/hedge_plan for release. Co-authored-by: Cursor <cursoragent@cursor.com>
89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
"""许可客户端基础测试(不依赖真实激活码)。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
if str(ROOT) not in sys.path:
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from lib.license import license_lib as lic
|
|
|
|
|
|
class LicenseLibTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self._td = tempfile.TemporaryDirectory()
|
|
self.state = Path(self._td.name) / "license_state.json"
|
|
self.env = {
|
|
"LICENSE_API_URL": "https://sq.bz121.com",
|
|
"LICENSE_CLIENT_KEY": "test-key",
|
|
"LICENSE_STATE_PATH": str(self.state),
|
|
"LICENSE_OFFLINE_GRACE_HOURS": "72",
|
|
}
|
|
self._patcher = mock.patch.dict(os.environ, self.env, clear=False)
|
|
self._patcher.start()
|
|
lic._env_loaded = True
|
|
lic._cached_device_id = None
|
|
|
|
def tearDown(self):
|
|
self._patcher.stop()
|
|
self._td.cleanup()
|
|
|
|
def test_device_id_length(self):
|
|
did = lic.get_device_id()
|
|
self.assertGreaterEqual(len(did), 16)
|
|
self.assertLessEqual(len(did), 64)
|
|
self.assertEqual(did, lic.get_device_id())
|
|
|
|
def test_not_activated(self):
|
|
st = lic.get_license_status()
|
|
self.assertFalse(st["valid"])
|
|
self.assertEqual(st["reason"], "not_activated")
|
|
|
|
def test_local_valid_within_grace(self):
|
|
now = lic._now_ts()
|
|
self.state.write_text(
|
|
json.dumps(
|
|
{
|
|
"subscription_id": "sub_test",
|
|
"expires_at": "2099-01-01T00:00:00+08:00",
|
|
"plan": "monthly",
|
|
"last_ok_at": now,
|
|
"last_validate_at": now,
|
|
}
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
st = lic.get_license_status(skip_remote=True)
|
|
self.assertTrue(st["valid"])
|
|
|
|
def test_redeem_posts_api(self):
|
|
def fake_http(method, path, body):
|
|
self.assertEqual(path, "/v1/redeem")
|
|
self.assertIn("device_id", body)
|
|
self.assertEqual(body["code"], "ABCD1234EFGH")
|
|
return {
|
|
"ok": True,
|
|
"subscription_id": "sub1",
|
|
"plan": "monthly",
|
|
"expires_at": "2099-06-01T00:00:00+08:00",
|
|
"message": "激活成功",
|
|
}
|
|
|
|
with mock.patch.object(lic, "_http_json", side_effect=fake_http):
|
|
r = lic.redeem_code("abcd1234efgh")
|
|
self.assertTrue(r["ok"])
|
|
data = json.loads(self.state.read_text(encoding="utf-8"))
|
|
self.assertEqual(data["subscription_id"], "sub1")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|