Merge remote-tracking branch 'upstream/main'

This commit is contained in:
misha
2025-12-25 16:36:23 +03:00
41 changed files with 3705 additions and 3478 deletions

View File

@@ -3,7 +3,7 @@ name: Eatvio App Android Test
on: [ pull_request ] on: [ pull_request ]
env: env:
flutter_version: "3.38.1" flutter_version: "3.38.5"
java_version: "21.x" java_version: "21.x"
flutter_channel: "stable" flutter_channel: "stable"
my_local_cache_dir: "/opt/hostedtoolcache/" my_local_cache_dir: "/opt/hostedtoolcache/"

View File

@@ -1,29 +1,33 @@
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
part 'oauth_verification_confirm_response.freezed.dart'; part 'oauth_verification_confirm_response.freezed.dart';
part 'oauth_verification_confirm_response.g.dart'; part 'oauth_verification_confirm_response.g.dart';
@freezed @freezed
abstract class OAuthVerificationConfirmResponse with _$OAuthVerificationConfirmResponse { abstract class OAuthVerificationConfirmResponse with _$OAuthVerificationConfirmResponse {
const factory OAuthVerificationConfirmResponse({ const factory OAuthVerificationConfirmResponse({
required bool success, required bool success,
required String message, required String message,
required String token, required String token,
required Map<String, dynamic> user, required Map<String, dynamic> user,
@JsonKey(name: 'is_new_user') required bool isNewUser, @JsonKey(name: 'is_new_user') required bool isNewUser,
}) = _OAuthVerificationConfirmResponse; }) = _OAuthVerificationConfirmResponse;
factory OAuthVerificationConfirmResponse.fromJson(Map<String, dynamic> json) => _$OAuthVerificationConfirmResponseFromJson(json); factory OAuthVerificationConfirmResponse.fromJson(Map<String, dynamic> json) => _$OAuthVerificationConfirmResponseFromJson(json);
} }

View File

@@ -1,23 +1,27 @@
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
part 'oauth_verification_request_response.freezed.dart'; part 'oauth_verification_request_response.freezed.dart';
part 'oauth_verification_request_response.g.dart'; part 'oauth_verification_request_response.g.dart';
@freezed @freezed
abstract class OAuthVerificationRequestResponse with _$OAuthVerificationRequestResponse { abstract class OAuthVerificationRequestResponse with _$OAuthVerificationRequestResponse {
const factory OAuthVerificationRequestResponse({required String email, required String status}) = _OAuthVerificationRequestResponse; const factory OAuthVerificationRequestResponse({required String email, required String status}) = _OAuthVerificationRequestResponse;
factory OAuthVerificationRequestResponse.fromJson(Map<String, dynamic> json) => _$OAuthVerificationRequestResponseFromJson(json); factory OAuthVerificationRequestResponse.fromJson(Map<String, dynamic> json) => _$OAuthVerificationRequestResponseFromJson(json);
} }

View File

@@ -1,17 +1,21 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart'; import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart';
import 'package:retrofit/retrofit.dart'; import 'package:retrofit/retrofit.dart';
part 'barcode_service.g.dart'; part 'barcode_service.g.dart';
@RestApi() @RestApi()
abstract class BarcodeService { abstract class BarcodeService {
factory BarcodeService(Dio dio, {String baseUrl}) = _BarcodeService; factory BarcodeService(Dio dio, {String baseUrl}) = _BarcodeService;
@GET('/api/gsone/barcode/{barcode}') @GET('/api/gsone/barcode/{barcode}')
Future<BarcodeProductModel> getProductByBarcode({@Path('barcode') required String barcode}); Future<BarcodeProductModel> getProductByBarcode({@Path('barcode') required String barcode});
@GET('/api/gsone/barcode/status/{task_id}') @GET('/api/gsone/barcode/status/{task_id}')
Future<BarcodeTaskStatusModel> getTaskStatus({@Path('task_id') required String taskId}); Future<BarcodeTaskStatusModel> getTaskStatus({@Path('task_id') required String taskId});
} }

View File

@@ -1,176 +1,178 @@
import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart';
import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart';
import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart'; import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart';
import 'package:eatvio_app/features/registration_v2/cubit/registration_cubit.dart'; import 'package:eatvio_app/features/registration_v2/cubit/registration_cubit.dart';
import 'package:eatvio_app/features/registration_v2/cubit/registration_state.dart'; import 'package:eatvio_app/features/registration_v2/cubit/registration_state.dart';
import 'package:eatvio_app/features/registration_v2/presentation/widgets/sex_widget.dart'; import 'package:eatvio_app/features/registration_v2/presentation/widgets/sex_widget.dart';
import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart'; import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
class FirstStepContent extends StatefulWidget { class FirstStepContent extends StatefulWidget {
const FirstStepContent({super.key}); const FirstStepContent({super.key});
@override @override
State<FirstStepContent> createState() => _FirstStepContentState(); State<FirstStepContent> createState() => _FirstStepContentState();
} }
class _FirstStepContentState extends State<FirstStepContent> { class _FirstStepContentState extends State<FirstStepContent> {
final maskFormatterForBirthday = MaskTextInputFormatter(mask: '##.##.####', filter: {"#": RegExp(r'[0-9]')}, type: MaskAutoCompletionType.lazy); final maskFormatterForBirthday = MaskTextInputFormatter(mask: '##.##.####', filter: {"#": RegExp(r'[0-9]')}, type: MaskAutoCompletionType.lazy);
final firstNameController = TextEditingController(); final firstNameController = TextEditingController();
final lastNameController = TextEditingController(); final lastNameController = TextEditingController();
final emailController = TextEditingController(); final emailController = TextEditingController();
final phoneController = TextEditingController(); final phoneController = TextEditingController();
final dateController = TextEditingController(); final dateController = TextEditingController();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
firstNameController.text = context.read<RegistrationCubitV2>().state.firstName; firstNameController.text = context.read<RegistrationCubitV2>().state.firstName;
lastNameController.text = context.read<RegistrationCubitV2>().state.lastName; lastNameController.text = context.read<RegistrationCubitV2>().state.lastName;
emailController.text = context.read<RegistrationCubitV2>().state.email; emailController.text = context.read<RegistrationCubitV2>().state.email;
phoneController.text = context.read<RegistrationCubitV2>().state.phone; phoneController.text = context.read<RegistrationCubitV2>().state.phone;
dateController.text = context.read<RegistrationCubitV2>().state.birthday?.format('dd.MM.yyyy') ?? ''; dateController.text = context.read<RegistrationCubitV2>().state.birthday?.format('dd.MM.yyyy') ?? '';
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final s = S.of(context); final s = S.of(context);
return BlocBuilder<RegistrationCubitV2, RegistrationStateV2>( return BlocBuilder<RegistrationCubitV2, RegistrationStateV2>(
builder: (context, state) { builder: (context, state) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(s.first_name, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), Text(s.first_name, style: TextStyles.textSMedium.copyWith(color: appTheme.black)),
const SizedBox(height: 4), const SizedBox(height: 4),
CustomTextFormField( CustomTextFormField(
hintText: s.your_name, hintText: s.your_name,
hasError: !state.isFirstNameValid, hasError: !state.isFirstNameValid,
controller: firstNameController, controller: firstNameController,
onChanged: (val) { onChanged: (val) {
context.read<RegistrationCubitV2>().setFirstName(val); context.read<RegistrationCubitV2>().setFirstName(val);
}, },
), ),
if (!state.isFirstNameValid) ...[const SizedBox(height: 4), ValidationErrorWidget(error: s.first_name_validation_error)], if (!state.isFirstNameValid) ...[const SizedBox(height: 4), ValidationErrorWidget(error: s.first_name_validation_error)],
], ],
), ),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(s.last_name, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), Text(s.last_name, style: TextStyles.textSMedium.copyWith(color: appTheme.black)),
const SizedBox(height: 4), const SizedBox(height: 4),
CustomTextFormField( CustomTextFormField(
hintText: s.your_last_name, hintText: s.your_last_name,
hasError: !state.isLastNameValid, hasError: !state.isLastNameValid,
controller: lastNameController, controller: lastNameController,
onChanged: (val) { onChanged: (val) {
context.read<RegistrationCubitV2>().setLastName(val); context.read<RegistrationCubitV2>().setLastName(val);
}, },
), ),
if (!state.isLastNameValid) ...[const SizedBox(height: 4), ValidationErrorWidget(error: s.last_name_error)], if (!state.isLastNameValid) ...[const SizedBox(height: 4), ValidationErrorWidget(error: s.last_name_error)],
], ],
), ),
), ),
], ],
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
Text(s.email, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), Text(s.email, style: TextStyles.textSMedium.copyWith(color: appTheme.black)),
CustomTextFormField( CustomTextFormField(
hintText: s.type_email, hintText: s.type_email,
hasError: !state.isEmailValid, hasError: !state.isEmailValid,
controller: emailController, keyboardType: TextInputType.emailAddress,
onChanged: (val) { controller: emailController,
context.read<RegistrationCubitV2>().setEmail(val); onChanged: (val) {
}, context.read<RegistrationCubitV2>().setEmail(val);
), },
if (!state.isEmailValid) ...[ ),
const SizedBox(height: 4), if (!state.isEmailValid) ...[
ValidationErrorWidget(error: state.emailDisplayError.isEmpty ? s.email_error : state.emailDisplayError), const SizedBox(height: 4),
], ValidationErrorWidget(error: state.emailDisplayError.isEmpty ? s.email_error : state.emailDisplayError),
const SizedBox(height: 12), ],
Text(s.phone, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), const SizedBox(height: 12),
Column( Text(s.phone, style: TextStyles.textSMedium.copyWith(color: appTheme.black)),
children: [ Column(
CustomTextFormField( children: [
hintText: '+7 (999) 999 99 99', CustomTextFormField(
controller: phoneController, hintText: '+7 (999) 999 99 99',
hasError: !state.isPhoneValid, controller: phoneController,
onChanged: (val) { hasError: !state.isPhoneValid,
context.read<RegistrationCubitV2>().setPhone(val); keyboardType: TextInputType.phone,
}, onChanged: (val) {
), context.read<RegistrationCubitV2>().setPhone(val);
if (!state.isPhoneValid) ...[ },
const SizedBox(height: 4), ),
ValidationErrorWidget(error: state.phoneDisplayError.isEmpty ? s.phone_error : state.phoneDisplayError), if (!state.isPhoneValid) ...[
], const SizedBox(height: 4),
], ValidationErrorWidget(error: state.phoneDisplayError.isEmpty ? s.phone_error : state.phoneDisplayError),
), ],
const SizedBox(height: 12), ],
Row( ),
crossAxisAlignment: CrossAxisAlignment.start, const SizedBox(height: 12),
children: [ Row(
Expanded( crossAxisAlignment: CrossAxisAlignment.start,
child: Column( children: [
crossAxisAlignment: CrossAxisAlignment.start, Expanded(
children: [ child: Column(
Text(s.date_of_birth, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), crossAxisAlignment: CrossAxisAlignment.start,
const SizedBox(height: 4), children: [
CustomTextFormField( Text(s.date_of_birth, style: TextStyles.textSMedium.copyWith(color: appTheme.black)),
textInputAction: TextInputAction.done, const SizedBox(height: 4),
hintText: '01.01.2000', CustomTextFormField(
keyboardType: TextInputType.number, textInputAction: TextInputAction.done,
inputFormatters: [maskFormatterForBirthday], hintText: '01.01.2000',
hasError: !state.isBirthdayValid, keyboardType: TextInputType.number,
controller: dateController, inputFormatters: [maskFormatterForBirthday],
onChanged: (val) { hasError: !state.isBirthdayValid,
final dateArray = val.split('.'); controller: dateController,
if (dateArray.length != 3) return; onChanged: (val) {
final date = DateTime(int.parse(dateArray[2]), int.parse(dateArray[1]), int.parse(dateArray[0])); final dateArray = val.split('.');
context.read<RegistrationCubitV2>().setBirthday(date); if (dateArray.length != 3) return;
}, final date = DateTime(int.parse(dateArray[2]), int.parse(dateArray[1]), int.parse(dateArray[0]));
), context.read<RegistrationCubitV2>().setBirthday(date);
if (!state.isBirthdayValid) ...[ },
const SizedBox(height: 4), ),
ValidationErrorWidget(error: state.dateOfBirthDisplayError.isEmpty ? s.date_of_birth_error : state.dateOfBirthDisplayError), if (!state.isBirthdayValid) ...[
], const SizedBox(height: 4),
], ValidationErrorWidget(error: state.dateOfBirthDisplayError.isEmpty ? s.date_of_birth_error : state.dateOfBirthDisplayError),
), ],
), ],
const SizedBox(width: 12), ),
const Expanded(child: SexWidget()), ),
], const SizedBox(width: 12),
), const Expanded(child: SexWidget()),
const Spacer(), ],
CustomOutlinedButton( ),
onPressed: () { const Spacer(),
context.read<RegistrationCubitV2>().nextStep(); CustomOutlinedButton(
}, onPressed: () {
text: s.next, context.read<RegistrationCubitV2>().nextStep();
height: 52, },
buttonTextStyle: TextStyles.textSSemibold.copyWith(color: appTheme.whiteA700), text: s.next,
buttonStyle: ButtonStyle(side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.blueA400)), height: 52,
), buttonTextStyle: TextStyles.textSSemibold.copyWith(color: appTheme.whiteA700),
const SizedBox(height: 20), buttonStyle: ButtonStyle(side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.blueA400)),
], ),
); const SizedBox(height: 20),
}, ],
); );
} },
} );
}
}

