Files
sundynix-agentix/sundynix-web/src/api.test.ts
T
Blizzard 7c67256f87
CI / Go · build + vet + test (pull_request) Failing after 30m3s
CI / Frontend · tsc (sundynix-admin) (pull_request) Failing after 9m42s
CI / Frontend · tsc (sundynix-desktop/frontend) (pull_request) Failing after 16m53s
CI / Frontend · tsc (sundynix-web) (pull_request) Has been cancelled
CI / mcp-py · sandbox guard (pull_request) Has been cancelled
feat(web): 薄 Web 面 sundynix-web —— 注册/组织/团队/账单自助入口
SaaS P3 收口第二刀(设计见 SAAS_DESIGN.md §8)。第三个产品面:desktop=用户
工作产品、admin=平台超管控制塔、web=租户客户的自助柜台——做「装桌面端之前
就要能用」的那些事,三者不合并。

- 骨架抄 admin(HashRouter+路由注册表+me()/sdx:logout 鉴权门+vite/vitest
  单文件配置);UI 整目录搬 desktop 的 ui/ 组件+ink/brand 主题 token(亮暗
  双主题),品牌观感与桌面端一致;api.ts 抄 desktop 的 auth/tenant/usage 段
  (纯 fetch 零 Wails 依赖),成员管理/建组织打新的租户自助接口。
- 页面:登录注册(一页两态)/概览(组织+角色+余额+桌面端下载指引)/团队(名册+
  邀请+改角色+移除,写控件按角色显隐、真闸在后端)/组织(列表+自助新建+切换)/
  用量与账单(余额 hero+趋势+合计+最近消耗,数据全来自现成 /me/usage;充值
  只放说明占位,支付 P5 再接,不做假入口)。
- 工程:vite :5175、launch.json 配置、make webface、ci.yml web 矩阵纳入。
- 测试:tsc 干净;vitest 3 例(fmtCredits 去尾零——测试先行抓出 1.50 毛刺;
  ASSIGNABLE_ROLES 不含 owner)。浏览器 live 全流程:甲(owner)登录→概览→
  团队邀请乙→乙(member)登录写控件全隐藏、名册只读,组织/用量页真数据渲染。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 17:47:23 +08:00

22 lines
749 B
TypeScript

import { describe, expect, it } from "vitest";
import { fmtCredits, ASSIGNABLE_ROLES } from "./api";
describe("fmtCredits", () => {
it("micro → 人类可读", () => {
expect(fmtCredits(0)).toBe("0");
expect(fmtCredits(1_500_000)).toBe("1.5"); // 1.5 积分
expect(fmtCredits(2_000_000)).toBe("2"); // 整数不留小数尾巴
expect(fmtCredits(1_234_000_000)).toBe("1.2K");
expect(fmtCredits(5_000_000_000_000)).toBe("5.0M");
});
it("负余额(软扣可为负)不丢符号", () => {
expect(fmtCredits(-1_500_000)).toBe("-1.5");
});
});
describe("ASSIGNABLE_ROLES", () => {
it("不含 owner —— owner 只能转让,后端同样拦", () => {
expect(ASSIGNABLE_ROLES).not.toContain("owner");
});
});