订单需管理员审核后才开通节点,并更新登录页文案。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-10 23:04:24 +08:00
parent 8b55b9cf55
commit f329f647c7
22 changed files with 583 additions and 81 deletions
+57
View File
@@ -295,6 +295,63 @@ class CoreFlowTest(unittest.TestCase):
wallet_admin = self.client.post("/api/v1/auth/login", json={"wallet_address": "admin-root"})
self.assertEqual(wallet_admin.status_code, 403, wallet_admin.text)
def test_order_stays_locked_until_admin_approves(self) -> None:
registered = self.client.post(
"/api/v1/auth/register",
json={"wallet_address": "0xbuyer01", "username": "buyer", "password": "secret1"},
)
self.assertEqual(registered.status_code, 200, registered.text)
headers = {"Authorization": f"Bearer {registered.json()['access_token']}"}
created = self.client.post("/api/v1/me/orders", headers=headers, json={"tx_id": "paytx1500usdt01"})
self.assertEqual(created.status_code, 200, created.text)
self.assertEqual(created.json()["status"], "pending")
self.assertEqual(created.json()["amount"], "1500.00000000")
order_id = created.json()["id"]
denied = self.client.post(f"/api/v1/admin/orders/{order_id}/approve", headers=headers)
self.assertEqual(denied.status_code, 403, denied.text)
board = self.client.get("/api/v1/me/dashboard", headers=headers)
self.assertEqual(board.status_code, 200, board.text)
self.assertEqual(board.json()["orders"][0]["status"], "pending")
self.assertEqual(board.json()["nodes"], [])
approved = self.client.post(f"/api/v1/admin/orders/{order_id}/approve", headers=self._admin_headers())
self.assertEqual(approved.status_code, 200, approved.text)
self.assertEqual(approved.json()["status"], "approved")
sn = approved.json()["sn"]
self.assertTrue(sn)
board = self.client.get("/api/v1/me/dashboard", headers=headers)
node = board.json()["nodes"][0]
self.assertEqual(node["sn"], sn)
self.assertTrue(node["activated"])
self.assertTrue(node["node_token"])
self.assertEqual(node["license_months"], 12)
missing = self.client.post("/api/v1/node/heartbeat", json={"sn": sn})
self.assertEqual(missing.status_code, 403, missing.text)
beat = self.client.post("/api/v1/node/heartbeat", json={"sn": sn, "token": node["node_token"]})
self.assertEqual(beat.status_code, 200, beat.text)
self.assertEqual(beat.json()["status"], "online")
client = self.client.get(f"/api/v1/me/nodes/{sn}/client", headers=headers)
self.assertEqual(client.status_code, 200, client.text)
self.assertIn(node["node_token"], client.text)
duplicated = self.client.post("/api/v1/me/orders", headers=headers, json={"tx_id": "paytx1500usdt01"})
self.assertEqual(duplicated.status_code, 409, duplicated.text)
rejected_order = self.client.post("/api/v1/me/orders", headers=headers, json={"tx_id": "paytxrejected01"})
self.assertEqual(rejected_order.status_code, 200, rejected_order.text)
rejected = self.client.post(
f"/api/v1/admin/orders/{rejected_order.json()['id']}/reject",
headers=self._admin_headers(),
json={"note": "凭证无效"},
)
self.assertEqual(rejected.status_code, 200, rejected.text)
self.assertEqual(rejected.json()["status"], "rejected")
self.assertIsNone(rejected.json()["sn"])
def _auth(self, wallet: str) -> dict[str, str]:
logged = self.client.post("/api/v1/auth/login", json={"wallet_address": wallet})
self.assertEqual(logged.status_code, 200, logged.text)