View File

@@ -33,8 +33,12 @@ class _SecondStepContentState extends State<SecondStepContent> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
heightController.text = context.read<RegistrationCubitV2>().state.height.toString(); heightController.text = context.read<RegistrationCubitV2>().state.height.toString() == '0'
weightController.text = context.read<RegistrationCubitV2>().state.weight.toString(); ? ''
: context.read<RegistrationCubitV2>().state.height.toString();
weightController.text = context.read<RegistrationCubitV2>().state.weight.toString() == '0'
? ''
: context.read<RegistrationCubitV2>().state.weight.toString();
} }
@override @override
@@ -61,6 +65,7 @@ class _SecondStepContentState extends State<SecondStepContent> {
hintText: s.type_height, hintText: s.type_height,
hasError: !state.isHeightValid, hasError: !state.isHeightValid,
controller: heightController, controller: heightController,
keyboardType: TextInputType.number,
textInputType: const TextInputType.numberWithOptions(), textInputType: const TextInputType.numberWithOptions(),
onChanged: (val) { onChanged: (val) {
final height = int.tryParse(val); final height = int.tryParse(val);
@@ -84,6 +89,7 @@ class _SecondStepContentState extends State<SecondStepContent> {
hintText: s.type_weight, hintText: s.type_weight,
hasError: !state.isWeightValid, hasError: !state.isWeightValid,
controller: weightController, controller: weightController,
keyboardType: TextInputType.number,
textInputType: const TextInputType.numberWithOptions(), textInputType: const TextInputType.numberWithOptions(),
onChanged: (val) { onChanged: (val) {
final weight = int.tryParse(val); final weight = int.tryParse(val);

View File

@@ -4,7 +4,7 @@ version: 1.3.10+90
publish_to: 'none' publish_to: 'none'
environment: environment:
sdk: '>=3.8.0 <4.0.0' sdk: ^3.10.4
dependencies: dependencies:
flutter: flutter:
@@ -15,7 +15,7 @@ dependencies:
flutter_bloc: ^9.1.1 flutter_bloc: ^9.1.1
cached_network_image: ^3.4.1 cached_network_image: ^3.4.1
flutter_svg: ^2.2.0 flutter_svg: ^2.2.3
equatable: ^2.0.7 equatable: ^2.0.7
freezed_annotation: ^3.1.0 freezed_annotation: ^3.1.0
json_annotation: ^4.9.0 json_annotation: ^4.9.0
@@ -23,12 +23,12 @@ dependencies:
path_provider: ^2.1.5 path_provider: ^2.1.5
carousel_slider_plus: ^7.1.1 carousel_slider_plus: ^7.1.1
flutter_form_builder: ^10.2.0 flutter_form_builder: ^10.2.0
image_picker: ^1.2.0 image_picker: ^1.2.1
flutter_typeahead: ^5.2.0 flutter_typeahead: ^5.2.0
go_router: ^17.0.0 go_router: ^17.0.1
keyboard_dismisser: ^3.0.0 keyboard_dismisser: ^3.0.0
retrofit: ^4.7.1 retrofit: 4.7.2
get_it: ^9.0.5 get_it: ^9.2.0
dio: ^5.9.0 dio: ^5.9.0
dart_pusher_channels: ^1.2.3 dart_pusher_channels: ^1.2.3
photo_view: ^0.15.0 photo_view: ^0.15.0
@@ -36,60 +36,60 @@ dependencies:
url_launcher: ^6.3.2 url_launcher: ^6.3.2
easy_debounce: ^2.0.3 easy_debounce: ^2.0.3
badges: ^3.1.2 badges: ^3.1.2
google_fonts: ^6.3.0 google_fonts: ^6.3.3
syncfusion_flutter_charts: ^31.2.10 syncfusion_flutter_charts: ^32.1.20
syncfusion_flutter_gauges: ^31.2.10 syncfusion_flutter_gauges: ^32.1.20
table_calendar: ^3.2.0 table_calendar: ^3.2.0
flutter_keyboard_visibility: ^6.0.0 flutter_keyboard_visibility: ^6.0.0
share_plus: ^12.0.1 share_plus: ^12.0.1
flutter_html: ^3.0.0 flutter_html: ^3.0.0
file_picker: ^10.3.1 file_picker: ^10.3.8
audioplayers: ^6.5.0 audioplayers: ^6.5.1
intl: ^0.20.2 intl: ^0.20.2
mask_text_input_formatter: ^2.9.0 mask_text_input_formatter: ^2.9.0
lottie: ^3.3.1 lottie: ^3.3.2
flutter_portal: ^1.1.4 flutter_portal: ^1.1.4
fluttertoast: ^9.0.0 fluttertoast: ^9.0.0
flutter_rating_bar: ^4.0.1 flutter_rating_bar: ^4.0.1
flutter_image_compress: ^2.4.0 flutter_image_compress: ^2.4.0
image: ^4.5.4 image: ^4.7.2
dotted_border: ^3.1.0 dotted_border: ^3.1.0
http: ^1.5.0 http: ^1.6.0
flutter_native_splash: ^2.4.6 flutter_native_splash: ^2.4.7
webview_flutter: ^4.13.0 webview_flutter: ^4.13.0
sentry_flutter: ^9.8.0 sentry_flutter: ^9.9.1
connectivity_plus: ^7.0.0 connectivity_plus: ^7.0.0
visibility_detector: ^0.4.0+2 visibility_detector: ^0.4.0+2
firebase_core: ^4.0.0 firebase_core: ^4.3.0
firebase_messaging: ^16.0.0 firebase_messaging: ^16.1.0
http_parser: ^4.1.2 http_parser: ^4.1.2
path: ^1.9.1 path: ^1.9.1
collection: ^1.19.1 collection: ^1.19.1
shared_preferences: ^2.5.3 shared_preferences: ^2.5.4
version: ^3.0.2 version: ^3.0.2
package_info_plus: ^9.0.0 package_info_plus: ^9.0.0
device_info_plus: ^12.2.0 device_info_plus: ^12.3.0
permission_handler: ^12.0.1 permission_handler: ^12.0.1
qr_code_scanner_plus: ^2.0.10+1 qr_code_scanner_plus: ^2.0.14
flutter_dotenv: ^6.0.0 flutter_dotenv: ^6.0.0
uuid: ^4.5.2 uuid: ^4.5.2
appmetrica_plugin: ^3.3.0 appmetrica_plugin: ^3.4.0
vk_id: ^1.0.3 vk_id: ^1.0.4
flutter_login_yandex: ^0.0.5 flutter_login_yandex: ^0.0.5
markdown: ^7.3.0 markdown: ^7.3.0
flutter_password_generator: ^1.0.3 flutter_password_generator: ^1.0.3
mobile_scanner: ^7.1.3 mobile_scanner: ^7.1.4
material_symbols_icons: ^4.2874.0 material_symbols_icons: ^4.2892.0
rxdart: ^0.27.7 rxdart: ^0.27.7
gpassword: ^1.0.0 gpassword: ^1.0.0
webview_flutter_platform_interface: ^2.14.0 webview_flutter_platform_interface: ^2.14.0
dev_dependencies: dev_dependencies:
build_runner: ^2.7.0 build_runner: ^2.10.4
freezed: ^3.2.0 freezed: ^3.2.0
json_serializable: ^6.10.0 json_serializable: ^6.11.2
retrofit_generator: ^10.0.2 retrofit_generator: 10.0.6
mockito: ^5.5.0 mockito: ^5.6.1
mocktail: ^1.0.4 mocktail: ^1.0.4
network_image_mock: ^2.1.1 network_image_mock: ^2.1.1

View File

@@ -1,153 +1,157 @@
import 'package:eatvio_app/core/constants/app_constants.dart'; import 'package:eatvio_app/core/constants/app_constants.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('AppConstants', () { group('AppConstants', () {
group('Sizes', () { group('Sizes', () {
test('has correct padding values', () { test('has correct padding values', () {
expect(AppConstants.defaultPadding, 16.0); expect(AppConstants.defaultPadding, 16.0);
expect(AppConstants.smallPadding, 8.0); expect(AppConstants.smallPadding, 8.0);
expect(AppConstants.largePadding, 24.0); expect(AppConstants.largePadding, 24.0);
expect(AppConstants.extraLargePadding, 32.0); expect(AppConstants.extraLargePadding, 32.0);
}); });
test('has correct border radius values', () { test('has correct border radius values', () {
expect(AppConstants.defaultBorderRadius, 8.0); expect(AppConstants.defaultBorderRadius, 8.0);
expect(AppConstants.smallBorderRadius, 4.0); expect(AppConstants.smallBorderRadius, 4.0);
expect(AppConstants.largeBorderRadius, 16.0); expect(AppConstants.largeBorderRadius, 16.0);
}); });
test('has correct button height values', () { test('has correct button height values', () {
expect(AppConstants.defaultButtonHeight, 48.0); expect(AppConstants.defaultButtonHeight, 48.0);
expect(AppConstants.smallButtonHeight, 36.0); expect(AppConstants.smallButtonHeight, 36.0);
expect(AppConstants.largeButtonHeight, 56.0); expect(AppConstants.largeButtonHeight, 56.0);
}); });
test('has correct content width values', () { test('has correct content width values', () {
expect(AppConstants.maxContentWidth, 400.0); expect(AppConstants.maxContentWidth, 400.0);
expect(AppConstants.minContentWidth, 280.0); expect(AppConstants.minContentWidth, 280.0);
}); });
}); });
group('Animations', () { group('Animations', () {
test('has correct animation durations', () { test('has correct animation durations', () {
expect(AppConstants.defaultAnimationDuration, const Duration(milliseconds: 300)); expect(AppConstants.defaultAnimationDuration, const Duration(milliseconds: 300));
expect(AppConstants.fastAnimationDuration, const Duration(milliseconds: 150)); expect(AppConstants.fastAnimationDuration, const Duration(milliseconds: 150));
expect(AppConstants.slowAnimationDuration, const Duration(milliseconds: 500)); expect(AppConstants.slowAnimationDuration, const Duration(milliseconds: 500));
}); });
}); });
group('Timeouts', () { group('Timeouts', () {
test('has correct timeout durations', () { test('has correct timeout durations', () {
expect(AppConstants.defaultTimeout, const Duration(seconds: 30)); expect(AppConstants.defaultTimeout, const Duration(seconds: 30));
expect(AppConstants.shortTimeout, const Duration(seconds: 10)); expect(AppConstants.shortTimeout, const Duration(seconds: 10));
expect(AppConstants.longTimeout, const Duration(minutes: 2)); expect(AppConstants.longTimeout, const Duration(minutes: 2));
}); });
}); });
group('Limits', () { group('Limits', () {
test('has correct size limits', () { test('has correct size limits', () {
expect(AppConstants.maxImageSize, 5 * 1024 * 1024); expect(AppConstants.maxImageSize, 5 * 1024 * 1024);
expect(AppConstants.maxVideoSize, 100 * 1024 * 1024); expect(AppConstants.maxVideoSize, 100 * 1024 * 1024);
}); });
test('has correct text length limits', () { test('has correct text length limits', () {
expect(AppConstants.maxTextLength, 1000); expect(AppConstants.maxTextLength, 1000);
expect(AppConstants.maxTitleLength, 100); expect(AppConstants.maxTitleLength, 100);
expect(AppConstants.maxDescriptionLength, 500); expect(AppConstants.maxDescriptionLength, 500);
}); });
}); });
group('Pagination', () { group('Pagination', () {
test('has correct page sizes', () { test('has correct page sizes', () {
expect(AppConstants.defaultPageSize, 20); expect(AppConstants.defaultPageSize, 20);
expect(AppConstants.smallPageSize, 10); expect(AppConstants.smallPageSize, 10);
expect(AppConstants.largePageSize, 50); expect(AppConstants.largePageSize, 50);
}); });
}); });
group('Formats', () { group('Formats', () {
test('has supported image formats', () { test('has supported image formats', () {
expect(AppConstants.supportedImageFormats, contains('jpg')); expect(AppConstants.supportedImageFormats, contains('jpg'));
expect(AppConstants.supportedImageFormats, contains('jpeg')); expect(AppConstants.supportedImageFormats, contains('jpeg'));
expect(AppConstants.supportedImageFormats, contains('png')); expect(AppConstants.supportedImageFormats, contains('png'));
expect(AppConstants.supportedImageFormats, contains('webp')); expect(AppConstants.supportedImageFormats, contains('webp'));
}); });
test('has supported video formats', () { test('has supported video formats', () {
expect(AppConstants.supportedVideoFormats, contains('mp4')); expect(AppConstants.supportedVideoFormats, contains('mp4'));
expect(AppConstants.supportedVideoFormats, contains('mov')); expect(AppConstants.supportedVideoFormats, contains('mov'));
expect(AppConstants.supportedVideoFormats, contains('avi')); expect(AppConstants.supportedVideoFormats, contains('avi'));
}); });
}); });
group('Regex', () { group('Regex', () {
test('has email regex', () { test('has email regex', () {
expect(AppConstants.emailRegex, isA<String>()); expect(AppConstants.emailRegex, isA<String>());
expect(AppConstants.emailRegex.isNotEmpty, isTrue); expect(AppConstants.emailRegex.isNotEmpty, isTrue);
}); });
test('has phone regex', () { test('has phone regex', () {
expect(AppConstants.phoneRegex, isA<String>()); expect(AppConstants.phoneRegex, isA<String>());
expect(AppConstants.phoneRegex.isNotEmpty, isTrue); expect(AppConstants.phoneRegex.isNotEmpty, isTrue);
}); });
test('has URL regex', () { test('has URL regex', () {
expect(AppConstants.urlRegex, isA<String>()); expect(AppConstants.urlRegex, isA<String>());
expect(AppConstants.urlRegex.isNotEmpty, isTrue); expect(AppConstants.urlRegex.isNotEmpty, isTrue);
}); });
}); });
group('Messages', () { group('Messages', () {
test('has error messages', () { test('has error messages', () {
expect(AppConstants.defaultErrorMessage, isA<String>()); expect(AppConstants.defaultErrorMessage, isA<String>());
expect(AppConstants.networkErrorMessage, isA<String>()); expect(AppConstants.networkErrorMessage, isA<String>());
expect(AppConstants.timeoutErrorMessage, isA<String>()); expect(AppConstants.timeoutErrorMessage, isA<String>());
expect(AppConstants.unknownErrorMessage, isA<String>()); expect(AppConstants.unknownErrorMessage, isA<String>());
}); });
}); });
group('Keys', () { group('Keys', () {
test('has SharedPreferences keys', () { test('has SharedPreferences keys', () {
expect(AppConstants.welcomeScreenShownKey, isA<String>()); expect(AppConstants.welcomeScreenShownKey, isA<String>());
expect(AppConstants.userTokenKey, isA<String>()); expect(AppConstants.userTokenKey, isA<String>());
expect(AppConstants.userDataKey, isA<String>()); expect(AppConstants.userDataKey, isA<String>());
expect(AppConstants.settingsKey, isA<String>()); expect(AppConstants.settingsKey, isA<String>());
}); });
}); });
group('API Endpoints', () { group('API Endpoints', () {
test('has API endpoints', () { test('has API endpoints', () {
expect(AppConstants.apiVersion, '/api'); expect(AppConstants.apiVersion, '/api');
expect(AppConstants.authEndpoint, '/auth'); expect(AppConstants.authEndpoint, '/auth');
expect(AppConstants.usersEndpoint, '/users'); expect(AppConstants.usersEndpoint, '/users');
expect(AppConstants.postsEndpoint, '/posts'); expect(AppConstants.postsEndpoint, '/posts');
expect(AppConstants.commentsEndpoint, '/comments'); expect(AppConstants.commentsEndpoint, '/comments');
}); });
}); });
}); });
} }

