Files
patbond-flutter/test/features/pets/money_test.dart
T
lixi 7fb9031f8d
CI / flutter-gates (push) Successful in 1m12s
新增:pets feature 数据层(T2-11,契约 v1.2.0 全 18 操作)
- 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>
2026-09-08 11:22:24 +08:00

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);
}
});
});
}