Files
qiaoqichaoandClaude Code d56c699ce6 chore(v2): 从兴邦预审v2白名单抽取独立可运行基座
按 docs/v2/05-implementation-plan.md §1 候选迁移表与 claude_use/T00 白名单,
从 55e2cdb 抽取 224 个文件(2.48 MB)到独立目录 F:/mini-OpenClaw-v2。

- 排除:凭据(.env/server-deploy.conf/旧DELIVERY.md)、运行数据(xingbang_data 等
  4 个 SQLite)、依赖(venv/node_modules 符号链接)、归档(_backup*/test-evidence/
  ori_file)、Office 临时文件
- 目标目录独立 git 仓库,初始恢复点;Gitea 远程与分支待 OQ-06 Q2 定案
- 未部署、未启动服务、未调用模型

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-29 12:58:26 +08:00

55 lines
2.6 KiB
Python

import tempfile
import unittest
from pathlib import Path
from fastapi import FastAPI
from fastapi.testclient import TestClient
from api import xingbang_workspace as workspace
class WorkflowTests(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory(ignore_cleanup_errors=True)
self.old = workspace.DB_PATH
workspace.DB_PATH = Path(self.tmp.name) / 'test.sqlite3'
app = FastAPI()
app.include_router(workspace.router)
self.client = TestClient(app)
self.base = '/api/xingbang/workspace/projects'
self.project = self.client.post(self.base, json={'name':'测试','client':'客户','amount':5000,'assets':10000,'liabilities':7500,'lease_value':5500}).json()
def tearDown(self):
self.client.close()
workspace.DB_PATH = self.old
self.tmp.cleanup()
def act(self, kind, **kwargs):
return self.client.post(self.base+'/'+self.project['id']+'/actions', json={'kind':kind,'actor':'测试','note':'人工核对依据',**kwargs})
def test_missing_and_evidence(self):
p = self.act('assess').json()
self.assertEqual(p['risks'][2]['category'], '信息缺失')
self.assertEqual(p['risks'][0]['value'], .75)
self.assertEqual(p['risks'][0]['evidence']['snapshot'], p['snapshots'][-1]['id'])
self.assertEqual(self.act('report').status_code,409)
def test_report_lifecycle_and_invalidation(self):
self.act('assess')
for target in ['debt','lease','insurance']:
self.assertEqual(self.act('confirm',target=target).status_code,200)
p = self.act('report').json()
report = p['reports'][-1]
p = self.act('finalize',target=report['id']).json()
self.assertEqual(p['cards'][0]['status'],'草稿')
self.assertEqual(self.act('assess').status_code,409)
p = self.act('change',amount=6000).json()
self.assertTrue(p['reports'][0]['stale'])
self.assertEqual(p['snapshots'][0]['data']['amount'],5000)
self.assertEqual(self.act('report').status_code,409)
def test_task_requires_submission_before_close(self):
self.act('assess')
p = self.act('task',target='debt').json()
task=p['tasks'][0]['id']
self.assertEqual(self.act('close_task',target=task).status_code,409)
self.assertEqual(self.act('submit_task',target=task).status_code,200)
self.assertEqual(self.act('close_task',target=task).json()['tasks'][0]['status'],'已解决')
def test_invalid_amount(self):
self.assertEqual(self.act('change',amount=-1).status_code,422)
if __name__ == '__main__':
unittest.main()