View File

@@ -1,88 +1,92 @@
import 'package:eatvio_app/core/cubit/state_utils.dart'; import 'package:eatvio_app/core/cubit/state_utils.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('StateUtils', () { group('StateUtils', () {
test('isLoading returns true for loading state', () { test('isLoading returns true for loading state', () {
expect(StateUtils.isLoading('loading'), isTrue); expect(StateUtils.isLoading('loading'), isTrue);
expect(StateUtils.isLoading('Loading'), isTrue); expect(StateUtils.isLoading('Loading'), isTrue);
expect(StateUtils.isLoading('StateLoading'), isTrue); expect(StateUtils.isLoading('StateLoading'), isTrue);
expect(StateUtils.isLoading('state_loading'), isTrue); expect(StateUtils.isLoading('state_loading'), isTrue);
}); });
test('isLoading returns false for non-loading state', () { test('isLoading returns false for non-loading state', () {
expect(StateUtils.isLoading('loaded'), isFalse); expect(StateUtils.isLoading('loaded'), isFalse);
expect(StateUtils.isLoading('error'), isFalse); expect(StateUtils.isLoading('error'), isFalse);
expect(StateUtils.isLoading('success'), isFalse); expect(StateUtils.isLoading('success'), isFalse);
}); });
test('isLoaded returns true for loaded state', () { test('isLoaded returns true for loaded state', () {
expect(StateUtils.isLoaded('loaded'), isTrue); expect(StateUtils.isLoaded('loaded'), isTrue);
expect(StateUtils.isLoaded('Loaded'), isTrue); expect(StateUtils.isLoaded('Loaded'), isTrue);
expect(StateUtils.isLoaded('StateLoaded'), isTrue); expect(StateUtils.isLoaded('StateLoaded'), isTrue);
expect(StateUtils.isLoaded('state_loaded'), isTrue); expect(StateUtils.isLoaded('state_loaded'), isTrue);
}); });
test('isLoaded returns false for non-loaded state', () { test('isLoaded returns false for non-loaded state', () {
expect(StateUtils.isLoaded('loading'), isFalse); expect(StateUtils.isLoaded('loading'), isFalse);
expect(StateUtils.isLoaded('error'), isFalse); expect(StateUtils.isLoaded('error'), isFalse);
expect(StateUtils.isLoaded('initial'), isFalse); expect(StateUtils.isLoaded('initial'), isFalse);
}); });
test('isError returns true for error state', () { test('isError returns true for error state', () {
expect(StateUtils.isError('error'), isTrue); expect(StateUtils.isError('error'), isTrue);
expect(StateUtils.isError('Error'), isTrue); expect(StateUtils.isError('Error'), isTrue);
expect(StateUtils.isError('StateError'), isTrue); expect(StateUtils.isError('StateError'), isTrue);
expect(StateUtils.isError('state_error'), isTrue); expect(StateUtils.isError('state_error'), isTrue);
}); });
test('isError returns false for non-error state', () { test('isError returns false for non-error state', () {
expect(StateUtils.isError('loading'), isFalse); expect(StateUtils.isError('loading'), isFalse);
expect(StateUtils.isError('loaded'), isFalse); expect(StateUtils.isError('loaded'), isFalse);
expect(StateUtils.isError('success'), isFalse); expect(StateUtils.isError('success'), isFalse);
}); });
test('getErrorMessage returns null for non-error state', () { test('getErrorMessage returns null for non-error state', () {
expect(StateUtils.getErrorMessage('loading'), isNull); expect(StateUtils.getErrorMessage('loading'), isNull);
expect(StateUtils.getErrorMessage('loaded'), isNull); expect(StateUtils.getErrorMessage('loaded'), isNull);
expect(StateUtils.getErrorMessage('success'), isNull); expect(StateUtils.getErrorMessage('success'), isNull);
}); });
test('getErrorMessage extracts error message from error state', () { test('getErrorMessage extracts error message from error state', () {
const errorState = 'error: Something went wrong'; const errorState = 'error: Something went wrong';
final message = StateUtils.getErrorMessage(errorState); final message = StateUtils.getErrorMessage(errorState);
expect(message, isNotNull); expect(message, isNotNull);
expect(message, contains('Something')); expect(message, contains('Something'));
}); });
test('getErrorMessage handles various error state formats', () { test('getErrorMessage handles various error state formats', () {
expect(StateUtils.getErrorMessage('error: test'), isNotNull); expect(StateUtils.getErrorMessage('error: test'), isNotNull);
expect(StateUtils.getErrorMessage('Error: test message'), isNotNull); expect(StateUtils.getErrorMessage('Error: test message'), isNotNull);
}); });
}); });
} }

View File

@@ -1,102 +1,106 @@
import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('SelectionPopupModel', () { group('SelectionPopupModel', () {
test('creates model with all parameters', () { test('creates model with all parameters', () {
const model = SelectionPopupModel( const model = SelectionPopupModel(
id: 1, id: 1,
title: 'Test Title', title: 'Test Title',
value: 'Test Value', value: 'Test Value',
isSelected: true, isSelected: true,
); );
expect(model.id, 1); expect(model.id, 1);
expect(model.title, 'Test Title'); expect(model.title, 'Test Title');
expect(model.value, 'Test Value'); expect(model.value, 'Test Value');
expect(model.isSelected, true); expect(model.isSelected, true);
}); });
test('creates model with default isSelected value', () { test('creates model with default isSelected value', () {
const model = SelectionPopupModel( const model = SelectionPopupModel(
title: 'Test Title', title: 'Test Title',
value: 'Test Value', value: 'Test Value',
); );
expect(model.isSelected, false); expect(model.isSelected, false);
}); });
test('creates model with null id', () { test('creates model with null id', () {
const model = SelectionPopupModel( const model = SelectionPopupModel(
id: null, id: null,
title: 'Test Title', title: 'Test Title',
value: 'Test Value', value: 'Test Value',
); );
expect(model.id, null); expect(model.id, null);
expect(model.title, 'Test Title'); expect(model.title, 'Test Title');
}); });
test('creates model with different value types', () { test('creates model with different value types', () {
const model1 = SelectionPopupModel( const model1 = SelectionPopupModel(
title: 'Test', title: 'Test',
value: 123, value: 123,
); );
const model2 = SelectionPopupModel( const model2 = SelectionPopupModel(
title: 'Test', title: 'Test',
value: 'String Value', value: 'String Value',
); );
const model3 = SelectionPopupModel( const model3 = SelectionPopupModel(
title: 'Test', title: 'Test',
value: true, value: true,
); );
expect(model1.value, 123); expect(model1.value, 123);
expect(model2.value, 'String Value'); expect(model2.value, 'String Value');
expect(model3.value, true); expect(model3.value, true);
}); });
test('can be compared', () { test('can be compared', () {
const model1 = SelectionPopupModel( const model1 = SelectionPopupModel(
id: 1, id: 1,
title: 'Test', title: 'Test',
value: 'Value', value: 'Value',
); );
const model2 = SelectionPopupModel( const model2 = SelectionPopupModel(
id: 1, id: 1,
title: 'Test', title: 'Test',
value: 'Value', value: 'Value',
); );
expect(model1 == model2, true); expect(model1 == model2, true);
}); });
}); });
} }

