feat(tests): test coverage 60%

This commit is contained in:
misha
2025-12-23 10:59:56 +03:00
parent 38118055a5
commit 5b705dfb72
67 changed files with 8391 additions and 42 deletions

View File

@@ -0,0 +1,92 @@
import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/enums/base_state.dart';
import 'package:eatvio_app/features/my_finance/models/card_model.dart';
import 'package:eatvio_app/features/my_finance/presentation/cubit/user_cards_cubit/user_cards_cubit.dart';
import 'package:eatvio_app/features/my_finance/presentation/cubit/user_cards_cubit/user_cards_state.dart';
import 'package:eatvio_app/features/my_finance/presentation/pages/card_settings.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.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 'card_settings_smoke_test.mocks.dart';
@GenerateNiceMocks([MockSpec<UserCardsCubit>()])
void main() {
group('CardSettingsScreen smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
void registerMock(UserCardsCubit cubit) {
sl.registerLazySingleton<UserCardsCubit>(() => cubit);
}
Widget wrap(UserCardsCubit cubit, Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('ru')],
home: BlocProvider<UserCardsCubit>.value(
value: cubit,
child: child,
),
);
}
testWidgets('renders with loading state', (tester) async {
final cubit = MockUserCardsCubit();
final state = UserCardsState(state: BaseState.initial, cards: const [], error: null);
when(cubit.state).thenReturn(state);
when(cubit.stream).thenAnswer((_) => const Stream<UserCardsState>.empty());
when(cubit.close()).thenAnswer((_) async => Future<void>.value());
when(cubit.getCards()).thenAnswer((_) async => Future<void>.value());
registerMock(cubit);
await tester.pumpWidget(wrap(cubit, const CardSettingsScreen()));
await tester.pump();
expect(find.byType(CardSettingsScreen), findsOneWidget);
});
testWidgets('renders with cards', (tester) async {
final cubit = MockUserCardsCubit();
final state = UserCardsState(
state: BaseState.success,
cards: [CardModel(id: 1, cardNumber: '1234567890123456', isDefault: true)],
error: null,
);
when(cubit.state).thenReturn(state);
when(cubit.stream).thenAnswer((_) => const Stream<UserCardsState>.empty());
when(cubit.close()).thenAnswer((_) async => Future<void>.value());
when(cubit.getCards()).thenAnswer((_) async => Future<void>.value());
registerMock(cubit);
await tester.pumpWidget(wrap(cubit, const CardSettingsScreen()));
await tester.pump();
expect(find.byType(CardSettingsScreen), findsOneWidget);
});
});
}

View File

@@ -0,0 +1,111 @@
import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart';
import 'package:eatvio_app/features/my_finance/presentation/pages/user_finance_screen.dart';
import 'package:eatvio_app/features/profile/models/profile_model.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.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 'user_finance_screen_smoke_test.mocks.dart';
@GenerateNiceMocks([MockSpec<ProfileAvatarCubit>()])
void main() {
group('UserFinanceScreen smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
const mockProfile = ProfileModel(
id: 1,
name: 'Test User',
email: 'test@example.com',
phoneConfirmationState: 'confirmed',
isPublicProfile: true,
isBlockedByMe: false,
isBlockedByAuthor: false,
isBlockedByUser: false,
isEntitySubscribedByMe: false,
slug: 'test-user',
profilePhotoUrl: 'https://example.com/avatar.jpg',
roles: ['user'],
badges: [],
subscriptions: [],
subscribers: [],
);
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('ru')],
home: child,
);
}
testWidgets('renders user finance screen', (tester) async {
final cubit = MockProfileAvatarCubit();
const state = ProfileAvatarStateLoaded(profile: mockProfile);
when(cubit.state).thenReturn(state);
when(cubit.stream).thenAnswer((_) => const Stream.empty());
when(cubit.close()).thenAnswer((_) async => Future<void>.value());
await tester.pumpWidget(BlocProvider<ProfileAvatarCubit>.value(value: cubit, child: wrap(const UserFinanceScreen())));
await tester.pumpAndSettle();
expect(find.text('Финансы'), findsOneWidget);
});
testWidgets('renders consultant finance screen with card management', (tester) async {
const consultantProfile = ProfileModel(
id: 1,
name: 'Test Consultant',
email: 'consultant@example.com',
phoneConfirmationState: 'confirmed',
isPublicProfile: true,
isBlockedByMe: false,
isBlockedByAuthor: false,
isBlockedByUser: false,
isEntitySubscribedByMe: false,
slug: 'test-consultant',
profilePhotoUrl: 'https://example.com/avatar.jpg',
roles: ['consultant'],
badges: [],
subscriptions: [],
subscribers: [],
);
final cubit = MockProfileAvatarCubit();
const state = ProfileAvatarStateLoaded(profile: consultantProfile);
when(cubit.state).thenReturn(state);
when(cubit.stream).thenAnswer((_) => const Stream.empty());
when(cubit.close()).thenAnswer((_) async => Future<void>.value());
await tester.pumpWidget(BlocProvider<ProfileAvatarCubit>.value(value: cubit, child: wrap(const UserFinanceScreen())));
await tester.pumpAndSettle();
expect(find.text('Финансы'), findsOneWidget);
expect(find.text('Управление картами'), findsOneWidget);
});
});
}