feat(coverage): enhance coverage analysis script to filter generated files and generate detailed markdown report for files with less than 100% coverage

This commit is contained in:
mso7nueh
2025-12-15 23:37:17 +03:00
parent cb441b4027
commit f1b7a24044
46 changed files with 1592 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/chat/repositories/chat_repository.dart';
import 'package:eatvio_app/features/order_info/cubit/order_info_cubit.dart';
import 'package:eatvio_app/features/order_info/presentation/info_by_order_screen.dart';
import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'info_by_order_screen_test.mocks.dart';
@GenerateMocks([ChatRepository, ProfileRepository])
void main() {
group('InfoByOrderScreen', () {
late MockChatRepository mockChatRepository;
late MockProfileRepository mockProfileRepository;
late OrderInfoCubit orderInfoCubit;
setUp(() async {
await sl.reset();
mockChatRepository = MockChatRepository();
mockProfileRepository = MockProfileRepository();
orderInfoCubit = OrderInfoCubit(
chatRepository: mockChatRepository,
profileRepository: mockProfileRepository,
);
sl.registerLazySingleton<OrderInfoCubit>(() => orderInfoCubit);
});
tearDown(() {
orderInfoCubit.close();
});
Widget createTestWidget({required int planId, bool? successfulPayment, String? customerSlug}) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('ru')],
home: InfoByOrderScreen(
planId: planId,
successfulPayment: successfulPayment,
customerSlug: customerSlug,
),
);
}
testWidgets('displays screen with loading state initially', (WidgetTester tester) async {
when(mockChatRepository.getChosenPlan(id: anyNamed('id')))
.thenThrow(Exception('Not implemented'));
await tester.pumpWidget(createTestWidget(planId: 1));
await tester.pump();
// Screen should be displayed (Loader widget is used, not CircularProgressIndicator directly)
expect(find.byType(Scaffold), findsOneWidget);
});
testWidgets('calls getChosenPlan when screen is created', (WidgetTester tester) async {
when(mockChatRepository.getChosenPlan(id: anyNamed('id')))
.thenThrow(Exception('Not implemented'));
await tester.pumpWidget(createTestWidget(planId: 123));
await tester.pump();
verify(mockChatRepository.getChosenPlan(id: 123)).called(1);
});
testWidgets('calls getChosenPlan when customerSlug is provided', (WidgetTester tester) async {
when(mockChatRepository.getChosenPlan(id: anyNamed('id')))
.thenThrow(Exception('Not implemented'));
await tester.pumpWidget(createTestWidget(planId: 123, customerSlug: 'test-user'));
await tester.pump();
verify(mockChatRepository.getChosenPlan(id: 123)).called(1);
// Note: getProfileBySlug is only called if getChosenPlan succeeds
});
testWidgets('displays screen with back button', (WidgetTester tester) async {
when(mockChatRepository.getChosenPlan(id: anyNamed('id')))
.thenThrow(Exception('Not implemented'));
await tester.pumpWidget(createTestWidget(planId: 1));
await tester.pump();
// Check for back button
expect(find.byIcon(Icons.arrow_back), findsOneWidget);
});
});
}