View File

@@ -1,51 +1,55 @@
import 'package:eatvio_app/core/prefs_keys.dart'; import 'package:eatvio_app/core/prefs_keys.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('PrefsKeys', () { group('PrefsKeys', () {
test('has all expected values', () { test('has all expected values', () {
expect(PrefsKeys.values.length, 4); expect(PrefsKeys.values.length, 4);
expect(PrefsKeys.values, contains(PrefsKeys.hasAnonymousTokenBeenSent)); expect(PrefsKeys.values, contains(PrefsKeys.hasAnonymousTokenBeenSent));
expect(PrefsKeys.values, contains(PrefsKeys.welcomeScreenWasShowed)); expect(PrefsKeys.values, contains(PrefsKeys.welcomeScreenWasShowed));
expect(PrefsKeys.values, contains(PrefsKeys.registrationDate)); expect(PrefsKeys.values, contains(PrefsKeys.registrationDate));
expect(PrefsKeys.values, contains(PrefsKeys.marketingBottomSheetHasBeenShown)); expect(PrefsKeys.values, contains(PrefsKeys.marketingBottomSheetHasBeenShown));
}); });
test('can be compared', () { test('can be compared', () {
expect(PrefsKeys.hasAnonymousTokenBeenSent == PrefsKeys.hasAnonymousTokenBeenSent, true); expect(PrefsKeys.hasAnonymousTokenBeenSent == PrefsKeys.hasAnonymousTokenBeenSent, true);
expect(PrefsKeys.hasAnonymousTokenBeenSent == PrefsKeys.welcomeScreenWasShowed, false); expect(PrefsKeys.hasAnonymousTokenBeenSent == PrefsKeys.welcomeScreenWasShowed, false);
}); });
test('has correct name property', () { test('has correct name property', () {
expect(PrefsKeys.hasAnonymousTokenBeenSent.name, 'hasAnonymousTokenBeenSent'); expect(PrefsKeys.hasAnonymousTokenBeenSent.name, 'hasAnonymousTokenBeenSent');
expect(PrefsKeys.welcomeScreenWasShowed.name, 'welcomeScreenWasShowed'); expect(PrefsKeys.welcomeScreenWasShowed.name, 'welcomeScreenWasShowed');
expect(PrefsKeys.registrationDate.name, 'registrationDate'); expect(PrefsKeys.registrationDate.name, 'registrationDate');
expect(PrefsKeys.marketingBottomSheetHasBeenShown.name, 'marketingBottomSheetHasBeenShown'); expect(PrefsKeys.marketingBottomSheetHasBeenShown.name, 'marketingBottomSheetHasBeenShown');
}); });
}); });
} }

View File

@@ -1,77 +1,81 @@
import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_state.dart'; import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_state.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('InternetConnectionState', () { group('InternetConnectionState', () {
test('creates state with default isInternetAvailable value', () { test('creates state with default isInternetAvailable value', () {
final state = InternetConnectionState(); final state = InternetConnectionState();
expect(state.isInternetAvailable, true); expect(state.isInternetAvailable, true);
}); });
test('creates state with isInternetAvailable set to false', () { test('creates state with isInternetAvailable set to false', () {
final state = InternetConnectionState( final state = InternetConnectionState(
isInternetAvailable: false, isInternetAvailable: false,
); );
expect(state.isInternetAvailable, false); expect(state.isInternetAvailable, false);
}); });
test('creates state with isInternetAvailable set to true', () { test('creates state with isInternetAvailable set to true', () {
final state = InternetConnectionState( final state = InternetConnectionState(
isInternetAvailable: true, isInternetAvailable: true,
); );
expect(state.isInternetAvailable, true); expect(state.isInternetAvailable, true);
}); });
test('can be compared', () { test('can be compared', () {
final state1 = InternetConnectionState( final state1 = InternetConnectionState(
isInternetAvailable: true, isInternetAvailable: true,
); );
final state2 = InternetConnectionState( final state2 = InternetConnectionState(
isInternetAvailable: true, isInternetAvailable: true,
); );
expect(state1 == state2, true); expect(state1 == state2, true);
}); });
test('different states are not equal', () { test('different states are not equal', () {
final state1 = InternetConnectionState( final state1 = InternetConnectionState(
isInternetAvailable: true, isInternetAvailable: true,
); );
final state2 = InternetConnectionState( final state2 = InternetConnectionState(
isInternetAvailable: false, isInternetAvailable: false,
); );
expect(state1 == state2, false); expect(state1 == state2, false);
}); });
}); });
} }

View File

@@ -1,47 +1,51 @@
import 'package:eatvio_app/core/prefs_keys.dart'; import 'package:eatvio_app/core/prefs_keys.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('PrefsKeys', () { group('PrefsKeys', () {
test('все значения enum определены', () { test('все значения enum определены', () {
expect(PrefsKeys.values.length, 4); expect(PrefsKeys.values.length, 4);
expect(PrefsKeys.values, contains(PrefsKeys.hasAnonymousTokenBeenSent)); expect(PrefsKeys.values, contains(PrefsKeys.hasAnonymousTokenBeenSent));
expect(PrefsKeys.values, contains(PrefsKeys.welcomeScreenWasShowed)); expect(PrefsKeys.values, contains(PrefsKeys.welcomeScreenWasShowed));
expect(PrefsKeys.values, contains(PrefsKeys.registrationDate)); expect(PrefsKeys.values, contains(PrefsKeys.registrationDate));
expect(PrefsKeys.values, contains(PrefsKeys.marketingBottomSheetHasBeenShown)); expect(PrefsKeys.values, contains(PrefsKeys.marketingBottomSheetHasBeenShown));
}); });
test('имена ключей корректны', () { test('имена ключей корректны', () {
expect(PrefsKeys.hasAnonymousTokenBeenSent.name, 'hasAnonymousTokenBeenSent'); expect(PrefsKeys.hasAnonymousTokenBeenSent.name, 'hasAnonymousTokenBeenSent');
expect(PrefsKeys.welcomeScreenWasShowed.name, 'welcomeScreenWasShowed'); expect(PrefsKeys.welcomeScreenWasShowed.name, 'welcomeScreenWasShowed');
expect(PrefsKeys.registrationDate.name, 'registrationDate'); expect(PrefsKeys.registrationDate.name, 'registrationDate');
expect(PrefsKeys.marketingBottomSheetHasBeenShown.name, 'marketingBottomSheetHasBeenShown'); expect(PrefsKeys.marketingBottomSheetHasBeenShown.name, 'marketingBottomSheetHasBeenShown');
}); });
}); });
} }

View File

@@ -1,44 +1,48 @@
import 'package:eatvio_app/core/routing/main_navigation_routes.dart'; import 'package:eatvio_app/core/routing/main_navigation_routes.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
void main() { void main() {
group('MainNavigationRoutes', () { group('MainNavigationRoutes', () {
test('createRoutes возвращает список маршрутов', () { test('createRoutes возвращает список маршрутов', () {
final routes = MainNavigationRoutes.createRoutes(); final routes = MainNavigationRoutes.createRoutes();
expect(routes, isNotEmpty); expect(routes, isNotEmpty);
expect(routes, isA<List<RouteBase>>()); expect(routes, isA<List<RouteBase>>());
}); });
test('createRoutes содержит ShellRoute', () { test('createRoutes содержит ShellRoute', () {
final routes = MainNavigationRoutes.createRoutes(); final routes = MainNavigationRoutes.createRoutes();
expect(routes.first, isA<ShellRoute>()); expect(routes.first, isA<ShellRoute>());
}); });
}); });
} }

View File

