后端: - 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口 一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失 - 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复 - 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令 - 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令) 前端:全站页面更新(pipeline/library/products/projects/team/account 等), 新增共享 pager 分页组件 QA:刷新 function-audit 全量输出,新增 full-qa 报告 文档:BP 产品介绍资料、design/CLAUDE.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
from decimal import Decimal
|
|
|
|
from django.conf import settings
|
|
from django.test import TestCase
|
|
from rest_framework.test import APIClient
|
|
|
|
from apps.accounts.models import Team, TeamMember, User
|
|
from apps.billing.models import CreditAccount, CreditLedger
|
|
|
|
|
|
class AuthApiTests(TestCase):
|
|
def test_register_creates_user_team_member_credit_account_and_token(self):
|
|
client = APIClient()
|
|
response = client.post(
|
|
"/api/auth/register/",
|
|
{
|
|
"username": "new-owner",
|
|
"password": "strong-password",
|
|
"email": "owner@example.com",
|
|
"team_name": "Launch Team",
|
|
},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 201)
|
|
self.assertIn("token", response.data)
|
|
user = User.objects.get(username="new-owner")
|
|
team = Team.objects.get(name="Launch Team")
|
|
self.assertEqual(team.owner, user)
|
|
self.assertTrue(TeamMember.objects.filter(team=team, user=user, role=TeamMember.Role.OWNER).exists())
|
|
self.assertTrue(CreditAccount.objects.filter(team=team).exists())
|
|
|
|
def test_register_trial_grant_is_recorded_in_ledger(self):
|
|
"""开户赠送额度必须进流水:余额=赠送额,且有一条 balance_after=赠送额的 genesis 流水,账目从第一条起可对账。"""
|
|
client = APIClient()
|
|
client.post(
|
|
"/api/auth/register/",
|
|
{"username": "ledger-owner", "password": "strong-password", "team_name": "Ledger Team"},
|
|
format="json",
|
|
)
|
|
team = Team.objects.get(name="Ledger Team")
|
|
trial = Decimal(str(settings.DEFAULT_TRIAL_CREDITS))
|
|
account = CreditAccount.objects.get(team=team)
|
|
self.assertEqual(account.balance, trial)
|
|
genesis = CreditLedger.objects.filter(team=team, ledger_type=CreditLedger.Type.RECHARGE)
|
|
self.assertEqual(genesis.count(), 1)
|
|
self.assertEqual(genesis.first().amount, trial)
|
|
self.assertEqual(genesis.first().balance_after, trial) # 流水终点 == 账户余额,可对账
|
|
|