172 lines
4.9 KiB
Dart
172 lines
4.9 KiB
Dart
|
|
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);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|