@@ -1,127 +1,131 @@
import 'package:eatvio_app/core/routing/route_constants.dart'; import 'package:eatvio_app/core/routing/route_constants.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('RouteConstants', () { group('RouteConstants', () {
test('has all auth routes defined', () { test('has all auth routes defined', () {
expect(RouteConstants.authScreen, '/auth-screen'); expect(RouteConstants.authScreen, '/auth-screen');
expect(RouteConstants.registrationScreen, 'registration-screen'); expect(RouteConstants.registrationScreen, 'registration-screen');
expect(RouteConstants.registrationScreenV2, 'registration-screen-v2'); expect(RouteConstants.registrationScreenV2, 'registration-screen-v2');
expect(RouteConstants.forgetPasswordScreen, 'forget-password-screen'); expect(RouteConstants.forgetPasswordScreen, 'forget-password-screen');
expect(RouteConstants.scanQRCodeScreen, 'scan-qr-code-screen'); expect(RouteConstants.scanQRCodeScreen, 'scan-qr-code-screen');
expect(RouteConstants.verifyScreen, '/verify-screen'); expect(RouteConstants.verifyScreen, '/verify-screen');
expect(RouteConstants.verifyEmailScreen, '/verify-email-screen'); expect(RouteConstants.verifyEmailScreen, '/verify-email-screen');
expect(RouteConstants.registerViaSocialScreen, '/register-via-social-screen'); expect(RouteConstants.registerViaSocialScreen, '/register-via-social-screen');
}); });
test('has all main navigation routes defined', () { test('has all main navigation routes defined', () {
expect(RouteConstants.myProfileScreen, '/my-profile-screen'); expect(RouteConstants.myProfileScreen, '/my-profile-screen');
expect(RouteConstants.feedScreen, '/feed-screen'); expect(RouteConstants.feedScreen, '/feed-screen');
expect(RouteConstants.diaryScreen, '/diary-screen'); expect(RouteConstants.diaryScreen, '/diary-screen');
expect(RouteConstants.consultationsScreen, '/consultations-screen'); expect(RouteConstants.consultationsScreen, '/consultations-screen');
expect(RouteConstants.chatSelectScreen, '/chat-select-screen'); expect(RouteConstants.chatSelectScreen, '/chat-select-screen');
expect(RouteConstants.notificationsScreen, '/notifications-screen'); expect(RouteConstants.notificationsScreen, '/notifications-screen');
expect(RouteConstants.menuScreen, '/menu-screen'); expect(RouteConstants.menuScreen, '/menu-screen');
}); });
test('has all content routes defined', () { test('has all content routes defined', () {
expect(RouteConstants.aboutPlanScreen, '/about-plan-screen'); expect(RouteConstants.aboutPlanScreen, '/about-plan-screen');
expect(RouteConstants.aboutRecipesScreen, '/about-recipes-screen'); expect(RouteConstants.aboutRecipesScreen, '/about-recipes-screen');
expect(RouteConstants.aboutDietScreen, '/about-diet-screen'); expect(RouteConstants.aboutDietScreen, '/about-diet-screen');
expect(RouteConstants.blogPostScreen, '/blog-post-screen'); expect(RouteConstants.blogPostScreen, '/blog-post-screen');
expect(RouteConstants.blogPostCreateScreen, '/blog-post-create-screen'); expect(RouteConstants.blogPostCreateScreen, '/blog-post-create-screen');
}); });
test('has all profile routes defined', () { test('has all profile routes defined', () {
expect(RouteConstants.profileScreen, '/profile-screen'); expect(RouteConstants.profileScreen, '/profile-screen');
expect(RouteConstants.subsScreen, '/subs-screen'); expect(RouteConstants.subsScreen, '/subs-screen');
}); });
test('has all settings routes defined', () { test('has all settings routes defined', () {
expect(RouteConstants.settingsScreen, '/settings-screen'); expect(RouteConstants.settingsScreen, '/settings-screen');
expect(RouteConstants.generalInfoScreen, 'general-info-screen'); expect(RouteConstants.generalInfoScreen, 'general-info-screen');
expect(RouteConstants.otherInfoScreen, 'other-info-screen'); expect(RouteConstants.otherInfoScreen, 'other-info-screen');
expect(RouteConstants.physicalActivityScreen, 'physical-activity-screen'); expect(RouteConstants.physicalActivityScreen, 'physical-activity-screen');
expect(RouteConstants.physicalFormScreen, 'physical-form-screen'); expect(RouteConstants.physicalFormScreen, 'physical-form-screen');
expect(RouteConstants.pressureScreen, 'pressure-screen'); expect(RouteConstants.pressureScreen, 'pressure-screen');
expect(RouteConstants.changePasswordScreen, 'change-password-screen'); expect(RouteConstants.changePasswordScreen, 'change-password-screen');
expect(RouteConstants.changeEmailScreen, 'change-email-screen'); expect(RouteConstants.changeEmailScreen, 'change-email-screen');
}); });
test('has all consultant routes defined', () { test('has all consultant routes defined', () {
expect(RouteConstants.becomeConsultantScreen, '/become-consultant-screen'); expect(RouteConstants.becomeConsultantScreen, '/become-consultant-screen');
expect(RouteConstants.stepperBecomeConsultantScreen, '/stepper-become-consultant-screen'); expect(RouteConstants.stepperBecomeConsultantScreen, '/stepper-become-consultant-screen');
expect(RouteConstants.consultantRatingScreen, '/consultant-rating-screen'); expect(RouteConstants.consultantRatingScreen, '/consultant-rating-screen');
}); });
test('has all other routes defined', () { test('has all other routes defined', () {
expect(RouteConstants.welcomeScreen, '/welcome-screen'); expect(RouteConstants.welcomeScreen, '/welcome-screen');
expect(RouteConstants.updateScreen, '/update-screen'); expect(RouteConstants.updateScreen, '/update-screen');
expect(RouteConstants.calendarScreen, '/calendar-screen'); expect(RouteConstants.calendarScreen, '/calendar-screen');
expect(RouteConstants.supportScreen, '/support-screen'); expect(RouteConstants.supportScreen, '/support-screen');
expect(RouteConstants.photoViewScreen, '/photo-view-screen'); expect(RouteConstants.photoViewScreen, '/photo-view-screen');
expect(RouteConstants.chatScreen, '/chat-screen'); expect(RouteConstants.chatScreen, '/chat-screen');
expect(RouteConstants.emptyChatScreen, '/empty-chat-screen'); expect(RouteConstants.emptyChatScreen, '/empty-chat-screen');
expect(RouteConstants.glossaryScreen, '/glossary-screen'); expect(RouteConstants.glossaryScreen, '/glossary-screen');
expect(RouteConstants.blockedUsersScreen, '/blocked-users-screen'); expect(RouteConstants.blockedUsersScreen, '/blocked-users-screen');
expect(RouteConstants.notificationsSettingsScreen, '/notifications-settings-screen'); expect(RouteConstants.notificationsSettingsScreen, '/notifications-settings-screen');
}); });
test('has all finance routes defined', () { test('has all finance routes defined', () {
expect(RouteConstants.userFinanceScreen, '/user-finance-screen'); expect(RouteConstants.userFinanceScreen, '/user-finance-screen');
expect(RouteConstants.cardSettingsScreen, '/card-settings-screen'); expect(RouteConstants.cardSettingsScreen, '/card-settings-screen');
expect(RouteConstants.orderInfoScreen, '/order-info-screen'); expect(RouteConstants.orderInfoScreen, '/order-info-screen');
expect(RouteConstants.paymentScreen, '/payment-screen'); expect(RouteConstants.paymentScreen, '/payment-screen');
}); });
test('has all content creation routes defined', () { test('has all content creation routes defined', () {
expect(RouteConstants.recipeCreateScreen, '/recipe-create-screen'); expect(RouteConstants.recipeCreateScreen, '/recipe-create-screen');
expect(RouteConstants.createDietScreen, '/create-diet-screen'); expect(RouteConstants.createDietScreen, '/create-diet-screen');
expect(RouteConstants.dietPreviewScreen, '/diet-preview-screen'); expect(RouteConstants.dietPreviewScreen, '/diet-preview-screen');
expect(RouteConstants.createPlanScreen, '/create-plan-screen'); expect(RouteConstants.createPlanScreen, '/create-plan-screen');
expect(RouteConstants.myDietsScreen, '/my-diets-screen'); expect(RouteConstants.myDietsScreen, '/my-diets-screen');
expect(RouteConstants.myPlansScreen, '/my-plans-screen'); expect(RouteConstants.myPlansScreen, '/my-plans-screen');
expect(RouteConstants.myRecipesScreen, '/my-recipes-screen'); expect(RouteConstants.myRecipesScreen, '/my-recipes-screen');
}); });
test('has all user details routes defined', () { test('has all user details routes defined', () {
expect(RouteConstants.userDetailsScreen, '/user-details-screen'); expect(RouteConstants.userDetailsScreen, '/user-details-screen');
expect(RouteConstants.userDiaryScreen, '/user-diary-screen'); expect(RouteConstants.userDiaryScreen, '/user-diary-screen');
}); });
test('has dev tools route defined', () { test('has dev tools route defined', () {
expect(RouteConstants.devToolsScreen, '/dev-tools-screen'); expect(RouteConstants.devToolsScreen, '/dev-tools-screen');
}); });
test('has all archive routes defined', () { test('has all archive routes defined', () {
expect(RouteConstants.consultationsArchiveScreen, '/consultations-archive-screen'); expect(RouteConstants.consultationsArchiveScreen, '/consultations-archive-screen');
expect(RouteConstants.consultantFinancesScreen, '/consultant-finances-screen'); expect(RouteConstants.consultantFinancesScreen, '/consultant-finances-screen');
expect(RouteConstants.userPurchasesScreen, '/user-purchases-screen'); expect(RouteConstants.userPurchasesScreen, '/user-purchases-screen');
}); });
}); });
} }

View File

@@ -1,51 +1,55 @@
import 'package:eatvio_app/core/routing/settings_routes.dart'; import 'package:eatvio_app/core/routing/settings_routes.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
void main() { void main() {
group('SettingsRoutes', () { group('SettingsRoutes', () {
test('createRoutes возвращает список маршрутов', () { test('createRoutes возвращает список маршрутов', () {
final routes = SettingsRoutes.createRoutes(); final routes = SettingsRoutes.createRoutes();
expect(routes, isNotEmpty); expect(routes, isNotEmpty);
expect(routes, isA<List<RouteBase>>()); expect(routes, isA<List<RouteBase>>());
}); });
test('createRoutes содержит маршрут settingsScreen', () { test('createRoutes содержит маршрут settingsScreen', () {
final routes = SettingsRoutes.createRoutes(); final routes = SettingsRoutes.createRoutes();
final settingsRoute = routes.first as GoRoute; final settingsRoute = routes.first as GoRoute;
expect(settingsRoute.path, '/settings-screen'); expect(settingsRoute.path, '/settings-screen');
}); });
test('createRoutes содержит вложенные маршруты', () { test('createRoutes содержит вложенные маршруты', () {
final routes = SettingsRoutes.createRoutes(); final routes = SettingsRoutes.createRoutes();
final settingsRoute = routes.first as GoRoute; final settingsRoute = routes.first as GoRoute;
expect(settingsRoute.routes, isNotEmpty); expect(settingsRoute.routes, isNotEmpty);
}); });
}); });
} }

View File

@@ -1,45 +1,49 @@
import 'package:eatvio_app/core/views/cubit/views_state.dart'; import 'package:eatvio_app/core/views/cubit/views_state.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ViewsCubitState', () { group('ViewsCubitState', () {
test('creates initial state', () { test('creates initial state', () {
final state = ViewsCubitState(); final state = ViewsCubitState();
expect(state, isA<ViewsCubitState>()); expect(state, isA<ViewsCubitState>());
}); });
test('can create multiple instances', () { test('can create multiple instances', () {
final state1 = ViewsCubitState(); final state1 = ViewsCubitState();
final state2 = ViewsCubitState(); final state2 = ViewsCubitState();
expect(state1, isA<ViewsCubitState>()); expect(state1, isA<ViewsCubitState>());
expect(state2, isA<ViewsCubitState>()); expect(state2, isA<ViewsCubitState>());
}); });
}); });
} }

View File

@@ -1,35 +1,31 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/add_item_button.dart'; import 'package:eatvio_app/core/widgets/add_item_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
void main() { void main() {
group('AddItemButton smoke', () { group('AddItemButton smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp.router( return MaterialApp.router(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
routerConfig: GoRouter( routerConfig: GoRouter(
routes: [ routes: [
GoRoute( GoRoute(
path: '/', path: '/',
builder: (context, state) => Scaffold(body: child), builder: (context, state) => Scaffold(body: child),
), ),
GoRoute( GoRoute(path: '/blog-post-create', name: 'blogPostCreateScreen', builder: (context, state) => const SizedBox.shrink()),
path: '/blog-post-create', ],
name: 'blogPostCreateScreen', ),
builder: (context, state) => const SizedBox.shrink(), );
), }
],
), testWidgets('renders add item button', (tester) async {
); await tester.pumpWidget(wrap(const AddItemButton()));
} await tester.pump();
testWidgets('renders add item button', (tester) async { expect(find.byType(AddItemButton), findsOneWidget);
await tester.pumpWidget(wrap(const AddItemButton())); });
await tester.pump(); });
}
expect(find.byType(AddItemButton), findsOneWidget);
});
});
}

View File

