import 'package:consumer_app/core/config/app_config.dart';
import 'package:consumer_app/core/theme/app_theme.dart';
import 'package:consumer_app/l10n/app_localizations.dart';
import 'package:consumer_app/models/content_models.dart';
import 'package:consumer_app/shared/discovery/service_cards.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('classified card renders API listing facts', (tester) async {
final item = DiscoveryItem.fromJson({
'id': 1,
'resource': 'classifieds',
'title': 'Sofa 3-Sitzer',
'listing': {'price_label': '250 €', 'condition': 'used'},
'address': {'formatted': 'Weimar, Westvorstadt'},
});
await tester.pumpWidget(
_app(
ClassifiedDiscoveryCard(
item: item,
categoryLabel: 'Möbel & Einrichtung',
onTap: () {},
isFavorite: false,
onFavorite: () {},
),
),
);
expect(find.text('Sofa 3-Sitzer'), findsOneWidget);
expect(find.text('250 €'), findsOneWidget);
expect(find.textContaining('Möbel & Einrichtung'), findsOneWidget);
});
testWidgets('real-estate card renders transaction and property facts', (
tester,
) async {
final item = DiscoveryItem.fromJson({
'id': 2,
'resource': 'real-estate',
'title': 'Helle 3-Zimmer-Wohnung',
'listing': {
'price_label': '780 €',
'transaction_type': 'rent',
'property_rooms': 3,
'area': 78,
},
'address': {'formatted': 'Weimar, Westvorstadt'},
});
await tester.pumpWidget(
_app(
RealEstateDiscoveryCard(
item: item,
categoryLabel: 'Wohnung',
onTap: () {},
isFavorite: false,
onFavorite: () {},
),
),
);
expect(find.text('Helle 3-Zimmer-Wohnung'), findsOneWidget);
expect(find.text('780 €'), findsOneWidget);
expect(find.text('Miete'), findsOneWidget);
expect(find.text('3 Zimmer · 78 m² · Wohnung'), findsOneWidget);
});
testWidgets('news card uses supplied API category without geo controls', (
tester,
) async {
final item = DiscoveryItem.fromJson({
'id': 3,
'resource': 'news',
'title': 'Aktuelles aus Weimar',
'excerpt': 'Nachrichten aus der Stadt.',
'address': {
'line1': 'Markt 1',
'postal_code': '99423',
'locality': 'Weimar',
},
});
await tester.pumpWidget(
_app(
NewsDiscoveryCard(
item: item,
categoryLabel: 'Stadtleben',
onTap: () {},
isFavorite: false,
onFavorite: () {},
),
),
);
expect(find.text('Aktuelles aus Weimar'), findsOneWidget);
expect(find.text('Stadtleben'), findsOneWidget);
expect(find.text('Nachrichten aus der Stadt.'), findsOneWidget);
expect(find.text('Markt 1, 99423 Weimar'), findsNothing);
});
testWidgets('home card shows resource, category, date and distance', (
tester,
) async {
final item = DiscoveryItem.fromJson({
'id': 4,
'resource': 'events',
'title': 'Weimarer Abendmarkt',
'published_at': '2026-09-20T10:00:00Z',
'distance_km': 0.3,
'event': {'start': '2026-10-01T18:30:00Z'},
'address': {
'line1': 'Markt 1',
'postal_code': '99423',
'locality': 'Weimar',
},
});
await tester.pumpWidget(
_app(
HomeDiscoveryCard(
item: item,
resourceLabel: 'Events',
categoryLabel: 'Stadtleben',
onTap: () {},
),
),
);
expect(find.text('Events'), findsOneWidget);
expect(find.text('Stadtleben'), findsOneWidget);
expect(find.text('300 m'), findsOneWidget);
expect(find.textContaining('2026'), findsOneWidget);
expect(find.text('Markt 1, 99423 Weimar'), findsOneWidget);
});
}
Widget _app(Widget child) {
return MaterialApp(
theme: AppTheme.light(colors: AppColorConfig.fallback()),
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
locale: const Locale('de'),
home: Scaffold(body: child),
);
}
