Files
jiu/client/test/license_copy_test.dart
wangjia 32bd64d676 feat(client): 实时授权状态与会话失效处理
- 心跳读取 /auth/ping 回带的授权概况,直接刷新横幅/状态栏/只读门禁,省去单独轮询 /license/info
- 账号被停用/删除(401 USER_DISABLED)即强制重新登录
- 令牌持久化经串行队列 + 会话代号守卫,杜绝续期写入与登出交叉把失效 token 写回
- 写操作门禁(write_guard)+ 授权文案(license_copy)按 grace/readonly/locked 分阶段降级

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 07:34:07 +08:00

75 lines
2.5 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter_test/flutter_test.dart';
import 'package:jiu_client/core/config/license_copy.dart';
import 'package:jiu_client/models/license.dart';
LicenseInfo _lic(String phase, {int expiredDays = 0, bool permanent = false}) =>
LicenseInfo(
id: 1,
type: 'annual',
isActive: true,
maxDevices: 3,
phase: phase,
expiresAt:
permanent ? null : DateTime.now().subtract(Duration(days: expiredDays)),
);
void main() {
group('writeBlockedToast', () {
test('readonly 阶段文案含过期天数并引导续费', () {
final s = LicenseCopy.writeBlockedToast(_lic('readonly', expiredDays: 10));
expect(s, contains('10'));
expect(s, contains('只读'));
expect(s, contains('设置 → 授权'));
});
test('locked 阶段文案标注已锁定', () {
final s = LicenseCopy.writeBlockedToast(_lic('locked', expiredDays: 20));
expect(s, contains('20'));
expect(s, contains('锁定'));
});
});
group('banner', () {
test('normal 阶段返回空串', () {
expect(LicenseCopy.banner(_lic('normal', permanent: true)), isEmpty);
});
test('grace/readonly/locked 各阶段含过期天数', () {
expect(LicenseCopy.banner(_lic('grace', expiredDays: 2)), contains('2'));
expect(
LicenseCopy.banner(_lic('readonly', expiredDays: 9)), contains('只读'));
expect(
LicenseCopy.banner(_lic('locked', expiredDays: 30)), contains('锁定'));
});
});
group('statusText / statusBar', () {
test('normal 永久授权', () {
final lic = _lic('normal', permanent: true);
expect(LicenseCopy.statusText(lic), contains('永久'));
expect(LicenseCopy.statusBar(lic, '2099-01-01'), contains('永久'));
});
test('readonly 阶段标注只读', () {
final lic = _lic('readonly', expiredDays: 9);
expect(LicenseCopy.statusText(lic), contains('只读'));
expect(LicenseCopy.statusBar(lic, '2024-01-01'), contains('只读'));
});
});
group('degradationNotes', () {
test('三条说明随阈值联动(含 7 与 15', () {
final notes = LicenseCopy.degradationNotes();
expect(notes.length, 3);
expect(notes.join(), contains('${LicenseCopy.graceDays}'));
expect(notes.join(), contains('${LicenseCopy.readonlyDays}'));
});
});
group('readonlyUserToast', () {
test('只读账号提示固定文案', () {
expect(LicenseCopy.readonlyUserToast, contains('只读'));
});
});
}