@@ -1,31 +1,31 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/animated_option_button.dart'; import 'package:eatvio_app/core/widgets/animated_option_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('AnimatedOptionButton smoke', () { group('AnimatedOptionButton smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders animated option button', (tester) async { testWidgets('renders animated option button', (tester) async {
await tester.pumpWidget(wrap(AnimatedOptionButton(text: 'Option 1', isSelected: false, onTap: () {}))); await tester.pumpWidget(wrap(AnimatedOptionButton(text: 'Option 1', isSelected: false, onTap: () {})));
await tester.pump(); await tester.pump();
expect(find.byType(AnimatedOptionButton), findsOneWidget); expect(find.byType(AnimatedOptionButton), findsOneWidget);
expect(find.text('Option 1'), findsOneWidget); expect(find.text('Option 1'), findsOneWidget);
}); });
testWidgets('renders animated option button as selected', (tester) async { testWidgets('renders animated option button as selected', (tester) async {
await tester.pumpWidget(wrap(AnimatedOptionButton(text: 'Option 2', isSelected: true, onTap: () {}))); await tester.pumpWidget(wrap(AnimatedOptionButton(text: 'Option 2', isSelected: true, onTap: () {})));
await tester.pump(); await tester.pump();
expect(find.byType(AnimatedOptionButton), findsOneWidget); expect(find.byType(AnimatedOptionButton), findsOneWidget);
expect(find.text('Option 2'), findsOneWidget); expect(find.text('Option 2'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,70 +1,74 @@
import 'package:eatvio_app/core/widgets/base_button.dart'; import 'package:eatvio_app/core/widgets/base_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('BaseButton', () { group('BaseButton', () {
testWidgets('renders as SizedBox.shrink', (tester) async { testWidgets('renders as SizedBox.shrink', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
body: BaseButton( body: BaseButton(
text: 'Test Button', text: 'Test Button',
onPressed: () {}, onPressed: () {},
), ),
), ),
), ),
); );
expect(find.byType(BaseButton), findsOneWidget); expect(find.byType(BaseButton), findsOneWidget);
expect(find.byType(SizedBox), findsWidgets); expect(find.byType(SizedBox), findsWidgets);
}); });
testWidgets('accepts all parameters', (tester) async { testWidgets('accepts all parameters', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
body: BaseButton( body: BaseButton(
text: 'Test Button', text: 'Test Button',
onPressed: () {}, onPressed: () {},
buttonStyle: const ButtonStyle(), buttonStyle: const ButtonStyle(),
buttonTextStyle: const TextStyle(), buttonTextStyle: const TextStyle(),
isDisabled: false, isDisabled: false,
height: 50.0, height: 50.0,
width: 100.0, width: 100.0,
margin: const EdgeInsets.all(10), margin: const EdgeInsets.all(10),
alignment: Alignment.center, alignment: Alignment.center,
), ),
), ),
), ),
); );
expect(find.byType(BaseButton), findsOneWidget); expect(find.byType(BaseButton), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,152 +1,156 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/bottom_sheet_with_blur.dart'; import 'package:eatvio_app/core/widgets/bottom_sheet_with_blur.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('showBottomSheetWithBlur', () { group('showBottomSheetWithBlur', () {
testWidgets('shows bottom sheet with blur', (tester) async { testWidgets('shows bottom sheet with blur', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Builder( home: Builder(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
body: ElevatedButton( body: ElevatedButton(
onPressed: () { onPressed: () {
showBottomSheetWithBlur( showBottomSheetWithBlur(
context: context, context: context,
child: const Text('Test Content'), child: const Text('Test Content'),
); );
}, },
child: const Text('Show Bottom Sheet'), child: const Text('Show Bottom Sheet'),
), ),
); );
}, },
), ),
), ),
); );
await tester.tap(find.text('Show Bottom Sheet')); await tester.tap(find.text('Show Bottom Sheet'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Test Content'), findsOneWidget); expect(find.text('Test Content'), findsOneWidget);
}); });
testWidgets('shows bottom sheet without blur when hasBlur is false', (tester) async { testWidgets('shows bottom sheet without blur when hasBlur is false', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Builder( home: Builder(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
body: ElevatedButton( body: ElevatedButton(
onPressed: () { onPressed: () {
showBottomSheetWithBlur( showBottomSheetWithBlur(
context: context, context: context,
child: const Text('Test Content'), child: const Text('Test Content'),
hasBlur: false, hasBlur: false,
); );
}, },
child: const Text('Show Bottom Sheet'), child: const Text('Show Bottom Sheet'),
), ),
); );
}, },
), ),
), ),
); );
await tester.tap(find.text('Show Bottom Sheet')); await tester.tap(find.text('Show Bottom Sheet'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Test Content'), findsOneWidget); expect(find.text('Test Content'), findsOneWidget);
}); });
testWidgets('accepts custom height', (tester) async { testWidgets('accepts custom height', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Builder( home: Builder(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
body: ElevatedButton( body: ElevatedButton(
onPressed: () { onPressed: () {
showBottomSheetWithBlur( showBottomSheetWithBlur(
context: context, context: context,
child: const Text('Test Content'), child: const Text('Test Content'),
height: 300.0, height: 300.0,
); );
}, },
child: const Text('Show Bottom Sheet'), child: const Text('Show Bottom Sheet'),
), ),
); );
}, },
), ),
), ),
); );
await tester.tap(find.text('Show Bottom Sheet')); await tester.tap(find.text('Show Bottom Sheet'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Test Content'), findsOneWidget); expect(find.text('Test Content'), findsOneWidget);
}); });
testWidgets('can be dismissed', (tester) async { testWidgets('can be dismissed', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Builder( home: Builder(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
body: ElevatedButton( body: ElevatedButton(
onPressed: () { onPressed: () {
showBottomSheetWithBlur( showBottomSheetWithBlur(
context: context, context: context,
child: const Text('Test Content'), child: const Text('Test Content'),
); );
}, },
child: const Text('Show Bottom Sheet'), child: const Text('Show Bottom Sheet'),
), ),
); );
}, },
), ),
), ),
); );
await tester.tap(find.text('Show Bottom Sheet')); await tester.tap(find.text('Show Bottom Sheet'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Test Content'), findsOneWidget); expect(find.text('Test Content'), findsOneWidget);
await tester.tapAt(const Offset(0, 0)); await tester.tapAt(const Offset(0, 0));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Test Content'), findsNothing); expect(find.text('Test Content'), findsNothing);
}); });
}); });
} }

View File

@@ -1,31 +1,31 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/cpfc_container.dart'; import 'package:eatvio_app/core/widgets/cpfc_container.dart';
import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('CpfcContainer smoke', () { group('CpfcContainer smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: const [Locale('ru')], supportedLocales: const [Locale('ru')],
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders cpfc container', (tester) async { testWidgets('renders cpfc container', (tester) async {
await tester.pumpWidget(wrap(const CpfcContainer(calories: 2000.0, proteins: 150.0, fats: 80.0, carbohydrates: 250.0))); await tester.pumpWidget(wrap(const CpfcContainer(calories: 2000.0, proteins: 150.0, fats: 80.0, carbohydrates: 250.0)));
await tester.pump(); await tester.pump();
expect(find.byType(CpfcContainer), findsOneWidget); expect(find.byType(CpfcContainer), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,37 +1,160 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/custom_search_bar.dart'; import 'package:eatvio_app/core/widgets/custom_search_bar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('CustomSearchBar smoke', () { group('CustomSearchBar smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders custom search bar', (tester) async { testWidgets('renders custom search bar', (tester) async {
final controller = TextEditingController(); final controller = TextEditingController();
await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {}))); await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {})));
await tester.pump(); await tester.pump();
expect(find.byType(CustomSearchBar), findsOneWidget); expect(find.byType(CustomSearchBar), findsOneWidget);
expect(find.byType(TextFormField), findsOneWidget); expect(find.byType(TextFormField), findsOneWidget);
}); });
testWidgets('renders custom search bar with icon', (tester) async { testWidgets('renders custom search bar with icon', (tester) async {
final controller = TextEditingController(); final controller = TextEditingController();
await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {}, enableIcon: true))); await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {}, enableIcon: true)));
await tester.pump(); await tester.pump();
expect(find.byIcon(Icons.search), findsOneWidget); expect(find.byIcon(Icons.search), findsOneWidget);
}); });
testWidgets('renders custom search bar without icon', (tester) async { testWidgets('renders custom search bar without icon', (tester) async {
final controller = TextEditingController(); final controller = TextEditingController();
await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {}, enableIcon: false))); await tester.pumpWidget(wrap(CustomSearchBar(searchController: controller, onChanged: (_) {}, enableIcon: false)));
await tester.pump(); await tester.pump();
expect(find.byIcon(Icons.search), findsNothing); expect(find.byIcon(Icons.search), findsNothing);
}); });
});
} testWidgets('calls onChanged when text is entered', (tester) async {
final controller = TextEditingController();
String? changedValue;
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(
body: CustomSearchBar(
searchController: controller,
onChanged: (value) {
changedValue = value;
},
),
),
),
);
await tester.enterText(find.byType(TextFormField), 'test');
await tester.pump();
expect(changedValue, 'test');
});
testWidgets('displays hint text', (tester) async {
final controller = TextEditingController();
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(
body: CustomSearchBar(
searchController: controller,
onChanged: (value) {},
),
),
),
);
expect(find.text('Поиск'), findsOneWidget);
});
testWidgets('accepts custom width', (tester) async {
final controller = TextEditingController();
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(
body: CustomSearchBar(
searchController: controller,
onChanged: (value) {},
width: 200.0,
),
),
),
);
expect(find.byType(CustomSearchBar), findsOneWidget);
});
testWidgets('accepts custom backgroundColor', (tester) async {
final controller = TextEditingController();
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(
body: CustomSearchBar(
searchController: controller,
onChanged: (value) {},
backgroundColor: Colors.red,
),
),
),
);
expect(find.byType(CustomSearchBar), findsOneWidget);
});
testWidgets('accepts custom borderRadius', (tester) async {
final controller = TextEditingController();
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(
body: CustomSearchBar(
searchController: controller,
onChanged: (value) {},
borderRadius: 20.0,
),
),
),
);
expect(find.byType(CustomSearchBar), findsOneWidget);
});
});
}

View File

