import 'package:consumer_app/core/config/app_config.dart';
import 'package:consumer_app/features/home/home_page.dart';
import 'package:consumer_app/l10n/app_localizations.dart';
import 'package:consumer_app/models/content_models.dart';
import 'package:consumer_app/repositories/discovery_repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets(
'home exposes the local discovery modules and editorial sections',
(tester) async {
tester.view.physicalSize = const Size(390, 844);
tester.view.devicePixelRatio = 1;
addTearDown(() {
tester.view.resetPhysicalSize();
tester.view.resetDevicePixelRatio();
});
final repository = _HomeRepository();
await tester.pumpWidget(
MaterialApp(
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
locale: const Locale('de'),
home: HomePage(
repository: repository,
brand: AppConfig.fallback().brand,
hero: HomeHeroConfig.fromJson({
'title': {'de_DE': 'Entdecke Weimar'},
'body': {
'de_DE': 'Finde Orte, Events und Empfehlungen rund um Weimar.',
},
'primary_label': {'de_DE': 'Jetzt entdecken'},
'primary_url': {'de_DE': '#discover'},
}),
resources: const [
ResourceDefinition(
id: 'places',
label: 'Orte',
endpoint: '/places',
geo: true,
),
ResourceDefinition(
id: 'events',
label: 'Events',
endpoint: '/events',
geo: true,
),
ResourceDefinition(
id: 'classifieds',
label: 'Kleinanzeigen',
endpoint: '/classifieds',
geo: true,
),
ResourceDefinition(
id: 'jobs',
label: 'Jobs',
endpoint: '/jobs',
geo: true,
),
ResourceDefinition(
id: 'real-estate',
label: 'Immobilien',
endpoint: '/real-estate',
geo: true,
),
],
onOpenDiscovery: () {},
onOpenResource: (_) {},
onOpenItem: (_) {},
onOpenCommunity: () {},
),
),
);
await tester.pumpAndSettle();
expect(find.text('Entdecke Weimar'), findsOneWidget);
expect(find.text('Orte'), findsWidgets);
final quickAccessSlider = find.byType(ListView).first;
await tester.drag(find.byType(CustomScrollView), const Offset(0, -700));
await tester.pumpAndSettle();
await tester.dragUntilVisible(
find.text('Kleinanzeigen').first,
quickAccessSlider,
const Offset(-160, 0),
);
await tester.pumpAndSettle();
expect(find.text('Kleinanzeigen'), findsWidgets);
expect(find.text('Aktuelle Events'), findsOneWidget);
expect(find.text('Neuigkeiten aus Weimar'), findsOneWidget);
expect(find.text('In deiner Nähe'), findsOneWidget);
expect(find.text('Mit Weimar verbunden'), findsOneWidget);
expect(repository.newsRadiusRequests, isNotEmpty);
expect(repository.newsRadiusRequests, everyElement(isNull));
},
);
testWidgets('disabled home sections do not trigger discovery requests', (
tester,
) async {
final repository = _HomeRepository();
await tester.pumpWidget(
MaterialApp(
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
locale: const Locale('de'),
home: HomePage(
repository: repository,
brand: AppConfig.fallback().brand,
hero: HomeHeroConfig.fromJson({
'title': {'de_DE': 'Nur Hero'},
'body': {'de_DE': 'Keine deaktivierten Datenabfragen.'},
}),
homeSections: const [
HomeSectionConfig(
id: 'hero',
enabled: true,
title: {},
titleKey: '',
icon: 'grid_view',
iconUrl: '',
iconAlt: '',
),
HomeSectionConfig(
id: 'events',
enabled: false,
title: {},
titleKey: 'homeEventsTitle',
icon: 'event',
iconUrl: '',
iconAlt: '',
),
],
resources: const [],
onOpenDiscovery: () {},
onOpenResource: (_) {},
onOpenItem: (_) {},
onOpenCommunity: () {},
),
),
);
await tester.pumpAndSettle();
expect(find.text('Nur Hero'), findsOneWidget);
expect(repository.requestedTypes, isEmpty);
});
}
class _HomeRepository implements DiscoveryRepository {
final List<List<String>> requestedTypes = [];
final List<double?> newsRadiusRequests = [];
@override
Future<DiscoveryResponse> discover({
required List<String> types,
String? search,
double? latitude,
double? longitude,
double? radiusKm = 10,
int page = 1,
int perPage = 20,
String? category,
String? region,
String? status,
Map<String, String> filters = const {},
String sort = 'auto',
double? minLatitude,
double? maxLatitude,
double? minLongitude,
double? maxLongitude,
}) async {
requestedTypes.add(types);
if (types.length == 1 && types.first == 'news') {
newsRadiusRequests.add(radiusKm);
}
final resource = types.first;
return DiscoveryResponse.fromJson({
'items': [
{
'id': 1,
'resource': resource,
'title': resource == 'places' ? 'Goethehaus' : 'Weimar erleben',
'excerpt': 'Lokaler Inhalt',
'image_url': '',
'media': const [],
'address': const {},
'geo': const {},
'contact': const {},
'marker': const {},
},
],
'meta': const {},
});
}
@override
Future<DiscoveryItem> detail({required String resource, required int id}) =>
throw UnimplementedError();
}
