import 'package:flutter/cupertino.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:please_pay_me/theme/theme.dart'; import 'package:please_pay_me_widgetbook/catalog.dart'; import 'package:widgetbook/widgetbook.dart'; List _collectUseCases() { final useCases = []; void walk(WidgetbookNode node) { if (node is WidgetbookUseCase) useCases.add(node); for (final child in node.children ?? const []) { walk(child); } } for (final root in buildCatalogDirectories()) { walk(root); } return useCases; } /// Knobs read `WidgetbookState` from the context, so use-cases can only be /// pumped inside a scope. Widget _host({required CupertinoThemeData theme, required WidgetbookUseCase useCase}) { return WidgetbookScope( state: WidgetbookState( path: useCase.path, root: WidgetbookRoot(children: buildCatalogDirectories()), ), child: CupertinoApp( theme: theme, locale: const Locale('ru'), home: Builder(builder: useCase.builder), ), ); } void main() { TestWidgetsFlutterBinding.ensureInitialized(); // No network access in tests — fall back to the default font instead. GoogleFonts.config.allowRuntimeFetching = false; setUpAll(() => initializeDateFormatting('ru')); test('catalog directories are non-empty', () { expect(buildCatalogDirectories(), isNotEmpty); }); test('every use-case has a name and a builder', () { final useCases = _collectUseCases(); for (final useCase in useCases) { expect(useCase.name, isNotEmpty); expect(useCase.builder, isNotNull); } expect(useCases.length, greaterThanOrEqualTo(20)); }); test('expected category folders exist', () { final names = buildCatalogDirectories().map((n) => n.name).toSet(); expect( names, containsAll({'Atoms', 'Molecules', 'Navigation', 'Feedback', 'Screens'}), ); }); group('use-cases render', () { final themes = { 'Light': buildLightTheme, 'Dark': buildDarkTheme, }; for (final entry in themes.entries) { for (final useCase in _collectUseCases()) { testWidgets('${useCase.path} (${entry.key})', (tester) async { await tester.pumpWidget(_host(theme: entry.value(), useCase: useCase)); await tester.pump(const Duration(milliseconds: 300)); expect(tester.takeException(), isNull); }); } } }); }