import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:life_helper/domain/catalog/catalog_item.dart'; import 'package:life_helper/domain/catalog/display_category.dart'; import 'package:life_helper/state/catalog_providers.dart'; import 'package:life_helper/ui/screens/protocol_gallery_screen.dart'; ProtocolCatalogItem _protocol( {required String id, required String title, required DisplayCategory dc}) => ProtocolCatalogItem( id: id, title: title, titleEn: null, summary: '$title 요약', displayCategory: dc, evidenceStrength: 'strong_rct', referenceIds: const [], what: 'w', whenText: 'wn', dose: 'd', why: 'y', how: const [], checkText: 'c', caution: null, defaultAnchor: null, minDoseForStart: null, sourceDoc: null, ); void main() { final fakeItems = [ _protocol(id: 'a1', title: '아침 햇빛', dc: DisplayCategory.lightCircadian), _protocol(id: 's1', title: '수면 스택', dc: DisplayCategory.sleep), _protocol(id: 's2', title: '카페인', dc: DisplayCategory.sleep), ]; Widget buildHarness(List items) { return ProviderScope( overrides: [ catalogItemsProvider.overrideWith((ref) async => items), ], child: const MaterialApp(home: ProtocolGalleryScreen()), ); } testWidgets('카테고리 칩 + 카드 표시', (tester) async { await tester.pumpWidget(buildHarness(fakeItems)); await tester.pump(); // resolve future // 칩: 전체 + lightCircadian + sleep (2 카테고리만 — 빈 카테고리 미표시) expect(find.text('전체'), findsOneWidget); expect(find.text('빛/일주기'), findsOneWidget); expect(find.text('수면'), findsOneWidget); expect(find.text('영양'), findsNothing); // 빈 카테고리는 안 보임 // 카드 3개 expect(find.text('아침 햇빛'), findsOneWidget); expect(find.text('수면 스택'), findsOneWidget); expect(find.text('카페인'), findsOneWidget); }); testWidgets('칩 선택 시 필터링', (tester) async { await tester.pumpWidget(buildHarness(fakeItems)); await tester.pump(); // 수면 칩 선택 await tester.tap(find.text('수면')); await tester.pump(); expect(find.text('아침 햇빛'), findsNothing); expect(find.text('수면 스택'), findsOneWidget); expect(find.text('카페인'), findsOneWidget); }); testWidgets('빈 결과 → "항목이 없습니다"', (tester) async { await tester.pumpWidget(buildHarness(const [])); await tester.pump(); expect(find.text('항목이 없습니다.'), findsOneWidget); }); }