Files
social-app/apps/test/features/chat/ui_schema_renderer_test.dart
T

172 lines
4.9 KiB
Dart
Raw Normal View History

2026-02-28 13:49:51 +08:00
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:social_app/features/chat/data/models/tool_result.dart';
import 'package:social_app/features/chat/ui/widgets/ui_schema_renderer.dart';
void main() {
group('UiSchemaRenderer', () {
testWidgets('calendar_card.v1 renders title', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Team Meeting',
startAt: '2026-03-01T10:00:00Z',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('Team Meeting'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders time', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
endAt: '2026-03-01T11:30:00Z',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.textContaining('3月1日'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders location', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
location: 'Room 101',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('Room 101'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders description', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
description: 'Quarterly review',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('Quarterly review'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders AI generated tag', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
sourceType: 'ai_generated',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('AI生成'), findsOneWidget);
});
testWidgets('error_card.v1 renders error message', (tester) async {
final card = UiCard(
cardType: 'error_card.v1',
data: {'message': 'Something went wrong'},
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('Something went wrong'), findsOneWidget);
});
testWidgets('error_card.v1 renders default message when missing', (
tester,
) async {
final card = UiCard(cardType: 'error_card.v1', data: {});
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('发生错误'), findsOneWidget);
});
testWidgets('unknown card type renders fallback', (tester) async {
final card = UiCard(cardType: 'unknown_type', data: {'foo': 'bar'});
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.textContaining('未知卡片类型'), findsOneWidget);
expect(find.textContaining('unknown_type'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders actions', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
).toJson(),
actions: [
CardAction(type: 'link', label: '查看详情', target: '/calendar/evt_001'),
],
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('查看详情'), findsOneWidget);
});
testWidgets('calendar_card.v1 renders custom color', (tester) async {
final card = UiCard(
cardType: 'calendar_card.v1',
data: CalendarCardData(
id: 'evt_001',
title: 'Meeting',
startAt: '2026-03-01T10:00:00Z',
color: '#FF0000',
).toJson(),
);
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: UiSchemaRenderer.render(card))),
);
expect(find.text('Meeting'), findsOneWidget);
});
});
}