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

@@ -1,23 +1,23 @@
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ValidationErrorWidget smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders validation error widget', (tester) async {
await tester.pumpWidget(wrap(const ValidationErrorWidget(error: 'Test error')));
await tester.pump();
expect(find.byType(ValidationErrorWidget), findsOneWidget);
expect(find.text('Test error'), findsOneWidget);
});
});
}
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ValidationErrorWidget smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders validation error widget', (tester) async {
await tester.pumpWidget(wrap(const ValidationErrorWidget(error: 'Test error')));
await tester.pump();
expect(find.byType(ValidationErrorWidget), 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/features/diary/presentation/widgets/chosen_diet_widget.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ChosenDietWidgetContent', () {
Widget createTestWidget(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
home: Scaffold(
body: child,
),
);
}
testWidgets('displays chosen diet widget content', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 5,
dietName: 'Test Diet',
dietDuration: 14,
dietId: 1,
),
),
);
expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
expect(find.text('Test Diet'), findsOneWidget);
});
testWidgets('displays current day and duration', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 7,
dietName: 'Test Diet',
dietDuration: 21,
dietId: 1,
),
),
);
expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
});
testWidgets('displays diet name with underline', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 1,
dietName: 'My Diet',
dietDuration: 7,
dietId: 1,
),
),
);
expect(find.text('My Diet'), findsOneWidget);
});
});
}
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/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ChosenDietWidgetContent', () {
Widget createTestWidget(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
home: Scaffold(
body: child,
),
);
}
testWidgets('displays chosen diet widget content', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 5,
dietName: 'Test Diet',
dietDuration: 14,
dietId: 1,
),
),
);
expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
expect(find.text('Test Diet'), findsOneWidget);
});
testWidgets('displays current day and duration', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 7,
dietName: 'Test Diet',
dietDuration: 21,
dietId: 1,
),
),
);
expect(find.byType(ChosenDietWidgetContent), findsOneWidget);
});
testWidgets('displays diet name with underline', (tester) async {
await tester.pumpWidget(
createTestWidget(
const ChosenDietWidgetContent(
currentDietDay: 1,
dietName: 'My Diet',
dietDuration: 7,
dietId: 1,
),
),
);
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/features/diary/presentation/widgets/comment_container.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('CommentContainer', () {
testWidgets('displays comment text', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: 'Test comment'),
),
),
);
expect(find.byType(CommentContainer), findsOneWidget);
expect(find.text('Test comment'), findsOneWidget);
});
testWidgets('displays empty comment', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: ''),
),
),
);
expect(find.byType(CommentContainer), findsOneWidget);
});
testWidgets('displays long comment', (tester) async {
const longComment = 'This is a very long comment that should be displayed properly in the container';
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: longComment),
),
),
);
expect(find.byType(CommentContainer), findsOneWidget);
expect(find.text(longComment), findsOneWidget);
});
});
}
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/comment_container.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('CommentContainer', () {
testWidgets('displays comment text', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: 'Test comment'),
),
),
);
expect(find.byType(CommentContainer), findsOneWidget);
expect(find.text('Test comment'), findsOneWidget);
});
testWidgets('displays empty comment', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: ''),
),
),
);
expect(find.byType(CommentContainer), findsOneWidget);
});
testWidgets('displays long comment', (tester) async {
const longComment = 'This is a very long comment that should be displayed properly in the container';
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: CommentContainer(comment: longComment),
),
),
);
expect(find.byType(CommentContainer), 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/core/theme/theme_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FinishDayButtonWidget smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders finish day button widget', (tester) async {
await tester.pumpWidget(wrap(FinishDayButtonWidget(onPressed: () async {})));
await tester.pump();
expect(find.byType(FinishDayButtonWidget), findsOneWidget);
expect(find.text('Закончить день'), findsOneWidget);
});
});
}
import 'package:eatvio_app/features/diary/presentation/widgets/finish_day_button_widget.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FinishDayButtonWidget smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders finish day button widget', (tester) async {
await tester.pumpWidget(wrap(FinishDayButtonWidget(onPressed: () async {})));
await tester.pump();
expect(find.byType(FinishDayButtonWidget), 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/presentation/widgets/meal_summary_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('MealSummaryWidget', () {
testWidgets('displays meal summary with totals', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 1,
),
),
),
);
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
testWidgets('hides when all totals are zero', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 1,
),
),
),
);
await tester.pumpAndSettle();
// Widget should be hidden (SizedBox.shrink) when totals are zero
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
testWidgets('displays meal number', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 3,
),
),
),
);
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
});
group('MealSummaryWidget.calculateMealTotals', () {
test('returns zero totals for empty portions list', () {
final result = MealSummaryWidget.calculateMealTotals([]);
expect(result['calories'], 0.0);
expect(result['proteins'], 0.0);
expect(result['fats'], 0.0);
expect(result['carbohydrates'], 0.0);
});
test('returns correct map structure', () {
final result = MealSummaryWidget.calculateMealTotals([]);
expect(result.containsKey('calories'), isTrue);
expect(result.containsKey('proteins'), isTrue);
expect(result.containsKey('fats'), isTrue);
expect(result.containsKey('carbohydrates'), isTrue);
});
});
}
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:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('MealSummaryWidget', () {
testWidgets('displays meal summary with totals', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 1,
),
),
),
);
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
testWidgets('hides when all totals are zero', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 1,
),
),
),
);
await tester.pumpAndSettle();
// Widget should be hidden (SizedBox.shrink) when totals are zero
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
testWidgets('displays meal number', (tester) async {
final portions = <PortionModel>[];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MealSummaryWidget(
portions: portions,
mealNumber: 3,
),
),
),
);
expect(find.byType(MealSummaryWidget), findsOneWidget);
});
});
group('MealSummaryWidget.calculateMealTotals', () {
test('returns zero totals for empty portions list', () {
final result = MealSummaryWidget.calculateMealTotals([]);
expect(result['calories'], 0.0);
expect(result['proteins'], 0.0);
expect(result['fats'], 0.0);
expect(result['carbohydrates'], 0.0);
});
test('returns correct map structure', () {
final result = MealSummaryWidget.calculateMealTotals([]);
expect(result.containsKey('calories'), isTrue);
expect(result.containsKey('proteins'), isTrue);
expect(result.containsKey('fats'), 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:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ProductLoaderWidget', () {
testWidgets('displays product loader widget', (tester) async {
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: ProductLoaderWidget(),
),
),
);
expect(find.byType(ProductLoaderWidget), findsOneWidget);
expect(find.byType(CupertinoActivityIndicator), findsOneWidget);
});
testWidgets('displays ListTile with activity indicator', (tester) async {
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: ProductLoaderWidget(),
),
),
);
expect(find.byType(ListTile), findsOneWidget);
expect(find.byType(CupertinoActivityIndicator), findsOneWidget);
});
});
}
import 'package:eatvio_app/features/diary/presentation/widgets/product_loader_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ProductLoaderWidget', () {
testWidgets('displays product loader widget', (tester) async {
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: ProductLoaderWidget(),
),
),
);
expect(find.byType(ProductLoaderWidget), findsOneWidget);
expect(find.byType(CupertinoActivityIndicator), findsOneWidget);
});
testWidgets('displays ListTile with activity indicator', (tester) async {
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: ProductLoaderWidget(),
),
),
);
expect(find.byType(ListTile), 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/features/diets/presentation/widgets/info_bouble.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('InfoBouble smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders info bouble', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Text('Test')])));
await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget);
expect(find.text('Test'), findsOneWidget);
});
testWidgets('renders info bouble with multiple children', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Icon(Icons.star), Text('Test')])));
await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget);
expect(find.byIcon(Icons.star), findsOneWidget);
expect(find.text('Test'), findsOneWidget);
});
testWidgets('renders info bouble with custom background color', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(backgroundColor: Colors.blue, children: [Text('Test')])));
await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget);
});
});
}
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('InfoBouble smoke', () {
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders info bouble', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Text('Test')])));
await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget);
expect(find.text('Test'), findsOneWidget);
});
testWidgets('renders info bouble with multiple children', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(children: [Icon(Icons.star), Text('Test')])));
await tester.pump();
expect(find.byType(InfoBouble), findsOneWidget);
expect(find.byIcon(Icons.star), findsOneWidget);
expect(find.text('Test'), findsOneWidget);
});
testWidgets('renders info bouble with custom background color', (tester) async {
await tester.pumpWidget(wrap(const InfoBouble(backgroundColor: Colors.blue, children: [Text('Test')])));
await tester.pump();
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_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/choice_chip_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ChoiceChipWidget smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders choice chip widget', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget(
wrap(
ChoiceChipWidget(
index: 0,
selectedChipIndex: 0,
chipsLabelList: chipsList,
onSelected: (value) {
},
),
),
);
await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), findsOneWidget);
expect(find.text('Все'), findsOneWidget);
});
testWidgets('renders choice chip widget not selected', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget(wrap(ChoiceChipWidget(index: 1, selectedChipIndex: 0, chipsLabelList: chipsList, onSelected: (value) {})));
await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), findsOneWidget);
expect(find.text('Рецепты'), findsOneWidget);
});
});
}
import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/choice_chip_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ChoiceChipWidget smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders choice chip widget', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget(
wrap(
ChoiceChipWidget(
index: 0,
selectedChipIndex: 0,
chipsLabelList: chipsList,
onSelected: (value) {
},
),
),
);
await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), findsOneWidget);
expect(find.text('Все'), findsOneWidget);
});
testWidgets('renders choice chip widget not selected', (tester) async {
final chipsList = ['Все', 'Рецепты', 'Диеты'];
await tester.pumpWidget(wrap(ChoiceChipWidget(index: 1, selectedChipIndex: 0, chipsLabelList: chipsList, onSelected: (value) {})));
await tester.pumpAndSettle();
expect(find.byType(ChoiceChipWidget), 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_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/filter_badge.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FilterBadge smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders filter badge', (tester) async {
await tester.pumpWidget(wrap(const FilterBadge(filterBottomSheet: Scaffold(body: Text('Filter Bottom Sheet')))));
await tester.pumpAndSettle();
expect(find.byType(FilterBadge), findsOneWidget);
});
});
}
import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/filter_badge.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FilterBadge smoke', () {
setUpAll(() async {
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
});
setUp(() async {
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
Widget wrap(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: Scaffold(body: child),
);
}
testWidgets('renders filter badge', (tester) async {
await tester.pumpWidget(wrap(const FilterBadge(filterBottomSheet: Scaffold(body: Text('Filter Bottom Sheet')))));
await tester.pumpAndSettle();
expect(find.byType(FilterBadge), findsOneWidget);
});
});
}