@@ -1,44 +1,44 @@
import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart'; import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/item_widget.dart'; import 'package:eatvio_app/core/widgets/item_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ItemWidget smoke', () { group('ItemWidget smoke', () {
setUpAll(() async { setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost'); dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
}); });
setUp(() async { setUp(() async {
await sl.reset(); await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost')); sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
}); });
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders item widget', (tester) async { testWidgets('renders item widget', (tester) async {
await tester.pumpWidget(wrap(const ItemWidget(text: 'Test Item'))); await tester.pumpWidget(wrap(const ItemWidget(text: 'Test Item')));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(ItemWidget), findsOneWidget); expect(find.byType(ItemWidget), findsOneWidget);
expect(find.text('Test Item'), findsOneWidget); expect(find.text('Test Item'), findsOneWidget);
}); });
testWidgets('renders item widget reversed', (tester) async { testWidgets('renders item widget reversed', (tester) async {
await tester.pumpWidget(wrap(const ItemWidget(text: 'Test Item', reversed: true))); await tester.pumpWidget(wrap(const ItemWidget(text: 'Test Item', reversed: true)));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(ItemWidget), findsOneWidget); expect(find.byType(ItemWidget), findsOneWidget);
expect(find.text('Test Item'), findsOneWidget); expect(find.text('Test Item'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,22 +1,22 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/core/widgets/loader.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('Loader smoke', () { group('Loader smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders loader', (tester) async { testWidgets('renders loader', (tester) async {
await tester.pumpWidget(wrap(const Loader())); await tester.pumpWidget(wrap(const Loader()));
await tester.pump(); await tester.pump();
expect(find.byType(Loader), findsOneWidget); expect(find.byType(Loader), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,37 +1,37 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/main_background_bouble.dart'; import 'package:eatvio_app/core/widgets/main_background_bouble.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('MainBackgroundBouble smoke', () { group('MainBackgroundBouble smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders main background bouble', (tester) async { testWidgets('renders main background bouble', (tester) async {
await tester.pumpWidget(wrap(const MainBackgroundBouble(child: Text('Test')))); await tester.pumpWidget(wrap(const MainBackgroundBouble(child: Text('Test'))));
await tester.pump(); await tester.pump();
expect(find.byType(MainBackgroundBouble), findsOneWidget); expect(find.byType(MainBackgroundBouble), findsOneWidget);
expect(find.text('Test'), findsOneWidget); expect(find.text('Test'), findsOneWidget);
}); });
testWidgets('renders main background bouble with error', (tester) async { testWidgets('renders main background bouble with error', (tester) async {
await tester.pumpWidget(wrap(const MainBackgroundBouble(hasError: true, child: Text('Test')))); await tester.pumpWidget(wrap(const MainBackgroundBouble(hasError: true, child: Text('Test'))));
await tester.pump(); await tester.pump();
expect(find.byType(MainBackgroundBouble), findsOneWidget); expect(find.byType(MainBackgroundBouble), findsOneWidget);
}); });
testWidgets('renders main background bouble with shadow', (tester) async { testWidgets('renders main background bouble with shadow', (tester) async {
await tester.pumpWidget(wrap(const MainBackgroundBouble(enableShadow: true, child: Text('Test')))); await tester.pumpWidget(wrap(const MainBackgroundBouble(enableShadow: true, child: Text('Test'))));
await tester.pump(); await tester.pump();
expect(find.byType(MainBackgroundBouble), findsOneWidget); expect(find.byType(MainBackgroundBouble), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,93 +1,97 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/marketing_bottom_sheet.dart'; import 'package:eatvio_app/core/widgets/marketing_bottom_sheet.dart';
import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('MarketingBottomSheet', () { group('MarketingBottomSheet', () {
Widget createTestWidget(Widget child) { Widget createTestWidget(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.delegate.supportedLocales,
home: Scaffold( home: Scaffold(
body: child, body: child,
), ),
); );
} }
testWidgets('displays marketing bottom sheet', (tester) async { testWidgets('displays marketing bottom sheet', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
createTestWidget( createTestWidget(
const MarketingBottomSheet(), const MarketingBottomSheet(),
), ),
); );
expect(find.byType(MarketingBottomSheet), findsOneWidget); expect(find.byType(MarketingBottomSheet), findsOneWidget);
}); });
testWidgets('shows marketing bottom sheet via function', (tester) async { testWidgets('shows marketing bottom sheet via function', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.delegate.supportedLocales,
home: Builder( home: Builder(
builder: (context) { builder: (context) {
return Scaffold( return Scaffold(
body: ElevatedButton( body: ElevatedButton(
onPressed: () { onPressed: () {
showMarketingBottomSheet(context); showMarketingBottomSheet(context);
}, },
child: const Text('Show'), child: const Text('Show'),
), ),
); );
}, },
), ),
), ),
); );
await tester.tap(find.text('Show')); await tester.tap(find.text('Show'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(MarketingBottomSheet), findsOneWidget); expect(find.byType(MarketingBottomSheet), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,82 +1,86 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/core/widgets/option_widget.dart'; import 'package:eatvio_app/core/widgets/option_widget.dart';
import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart'; import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart';
import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('OptionWidget', () { group('OptionWidget', () {
Widget createTestWidget(Widget child) { Widget createTestWidget(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.delegate.supportedLocales,
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('returns SizedBox.shrink when option is null', (tester) async { testWidgets('returns SizedBox.shrink when option is null', (tester) async {
await tester.pumpWidget(createTestWidget(const OptionWidget(option: null, duration: 7))); await tester.pumpWidget(createTestWidget(const OptionWidget(option: null, duration: 7)));
expect(find.byType(OptionWidget), findsOneWidget); expect(find.byType(OptionWidget), findsOneWidget);
expect(find.byType(SizedBox), findsWidgets); expect(find.byType(SizedBox), findsWidgets);
}); });
testWidgets('displays option widget with option', (tester) async { testWidgets('displays option widget with option', (tester) async {
const option = PacketOptions(items: ['Item 1', 'Item 2'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false); const option = PacketOptions(items: ['Item 1', 'Item 2'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false);
await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7))); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7)));
expect(find.byType(OptionWidget), findsOneWidget); expect(find.byType(OptionWidget), findsOneWidget);
expect(find.text('Short'), findsOneWidget); expect(find.text('Short'), findsOneWidget);
expect(find.text('Description'), findsOneWidget); expect(find.text('Description'), findsOneWidget);
}); });
testWidgets('displays option widget with personal diet', (tester) async { testWidgets('displays option widget with personal diet', (tester) async {
const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: true); const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: true);
await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7))); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7)));
expect(find.byType(OptionWidget), findsOneWidget); expect(find.byType(OptionWidget), findsOneWidget);
}); });
testWidgets('hides duration when disableDuration is true', (tester) async { testWidgets('hides duration when disableDuration is true', (tester) async {
const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false); const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false);
await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7, disableDuration: true))); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7, disableDuration: true)));
expect(find.byType(OptionWidget), findsOneWidget); expect(find.byType(OptionWidget), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,23 +1,23 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart'; import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ValidationErrorWidget smoke', () { group('ValidationErrorWidget smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders validation error widget', (tester) async { testWidgets('renders validation error widget', (tester) async {
await tester.pumpWidget(wrap(const ValidationErrorWidget(error: 'Test error'))); await tester.pumpWidget(wrap(const ValidationErrorWidget(error: 'Test error')));
await tester.pump(); await tester.pump();
expect(find.byType(ValidationErrorWidget), findsOneWidget); expect(find.byType(ValidationErrorWidget), findsOneWidget);
expect(find.text('Test error'), findsOneWidget); expect(find.text('Test error'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,97 +1,101 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/chosen_diet_widget.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/chosen_diet_widget.dart';
import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ChosenDietWidgetContent', () { group('ChosenDietWidgetContent', () {
Widget createTestWidget(Widget child) { Widget createTestWidget(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
localizationsDelegates: const [ localizationsDelegates: const [
S.delegate, S.delegate,
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.delegate.supportedLocales,
home: Scaffold( home: Scaffold(
body: child, body: child,
), ),
); );
} }
testWidgets('displays chosen diet widget content', (tester) async { testWidgets('displays chosen diet widget content', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
createTestWidget( createTestWidget(
const ChosenDietWidgetContent( const ChosenDietWidgetContent(
currentDietDay: 5, currentDietDay: 5,
dietName: 'Test Diet', dietName: 'Test Diet',
dietDuration: 14, dietDuration: 14,
dietId: 1, dietId: 1,
), ),
), ),
); );
expect(find.byType(ChosenDietWidgetContent), findsOneWidget); expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
expect(find.text('Test Diet'), findsOneWidget); expect(find.text('Test Diet'), findsOneWidget);
}); });
testWidgets('displays current day and duration', (tester) async { testWidgets('displays current day and duration', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
createTestWidget( createTestWidget(
const ChosenDietWidgetContent( const ChosenDietWidgetContent(
currentDietDay: 7, currentDietDay: 7,
dietName: 'Test Diet', dietName: 'Test Diet',
dietDuration: 21, dietDuration: 21,
dietId: 1, dietId: 1,
), ),
), ),
); );
expect(find.byType(ChosenDietWidgetContent), findsOneWidget); expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
}); });
testWidgets('displays diet name with underline', (tester) async { testWidgets('displays diet name with underline', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
createTestWidget( createTestWidget(
const ChosenDietWidgetContent( const ChosenDietWidgetContent(
currentDietDay: 1, currentDietDay: 1,
dietName: 'My Diet', dietName: 'My Diet',
dietDuration: 7, dietDuration: 7,
dietId: 1, dietId: 1,
), ),
), ),
); );
expect(find.text('My Diet'), findsOneWidget); expect(find.text('My Diet'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,75 +1,79 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/comment_container.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/comment_container.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('CommentContainer', () { group('CommentContainer', () {
testWidgets('displays comment text', (tester) async { testWidgets('displays comment text', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: CommentContainer(comment: 'Test comment'), body: CommentContainer(comment: 'Test comment'),
), ),
), ),
); );
expect(find.byType(CommentContainer), findsOneWidget); expect(find.byType(CommentContainer), findsOneWidget);
expect(find.text('Test comment'), findsOneWidget); expect(find.text('Test comment'), findsOneWidget);
}); });
testWidgets('displays empty comment', (tester) async { testWidgets('displays empty comment', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: CommentContainer(comment: ''), body: CommentContainer(comment: ''),
), ),
), ),
); );
expect(find.byType(CommentContainer), findsOneWidget); expect(find.byType(CommentContainer), findsOneWidget);
}); });
testWidgets('displays long comment', (tester) async { testWidgets('displays long comment', (tester) async {
const longComment = 'This is a very long comment that should be displayed properly in the container'; const longComment = 'This is a very long comment that should be displayed properly in the container';
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: CommentContainer(comment: longComment), body: CommentContainer(comment: longComment),
), ),
), ),
); );
expect(find.byType(CommentContainer), findsOneWidget); expect(find.byType(CommentContainer), findsOneWidget);
expect(find.text(longComment), findsOneWidget); expect(find.text(longComment), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,23 +1,23 @@
import 'package:eatvio_app/features/diary/presentation/widgets/finish_day_button_widget.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/finish_day_button_widget.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('FinishDayButtonWidget smoke', () { group('FinishDayButtonWidget smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders finish day button widget', (tester) async { testWidgets('renders finish day button widget', (tester) async {
await tester.pumpWidget(wrap(FinishDayButtonWidget(onPressed: () async {}))); await tester.pumpWidget(wrap(FinishDayButtonWidget(onPressed: () async {})));
await tester.pump(); await tester.pump();
expect(find.byType(FinishDayButtonWidget), findsOneWidget); expect(find.byType(FinishDayButtonWidget), findsOneWidget);
expect(find.text('Закончить день'), findsOneWidget); expect(find.text('Закончить день'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,107 +1,111 @@
import 'package:eatvio_app/features/diary/models/diary_day_model.dart'; import 'package:eatvio_app/features/diary/models/diary_day_model.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/meal_summary_widget.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/meal_summary_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('MealSummaryWidget', () { group('MealSummaryWidget', () {
testWidgets('displays meal summary with totals', (tester) async { testWidgets('displays meal summary with totals', (tester) async {
final portions = <PortionModel>[]; final portions = <PortionModel>[];
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
body: MealSummaryWidget( body: MealSummaryWidget(
portions: portions, portions: portions,
mealNumber: 1, mealNumber: 1,
), ),
), ),
), ),
); );
expect(find.byType(MealSummaryWidget), findsOneWidget); expect(find.byType(MealSummaryWidget), findsOneWidget);
}); });
testWidgets('hides when all totals are zero', (tester) async { testWidgets('hides when all totals are zero', (tester) async {
final portions = <PortionModel>[]; final portions = <PortionModel>[];
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
body: MealSummaryWidget( body: MealSummaryWidget(
portions: portions, portions: portions,
mealNumber: 1, mealNumber: 1,
), ),
), ),
), ),
); );
await tester.pumpAndSettle(); await tester.pumpAndSettle();
// Widget should be hidden (SizedBox.shrink) when totals are zero // Widget should be hidden (SizedBox.shrink) when totals are zero
expect(find.byType(MealSummaryWidget), findsOneWidget); expect(find.byType(MealSummaryWidget), findsOneWidget);
}); });
testWidgets('displays meal number', (tester) async { testWidgets('displays meal number', (tester) async {
final portions = <PortionModel>[]; final portions = <PortionModel>[];
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
body: MealSummaryWidget( body: MealSummaryWidget(
portions: portions, portions: portions,
mealNumber: 3, mealNumber: 3,
), ),
), ),
), ),
); );
expect(find.byType(MealSummaryWidget), findsOneWidget); expect(find.byType(MealSummaryWidget), findsOneWidget);
}); });
}); });
group('MealSummaryWidget.calculateMealTotals', () { group('MealSummaryWidget.calculateMealTotals', () {
test('returns zero totals for empty portions list', () { test('returns zero totals for empty portions list', () {
final result = MealSummaryWidget.calculateMealTotals([]); final result = MealSummaryWidget.calculateMealTotals([]);
expect(result['calories'], 0.0); expect(result['calories'], 0.0);
expect(result['proteins'], 0.0); expect(result['proteins'], 0.0);
expect(result['fats'], 0.0); expect(result['fats'], 0.0);
expect(result['carbohydrates'], 0.0); expect(result['carbohydrates'], 0.0);
}); });
test('returns correct map structure', () { test('returns correct map structure', () {
final result = MealSummaryWidget.calculateMealTotals([]); final result = MealSummaryWidget.calculateMealTotals([]);
expect(result.containsKey('calories'), isTrue); expect(result.containsKey('calories'), isTrue);
expect(result.containsKey('proteins'), isTrue); expect(result.containsKey('proteins'), isTrue);
expect(result.containsKey('fats'), isTrue); expect(result.containsKey('fats'), isTrue);
expect(result.containsKey('carbohydrates'), isTrue); expect(result.containsKey('carbohydrates'), isTrue);
}); });
}); });
} }

View File

