chore(version): update app version to 1.3.5+85 and improve test coverage reporting in CI

This commit is contained in:
mso7nueh
2025-12-08 11:19:08 +03:00
parent abe4985f0e
commit c2a506cdbf
148 changed files with 12395 additions and 1889 deletions

View File

@@ -0,0 +1,113 @@
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/create_recipe/entities/recipe_create_entity.dart';
import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart';
import 'package:eatvio_app/features/create_recipe/presentation/widgets/tags_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'tags_widget_test.mocks.dart';
@GenerateMocks([CreateRecipeCubit])
void main() {
group('TagsWidget', () {
late MockCreateRecipeCubit mockCubit;
setUp(() {
mockCubit = MockCreateRecipeCubit();
});
Widget createTestWidget() {
return MaterialApp(
theme: ThemeHelper().themeData(),
home: BlocProvider<CreateRecipeCubit>.value(
value: mockCubit,
child: Scaffold(
body: TagsWidget(),
),
),
);
}
testWidgets('displays tags widget', (tester) async {
final initialState = CreateRecipeState(
entity: RecipeCreateEntity(
ingredients: [],
steps: [],
tags: [],
),
loading: false,
);
when(mockCubit.state).thenReturn(initialState);
when(mockCubit.stream).thenAnswer((_) => Stream.value(initialState));
// ignore: return_of_invalid_type
when(mockCubit.addTag(any)).thenAnswer((_) => () {});
// ignore: return_of_invalid_type
when(mockCubit.removeTag(any)).thenAnswer((_) => () {});
await tester.pumpWidget(createTestWidget());
await tester.pumpAndSettle();
expect(find.byType(TagsWidget), findsOneWidget);
});
testWidgets('displays existing tags', (tester) async {
final stateWithTags = CreateRecipeState(
entity: RecipeCreateEntity(
ingredients: [],
steps: [],
tags: ['tag1', 'tag2'],
),
loading: false,
);
when(mockCubit.state).thenReturn(stateWithTags);
when(mockCubit.stream).thenAnswer((_) => Stream.value(stateWithTags));
// ignore: return_of_invalid_type
when(mockCubit.addTag(any)).thenAnswer((_) => () {});
// ignore: return_of_invalid_type
when(mockCubit.removeTag(any)).thenAnswer((_) => () {});
await tester.pumpWidget(createTestWidget());
await tester.pumpAndSettle();
expect(find.text('tag1'), findsOneWidget);
expect(find.text('tag2'), findsOneWidget);
});
testWidgets('calls addTag when add button is tapped', (tester) async {
final initialState = CreateRecipeState(
entity: RecipeCreateEntity(
ingredients: [],
steps: [],
tags: [],
),
loading: false,
);
when(mockCubit.state).thenReturn(initialState);
when(mockCubit.stream).thenAnswer((_) => Stream.value(initialState));
// ignore: return_of_invalid_type
when(mockCubit.addTag(any)).thenAnswer((_) => () {});
// ignore: return_of_invalid_type
when(mockCubit.removeTag(any)).thenAnswer((_) => () {});
await tester.pumpWidget(createTestWidget());
await tester.pumpAndSettle();
// Find text field and enter tag
final textField = find.byType(TextField);
await tester.enterText(textField, 'new tag');
await tester.pump();
// Find and tap add button
final addButton = find.byIcon(Icons.done);
await tester.tap(addButton);
await tester.pump();
verify(mockCubit.addTag('new tag')).called(1);
});
});
}