View File

@@ -1,75 +1,79 @@
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:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('StatusWidget', () {
testWidgets('displays canceled status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.canceled),
),
),
);
expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Отменён'), findsOneWidget);
});
testWidgets('displays success status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.success),
),
),
);
expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Успешно'), findsOneWidget);
});
testWidgets('displays inProgress status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.inProgress),
),
),
);
expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('В процессе'), findsOneWidget);
});
});
}
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:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('StatusWidget', () {
testWidgets('displays canceled status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.canceled),
),
),
);
expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Отменён'), findsOneWidget);
});
testWidgets('displays success status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.success),
),
),
);
expect(find.byType(StatusWidget), findsOneWidget);
expect(find.text('Успешно'), findsOneWidget);
});
testWidgets('displays inProgress status', (tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
home: const Scaffold(
body: StatusWidget(status: Status.inProgress),
),
),
);
expect(find.byType(StatusWidget), 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/repositories/glossary_repository.dart';
import 'package:eatvio_app/features/glossary/services/glossary_service.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
class MockGlossaryService extends Mock implements GlossaryService {}
void main() {
group('GlossaryRepository', () {
late GlossaryRepository repository;
late MockGlossaryService mockService;
setUp(() {
mockService = MockGlossaryService();
repository = GlossaryRepository(glossaryService: mockService);
});
test('getGlossaryListByQuery - успешный запрос', () async {
const query = 'test';
final mockGlossaries = <GlossaryModel>[];
final mockPagination = GlossaryPaginationModel(glossariesList: mockGlossaries);
when(() => mockService.getGlossaryByQuery(query: query))
.thenAnswer((_) async => mockPagination);
final result = await repository.getGlossaryListByQuery(query);
expect(result, mockGlossaries);
verify(() => mockService.getGlossaryByQuery(query: query)).called(1);
});
test('getGlossaryListByQuery - пробрасывает ошибку', () async {
const query = 'test';
when(() => mockService.getGlossaryByQuery(query: query))
.thenThrow(Exception('Error'));
expect(() => repository.getGlossaryListByQuery(query), throwsException);
});
});
}
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/services/glossary_service.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
class MockGlossaryService extends Mock implements GlossaryService {}
void main() {
group('GlossaryRepository', () {
late GlossaryRepository repository;
late MockGlossaryService mockService;
setUp(() {
mockService = MockGlossaryService();
repository = GlossaryRepository(glossaryService: mockService);
});
test('getGlossaryListByQuery - успешный запрос', () async {
const query = 'test';
final mockGlossaries = <GlossaryModel>[];
final mockPagination = GlossaryPaginationModel(glossariesList: mockGlossaries);
when(() => mockService.getGlossaryByQuery(query: query))
.thenAnswer((_) async => mockPagination);
final result = await repository.getGlossaryListByQuery(query);
expect(result, mockGlossaries);
verify(() => mockService.getGlossaryByQuery(query: query)).called(1);
});
test('getGlossaryListByQuery - пробрасывает ошибку', () async {
const query = 'test';
when(() => mockService.getGlossaryByQuery(query: query))
.thenThrow(Exception('Error'));
expect(() => repository.getGlossaryListByQuery(query), throwsException);
});
});
}

View File

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