fix: 测试清单遗留bug批量修复(15条:商品库/消费/团队/设置/消息中心/平台套图/资产库)
- R6 商品图删除不生效: 封面asset移交+绕开prefetch缓存, 前端封面缩图补删除入口 - R48 消息中心长文本与UI框错位: 胶囊单行省略+优先级标签禁压缩 - R70 账单流水筛选: 后端加ledger_type过滤, count随筛选变化, 切筛选重置页码 - R72 月限额改后不刷新: 团队页/消费页自取最新teamSettings, 两页同源 - R83/R86 平台套图提示词框加大+模型胶囊嵌入输入框(复用Pill组件) - R96 未读角标: 修KeyTextTransform注解过滤触发MySQL 3141致接口500 - R100 工作台记录丢失: 新增GET /api/ai/tasks/workbench/ 同源恢复, 废除localStorage方案 - R104 卖点添加按钮移出输入框, 新建抽屉+编辑态统一 - R106 商品库宽屏锁5列, 10个/页铺满两行 - R108 资产删除改软删+单张删除+回收站二次确认; trash页商品/资产双分区+restore/purge端点 - R109 生成图自动入资产库(person演员立绘除外), 迁移0008存量回填, 移除全部加入资产库入口 - R65 无需改动(22268d6已修, 测旧部署所致) 验证: tsc/build/check/makemigrations --check 通过, 后端测试210/210, perf-probe PASS Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -100,6 +100,38 @@ class MemberLimitTests(TestCase):
|
||||
reserve_credit(team=self.team, user=self.user, task=self._task(f"z{i}"), amount=Decimal("10.0000"))
|
||||
|
||||
|
||||
class LedgerTypeFilterTests(TestCase):
|
||||
"""账单流水按类型过滤(R70):count/结果随 ledger_type 变化,未知类型忽略回全量。"""
|
||||
|
||||
def setUp(self):
|
||||
self.owner = User.objects.create_user(username="lf-owner", password="ownerpass123")
|
||||
self.team = Team.objects.create(name="Ledger Filter Team", owner=self.owner)
|
||||
TeamMember.objects.create(team=self.team, user=self.owner, role=TeamMember.Role.OWNER, status=TeamMember.Status.ACTIVE)
|
||||
CreditAccount.objects.create(team=self.team, balance=Decimal("100.0000"))
|
||||
for i, ltype in enumerate([CreditLedger.Type.RECHARGE, CreditLedger.Type.CHARGE, CreditLedger.Type.CHARGE]):
|
||||
CreditLedger.objects.create(
|
||||
team=self.team, user=self.owner, ledger_type=ltype,
|
||||
amount=Decimal("10.0000"), balance_after=Decimal("100.0000"), reason=f"row {i}",
|
||||
)
|
||||
self.client_api = APIClient()
|
||||
self.client_api.force_authenticate(self.owner)
|
||||
|
||||
def test_filter_by_type_changes_count_and_rows(self):
|
||||
response = self.client_api.get("/api/billing/ledgers/?ledger_type=charge")
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data["count"], 2)
|
||||
self.assertTrue(all(row["ledger_type"] == "charge" for row in response.data["results"]))
|
||||
|
||||
response = self.client_api.get("/api/billing/ledgers/?ledger_type=recharge")
|
||||
self.assertEqual(response.data["count"], 1)
|
||||
self.assertEqual(response.data["results"][0]["ledger_type"], "recharge")
|
||||
|
||||
def test_unknown_type_returns_all(self):
|
||||
response = self.client_api.get("/api/billing/ledgers/?ledger_type=bogus")
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data["count"], 3)
|
||||
|
||||
|
||||
class RechargePermissionTests(TestCase):
|
||||
"""充值是团队资金操作:仅 owner/admin 可发起,普通成员/访客被 403 拦截。"""
|
||||
|
||||
|
||||
@@ -59,10 +59,14 @@ def ledgers(request):
|
||||
)
|
||||
project_id = request.query_params.get("project")
|
||||
user_id = request.query_params.get("user")
|
||||
# 按类型过滤(账户页「全部类型/扣费/充值…」下拉):count/分页随过滤变化,未知值忽略
|
||||
ledger_type = request.query_params.get("ledger_type")
|
||||
if project_id:
|
||||
queryset = queryset.filter(project_id=project_id)
|
||||
if user_id:
|
||||
queryset = queryset.filter(user_id=user_id)
|
||||
if ledger_type and ledger_type in CreditLedger.Type.values:
|
||||
queryset = queryset.filter(ledger_type=ledger_type)
|
||||
# 服务端分页:总数随流水增长(原先写死 [:100] 导致永远 100 条)
|
||||
try:
|
||||
page = max(1, int(request.query_params.get("page", 1)))
|
||||
|
||||
Reference in New Issue
Block a user