@@ -1,59 +1,63 @@
import 'package:eatvio_app/features/diary/presentation/widgets/product_loader_widget.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/product_loader_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ProductLoaderWidget', () { group('ProductLoaderWidget', () {
testWidgets('displays product loader widget', (tester) async { testWidgets('displays product loader widget', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const MaterialApp( const MaterialApp(
home: Scaffold( home: Scaffold(
body: ProductLoaderWidget(), body: ProductLoaderWidget(),
), ),
), ),
); );
expect(find.byType(ProductLoaderWidget), findsOneWidget); expect(find.byType(ProductLoaderWidget), findsOneWidget);
expect(find.byType(CupertinoActivityIndicator), findsOneWidget); expect(find.byType(CupertinoActivityIndicator), findsOneWidget);
}); });
testWidgets('displays ListTile with activity indicator', (tester) async { testWidgets('displays ListTile with activity indicator', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const MaterialApp( const MaterialApp(
home: Scaffold( home: Scaffold(
body: ProductLoaderWidget(), body: ProductLoaderWidget(),
), ),
), ),
); );
expect(find.byType(ListTile), findsOneWidget); expect(find.byType(ListTile), findsOneWidget);
expect(find.byType(CupertinoActivityIndicator), findsOneWidget); expect(find.byType(CupertinoActivityIndicator), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,39 +1,39 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('InfoBouble smoke', () { group('InfoBouble smoke', () {
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders info bouble', (tester) async { testWidgets('renders info bouble', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Text('Test')]))); await tester.pumpWidget(wrap(const InfoBouble(children: [Text('Test')])));
await tester.pump(); await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget); expect(find.byType(InfoBouble), findsOneWidget);
expect(find.text('Test'), findsOneWidget); expect(find.text('Test'), findsOneWidget);
}); });
testWidgets('renders info bouble with multiple children', (tester) async { testWidgets('renders info bouble with multiple children', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Icon(Icons.star), Text('Test')]))); await tester.pumpWidget(wrap(const InfoBouble(children: [Icon(Icons.star), Text('Test')])));
await tester.pump(); await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget); expect(find.byType(InfoBouble), findsOneWidget);
expect(find.byIcon(Icons.star), findsOneWidget); expect(find.byIcon(Icons.star), findsOneWidget);
expect(find.text('Test'), findsOneWidget); expect(find.text('Test'), findsOneWidget);
}); });
testWidgets('renders info bouble with custom background color', (tester) async { testWidgets('renders info bouble with custom background color', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(backgroundColor: Colors.blue, children: [Text('Test')]))); await tester.pumpWidget(wrap(const InfoBouble(backgroundColor: Colors.blue, children: [Text('Test')])));
await tester.pump(); await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget); expect(find.byType(InfoBouble), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,59 +1,59 @@
import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart'; import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/choice_chip_widget.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/choice_chip_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('ChoiceChipWidget smoke', () { group('ChoiceChipWidget smoke', () {
setUpAll(() async { setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost'); dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
}); });
setUp(() async { setUp(() async {
await sl.reset(); await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost')); sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
}); });
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders choice chip widget', (tester) async { testWidgets('renders choice chip widget', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты']; final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget( await tester.pumpWidget(
wrap( wrap(
ChoiceChipWidget( ChoiceChipWidget(
index: 0, index: 0,
selectedChipIndex: 0, selectedChipIndex: 0,
chipsLabelList: chipsList, chipsLabelList: chipsList,
onSelected: (value) { onSelected: (value) {
}, },
), ),
), ),
); );
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), findsOneWidget); expect(find.byType(ChoiceChipWidget), findsOneWidget);
expect(find.text('Все'), findsOneWidget); expect(find.text('Все'), findsOneWidget);
}); });
testWidgets('renders choice chip widget not selected', (tester) async { testWidgets('renders choice chip widget not selected', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты']; final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget(wrap(ChoiceChipWidget(index: 1, selectedChipIndex: 0, chipsLabelList: chipsList, onSelected: (value) {}))); await tester.pumpWidget(wrap(ChoiceChipWidget(index: 1, selectedChipIndex: 0, chipsLabelList: chipsList, onSelected: (value) {})));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), findsOneWidget); expect(find.byType(ChoiceChipWidget), findsOneWidget);
expect(find.text('Рецепты'), findsOneWidget); expect(find.text('Рецепты'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,35 +1,35 @@
import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart'; import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/filter_badge.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/filter_badge.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('FilterBadge smoke', () { group('FilterBadge smoke', () {
setUpAll(() async { setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost'); dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
}); });
setUp(() async { setUp(() async {
await sl.reset(); await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost')); sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
}); });
Widget wrap(Widget child) { Widget wrap(Widget child) {
return MaterialApp( return MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: Scaffold(body: child), home: Scaffold(body: child),
); );
} }
testWidgets('renders filter badge', (tester) async { testWidgets('renders filter badge', (tester) async {
await tester.pumpWidget(wrap(const FilterBadge(filterBottomSheet: Scaffold(body: Text('Filter Bottom Sheet'))))); await tester.pumpWidget(wrap(const FilterBadge(filterBottomSheet: Scaffold(body: Text('Filter Bottom Sheet')))));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byType(FilterBadge), findsOneWidget); expect(find.byType(FilterBadge), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,75 +1,79 @@
import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/widgets/status_widget.dart'; import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/widgets/status_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
group('StatusWidget', () { group('StatusWidget', () {
testWidgets('displays canceled status', (tester) async { testWidgets('displays canceled status', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: StatusWidget(status: Status.canceled), body: StatusWidget(status: Status.canceled),
), ),
), ),
); );
expect(find.byType(StatusWidget), findsOneWidget); expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Отменён'), findsOneWidget); expect(find.text('Отменён'), findsOneWidget);
}); });
testWidgets('displays success status', (tester) async { testWidgets('displays success status', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: StatusWidget(status: Status.success), body: StatusWidget(status: Status.success),
), ),
), ),
); );
expect(find.byType(StatusWidget), findsOneWidget); expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Успешно'), findsOneWidget); expect(find.text('Успешно'), findsOneWidget);
}); });
testWidgets('displays inProgress status', (tester) async { testWidgets('displays inProgress status', (tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
theme: ThemeHelper().themeData(), theme: ThemeHelper().themeData(),
home: const Scaffold( home: const Scaffold(
body: StatusWidget(status: Status.inProgress), body: StatusWidget(status: Status.inProgress),
), ),
), ),
); );
expect(find.byType(StatusWidget), findsOneWidget); expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('В процессе'), findsOneWidget); expect(find.text('В процессе'), findsOneWidget);
}); });
}); });
} }

View File

@@ -1,68 +1,72 @@
import 'package:eatvio_app/features/glossary/models/glossary_model.dart'; import 'package:eatvio_app/features/glossary/models/glossary_model.dart';
import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart'; import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart';
import 'package:eatvio_app/features/glossary/services/glossary_service.dart'; import 'package:eatvio_app/features/glossary/services/glossary_service.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
class MockGlossaryService extends Mock implements GlossaryService {} class MockGlossaryService extends Mock implements GlossaryService {}
void main() { void main() {
group('GlossaryRepository', () { group('GlossaryRepository', () {
late GlossaryRepository repository; late GlossaryRepository repository;
late MockGlossaryService mockService; late MockGlossaryService mockService;
setUp(() { setUp(() {
mockService = MockGlossaryService(); mockService = MockGlossaryService();
repository = GlossaryRepository(glossaryService: mockService); repository = GlossaryRepository(glossaryService: mockService);
}); });
test('getGlossaryListByQuery - успешный запрос', () async { test('getGlossaryListByQuery - успешный запрос', () async {
const query = 'test'; const query = 'test';
final mockGlossaries = <GlossaryModel>[]; final mockGlossaries = <GlossaryModel>[];
final mockPagination = GlossaryPaginationModel(glossariesList: mockGlossaries); final mockPagination = GlossaryPaginationModel(glossariesList: mockGlossaries);
when(() => mockService.getGlossaryByQuery(query: query)) when(() => mockService.getGlossaryByQuery(query: query))
.thenAnswer((_) async => mockPagination); .thenAnswer((_) async => mockPagination);
final result = await repository.getGlossaryListByQuery(query); final result = await repository.getGlossaryListByQuery(query);
expect(result, mockGlossaries); expect(result, mockGlossaries);
verify(() => mockService.getGlossaryByQuery(query: query)).called(1); verify(() => mockService.getGlossaryByQuery(query: query)).called(1);
}); });
test('getGlossaryListByQuery - пробрасывает ошибку', () async { test('getGlossaryListByQuery - пробрасывает ошибку', () async {
const query = 'test'; const query = 'test';
when(() => mockService.getGlossaryByQuery(query: query)) when(() => mockService.getGlossaryByQuery(query: query))
.thenThrow(Exception('Error')); .thenThrow(Exception('Error'));
expect(() => repository.getGlossaryListByQuery(query), throwsException); expect(() => repository.getGlossaryListByQuery(query), throwsException);
}); });
}); });
} }

View File

@@ -1,77 +1,81 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:eatvio_app/features/notifications/service/notifications_service.dart'; import 'package:eatvio_app/features/notifications/service/notifications_service.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import '../../../fixtures/fixture_reader.dart'; import '../../../fixtures/fixture_reader.dart';
import 'notifications_service_test.mocks.dart'; import 'notifications_service_test.mocks.dart';
@GenerateNiceMocks([MockSpec<Dio>()]) @GenerateNiceMocks([MockSpec<Dio>()])
void main() { void main() {
group('NotificationsService', () { group('NotificationsService', () {
late NotificationsService notificationsService; late NotificationsService notificationsService;
late MockDio mockDio; late MockDio mockDio;
setUp(() { setUp(() {
mockDio = MockDio(); mockDio = MockDio();
notificationsService = NotificationsService(mockDio); notificationsService = NotificationsService(mockDio);
}); });
test('getNotifications - возвращает уведомления', () async { test('getNotifications - возвращает уведомления', () async {
const page = 1; const page = 1;
final json = FixtureReader.readAsMap('notifications/notifications_response.json'); final json = FixtureReader.readAsMap('notifications/notifications_response.json');
final response = Response( final response = Response(
data: { data: {
'data': json['notifications'], 'data': json['notifications'],
'current_page': json['pagination']['current_page'], 'current_page': json['pagination']['current_page'],
'last_page': json['pagination']['last_page'], 'last_page': json['pagination']['last_page'],
'per_page': 10, 'per_page': 10,
'total': 1, 'total': 1,
}, },
statusCode: 200, statusCode: 200,
requestOptions: RequestOptions(path: '/api/profile/notifications'), requestOptions: RequestOptions(path: '/api/profile/notifications'),
); );
when(mockDio.get(any)) when(mockDio.get(any))
.thenAnswer((_) async => response); .thenAnswer((_) async => response);
final result = await notificationsService.getNotifications(page: page); final result = await notificationsService.getNotifications(page: page);
expect(result, isA<Map<String, dynamic>?>()); expect(result, isA<Map<String, dynamic>?>());
expect(result, isNotNull); expect(result, isNotNull);
expect(result!['notifications'], isA<List>()); expect(result!['notifications'], isA<List>());
verify(mockDio.get(any)).called(1); verify(mockDio.get(any)).called(1);
}); });
test('markNotificationsAsRead - помечает уведомления как прочитанные', () async { test('markNotificationsAsRead - помечает уведомления как прочитанные', () async {
final response = Response( final response = Response(
data: {}, data: {},
statusCode: 200, statusCode: 200,
requestOptions: RequestOptions(path: '/api/profile/mark_notifications_as_readed'), requestOptions: RequestOptions(path: '/api/profile/mark_notifications_as_readed'),
); );
when(mockDio.post(any)) when(mockDio.post(any))
.thenAnswer((_) async => response); .thenAnswer((_) async => response);
await notificationsService.markNotificationsAsRead(); await notificationsService.markNotificationsAsRead();
verify(mockDio.post(any)).called(1); verify(mockDio.post(any)).called(1);
}); });
}); });
} }