Files
Navius/frontend/test/features/home/presentation/link_card_test.dart
T
CNWei e2cc3ac30f feat: 进行功能分区方便后期维护
- 添加导航条目和分类数据模型
- 实现导航卡片网格展示
- 支持点击卡片打开链接
- 添加主题样式(渐变色、卡片阴影)
- 区分系统默认和自定义条目
- 添加分类统计信息"
2026-09-13 22:49:02 +08:00

103 lines
2.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:frontend/core/constants/app_sizes.dart';
import 'package:frontend/core/theme/app_colors.dart';
import 'package:frontend/features/home/domain/models/link_item.dart';
import 'package:frontend/features/home/presentation/widgets/link_card.dart';
const LinkItem _item = LinkItem(
id: 'github',
title: 'GitHub',
url: 'https://github.com',
description: '代码托管与开源社区',
);
void main() {
late int openCount;
setUp(() {
openCount = 0;
});
Future<void> pumpCard(
WidgetTester tester, {
LinkItem item = _item,
Size size = const Size(280, 200),
}) async {
tester.view.physicalSize = size;
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.reset);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
backgroundColor: AppColors.background,
body: Center(
child: SizedBox(
width: 260,
child: LinkCard(item: item, onOpen: () => openCount++),
),
),
),
),
);
await tester.pump();
}
testWidgets('渲染首字母图标、名称与描述', (WidgetTester tester) async {
await pumpCard(tester);
expect(find.text('G'), findsOneWidget);
expect(find.text('GitHub'), findsOneWidget);
expect(find.text('代码托管与开源社区'), findsOneWidget);
});
testWidgets('没有描述时不报错', (WidgetTester tester) async {
await pumpCard(
tester,
item: const LinkItem(id: 'x', title: '示例', url: 'https://example.com'),
);
expect(find.text('示'), findsOneWidget);
expect(find.text('示例'), findsOneWidget);
});
testWidgets('点击触发打开回调', (WidgetTester tester) async {
await pumpCard(tester);
await tester.tap(find.text('GitHub'));
await tester.pump();
expect(openCount, 1);
});
testWidgets('悬停时上浮', (WidgetTester tester) async {
await pumpCard(tester);
// AnimatedContainer 目标 transform 的 y 分量就是上浮距离:
// 直接断言它,不受 Tooltip 等外层 RenderObject 的影响。
double lift() {
final AnimatedContainer container = tester.widget<AnimatedContainer>(
find.descendant(
of: find.byType(LinkCard),
matching: find.byType(AnimatedContainer),
),
);
return container.transform?.getTranslation().y ?? 0;
}
expect(lift(), 0);
final TestGesture gesture = await tester.createGesture(
kind: PointerDeviceKind.mouse,
);
await gesture.addPointer(location: tester.getCenter(find.byType(LinkCard)));
addTearDown(gesture.removePointer);
await gesture.moveTo(tester.getCenter(find.byType(LinkCard)));
await tester.pumpAndSettle();
expect(lift(), -AppSizes.cardHoverLift);
});
}