7fb9031f8d
CI / flutter-gates (push) Successful in 1m12s
- pet_models.dart:pets 域 DTO 逐字段对齐冻结契约(宠物/品种/体重/ 疫苗目录/疫苗/健康事件/照护提醒/聚合摘要 + cursor 分页信封), 枚举严格解析,请求体部分更新语义(缺席字段不出现) - pets_repository.dart:PetsRepository 抽象 + ApiPetsRepository, 12 路径 18 操作全覆盖;四个 POST 携带 Idempotency-Key; 复用既有 ApiClient token 拦截与单飞刷新重放 - pet_exceptions.dart:新 8 错误码映射为类型化异常 (40300/40401/40402/40902/40903/40904/42201/42202), 仍可按 ApiBusinessException 基类捕获 - pets_controller.dart:宠物档案状态自 AppState 拆出 (Controller → Repository → API Client 分层,四态就绪供 T2-12) - money.dart:元/分换算工具(DTO 层保持整数分,UI 层 T2-14 使用) - api_client.dart:新增 patbondPetApiBaseUrl(:8083,--dart-define 可覆盖)与 query 参数支持;api_exception.dart 补 pets 域错误码 - 测试 64 → 126:DTO 映射、错误类型化映射、请求线路 (路径/方法/鉴权/分页/幂等键/tz)、控制器状态机、金额换算 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
52 lines
1.7 KiB
Dart
52 lines
1.7 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:patbond_flutter/features/pets/money.dart';
|
|
|
|
void main() {
|
|
group('formatCentsAsYuan', () {
|
|
test('整元不带小数', () {
|
|
expect(formatCentsAsYuan(0), '0');
|
|
expect(formatCentsAsYuan(100), '1');
|
|
expect(formatCentsAsYuan(12800), '128');
|
|
});
|
|
|
|
test('非整元固定两位小数', () {
|
|
expect(formatCentsAsYuan(12850), '128.50');
|
|
expect(formatCentsAsYuan(12805), '128.05');
|
|
expect(formatCentsAsYuan(5), '0.05');
|
|
expect(formatCentsAsYuan(50), '0.50');
|
|
});
|
|
|
|
test('负数入参抛 ArgumentError(契约金额非负)', () {
|
|
expect(() => formatCentsAsYuan(-1), throwsArgumentError);
|
|
});
|
|
});
|
|
|
|
group('parseYuanToCents', () {
|
|
test('整数与一/两位小数', () {
|
|
expect(parseYuanToCents('128'), 12800);
|
|
expect(parseYuanToCents('128.5'), 12850);
|
|
expect(parseYuanToCents('128.50'), 12850);
|
|
expect(parseYuanToCents('0.05'), 5);
|
|
expect(parseYuanToCents('0'), 0);
|
|
expect(parseYuanToCents(' 12.30 '), 1230);
|
|
});
|
|
|
|
test('非法输入返回 null', () {
|
|
expect(parseYuanToCents(''), isNull);
|
|
expect(parseYuanToCents('abc'), isNull);
|
|
expect(parseYuanToCents('12.345'), isNull);
|
|
expect(parseYuanToCents('-5'), isNull);
|
|
expect(parseYuanToCents('12.'), isNull);
|
|
expect(parseYuanToCents('.5'), isNull);
|
|
expect(parseYuanToCents('1,200'), isNull);
|
|
});
|
|
|
|
test('往返一致:format(parse(x)) 保持数值', () {
|
|
for (final input in ['128', '128.50', '0.05', '99.90']) {
|
|
final cents = parseYuanToCents(input)!;
|
|
expect(parseYuanToCents(formatCentsAsYuan(cents)), cents);
|
|
}
|
|
});
|
|
});
|
|
}
|