From bb97c395dded9828966fa49c74fb41f696eb9349 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Thu, 12 Feb 2026 11:25:06 +0300 Subject: [PATCH 01/37] feat: Implement comprehensive navigation logic for various notification types within the NotificationWidget. --- .gitignore | 3 +- lib/core/routing/content_routes.dart | 66 +- .../presentation/pages/blog_post_screen.dart | 11 +- .../pages/blog_post_create_screen.dart | 1 + .../presentation/pages/about_diet_screen.dart | 4 +- .../presentation/widgets/comments_widget.dart | 52 +- .../models/notification_model.dart | 392 +++++++++++- .../notifications_cubit.dart | 76 ++- .../widgets/notification_widget.dart | 589 ++++++++++++++++-- .../service/notifications_service.dart | 72 +++ .../presentation/pages/about_plan_screen.dart | 25 +- .../pages/about_recipe_screen.dart | 4 +- .../pages/about_diet_screen_smoke_test.dart | 8 +- .../models/notification_model_test.dart | 2 +- .../widgets/notification_widget_test.dart | 6 + .../pages/about_plan_screen_smoke_test.dart | 6 +- 16 files changed, 1211 insertions(+), 106 deletions(-) diff --git a/.gitignore b/.gitignore index 530ea713..1503b5ce 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ env/.env .env android/key.properties app/upload-keystore.jks -coverage/ \ No newline at end of file +coverage/ +backend/ \ No newline at end of file diff --git a/lib/core/routing/content_routes.dart b/lib/core/routing/content_routes.dart index 0556fab6..5a93013c 100644 --- a/lib/core/routing/content_routes.dart +++ b/lib/core/routing/content_routes.dart @@ -17,12 +17,25 @@ class ContentRoutes { name: 'aboutPlanScreen', builder: (context, state) { final slug = state.uri.queryParameters['slug']; + final commentIdStr = state.uri.queryParameters['commentId']; + final commentId = int.tryParse(commentIdStr ?? ''); + if (slug != null) { - return AboutPlanScreen(slug: slug, navigateToComments: false, index: null); + return AboutPlanScreen( + slug: slug, + navigateToComments: commentId != null, + index: null, + highlightedCommentId: commentId, + ); } final data = state.extra as Map; - return AboutPlanScreen(slug: data['slug'] as String, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool); + return AboutPlanScreen( + slug: data['slug'] as String, + index: data['index'] as int?, + navigateToComments: data['navigateToComments'] as bool? ?? (data['commentId'] != null), + highlightedCommentId: data['commentId'] as int?, + ); }, ), GoRoute( @@ -30,12 +43,25 @@ class ContentRoutes { name: 'aboutRecipesScreen', builder: (context, state) { final slug = state.uri.queryParameters['slug']; + final commentIdStr = state.uri.queryParameters['commentId']; + final commentId = int.tryParse(commentIdStr ?? ''); + if (slug != null) { - return AboutRecipeScreen(recipeSlug: slug, navigateToComments: false, index: null); + return AboutRecipeScreen( + recipeSlug: slug, + navigateToComments: commentId != null, + index: null, + highlightedCommentId: commentId, + ); } final data = state.extra as Map; - return AboutRecipeScreen(recipeSlug: data['recipe'] as String, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool); + return AboutRecipeScreen( + recipeSlug: data['recipe'] as String, + index: data['index'] as int?, + navigateToComments: data['navigateToComments'] as bool? ?? (data['commentId'] != null), + highlightedCommentId: data['commentId'] as int?, + ); }, ), GoRoute( @@ -43,15 +69,25 @@ class ContentRoutes { name: 'aboutDietScreen', builder: (context, state) { final slug = state.uri.queryParameters['slug']; + final commentIdStr = state.uri.queryParameters['commentId']; + final commentId = int.tryParse(commentIdStr ?? ''); + if (slug != null) { - return AboutDietScreen(id: null, slug: slug, index: null, navigateToComments: false); + return AboutDietScreen( + id: null, + slug: slug, + index: null, + navigateToComments: commentId != null, + highlightedCommentId: commentId, + ); } final data = state.extra as Map; return AboutDietScreen( id: data['id'] as int?, slug: data['slug'] as String?, index: data['index'] as int?, - navigateToComments: data['navigateToComments'] as bool, + navigateToComments: data['navigateToComments'] as bool? ?? (data['commentId'] != null), + highlightedCommentId: data['commentId'] as int?, ); }, ), @@ -65,12 +101,26 @@ class ContentRoutes { name: 'blogPostScreen', builder: (context, state) { final id = state.uri.queryParameters['id']; + final commentIdStr = state.uri.queryParameters['commentId']; + final commentId = int.tryParse(commentIdStr ?? ''); final parsedId = int.tryParse(id ?? ''); + if (parsedId != null) { - return BlogPostScreen(id: parsedId); + return BlogPostScreen( + id: parsedId, + highlightedCommentId: commentId, + ); } - return BlogPostScreen(id: state.extra as int); + if (state.extra is int) { + return BlogPostScreen(id: state.extra as int); + } + + final data = state.extra as Map; + return BlogPostScreen( + id: data['id'] as int, + highlightedCommentId: data['commentId'] as int?, + ); }, ), ]; diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart index 70593f8c..bf50518a 100644 --- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart +++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart @@ -21,8 +21,9 @@ import 'package:share_plus/share_plus.dart'; class BlogPostScreen extends StatefulWidget { final int id; + final int? highlightedCommentId; - const BlogPostScreen({super.key, required this.id}); + const BlogPostScreen({super.key, required this.id, this.highlightedCommentId}); @override State createState() => _BlogPostScreenState(); @@ -303,7 +304,13 @@ class _BlogPostScreenState extends State { const SizedBox(height: 16), if (state is CommentsStateLoading) const Loader(), if (state is CommentsStateLoaded) - CommentsWidget(id: widget.id.toString(), commentSourceType: CommentSourceType.blogPost, comment: state.comment, replyId: replyId), + CommentsWidget( + id: widget.id.toString(), + commentSourceType: CommentSourceType.blogPost, + comment: state.comment, + replyId: replyId, + highlightedCommentId: widget.highlightedCommentId, + ), ], ), ), diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index 0254d3c7..6da09b9e 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -568,6 +568,7 @@ class _BlogPostCreateScreenState extends State { CustomTextFormField(key: AppKeys.blogPostCreateScreenVideoLinkTextField, controller: videoUrlController), const SizedBox(height: 80), _createBlogPostButton(), + const SizedBox(height: 80), ], ), ), diff --git a/lib/features/diets/presentation/pages/about_diet_screen.dart b/lib/features/diets/presentation/pages/about_diet_screen.dart index 54d74215..3823b471 100644 --- a/lib/features/diets/presentation/pages/about_diet_screen.dart +++ b/lib/features/diets/presentation/pages/about_diet_screen.dart @@ -37,8 +37,9 @@ class AboutDietScreen extends StatefulWidget { final int? id; final int? index; final bool navigateToComments; + final int? highlightedCommentId; - const AboutDietScreen({super.key, required this.index, required this.navigateToComments, required this.slug, required this.id}); + const AboutDietScreen({super.key, required this.index, required this.navigateToComments, required this.slug, required this.id, this.highlightedCommentId}); @override State createState() => _AboutDietScreenState(); @@ -433,6 +434,7 @@ class _AboutDietScreenState extends State { commentSourceType: CommentSourceType.diet, comment: state.comment, replyId: replyId, + highlightedCommentId: widget.highlightedCommentId, ), ], ), diff --git a/lib/features/feed/presentation/widgets/comments_widget.dart b/lib/features/feed/presentation/widgets/comments_widget.dart index f8b3ecba..61ba39d2 100644 --- a/lib/features/feed/presentation/widgets/comments_widget.dart +++ b/lib/features/feed/presentation/widgets/comments_widget.dart @@ -23,14 +23,60 @@ class CommentsWidget extends StatefulWidget { final CommentSourceType commentSourceType; final CommentModel comment; final int? replyId; + final int? highlightedCommentId; - const CommentsWidget({super.key, required this.id, required this.commentSourceType, required this.comment, this.replyId}); + const CommentsWidget({ + super.key, + required this.id, + required this.commentSourceType, + required this.comment, + this.replyId, + this.highlightedCommentId, + }); @override State createState() => _CommentsWidgetState(); } class _CommentsWidgetState extends State { + final Map commentKeys = {}; + + @override + void initState() { + super.initState(); + if (widget.highlightedCommentId != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _scrollToHighlightedComment(); + }); + } + } + + @override + void didUpdateWidget(CommentsWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.highlightedCommentId != null && widget.highlightedCommentId != oldWidget.highlightedCommentId) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _scrollToHighlightedComment(); + }); + } else if (widget.comment != oldWidget.comment && widget.highlightedCommentId != null) { + // Comments might have just loaded + WidgetsBinding.instance.addPostFrameCallback((_) { + _scrollToHighlightedComment(); + }); + } + } + + void _scrollToHighlightedComment() { + final key = commentKeys[widget.highlightedCommentId]; + if (key != null && key.currentContext != null) { + Scrollable.ensureVisible( + key.currentContext!, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + ); + } + } + @override Widget build(BuildContext context) { final s = S.of(context); @@ -49,8 +95,10 @@ class _CommentsWidgetState extends State { } Widget _comment(S s, Comment comment, [double radius = 18, bool isChild = false]) { + final key = commentKeys.putIfAbsent(comment.id, () => GlobalKey()); final isMe = (sl().state as ProfileAvatarStateLoaded).profile.slug == comment.authorSlug; return GestureDetector( + key: key, onTap: () { showCommentsActionsBottomSheet( context, @@ -83,7 +131,7 @@ class _CommentsWidgetState extends State { child: Container( width: MediaQuery.of(context).size.width, decoration: BoxDecoration( - color: widget.replyId == comment.id ? appTheme.blueA400.withValues(alpha: 0.1) : Colors.white, + color: (widget.replyId == comment.id || widget.highlightedCommentId == comment.id) ? appTheme.blueA400.withValues(alpha: 0.1) : Colors.white, borderRadius: BorderRadius.circular(16), ), child: Padding( diff --git a/lib/features/notifications/models/notification_model.dart b/lib/features/notifications/models/notification_model.dart index cc77616e..3375a312 100644 --- a/lib/features/notifications/models/notification_model.dart +++ b/lib/features/notifications/models/notification_model.dart @@ -215,6 +215,8 @@ class ChosenPlanStartedToConsultantNotification implements BaseNotificationModel final bool isRead; final String planName; final String customerName; + final int planId; + final int customerId; @override final DateTime createdAt; ChosenPlanStartedToConsultantNotification({ @@ -222,6 +224,8 @@ class ChosenPlanStartedToConsultantNotification implements BaseNotificationModel required this.isRead, required this.planName, required this.customerName, + required this.planId, + required this.customerId, required this.createdAt, }); @@ -231,6 +235,8 @@ class ChosenPlanStartedToConsultantNotification implements BaseNotificationModel isRead: isRead ?? false, planName: json['plan_name'], customerName: json['client_name'], + planId: json['plan_id'] ?? 0, + customerId: json['client_id'] ?? 0, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); } @@ -420,6 +426,7 @@ class CommentReplied implements BaseNotificationModel { final String author; final int authorId; final int parentCommentId; + final int? commentId; @override final DateTime createdAt; @@ -431,6 +438,7 @@ class CommentReplied implements BaseNotificationModel { required this.author, required this.authorId, required this.parentCommentId, + this.commentId, required this.isRead, required this.createdAt, }); @@ -444,6 +452,7 @@ class CommentReplied implements BaseNotificationModel { author: json['author'], authorId: json['author_id'], parentCommentId: json['parrent_comment_id'], + commentId: json['comment_id'], isRead: isRead ?? false, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); @@ -504,6 +513,7 @@ class EntityCommented implements BaseNotificationModel { final String authorName; final int authorId; final String authorSlug; + final int? commentId; @override final DateTime createdAt; @@ -517,6 +527,7 @@ class EntityCommented implements BaseNotificationModel { required this.authorName, required this.authorId, required this.authorSlug, + this.commentId, required this.isRead, required this.createdAt, }); @@ -532,6 +543,7 @@ class EntityCommented implements BaseNotificationModel { authorName: json['author_name'], authorId: json['author_id'], authorSlug: json['author_slug'], + commentId: json['comment_id'], isRead: isRead ?? false, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); @@ -831,7 +843,15 @@ class UnknownNotification implements BaseNotificationModel { @override final DateTime createdAt; - UnknownNotification({required this.type, this.isRead = true, DateTime? createdAt}) : createdAt = createdAt ?? DateTime.fromMillisecondsSinceEpoch(0); + UnknownNotification({required this.type, this.isRead = true, required this.createdAt}); + + factory UnknownNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return UnknownNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } } class DietCancelledNotification implements BaseNotificationModel { @@ -1015,16 +1035,28 @@ class StayOnTrackToAuthorNotification implements BaseNotificationModel { final bool isRead; final String planName; final String clientName; + final int planId; + final int clientId; @override final DateTime createdAt; - StayOnTrackToAuthorNotification({required this.type, required this.planName, required this.clientName, required this.isRead, required this.createdAt}); + StayOnTrackToAuthorNotification({ + required this.type, + required this.planName, + required this.clientName, + required this.planId, + required this.clientId, + required this.isRead, + required this.createdAt, + }); factory StayOnTrackToAuthorNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { return StayOnTrackToAuthorNotification( type: type, planName: json['plan_name'] ?? '', clientName: json['client_name'] ?? '', + planId: json['plan_id'] ?? 0, + clientId: json['client_id'] ?? 0, isRead: isRead ?? false, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); @@ -1326,16 +1358,28 @@ class StayOnTrackToCustomerNotification implements BaseNotificationModel { final bool isRead; final String planName; final String consultantName; + final int planId; + final int consultantId; @override final DateTime createdAt; - StayOnTrackToCustomerNotification({required this.type, required this.planName, required this.consultantName, required this.isRead, required this.createdAt}); + StayOnTrackToCustomerNotification({ + required this.type, + required this.planName, + required this.consultantName, + required this.planId, + required this.consultantId, + required this.isRead, + required this.createdAt, + }); factory StayOnTrackToCustomerNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { return StayOnTrackToCustomerNotification( type: type, planName: json['plan_name'] ?? '', consultantName: json['consultant_name'] ?? '', + planId: json['plan_id'] ?? 0, + consultantId: json['consultant_id'] ?? 0, isRead: isRead ?? false, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); @@ -1652,14 +1696,16 @@ class ProductStatusUpdatedForAuthorNotification implements BaseNotificationModel final String productName; final String oldStatus; final String newStatus; + final String status; // Added to capture single status if old/new aren't provided @override final DateTime createdAt; ProductStatusUpdatedForAuthorNotification({ required this.type, required this.productName, - required this.oldStatus, - required this.newStatus, + this.oldStatus = '', + this.newStatus = '', + this.status = '', required this.isRead, required this.createdAt, }); @@ -1670,6 +1716,7 @@ class ProductStatusUpdatedForAuthorNotification implements BaseNotificationModel productName: json['product_name'] ?? '', oldStatus: json['old_status'] ?? '', newStatus: json['new_status'] ?? '', + status: json['status'] ?? '', isRead: isRead ?? false, createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), ); @@ -1724,6 +1771,309 @@ class PersonalDietIsDefinedToCustomerNotification implements BaseNotificationMod } } +// New Model Classes for Comprehensive Support + +class ConsultantEducationUpdatedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String consultantName; + + ConsultantEducationUpdatedNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.consultantName, + }); + + factory ConsultantEducationUpdatedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ConsultantEducationUpdatedNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + consultantName: json['consultant_name'] ?? '', + ); + } +} + +class ComplaintRegisteredNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String complaintType; + final String entityName; + + ComplaintRegisteredNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.complaintType, + required this.entityName, + }); + + factory ComplaintRegisteredNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ComplaintRegisteredNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + complaintType: json['complaint_type'] ?? '', + entityName: json['entity_name'] ?? '', + ); + } +} + +class ContentUnpublishedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String reason; + final String entityName; + + ContentUnpublishedNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.reason, + required this.entityName, + }); + + factory ContentUnpublishedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ContentUnpublishedNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + reason: json['reason'] ?? '', + entityName: json['entity_name'] ?? '', + ); + } +} + +class FinanceQuestionCreatedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String questionText; + + FinanceQuestionCreatedNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.questionText, + }); + + factory FinanceQuestionCreatedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return FinanceQuestionCreatedNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + questionText: json['question_text'] ?? '', + ); + } +} + +class NewChatMessageNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String senderName; + final String messagePreview; + final int chatId; + + NewChatMessageNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.senderName, + required this.messagePreview, + required this.chatId, + }); + + factory NewChatMessageNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return NewChatMessageNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + senderName: json['sender_name'] ?? '', + messagePreview: json['message_preview'] ?? '', + chatId: json['chat_id'] ?? 0, + ); + } +} + +class CompleteRegistrationNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + + CompleteRegistrationNotification({ + required this.type, + required this.isRead, + required this.createdAt, + }); + + factory CompleteRegistrationNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return CompleteRegistrationNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + ); + } +} + +class ChosenDietExpiredNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String dietName; + + ChosenDietExpiredNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.dietName, + }); + + factory ChosenDietExpiredNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return ChosenDietExpiredNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + dietName: json['diet_name'] ?? '', + ); + } +} + +class MotivateUserNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String message; + + MotivateUserNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.message, + }); + + factory MotivateUserNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return MotivateUserNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + message: json['message'] ?? '', + ); + } +} + +class CommentComplaintNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String commentPreview; + final String reason; + + CommentComplaintNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.commentPreview, + required this.reason, + }); + + factory CommentComplaintNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return CommentComplaintNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + commentPreview: json['comment_preview'] ?? '', + reason: json['reason'] ?? '', + ); + } +} + +class CommentDeletedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String commentPreview; + + CommentDeletedNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.commentPreview, + }); + + factory CommentDeletedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return CommentDeletedNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + commentPreview: json['comment_preview'] ?? '', + ); + } +} + +class UserSubscribedNotification implements BaseNotificationModel { + @override + final NotificationType type; + @override + final bool isRead; + @override + final DateTime createdAt; + final String subscriberName; + final int subscriberId; + + UserSubscribedNotification({ + required this.type, + required this.isRead, + required this.createdAt, + required this.subscriberName, + required this.subscriberId, + }); + + factory UserSubscribedNotification.fromJson(Map json, NotificationType type, {bool? isRead, String? createdAt}) { + return UserSubscribedNotification( + type: type, + isRead: isRead ?? false, + createdAt: parseDate(createdAt ?? json['created_at'] ?? DateTime.now().toIso8601String()), + subscriberName: json['subscriber_name'] ?? '', + subscriberId: json['subscriber_id'] ?? 0, + ); + } +} + enum NotificationType { // Diet related dietCancelled, @@ -1731,6 +2081,7 @@ enum NotificationType { dietExpired, dietWillStartedIn, dietCanNotBeStarted, + chosenDietExpired, // New // Plan related personalDietCreationNeeded, @@ -1760,12 +2111,17 @@ enum NotificationType { // Comments entityCommented, commentReplied, + commentComplaint, // New + commentDeleted, // New // Profile phoneChanged, + consultantEducationUpdated, // New + completeRegistration, // New // Subscription subscription, + userSubscribed, // New // Badges badgeAwarded, @@ -1773,16 +2129,21 @@ enum NotificationType { // Consultant consultantRequestStarted, + motivateUser, // New // Complaints clientCloseComplaintSuccess, complaintToModerationForUser, + complaintRegistered, // New + contentUnpublished, // New + contentUnpublishedComplaint, // New // Finance clientRefundSuccess, consultantRefundSuccess, clientRejectSuccess, consultantRejectSuccess, + financeQuestionCreated, // New // Score scoreAdded, @@ -1794,6 +2155,9 @@ enum NotificationType { // Diary diaryReminderForUsers, + // Chat + newChatMessage, // New + // Legacy types (keeping for backward compatibility) planSubscriptionStartedToAuthor, planSubscriptionCanceledToAuthor, @@ -1865,7 +2229,23 @@ enum NotificationType { 'stay-on-track-to-customer' => NotificationType.stayOnTrackToCustomer, 'diary-reminder-for-users' => NotificationType.diaryReminderForUsers, 'personal-diet-is-defined-to-customer' => NotificationType.personalDietIsDefinedToCustomer, - + + // New additions + 'consultant-education-updated' => NotificationType.consultantEducationUpdated, + 'complaint-registered' => NotificationType.complaintRegistered, + 'content-unpublished' => NotificationType.contentUnpublished, + 'content-unpublished-complaint' => NotificationType.contentUnpublishedComplaint, + 'finance-question-created' => NotificationType.financeQuestionCreated, + 'new-chat-message' => NotificationType.newChatMessage, + 'complete-registration' => NotificationType.completeRegistration, + 'chosen-diet-expired' => NotificationType.chosenDietExpired, + 'motivate-user' => NotificationType.motivateUser, + 'comment-complaint' => NotificationType.commentComplaint, + 'comment-deleted' => NotificationType.commentDeleted, + 'user-subscribed' => NotificationType.userSubscribed, + // 'diary-reminder' => NotificationType.diaryReminder, // Already legacy? Check if it maps to diaryReminderNotification + 'meal-reminder' => NotificationType.mealReminder, // Maps to legacy if string matches? No, legacy was App\\... + // Legacy mapping 'App\\Notifications\\Plan\\PlanSubscriptionStartedToAuthor' => NotificationType.planSubscriptionStartedToAuthor, 'App\\Notifications\\Plan\\PlanSubscriptionCanceledToAuthor' => NotificationType.planSubscriptionCanceledToAuthor, diff --git a/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart b/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart index 110607c0..54c84507 100644 --- a/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart +++ b/lib/features/notifications/presentation/notifications_cubit/notifications_cubit.dart @@ -267,10 +267,82 @@ class NotificationsCubit extends Cubit { isRead: isRead, createdAt: createdAt, ), - NotificationType.unknown => UnknownNotification(type: type), + NotificationType.consultantEducationUpdated => ConsultantEducationUpdatedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.complaintRegistered => ComplaintRegisteredNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.contentUnpublished => ContentUnpublishedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.contentUnpublishedComplaint => ContentUnpublishedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.financeQuestionCreated => FinanceQuestionCreatedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.newChatMessage => NewChatMessageNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.completeRegistration => CompleteRegistrationNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.chosenDietExpired => ChosenDietExpiredNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.motivateUser => MotivateUserNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.commentComplaint => CommentComplaintNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.commentDeleted => CommentDeletedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.userSubscribed => UserSubscribedNotification.fromJson( + notificationJson, + type, + isRead: isRead, + createdAt: createdAt, + ), + NotificationType.unknown => UnknownNotification(type: type, createdAt: parseDate(createdAt ?? jsonEncode(notificationJson))), }; } catch (e) { - return UnknownNotification(type: NotificationType.unknown); + return UnknownNotification(type: NotificationType.unknown, createdAt: DateTime.now()); } } diff --git a/lib/features/notifications/presentation/widgets/notification_widget.dart b/lib/features/notifications/presentation/widgets/notification_widget.dart index 0169f96d..1c2d1c58 100644 --- a/lib/features/notifications/presentation/widgets/notification_widget.dart +++ b/lib/features/notifications/presentation/widgets/notification_widget.dart @@ -9,9 +9,194 @@ import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_cubit.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + class NotificationWidget extends StatelessWidget { const NotificationWidget({super.key, required this.notification}); final BaseNotificationModel notification; + + void _onTap(BuildContext context) { + // Mark as read first + context.read().markNotificationsAsRead(); + + switch (notification) { + case CommentReplied n: + _navigateToEntity(context, n.commentedEntityType, n.commentedEntityId, n.commentId); + case EntityCommented n: + _navigateToEntity(context, n.entityType, n.entityId, n.commentId); + case PersonalDietIsDefinedToCustomerNotification n: + context.push(RouteConstants.aboutDietScreen, extra: {'id': n.dietId}); + case PlanSubscriptionStartedToAuthorNotification n: + if (n.chatId.isNotEmpty && n.chatId != '0') { + context.push(RouteConstants.chatScreen, extra: int.tryParse(n.chatId) ?? 0); + } else { + // Fallback if no chat ID + context.push(RouteConstants.profileScreen); + } + case ConsultantAssignedNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case StayOnTrackToAuthorNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case StayOnTrackToCustomerNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case ChosenPlanStartedToClientNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case ChosenPlanStartedToConsultantNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case ProductStatusUpdatedForAuthorNotification(): + context.push(RouteConstants.profileScreen); + // New Cases with Safety Checks + case NewChatMessageNotification n: + if (n.chatId != 0) context.push(RouteConstants.chatScreen, extra: n.chatId); + case FinanceQuestionCreatedNotification(): + context.push(RouteConstants.userFinanceScreen); + case ChosenDietExpiredNotification(): + context.push(RouteConstants.myDietsScreen); + case ContentUnpublishedNotification(): + context.push(RouteConstants.profileScreen); + case CompleteRegistrationNotification(): + context.push(RouteConstants.profileScreen); // Or edit profile + case ConsultantEducationUpdatedNotification(): + context.push(RouteConstants.profileScreen); + case ComplaintRegisteredNotification(): + context.push(RouteConstants.profileScreen); + case ConsultantRequestStartedNotification(): + // Navigate to where requests are shown + context.push(RouteConstants.profileScreen); + case ClientCloseComplaintSuccessNotification(): + context.push(RouteConstants.profileScreen); + case ClientRefundSuccessNotification(): + context.push(RouteConstants.userFinanceScreen); + case ConsultantRefundSuccessNotification(): + context.push(RouteConstants.userFinanceScreen); + case ClientRejectSuccessNotification(): + context.push(RouteConstants.aboutPlanScreen); // Best guess + case ConsultantRejectSuccessNotification(): + context.push(RouteConstants.aboutPlanScreen); + case ScoreSubstractedNotification(): + context.push(RouteConstants.profileScreen); + case ScoreAdded(): + context.push(RouteConstants.profileScreen); + case DiaryReminderForUsersNotification(): + context.push(RouteConstants.myDietsScreen); // Likely where diary is + case MotivateUserNotification(): + context.push(RouteConstants.myDietsScreen); + case CommentComplaintNotification(): + context.push(RouteConstants.profileScreen); + case CommentDeletedNotification(): + context.push(RouteConstants.profileScreen); + case UserSubscribedNotification(): + context.push(RouteConstants.profileScreen); + case BadgeAwardedNotification(): + context.push(RouteConstants.profileScreen); + case BadgeRevokedNotification(): + context.push(RouteConstants.profileScreen); + case SubscriptionNotification(): + context.push(RouteConstants.userFinanceScreen); + case PhoneChangedNotification(): + context.push(RouteConstants.profileScreen); + case UserDailyReportCompletedNotification(): + // Attempt to go to plan if we had ID, but we don't in this model. Go to plans list. + context.push(RouteConstants.myPlansScreen); + case ClientCancelPlanSubscriptionToSubscriberNotification(): + context.push(RouteConstants.myPlansScreen); + case ClientCancelPlanSubscriptionToAuthorNotification(): + context.push(RouteConstants.myPlansScreen); + case ClientStartPlanSubscriptionToAuthorNotification(): + context.push(RouteConstants.myPlansScreen); + case ClientPaidPlanSubscriptionToSubscriberNotification(): + context.push(RouteConstants.userFinanceScreen); + case ConsultantConfirmPlanSubscriptionToAuthorNotification(): + context.push(RouteConstants.myPlansScreen); + case ConsultantLeftDiaryCommentNotification(): + // Needs planID to go to specific plan, model has planName. + // Optimally we'd go to the diary. For now plans screen. + context.push(RouteConstants.myPlansScreen); + case ClientPaidPlanSubscriptionToAuthorNotification(): + context.push(RouteConstants.userFinanceScreen); + case ConsultantConfirmPlanSubscriptionToSubscriberNotification(): + context.push(RouteConstants.myPlansScreen); + case ClientStartPlanSubscriptionToSubscriberNotification(): + context.push(RouteConstants.myPlansScreen); + case ChosenPlanClientLastDayStartedNotification(): + context.push(RouteConstants.myPlansScreen); + case ChosenPlanClientLastDayFinishedNotification(): + context.push(RouteConstants.myPlansScreen); + case PersonalDietCreationNeededNotification(): + context.push(RouteConstants.myPlansScreen); + case DietCanNotBeStartedNotification(): + context.push(RouteConstants.myDietsScreen); + case DietWillStartedInNotification(): + context.push(RouteConstants.myDietsScreen); + case DietExpiredNotification(): + context.push(RouteConstants.myDietsScreen); + case DietStartedNotification(): + context.push(RouteConstants.myDietsScreen); + case DietCancelledNotification(): + context.push(RouteConstants.myDietsScreen); + case MealReminderNotification(): + context.push(RouteConstants.myDietsScreen); + case WorkoutReminderNotification(): + context.push(RouteConstants.myDietsScreen); + case GoalAchievedNotification(): + context.push(RouteConstants.profileScreen); + case PaymentSuccessfulNotification(): + context.push(RouteConstants.userFinanceScreen); + case PaymentFailedNotification(): + context.push(RouteConstants.userFinanceScreen); + case ConsultantUnassignedNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case PlanSubscriptionRenewedNotification(): + context.push(RouteConstants.userFinanceScreen); + case PlanSubscriptionExpiredNotification(): + context.push(RouteConstants.userFinanceScreen); + case ComplaintToModerationForUser(): + context.push(RouteConstants.profileScreen); + case ChosenPlanConsultantLastDayStarted n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case ChosenPlanLastDayFinishedForUser(): + context.push(RouteConstants.myPlansScreen); + case ChosenPlanFinishedToConsultantNotification n: + context.push(RouteConstants.aboutPlanScreen, extra: {'id': n.planId}); + case PlanSubscriptionPaidToAuthorNotification(): + context.push(RouteConstants.userFinanceScreen); + case ChosenPlanTomorrowReminderToConsultantNotification(): + context.push(RouteConstants.myPlansScreen); + case ChosenPlanTomorrowReminderToClientNotification(): + context.push(RouteConstants.myPlansScreen); + case PlanSubscriptionCanceledToCustomerNotification(): + context.push(RouteConstants.myPlansScreen); + case ChosenPlanFinishedToClientNotification(): + context.push(RouteConstants.myPlansScreen); + case PersonalizedDietIsDefinedNotification(): + context.push(RouteConstants.myDietsScreen); + case ConsultantLeftCommentNotification(): + context.push(RouteConstants.myPlansScreen); + case DiaryReminderNotification(): + context.push(RouteConstants.myDietsScreen); + case PlanSubscriptionCanceledToAuthorNotification(): + context.push(RouteConstants.myPlansScreen); + default: + // Do nothing if no logical destination + break; + } + } + + void _navigateToEntity(BuildContext context, String type, int id, int? commentId) { + if (type.contains('BlogPost')) { + context.push(RouteConstants.blogPostScreen, extra: {'id': id, 'highlightedCommentId': commentId}); + } else if (type.contains('Recipe')) { + context.push(RouteConstants.aboutRecipesScreen, extra: {'id': id, 'highlightedCommentId': commentId}); + } else if (type.contains('Plan')) { + context.push(RouteConstants.aboutPlanScreen, extra: {'id': id, 'highlightedCommentId': commentId}); + } else if (type.contains('Diet')) { + context.push(RouteConstants.aboutDietScreen, extra: {'id': id, 'highlightedCommentId': commentId}); + } + } + +// }; +// } @override Widget build(BuildContext context) { return switch (notification) { @@ -117,6 +302,20 @@ class NotificationWidget extends StatelessWidget { PersonalDietIsDefinedToCustomerNotification() => _PersonalDietIsDefinedToCustomerWidget( notification: notification as PersonalDietIsDefinedToCustomerNotification, ), + // New Widgets + ConsultantEducationUpdatedNotification() => _ConsultantEducationUpdatedWidget( + notification: notification as ConsultantEducationUpdatedNotification, + ), + ComplaintRegisteredNotification() => _ComplaintRegisteredWidget(notification: notification as ComplaintRegisteredNotification), + ContentUnpublishedNotification() => _ContentUnpublishedWidget(notification: notification as ContentUnpublishedNotification), + FinanceQuestionCreatedNotification() => _FinanceQuestionCreatedWidget(notification: notification as FinanceQuestionCreatedNotification), + NewChatMessageNotification() => _NewChatMessageWidget(notification: notification as NewChatMessageNotification), + CompleteRegistrationNotification() => _CompleteRegistrationWidget(notification: notification as CompleteRegistrationNotification), + ChosenDietExpiredNotification() => _ChosenDietExpiredWidget(notification: notification as ChosenDietExpiredNotification), + MotivateUserNotification() => _MotivateUserWidget(notification: notification as MotivateUserNotification), + CommentComplaintNotification() => _CommentComplaintWidget(notification: notification as CommentComplaintNotification), + CommentDeletedNotification() => _CommentDeletedWidget(notification: notification as CommentDeletedNotification), + UserSubscribedNotification() => _UserSubscribedWidget(notification: notification as UserSubscribedNotification), UnknownNotification() => _UnknownNotificationWidget(notification: notification as UnknownNotification), }; } @@ -131,8 +330,9 @@ class _PlanSubscriptionStartedToAuthorWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.userSubscribedToPlan(notification.customerName, notification.planName), + notificationsText: '${s.userSubscribedToPlan(notification.customerName, notification.planName)}! 🎉', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -146,8 +346,9 @@ class _PlanSubscriptionCanceledToAuthorWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.userCanceldThePlanSubscription(notification.customerName, notification.planName), + notificationsText: 'Отмена подписки. Клиент ${notification.customerName} отказался от плана "${notification.planName}"', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -159,7 +360,12 @@ class _ChosenPlanStartedToClientWidget extends StatelessWidget { Widget build(BuildContext context) { final s = S.of(context); - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: s.planStarted(notification.planName), createdAt: notification.createdAt); + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Ваш план "${notification.planName}" начался! Удачи! 🚀', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); } } @@ -172,8 +378,9 @@ class _ChosenPlanTomorrowReminderToClientWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.tomorrowYourPlanWillStart(notification.planName), + notificationsText: 'Напоминание: Завтра старт плана "${notification.planName}"', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -184,7 +391,12 @@ class _DiaryReminderWidget extends StatelessWidget { @override Widget build(BuildContext context) { final s = S.of(context); - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: s.fillYasterday, createdAt: notification.createdAt); + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Не забудьте заполнить дневник за вчера! 📝', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); } } @@ -197,8 +409,9 @@ class _ConsultantLeftCommentWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.consultantLeftComment(notification.date.format('dd.MM.yyyy')), + notificationsText: 'Новый комментарий от консультанта (за ${notification.date.format('dd.MM.yyyy')})', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -208,7 +421,12 @@ class _PersonalizedDietIsDefinedWidget extends StatelessWidget { final PersonalizedDietIsDefinedNotification notification; @override Widget build(BuildContext context) { - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Персональная диета определена', createdAt: notification.createdAt); + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Персональная диета определена', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); } } @@ -221,8 +439,9 @@ class _ChosenPlanFinishedToClientWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: '${s.congratsYouHaveFinishedPlan} «${notification.planName}»', + notificationsText: 'Поздравляем! План «${notification.planName}» успешно завершен! 🏆', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -236,8 +455,9 @@ class _PlanSubscriptionCanceledToCustomerWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.youCanceledSubscriptionToPlan(notification.planName), + notificationsText: 'Подписка на план "${notification.planName}" отменена.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -251,8 +471,9 @@ class _ChosenPlanStartedToConsultantWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.planWithUserStarted(notification.planName, notification.customerName), + notificationsText: 'Начало работы: План "${notification.planName}" с клиентом ${notification.customerName}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -266,8 +487,9 @@ class _ChosenPlanTomorrowReminderToConsultantWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.tommorowPlanWithUserWillStart(notification.planName, notification.customerName), + notificationsText: 'Напоминание: Завтра старт работы с ${notification.customerName} по плану "${notification.planName}"', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -281,8 +503,9 @@ class _PlanSubscriptionPaidToAuthorWidget extends StatelessWidget { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: s.userPaidThePlan(notification.customerName, notification.planName), + notificationsText: 'Оплата получена! Клиент ${notification.customerName} оплатил план "${notification.planName}" 💰', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -293,16 +516,19 @@ class _ChosenPlanFinishedToConsultantWidget extends StatelessWidget { @override Widget build(BuildContext context) { final s = S.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + return GestureDetector( + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + behavior: HitTestBehavior.opaque, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('${s.congratsYouHaveFinishedPlan} «${notification.planName}»', style: TextStyles.textMSemibold.copyWith(color: appTheme.black)), + Text('План «${notification.planName}» завершен! Поздравляем! 🎉', style: TextStyles.textMSemibold.copyWith(color: appTheme.black)), const SizedBox(height: 12), Text(s.userConfirmedPlanCompletionWithoutSum, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), const SizedBox(height: 12), @@ -331,6 +557,7 @@ class _ChosenPlanFinishedToConsultantWidget extends StatelessWidget { style: TextStyles.textSMedium.copyWith(color: appTheme.gray600), ), ], + ), ); } @@ -377,6 +604,7 @@ class _BaseNotificationWidget extends StatelessWidget { Widget build(BuildContext context) { return GestureDetector( onTap: onTap, + behavior: HitTestBehavior.opaque, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -385,8 +613,14 @@ class _BaseNotificationWidget extends StatelessWidget { Expanded( child: Text(notificationsText, style: TextStyles.textMMedium.copyWith(color: appTheme.black)), ), + if (onTap != null) + Padding( + padding: const EdgeInsets.only(left: 8), + child: Icon(Icons.chevron_right, color: appTheme.gray500, size: 20), + ), if (!isRead) Container( + margin: const EdgeInsets.only(left: 8), decoration: BoxDecoration(color: appTheme.blueA400, shape: BoxShape.circle), width: 8, height: 8, @@ -440,7 +674,7 @@ class _ChosenPlanLastDayFinishedForUserWidget extends StatelessWidget { final ChosenPlanLastDayFinishedForUser notification; @override Widget build(BuildContext context) { - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Последний день плана завершен', createdAt: notification.createdAt); + return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Финишная прямая! Последний день плана завершен.', createdAt: notification.createdAt); } } @@ -451,8 +685,9 @@ class _ChosenPlanConsultantLastDayStartedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Последний день плана начался: ${notification.planName}', + notificationsText: 'Внимание: Начался последний день плана "${notification.planName}"', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -462,7 +697,12 @@ class _ComplaintToModerationForUserWidget extends StatelessWidget { final ComplaintToModerationForUser notification; @override Widget build(BuildContext context) { - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Жалоба отправлена на модерацию', createdAt: notification.createdAt); + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Ваша жалоба принята и находится на модерации.', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); } } @@ -473,8 +713,9 @@ class _CommentRepliedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Ответ на комментарий: ${notification.entityName}', + notificationsText: 'Вам ответили в комментариях к: ${notification.entityName}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -486,8 +727,9 @@ class _ScoreAddedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Добавлены баллы: ${notification.scoreValue}', + notificationsText: 'Поздравляем! Вам начислены баллы: ${notification.scoreValue} ⭐', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -499,8 +741,9 @@ class _EntityCommentedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Комментарий к ${notification.entityTranslatedType}: ${notification.entityName}', + notificationsText: 'Новый комментарий к вашей публикации "${notification.entityTranslatedType}": ${notification.entityName}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -512,8 +755,9 @@ class _UnknownNotificationWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Неизвестное уведомление: ${notification.type.toString()}', + notificationsText: 'У вас новое уведомление! Пожалуйста, обновите приложение, чтобы увидеть детали.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -526,8 +770,9 @@ class _PlanSubscriptionExpiredWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Подписка на план "${notification.planName}" истекла', + notificationsText: 'Срок действия подписки на план "${notification.planName}" истек. Продлите, чтобы продолжить! ⏳', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -539,8 +784,9 @@ class _PlanSubscriptionRenewedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Подписка на план "${notification.planName}" продлена до ${notification.renewalDate}', + notificationsText: 'Успешное продление! Подписка на план "${notification.planName}" активна до ${notification.renewalDate} ✅', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -552,8 +798,9 @@ class _ConsultantAssignedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'К плану "${notification.planName}" назначен консультант ${notification.consultantName}', + notificationsText: 'Вам назначен консультант ${notification.consultantName} по плану "${notification.planName}". Приветствуйте! 👋', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -565,8 +812,9 @@ class _ConsultantUnassignedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Консультант ${notification.consultantName} отстранен от плана "${notification.planName}"', + notificationsText: 'Изменение в плане "${notification.planName}": консультант ${notification.consultantName} отстранен.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -578,8 +826,9 @@ class _PaymentFailedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Ошибка оплаты плана "${notification.planName}": ${notification.errorMessage}', + notificationsText: 'Не удалось провести оплату за план "${notification.planName}". Причина: ${notification.errorMessage} ❌', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -591,8 +840,9 @@ class _PaymentSuccessfulWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Успешная оплата плана "${notification.planName}" на сумму ${notification.amount} ${notification.currency}', + notificationsText: 'Оплата прошла успешно! План "${notification.planName}" оплачен на сумму ${notification.amount} ${notification.currency} 💳', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -604,8 +854,9 @@ class _GoalAchievedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Достигнута цель "${notification.goalName}": ${notification.achievedValue}/${notification.targetValue}', + notificationsText: 'Цель достигнута! "${notification.goalName}": ${notification.achievedValue}/${notification.targetValue} 🎯', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -617,8 +868,9 @@ class _WorkoutReminderWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Напоминание о тренировке "${notification.workoutName}" (${notification.duration} мин)', + notificationsText: 'Время тренировки! "${notification.workoutName}" ждет вас (${notification.duration} мин) 💪', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -630,8 +882,9 @@ class _MealReminderWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Напоминание о приеме пищи "${notification.mealName}" (${notification.calories} ккал)', + notificationsText: 'Пора подкрепиться! "${notification.mealName}" (${notification.calories} ккал) 🍎', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -644,8 +897,9 @@ class _DietCancelledWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Диета "${notification.dietName}" отменена', + notificationsText: 'Диета "${notification.dietName}" была отменена.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -657,8 +911,9 @@ class _DietStartedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Диета "${notification.dietName}" началась', + notificationsText: 'Старт диеты "${notification.dietName}"! Успехов! 🥗', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -670,8 +925,9 @@ class _DietExpiredWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Диета "${notification.dietName}" истекла', + notificationsText: 'Срок действия диеты "${notification.dietName}" подошел к концу.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -683,8 +939,9 @@ class _DietWillStartedInWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Диета "${notification.dietName}" начнется ${notification.startDate}', + notificationsText: 'Скоро старт! Диета "${notification.dietName}" начнется ${notification.startDate} ⏰', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -696,8 +953,9 @@ class _DietCanNotBeStartedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Диета "${notification.dietName}" не может быть начата: ${notification.reason}', + notificationsText: 'Внимание: Не удалось начать диету "${notification.dietName}". Причина: ${notification.reason}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -709,8 +967,9 @@ class _PersonalDietCreationNeededWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Требуется создание персональной диеты для клиента ${notification.clientName} по плану "${notification.planName}"', + notificationsText: 'Задача: Создать персональную диету для клиента ${notification.clientName} (План "${notification.planName}")', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -722,8 +981,9 @@ class _ChosenPlanClientLastDayFinishedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Последний день плана "${notification.planName}" завершен', + notificationsText: 'Поздравляем с завершением плана "${notification.planName}"! 🎉', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -735,8 +995,9 @@ class _ChosenPlanClientLastDayStartedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Последний день плана "${notification.planName}" начался', + notificationsText: 'Сегодня последний день плана "${notification.planName}"! Финиш близко! 🏁', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -748,8 +1009,9 @@ class _StayOnTrackToAuthorWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Клиент ${notification.clientName} остается на плане "${notification.planName}"', + notificationsText: 'Клиент ${notification.clientName} продолжает уверенно идти по плану "${notification.planName}" 🔥', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -761,8 +1023,9 @@ class _ClientStartPlanSubscriptionToSubscriberWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Подписка на план "${notification.planName}" началась', + notificationsText: 'У вас новая подписка на план "${notification.planName}"! 🌟', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -774,8 +1037,9 @@ class _ConsultantConfirmPlanSubscriptionToSubscriberWidget extends StatelessWidg Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Консультант ${notification.consultantName} подтвердил подписку на план "${notification.planName}"', + notificationsText: 'Ваша подписка на план "${notification.planName}" подтверждена консультантом ${notification.consultantName} ✅', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -787,8 +1051,9 @@ class _ClientPaidPlanSubscriptionToAuthorWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Клиент ${notification.clientName} оплатил подписку на план "${notification.planName}" на сумму ${notification.amount}', + notificationsText: 'Поступление средств: Клиент ${notification.clientName} оплатил подписку на план "${notification.planName}" (${notification.amount}) 💸', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -800,8 +1065,9 @@ class _ConsultantLeftDiaryCommentWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Консультант ${notification.consultantName} оставил комментарий к дневнику по плану "${notification.planName}"', + notificationsText: 'Ваш консультант ${notification.consultantName} прокомментировал дневник по плану "${notification.planName}" 💬', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -813,8 +1079,9 @@ class _ConsultantConfirmPlanSubscriptionToAuthorWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Консультант ${notification.consultantName} подтвердил подписку на план "${notification.planName}"', + notificationsText: 'Консультант ${notification.consultantName} подтвердил подписку на план "${notification.planName}" 🤝', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -826,8 +1093,9 @@ class _ClientPaidPlanSubscriptionToSubscriberWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Оплачена подписка на план "${notification.planName}" на сумму ${notification.amount}', + notificationsText: 'Оплата подписки на план "${notification.planName}" прошла успешно (${notification.amount}) ✅', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -839,8 +1107,9 @@ class _ClientStartPlanSubscriptionToAuthorWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Клиент ${notification.clientName} начал подписку на план "${notification.planName}"', + notificationsText: 'Новый подписчик! Клиент ${notification.clientName} начал подписку на план "${notification.planName}" 🎈', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -852,8 +1121,9 @@ class _ClientCancelPlanSubscriptionToAuthorWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Клиент ${notification.clientName} отменил подписку на план "${notification.planName}"', + notificationsText: 'Отмена подписки: Клиент ${notification.clientName} отказался от плана "${notification.planName}"', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -865,8 +1135,9 @@ class _ClientCancelPlanSubscriptionToSubscriberWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Подписка на план "${notification.planName}" отменена', + notificationsText: 'Ваша подписка на план "${notification.planName}" была отменена.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -878,8 +1149,9 @@ class _UserDailyReportCompletedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Клиент ${notification.clientName} завершил ежедневный отчет по плану "${notification.planName}"', + notificationsText: 'Отчет получен: Клиент ${notification.clientName} заполнил дневник по плану "${notification.planName}" 📝', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -891,8 +1163,9 @@ class _StayOnTrackToCustomerWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Консультант ${notification.consultantName} остается на плане "${notification.planName}"', + notificationsText: 'Консультант ${notification.consultantName} продолжает работу с вами по плану "${notification.planName}" 💪', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -904,8 +1177,9 @@ class _PhoneChangedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Номер телефона изменен с ${notification.oldPhone} на ${notification.newPhone}', + notificationsText: 'Ваш номер телефона был успешно изменен на ${notification.newPhone} 📱', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -917,8 +1191,9 @@ class _SubscriptionWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Подписка ${notification.subscriptionType} на план "${notification.planName}"', + notificationsText: 'Оформлена подписка ${notification.subscriptionType} на план "${notification.planName}" 🎉', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -930,8 +1205,9 @@ class _BadgeAwardedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Получен значок "${notification.badgeName}": ${notification.badgeDescription}', + notificationsText: 'Новая награда! Вы получили значок "${notification.badgeName}": ${notification.badgeDescription} 🏅', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -943,8 +1219,9 @@ class _BadgeRevokedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Отозван значок "${notification.badgeName}": ${notification.reason}', + notificationsText: 'Значок "${notification.badgeName}" был отозван. Причина: ${notification.reason}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -956,8 +1233,9 @@ class _ConsultantRequestStartedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Запрос к консультанту ${notification.consultantName} начат', + notificationsText: 'Запрос отправлен консультанту ${notification.consultantName} 📩', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -969,8 +1247,9 @@ class _ClientCloseComplaintSuccessWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Жалоба на ${notification.complaintType} "${notification.entityName}" успешно закрыта', + notificationsText: 'Ваша жалоба на ${notification.complaintType} "${notification.entityName}" была рассмотрена и закрыта.', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -982,8 +1261,9 @@ class _ClientRefundSuccessWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Возврат средств по плану "${notification.planName}" на сумму ${notification.amount}: ${notification.reason}', + notificationsText: 'Вам одобрен возврат средств по плану "${notification.planName}" (${notification.amount}). Причина: ${notification.reason}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -995,8 +1275,9 @@ class _ConsultantRefundSuccessWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Возврат средств клиенту ${notification.clientName} по плану "${notification.planName}" на сумму ${notification.amount}', + notificationsText: 'Выполнен возврат средств клиенту ${notification.clientName} по плану "${notification.planName}" (${notification.amount})', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -1008,8 +1289,9 @@ class _ClientRejectSuccessWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Отклонение по плану "${notification.planName}": ${notification.reason}', + notificationsText: 'Отказ по плану "${notification.planName}" принят: ${notification.reason}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -1021,8 +1303,9 @@ class _ConsultantRejectSuccessWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Отклонение клиентом ${notification.clientName} по плану "${notification.planName}": ${notification.reason}', + notificationsText: 'Клиент ${notification.clientName} отказался от плана "${notification.planName}": ${notification.reason}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -1034,8 +1317,9 @@ class _ScoreSubstractedWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Вычтено ${notification.scoreValue} баллов за ${notification.scorableName}', + notificationsText: 'Списание баллов: -${notification.scoreValue} за ${notification.scorableName}', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -1045,10 +1329,22 @@ class _ProductStatusUpdatedForAuthorWidget extends StatelessWidget { final ProductStatusUpdatedForAuthorNotification notification; @override Widget build(BuildContext context) { + String text; + if (notification.oldStatus.isNotEmpty && notification.newStatus.isNotEmpty) { + text = 'Статус продукта "${notification.productName}" изменен с ${notification.oldStatus} на ${notification.newStatus}'; + } else if (notification.newStatus.isNotEmpty) { + text = 'Статус продукта "${notification.productName}" изменен на ${notification.newStatus}'; + } else if (notification.status.isNotEmpty) { + text = 'Статус продукта "${notification.productName}": ${notification.status}'; + } else { + text = 'Статус продукта "${notification.productName}" обновлен'; + } + return _BaseNotificationWidget( isRead: notification.isRead, - notificationsText: 'Статус продукта "${notification.productName}" изменен с ${notification.oldStatus} на ${notification.newStatus}', + notificationsText: text, createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } @@ -1058,7 +1354,12 @@ class _DiaryReminderForUsersWidget extends StatelessWidget { final DiaryReminderForUsersNotification notification; @override Widget build(BuildContext context) { - return _BaseNotificationWidget(isRead: notification.isRead, notificationsText: 'Напоминание о заполнении дневника', createdAt: notification.createdAt); + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Не забудьте заполнить дневник сегодня! 📓', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); } } @@ -1069,9 +1370,163 @@ class _PersonalDietIsDefinedToCustomerWidget extends StatelessWidget { Widget build(BuildContext context) { return _BaseNotificationWidget( isRead: notification.isRead, - onTap: () => GoRouter.of(context).push(RouteConstants.aboutDietScreen, extra: {'id': notification.dietId, 'navigateToComments': false}), - notificationsText: 'Персональная диета "${notification.dietName}" установлена', + notificationsText: 'Для вас составлена персональная диета "${notification.dietName}"! 🥗', createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _ConsultantEducationUpdatedWidget extends StatelessWidget { + const _ConsultantEducationUpdatedWidget({required this.notification}); + final ConsultantEducationUpdatedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Консультант ${notification.consultantName} обновил данные об образовании.', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _ComplaintRegisteredWidget extends StatelessWidget { + const _ComplaintRegisteredWidget({required this.notification}); + final ComplaintRegisteredNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Мы получили вашу жалобу на ${notification.entityName}. Спасибо за сигнал!', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _ContentUnpublishedWidget extends StatelessWidget { + const _ContentUnpublishedWidget({required this.notification}); + final ContentUnpublishedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Ваша публикация ${notification.entityName} была скрыта. Причина: ${notification.reason}', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _FinanceQuestionCreatedWidget extends StatelessWidget { + const _FinanceQuestionCreatedWidget({required this.notification}); + final FinanceQuestionCreatedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Служба поддержки: Новый вопрос по финансам: ${notification.questionText}', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _NewChatMessageWidget extends StatelessWidget { + const _NewChatMessageWidget({required this.notification}); + final NewChatMessageNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Входящее сообщение от ${notification.senderName}: "${notification.messagePreview}"', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _CompleteRegistrationWidget extends StatelessWidget { + const _CompleteRegistrationWidget({required this.notification}); + final CompleteRegistrationNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Завершите регистрацию, чтобы получить доступ ко всем функциям! 🚀', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _ChosenDietExpiredWidget extends StatelessWidget { + const _ChosenDietExpiredWidget({required this.notification}); + final ChosenDietExpiredNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Диета "${notification.dietName}" завершена. Время подвести итоги!', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _MotivateUserWidget extends StatelessWidget { + const _MotivateUserWidget({required this.notification}); + final MotivateUserNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: notification.message, + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _CommentComplaintWidget extends StatelessWidget { + const _CommentComplaintWidget({required this.notification}); + final CommentComplaintNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Поступила жалоба на ваш комментарий: "${notification.commentPreview}". Причина: ${notification.reason}', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _CommentDeletedWidget extends StatelessWidget { + const _CommentDeletedWidget({required this.notification}); + final CommentDeletedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'Ваш комментарий был удален по правилам сообщества: "${notification.commentPreview}"', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), + ); + } +} + +class _UserSubscribedWidget extends StatelessWidget { + const _UserSubscribedWidget({required this.notification}); + final UserSubscribedNotification notification; + @override + Widget build(BuildContext context) { + return _BaseNotificationWidget( + isRead: notification.isRead, + notificationsText: 'У вас новый подписчик: ${notification.subscriberName}! 👋', + createdAt: notification.createdAt, + onTap: () => (context.findAncestorWidgetOfExactType() as NotificationWidget)._onTap(context), ); } } diff --git a/lib/features/notifications/service/notifications_service.dart b/lib/features/notifications/service/notifications_service.dart index 1fd5e4d6..c934fb53 100644 --- a/lib/features/notifications/service/notifications_service.dart +++ b/lib/features/notifications/service/notifications_service.dart @@ -413,6 +413,78 @@ class NotificationsService { isRead: readDate != null, createdAt: createdAt, ), + NotificationType.consultantEducationUpdated => ConsultantEducationUpdatedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.complaintRegistered => ComplaintRegisteredNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.contentUnpublished => ContentUnpublishedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.contentUnpublishedComplaint => ContentUnpublishedNotification.fromJson( // Reusing ContentUnpublishedNotification if structure is same, or create specific if different. Assuming similar for now or check backend. + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.financeQuestionCreated => FinanceQuestionCreatedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.newChatMessage => NewChatMessageNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.completeRegistration => CompleteRegistrationNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.chosenDietExpired => ChosenDietExpiredNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.motivateUser => MotivateUserNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.commentComplaint => CommentComplaintNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.commentDeleted => CommentDeletedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), + NotificationType.userSubscribed => UserSubscribedNotification.fromJson( + notificationJson['data'], + type, + isRead: readDate != null, + createdAt: createdAt, + ), NotificationType.unknown => UnknownNotification(type: type, createdAt: parseDate(createdAt)), }; } catch (e) { diff --git a/lib/features/plans/presentation/pages/about_plan_screen.dart b/lib/features/plans/presentation/pages/about_plan_screen.dart index 03e94814..283ef0fc 100644 --- a/lib/features/plans/presentation/pages/about_plan_screen.dart +++ b/lib/features/plans/presentation/pages/about_plan_screen.dart @@ -32,10 +32,18 @@ import 'package:go_router/go_router.dart'; import '../../../../core/widgets/option_widget.dart'; class AboutPlanScreen extends StatefulWidget { - const AboutPlanScreen({super.key, required this.slug, required this.navigateToComments, required this.index}); final String slug; final bool navigateToComments; final int? index; + final int? highlightedCommentId; + + const AboutPlanScreen({ + super.key, + required this.slug, + required this.navigateToComments, + required this.index, + this.highlightedCommentId, + }); @override State createState() => _AboutPlanScreenState(); } @@ -468,13 +476,14 @@ class _AboutPlanScreenState extends State { ), const SizedBox(height: 16), if (commentsState is CommentsStateLoading) const Loader(), - if (commentsState is CommentsStateLoaded) - CommentsWidget( - id: state.planModel?.id.toString() ?? '', - commentSourceType: CommentSourceType.plan, - comment: commentsState.comment, - replyId: replyId, - ), + if (commentsState is CommentsStateLoaded) + CommentsWidget( + id: state.planModel?.id.toString() ?? '', + commentSourceType: CommentSourceType.plan, + comment: commentsState.comment, + replyId: replyId, + highlightedCommentId: widget.highlightedCommentId, + ), ], ), ), diff --git a/lib/features/recipe/presentation/pages/about_recipe_screen.dart b/lib/features/recipe/presentation/pages/about_recipe_screen.dart index a5448a86..ff9e4f0a 100644 --- a/lib/features/recipe/presentation/pages/about_recipe_screen.dart +++ b/lib/features/recipe/presentation/pages/about_recipe_screen.dart @@ -36,8 +36,9 @@ class AboutRecipeScreen extends StatefulWidget { final String recipeSlug; final int? index; final bool navigateToComments; + final int? highlightedCommentId; - const AboutRecipeScreen({super.key, required this.recipeSlug, required this.index, required this.navigateToComments}); + const AboutRecipeScreen({super.key, required this.recipeSlug, required this.index, required this.navigateToComments, this.highlightedCommentId}); @override State createState() => _AboutRecipeScreenState(); @@ -391,6 +392,7 @@ class _AboutRecipeScreenState extends State { commentSourceType: CommentSourceType.recipe, comment: state.comment, replyId: replyId, + highlightedCommentId: widget.highlightedCommentId, ), ], ), diff --git a/test/features/diets/presentation/pages/about_diet_screen_smoke_test.dart b/test/features/diets/presentation/pages/about_diet_screen_smoke_test.dart index a09bfe1d..18546734 100644 --- a/test/features/diets/presentation/pages/about_diet_screen_smoke_test.dart +++ b/test/features/diets/presentation/pages/about_diet_screen_smoke_test.dart @@ -101,7 +101,7 @@ void main() { registerMocks(cubit, commentsCubit); - await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false))); + await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false, highlightedCommentId: null))); await tester.pump(); expect(find.byType(AboutDietScreen), findsOneWidget); @@ -127,7 +127,7 @@ void main() { registerMocks(cubit, commentsCubit); await mockNetworkImagesFor(() async { - await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false))); + await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false, highlightedCommentId: null))); await tester.pump(); await tester.pump(const Duration(milliseconds: 600)); }); @@ -157,7 +157,7 @@ void main() { registerMocks(cubit, commentsCubit); await mockNetworkImagesFor(() async { - await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false))); + await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false, highlightedCommentId: null))); await tester.pump(); await tester.pump(const Duration(milliseconds: 600)); }); @@ -183,7 +183,7 @@ void main() { registerMocks(cubit, commentsCubit); - await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false))); + await tester.pumpWidget(wrap(cubit, feedCubit, commentsCubit, const AboutDietScreen(slug: 'test', id: null, index: null, navigateToComments: false, highlightedCommentId: null))); await tester.pump(); expect(find.byType(AboutDietScreen), findsOneWidget); diff --git a/test/features/notifications/models/notification_model_test.dart b/test/features/notifications/models/notification_model_test.dart index 28b21566..cb7504ec 100644 --- a/test/features/notifications/models/notification_model_test.dart +++ b/test/features/notifications/models/notification_model_test.dart @@ -124,7 +124,7 @@ void main() { }); test('UnknownNotification uses default createdAt when not provided', () { - final notification = UnknownNotification(type: NotificationType.unknown); + final notification = UnknownNotification(type: NotificationType.unknown, createdAt: DateTime.now()); expect(notification.type, NotificationType.unknown); expect(notification.isRead, true); diff --git a/test/features/notifications/presentation/widgets/notification_widget_test.dart b/test/features/notifications/presentation/widgets/notification_widget_test.dart index f624993a..d6a8025d 100644 --- a/test/features/notifications/presentation/widgets/notification_widget_test.dart +++ b/test/features/notifications/presentation/widgets/notification_widget_test.dart @@ -160,6 +160,8 @@ void main() { type: NotificationType.chosenPlanStartedToConsultant, planName: 'Test Plan', customerName: 'Test Customer', + planId: 1, + customerId: 1, isRead: false, createdAt: testDate, ); @@ -586,6 +588,8 @@ void main() { type: NotificationType.stayOnTrackToAuthor, planName: 'Test Plan', clientName: 'Test Client', + planId: 1, + clientId: 1, isRead: false, createdAt: testDate, ); @@ -752,6 +756,8 @@ void main() { type: NotificationType.stayOnTrackToCustomer, planName: 'Test Plan', consultantName: 'Test Consultant', + planId: 1, + consultantId: 1, isRead: false, createdAt: testDate, ); diff --git a/test/features/plans/presentation/pages/about_plan_screen_smoke_test.dart b/test/features/plans/presentation/pages/about_plan_screen_smoke_test.dart index 32f67e95..4fa46bb3 100644 --- a/test/features/plans/presentation/pages/about_plan_screen_smoke_test.dart +++ b/test/features/plans/presentation/pages/about_plan_screen_smoke_test.dart @@ -123,7 +123,7 @@ void main() { registerMocks(planCubit, commentsCubit); - await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null))); + await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null, highlightedCommentId: null))); await tester.pump(); expect(find.byType(AboutPlanScreen), findsOneWidget); @@ -149,7 +149,7 @@ void main() { registerMocks(planCubit, commentsCubit); await mockNetworkImagesFor(() async { - await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null))); + await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null, highlightedCommentId: null))); await tester.pump(); await tester.pump(); }); @@ -177,7 +177,7 @@ void main() { registerMocks(planCubit, commentsCubit); - await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null))); + await tester.pumpWidget(wrap(planCubit, feedCubit, commentsCubit, const AboutPlanScreen(slug: 'test', navigateToComments: false, index: null, highlightedCommentId: null))); await tester.pump(); expect(find.byType(AboutPlanScreen), findsOneWidget); From d4f41fe6cfac4c78bfc7cf385e2e7403a0ed5bbd Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 16 Feb 2026 12:46:55 +0300 Subject: [PATCH 02/37] feat: implement recipe drafting functionality and refactor MyRecipesTab to be stateless --- .gitignore | 3 +- .../create_recipe_cubit.dart | 33 +++++ .../create_recipe_state.dart | 2 + .../pages/recipe_create_screen.dart | 104 ++++++++++---- .../widgets/ingredients_widget.dart | 8 ++ .../reporitories/recipe_repository.dart | 127 +++++++++++------- .../services/recipe_service.dart | 10 +- .../my_recipes_cubit/my_recieps_cubit.dart | 12 ++ .../presentation/pages/my_recipes_screen.dart | 45 +++++-- .../widgets/my_recipe_widget.dart | 106 +++++++++++---- .../presentation/widgets/my_recipes_tab.dart | 51 +++---- .../reporitories/recipe_repository_test.dart | 29 ++-- .../widgets/my_recipes_tab_test.dart | 11 +- 13 files changed, 388 insertions(+), 153 deletions(-) diff --git a/.gitignore b/.gitignore index 530ea713..0d94aecf 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ env/.env .env android/key.properties app/upload-keystore.jks -coverage/ \ No newline at end of file +coverage/ +eatvio/ \ No newline at end of file diff --git a/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart b/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart index 8f7bca23..482d7d56 100644 --- a/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart +++ b/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart @@ -172,6 +172,23 @@ class CreateRecipeCubit extends Cubit { } } + Future saveAsDraft([bool update = false, String? slug]) async { + try { + final model = state.entity.toModel(); + await recipeRepository.saveAsDraft(model, update, slug); + emit(state.copyWith(drafted: true)); + return true; + } catch (e, st) { + await Sentry.captureException(e, stackTrace: st); + log(e.toString(), stackTrace: st); + return false; + } + } + + bool validateForDraft() { + return validateAll(); + } + Future downloadImageAsFile(String imageUrl) async { final response = await http.get(Uri.parse(imageUrl)); @@ -239,6 +256,7 @@ class CreateRecipeCubit extends Cubit { final isActiveCookTimeValid = validateActiveCookTime(); final isEnergyPerServingsValid = validateEnergyPerServing(); + final isIngredientsValid = validateIngredients(); final isStepsValid = validateSteps(); return isTitleValid && @@ -248,8 +266,19 @@ class CreateRecipeCubit extends Cubit { isCookTimeValid && isActiveCookTimeValid && isEnergyPerServingsValid && + isIngredientsValid && isStepsValid; } + + bool validateIngredients() { + if (state.entity.ingredients.isEmpty) { + emit(state.copyWith(ingredientsValidationError: 'Добавьте хотя бы один ингредиент')); + return false; + } else { + emit(state.copyWith(ingredientsValidationError: null)); + return true; + } + } bool validateTitle() { if (state.entity.title == null || (state.entity.title?.isEmpty ?? true)) { @@ -343,6 +372,10 @@ class CreateRecipeCubit extends Cubit { bool validateSteps() { bool isValid = true; + if (state.entity.steps.isEmpty) { + emit(state.copyWith(stepsValidationError: 'Добавьте хотя бы один шаг')); + return false; + } for (var step in state.entity.steps) { if (step.description == null || step.description!.trim().isEmpty) { isValid = false; diff --git a/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart b/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart index ef0efe78..23cb9895 100644 --- a/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart +++ b/lib/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart @@ -8,6 +8,7 @@ abstract class CreateRecipeState with _$CreateRecipeState { const factory CreateRecipeState({ required RecipeCreateEntity entity, required bool loading, + @Default(false) bool drafted, String? titleValidationError, String? descriptionValidationError, String? cookingTimeValidationError, @@ -16,6 +17,7 @@ abstract class CreateRecipeState with _$CreateRecipeState { String? energyPerServingValidationError, String? imageValidationError, String? stepsValidationError, + String? ingredientsValidationError, }) = _CreateRecipeState; } diff --git a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart index 932852ac..1538dc57 100644 --- a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart +++ b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart @@ -81,55 +81,107 @@ class _RecipeCreateScreenState extends State { builder: (context, state) { return Builder( builder: (context) { - return _isRecipeBeingPublished - ? const Center(child: Loader()) - : InkWell( - key: AppKeys.recipeCreateScreenPublishButton, + if (_isRecipeBeingPublished) { + return const Center(child: Loader()); + } + return Column( + children: [ + InkWell( + key: AppKeys.recipeCreateScreenPublishButton, + onTap: () async { + setState(() { + _isRecipeBeingPublished = true; + }); + if (context.read().validateAll()) { + final isSuccess = await context.read().publishRecipe( + widget.recipe == null ? false : true, + widget.recipe?.slug, + ); + setState(() { + _isRecipeBeingPublished = false; + }); + if (isSuccess) { + Future.delayed(const Duration(milliseconds: 500), () { + if (!context.mounted) return; + context.pop(); + showBottomSheetWithBlur( + userRootNavigator: true, + context: context, + child: SuccessPublishedRecipeBottomSheet(title: state.entity.title ?? 'Рецепт'), + ); + }); + } else { + if (!context.mounted) return; + showErrorDialog(context, title: '${s.could_not_publish_recipe} ${state.entity.title}'); + } + } else { + setState(() { + _isRecipeBeingPublished = false; + }); + } + }, + borderRadius: BorderRadius.circular(20), + child: Ink( + width: MediaQuery.of(context).size.width - 32, + decoration: BoxDecoration(color: appTheme.blueA400, borderRadius: BorderRadius.circular(20)), + child: Container( + padding: const EdgeInsets.all(16), + alignment: Alignment.center, + child: Text( + widget.recipe != null ? 'Обновить' : 'Опубликовать', + style: const TextStyle(fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), + ), + ), + ), + ), + const SizedBox(height: 12), + if (widget.recipe == null || widget.recipe?.state == 'drafted') + InkWell( onTap: () async { setState(() { _isRecipeBeingPublished = true; }); - if (context.read().validateAll()) { - final isSuccess = await context.read().publishRecipe( - widget.recipe == null ? false : true, - widget.recipe?.slug, - ); + if (context.read().validateForDraft()) { + final isSuccess = await context.read().saveAsDraft( + widget.recipe == null ? false : true, + widget.recipe?.slug, + ); setState(() { _isRecipeBeingPublished = false; }); if (isSuccess) { - Future.delayed(const Duration(milliseconds: 500), () { - if (!context.mounted) return; - context.pop(); - showBottomSheetWithBlur( - userRootNavigator: true, - context: context, - child: SuccessPublishedRecipeBottomSheet(title: state.entity.title ?? 'Рецепт'), - ); - }); + if (!context.mounted) return; + context.pop(); } else { if (!context.mounted) return; - showErrorDialog(context, title: '${s.could_not_publish_recipe} ${state.entity.title}'); + showErrorDialog(context, title: 'Не удалось сохранить черновик'); } + } else { + setState(() { + _isRecipeBeingPublished = false; + }); } - setState(() { - _isRecipeBeingPublished = false; - }); }, borderRadius: BorderRadius.circular(20), child: Ink( width: MediaQuery.of(context).size.width - 32, - decoration: BoxDecoration(color: appTheme.blueA400, borderRadius: BorderRadius.circular(20)), + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: appTheme.blueA400), + ), child: Container( padding: const EdgeInsets.all(16), alignment: Alignment.center, child: Text( - widget.recipe != null ? 'Обновить' : 'Опубликовать', - style: const TextStyle(fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), + 'Сохранить как черновик', + style: TextStyle(fontSize: 16, color: appTheme.blueA400, fontWeight: FontWeight.w600), ), ), ), - ); + ), + ], + ); }, ); }, diff --git a/lib/features/create_recipe/presentation/widgets/ingredients_widget.dart b/lib/features/create_recipe/presentation/widgets/ingredients_widget.dart index 4b3261ab..6894c162 100644 --- a/lib/features/create_recipe/presentation/widgets/ingredients_widget.dart +++ b/lib/features/create_recipe/presentation/widgets/ingredients_widget.dart @@ -85,6 +85,14 @@ class _IngredientsWidgetState extends State { title: Text('Добавить ингредиент', style: TextStyle(color: appTheme.blueA400)), leading: Icon(Icons.add_rounded, color: appTheme.blueA400), ), + if (state.ingredientsValidationError != null) + Padding( + padding: const EdgeInsets.only(left: 16, top: 4), + child: Text( + state.ingredientsValidationError!, + style: const TextStyle(color: Colors.red, fontSize: 12), + ), + ), ], ), ), diff --git a/lib/features/create_recipe/reporitories/recipe_repository.dart b/lib/features/create_recipe/reporitories/recipe_repository.dart index b1b5fce9..f079d810 100644 --- a/lib/features/create_recipe/reporitories/recipe_repository.dart +++ b/lib/features/create_recipe/reporitories/recipe_repository.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:eatvio_app/core/image_compressing/image_compress_utility.dart'; @@ -23,55 +24,59 @@ class RecipeRepository { } } - Future publishRecipe(RecipeModel recipe, [bool update = false, String? slug]) async { - try { - if (recipe.image == null || (recipe.image?.isEmpty ?? true)) { - return; - } - final image = await ImageCompressUtility.compressFile(File(recipe.image ?? '')); - final multiPartFile = await MultipartFile.fromFile(image.path); + Future _buildFormData(RecipeModel recipe, {String state = 'active'}) async { + if (recipe.image == null || (recipe.image?.isEmpty ?? true)) { + throw Exception('Recipe image is required'); + } + final image = await ImageCompressUtility.compressFile(File(recipe.image ?? '')); + final multiPartFile = await MultipartFile.fromFile(image.path); - final ingredientsMap = recipe.ingredients?.map((ingredient) { - if (ingredient != null) { - return ingredient.toJson(); - } - }).toList() ?? - []; - - final stepsMap = []; - for (final Step? step in recipe.steps ?? []) { - if (step != null) { - if ((step.image == null || (step.image?.isEmpty ?? true)) && step.description != null) { - stepsMap.add({ - 'description_md': step.description ?? "", - }); - } else if (step.image != null && (step.image?.isNotEmpty ?? false)) { - final image = await ImageCompressUtility.compressFile(File(step.image ?? '')); - final multipartFile = await MultipartFile.fromFile(image.path); - stepsMap.add({ - 'description_md': step.description ?? "", - 'image': multipartFile, - }); + final ingredientsMap = recipe.ingredients?.map((ingredient) { + if (ingredient != null) { + return ingredient.toJson(); } + }).toList() ?? + []; + + final stepsMap = []; + for (final Step? step in recipe.steps ?? []) { + if (step != null) { + if ((step.image == null || (step.image?.isEmpty ?? true)) && step.description != null) { + stepsMap.add({ + 'description_md': step.description ?? "", + }); + } else if (step.image != null && (step.image?.isNotEmpty ?? false)) { + final image = await ImageCompressUtility.compressFile(File(step.image ?? '')); + final multipartFile = await MultipartFile.fromFile(image.path); + stepsMap.add({ + 'description_md': step.description ?? "", + 'image': multipartFile, + }); } } - final formMap = { - 'type': recipe.type, - 'state': 'active', - 'title': recipe.title, - 'tags[]': recipe.tags ?? [], - 'description_md': recipe.description, - 'video_url': recipe.videoUrl, - 'ingredients': ingredientsMap, - 'steps': stepsMap, - 'cooking_time': recipe.totalCookingTime, - 'active_time': recipe.activeCookTime, - 'image': multiPartFile, - 'servings': recipe.servings, - 'energy_per_serving': recipe.energyPerServing, - }; - formMap.removeWhere((k, v) => v == null || (v is String && v.isEmpty)); - final formData = FormData.fromMap(formMap); + } + final formMap = { + 'type': recipe.type, + 'state': state, + 'title': recipe.title, + 'tags[]': recipe.tags ?? [], + 'description_md': recipe.description, + 'video_url': recipe.videoUrl, + 'ingredients': ingredientsMap, + 'steps': stepsMap, + 'cooking_time': recipe.totalCookingTime, + 'active_time': recipe.activeCookTime, + 'image': multiPartFile, + 'servings': recipe.servings, + 'energy_per_serving': recipe.energyPerServing, + }; + formMap.removeWhere((k, v) => v == null || (v is String && v.isEmpty)); + return FormData.fromMap(formMap); + } + + Future publishRecipe(RecipeModel recipe, [bool update = false, String? slug]) async { + try { + final formData = await _buildFormData(recipe, state: 'active'); if (update) { await recipeService.updateRecipe(slug: slug!, formData: formData); } else { @@ -83,6 +88,38 @@ class RecipeRepository { } } + Future saveAsDraft(RecipeModel recipe, [bool update = false, String? slug]) async { + try { + final formData = await _buildFormData(recipe, state: 'archived'); + log(formData.fields.toString()); + if (update) { + final response = await recipeService.updateRecipe(slug: slug!, formData: formData); + final recipeId = response.data['data']?['id'] ?? response.data['id']; + if (recipeId != null) { + await recipeService.draftRecipe(id: recipeId as int); + } + } else { + final response = await recipeService.publishRecipe(formData: formData); + final recipeId = response.data['data']?['id'] ?? response.data['id']; + if (recipeId != null) { + await recipeService.draftRecipe(id: recipeId as int); + } + } + } catch (e, s) { + await Sentry.captureException(e, stackTrace: s); + rethrow; + } + } + + Future draftExistingRecipe(int id) async { + try { + await recipeService.draftRecipe(id: id); + } catch (e, s) { + await Sentry.captureException(e, stackTrace: s); + rethrow; + } + } + Future getRecipe(String recipeID) async { try { return await recipeService.getRecipe(recipeID); diff --git a/lib/features/create_recipe/services/recipe_service.dart b/lib/features/create_recipe/services/recipe_service.dart index 41ee957a..199c7d54 100644 --- a/lib/features/create_recipe/services/recipe_service.dart +++ b/lib/features/create_recipe/services/recipe_service.dart @@ -2,6 +2,7 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/features/create_recipe/models/recipe_model.dart'; import 'package:eatvio_app/features/create_recipe/models/recipe_tag_model.dart'; import 'package:retrofit/retrofit.dart'; +import 'package:retrofit/http.dart'; import 'package:eatvio_app/features/create_recipe/models/product.dart'; part 'recipe_service.g.dart'; @@ -33,7 +34,7 @@ abstract class CreateRecipeService { @POST('/api/recipes/create') @MultiPart() - Future publishRecipe({ + Future> publishRecipe({ @Body() required FormData formData, }); @@ -47,8 +48,13 @@ abstract class CreateRecipeService { @POST('/api/recipes/update/{slug}') @MultiPart() - Future updateRecipe({ + Future> updateRecipe({ @Path() required String slug, @Body() required FormData formData, }); + + @POST('/api/recipes/draft/{id}') + Future draftRecipe({ + @Path() required int id, + }); } diff --git a/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart b/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart index 44481c3a..2ab45971 100644 --- a/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart +++ b/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart @@ -11,6 +11,7 @@ class MyRecipesCubit extends Cubit { static const String active = 'active'; static const String archived = 'archived'; + static const String drafted = 'drafted'; MyRecipesCubit({ required this.myRecipesRepository, @@ -50,6 +51,17 @@ class MyRecipesCubit extends Cubit { } } + Future setDraftedState() async { + emit(const MyRecipesState.loading()); + try { + final myRecipes = await myRecipesRepository.getMyRecipes(); + final List draftedRecipes = myRecipes.where((recipe) => recipe.state == drafted).toList(); + emit(MyRecipesState.loaded(recipes: draftedRecipes, selectedState: drafted)); + } catch (e) { + emit(const MyRecipesState.error()); + } + } + Future getRecipeById(String slug) async { return await aboutRecipeRepository.getRecipe(slug); } diff --git a/lib/features/recipe/presentation/pages/my_recipes_screen.dart b/lib/features/recipe/presentation/pages/my_recipes_screen.dart index c3e29db5..1f276cf6 100644 --- a/lib/features/recipe/presentation/pages/my_recipes_screen.dart +++ b/lib/features/recipe/presentation/pages/my_recipes_screen.dart @@ -4,6 +4,7 @@ import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/presentation/widgets/my_recipe_widget.dart'; +import 'package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -32,15 +33,41 @@ class MyRecipesScreen extends StatelessWidget { create: (BuildContext context) => sl()..getMyRecipes(), child: BlocBuilder( builder: (BuildContext context, MyRecipesState state) { - if (state is MyRecipesStateLoaded) { - return ListView.separated( - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => MyRecipeWidget(recipe: state.recipes[index]), - separatorBuilder: (context, index) => const SizedBox(height: 12), - itemCount: state.recipes.length, - ); - } - return Container(); + return Column( + children: [ + MyRecipesTab( + selectedIndex: state is MyRecipesStateLoaded + ? (state.selectedState == MyRecipesCubit.drafted ? 1 : 0) + : 0, + onTabChanged: (index) { + if (index == 0) { + context.read().setActiveState(); + } else { + context.read().setDraftedState(); + } + }, + ), + Expanded( + child: state is MyRecipesStateLoaded + ? state.recipes.isEmpty + ? Center( + child: Text( + state.selectedState == MyRecipesCubit.drafted + ? 'Нет черновиков' + : 'Нет опубликованных рецептов', + style: TextStyles.textLMedium.copyWith(color: appTheme.gray500), + ), + ) + : ListView.separated( + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: (context, index) => MyRecipeWidget(recipe: state.recipes[index]), + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemCount: state.recipes.length, + ) + : const Center(child: CircularProgressIndicator()), + ), + ], + ); }, ), ), diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart index c30aebc1..a47b6161 100644 --- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart +++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart @@ -12,6 +12,8 @@ import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/m import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.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/pages/recipe_create_screen.dart'; import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; @@ -99,11 +101,7 @@ class _MyRecipeWidgetState extends State { ? '${widget.recipe.description.substring(0, 200)}...' : widget.recipe.description; - return MarkdownHtmlWidget( - markdownText: description, - fontSize: TextStyles.textSMedium.fontSize ?? 14, - textColor: appTheme.black, - ); + return MarkdownHtmlWidget(markdownText: description, fontSize: TextStyles.textSMedium.fontSize ?? 14, textColor: appTheme.black); }, ), ), @@ -126,7 +124,13 @@ class _MyRecipeWidgetState extends State { return; } showSuccessToast('Рецепт удален'); - if (context.mounted) context.read().getMyRecipes(); + if (context.mounted) { + if (isDraft) { + context.read().setDraftedState(); + } else { + context.read().getMyRecipes(); + } + } }, text: 'Удалить', height: 52, @@ -140,30 +144,83 @@ class _MyRecipeWidgetState extends State { ), const SizedBox(width: 8), Expanded( - child: CustomOutlinedButton( - onPressed: () async { - final box = context.findRenderObject() as RenderBox?; - await SharePlus.instance.share( - ShareParams( - uri: Uri.parse('${sl().baseUrl}/ru/recipe/${widget.recipe.slug}'), - sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + child: PopupMenuButton( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + offset: const Offset(0, 50), + itemBuilder: (context) => [ + if (!isDraft) + PopupMenuItem( + onTap: () async { + final box = context.findRenderObject() as RenderBox?; + await SharePlus.instance.share( + ShareParams( + uri: Uri.parse('${sl().baseUrl}/ru/recipe/${widget.recipe.slug}'), + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + ), + ); + }, + child: Row( + children: [ + Icon(Icons.share, size: 20, color: appTheme.black), + const SizedBox(width: 8), + Text(S.of(context).share, style: TextStyles.textSMedium), + ], + ), ), - ); - }, - height: 52, - width: 52, - buttonStyle: ButtonStyle( - shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.circular(20))), - backgroundColor: WidgetStatePropertyAll(appTheme.blueA400), - side: const WidgetStatePropertyAll(BorderSide.none), + if (widget.recipe.state == 'active' || isDraft) + PopupMenuItem( + onTap: () { + context.push(RecipeCreateScreen.path, extra: widget.recipe); + }, + child: Row( + children: [ + Icon(Icons.edit, size: 20, color: appTheme.black), + const SizedBox(width: 8), + Text(S.of(context).edit, style: TextStyles.textSMedium), + ], + ), + ), + ], + child: CustomOutlinedButton( + onPressed: () {}, + height: 52, + width: 52, + buttonStyle: ButtonStyle( + shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.circular(20))), + backgroundColor: WidgetStatePropertyAll(appTheme.blueA400), + side: const WidgetStatePropertyAll(BorderSide.none), + ), + text: isDraft ? '...' : s.share, + buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700), ), - text: s.share, - buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700), ), ), ], ), const SizedBox(height: 8), + if (isDraft) + Padding( + padding: const EdgeInsets.only(top: 12), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () { + // Publish draft + context.read().publishRecipe(true, widget.recipe.slug).then((success) { + if (success) { + context.read().setDraftedState(); + } + }); + }, + style: ElevatedButton.styleFrom( + backgroundColor: appTheme.blueA400, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: Text('Опубликовать', style: TextStyles.textSMedium.copyWith(color: Colors.white)), + ), + ), + ), ], ), ), @@ -172,6 +229,8 @@ class _MyRecipeWidgetState extends State { ); } + bool get isDraft => widget.recipe.state == 'drafted'; + Container _iconButton(String iconPath, [String? text]) { return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), @@ -192,4 +251,3 @@ class _MyRecipeWidgetState extends State { ); } } - diff --git a/lib/features/recipe/presentation/widgets/my_recipes_tab.dart b/lib/features/recipe/presentation/widgets/my_recipes_tab.dart index f6de8669..af68f89e 100644 --- a/lib/features/recipe/presentation/widgets/my_recipes_tab.dart +++ b/lib/features/recipe/presentation/widgets/my_recipes_tab.dart @@ -4,30 +4,21 @@ import 'package:eatvio_app/core/widgets/animated_option_button.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/widgets.dart'; -class MyRecipesTab extends StatefulWidget { - const MyRecipesTab({super.key, this.additionalOnTap}); +class MyRecipesTab extends StatelessWidget { + const MyRecipesTab({ + super.key, + required this.selectedIndex, + required this.onTabChanged, + }); - final void Function()? additionalOnTap; - - @override - State createState() => _MyRecipesTabState(); -} - -class _MyRecipesTabState extends State { - final List tabTitles = []; - - @override - void didChangeDependencies() { - final s = S.of(context); - if (tabTitles.isEmpty) { - tabTitles.add(s.published); - tabTitles.add(s.drafted); - } - super.didChangeDependencies(); - } + final int selectedIndex; + final ValueChanged onTabChanged; @override Widget build(BuildContext context) { + final s = S.of(context); + final tabTitles = [s.published, s.drafted]; + return Align( alignment: Alignment.centerLeft, child: Row( @@ -44,18 +35,14 @@ class _MyRecipesTabState extends State { children: [ ...List.generate( 2, - (index) => - Expanded( - child: AnimatedOptionButton( - textStyle: TextStyles.textSMedium, - isSelected: false, // state.selectedStateIndex == index, - text: tabTitles[index], - onTap: () { - widget.additionalOnTap?.call(); - // context.read().changeSelectedStateIndex(index); - }, - ), - ), + (index) => Expanded( + child: AnimatedOptionButton( + textStyle: TextStyles.textSMedium, + isSelected: selectedIndex == index, + text: tabTitles[index], + onTap: () => onTabChanged(index), + ), + ), ), ], ), diff --git a/test/features/create_recipe/reporitories/recipe_repository_test.dart b/test/features/create_recipe/reporitories/recipe_repository_test.dart index 95cb1462..4a82a264 100644 --- a/test/features/create_recipe/reporitories/recipe_repository_test.dart +++ b/test/features/create_recipe/reporitories/recipe_repository_test.dart @@ -10,8 +10,15 @@ import 'package:eatvio_app/features/create_recipe/services/recipe_service.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:retrofit/retrofit.dart'; + class MockCreateRecipeService extends Mock implements CreateRecipeService {} +final mockHttpResponse = HttpResponse( + null, + Response(requestOptions: RequestOptions(path: ''), statusCode: 200), +); + void main() { setUpAll(() { registerFallbackValue(FormData()); @@ -109,7 +116,7 @@ void main() { test('deleteRecipe - удаляет рецепт', () async { const slug = 'recipe-slug'; - when(() => mockService.deleteRecipe(slug: slug)).thenAnswer((_) async => Future.value()); + when(() => mockService.deleteRecipe(slug: slug)).thenAnswer((_) async => Future.value(mockHttpResponse)); await repository.deleteRecipe(slug); @@ -188,7 +195,7 @@ void main() { // Мокируем ImageCompressUtility.compressFile // Это сложно, так как это статический метод, но мы можем проверить, что вызывается updateRecipe when(() => mockService.updateRecipe(slug: slug, formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); // Этот тест может упасть из-за ImageCompressUtility, но мы проверяем логику try { @@ -216,7 +223,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -243,7 +250,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -270,7 +277,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -297,7 +304,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -364,7 +371,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -399,7 +406,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -435,7 +442,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -472,7 +479,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); @@ -499,7 +506,7 @@ void main() { ); when(() => mockService.publishRecipe(formData: any(named: 'formData'))) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); try { await repository.publishRecipe(recipe); diff --git a/test/features/recipe/presentation/widgets/my_recipes_tab_test.dart b/test/features/recipe/presentation/widgets/my_recipes_tab_test.dart index efba34ba..58d21ef1 100644 --- a/test/features/recipe/presentation/widgets/my_recipes_tab_test.dart +++ b/test/features/recipe/presentation/widgets/my_recipes_tab_test.dart @@ -7,7 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('MyRecipesTab smoke', () { - Widget wrap(Widget child) { + Widget wrap() { return MaterialApp( theme: ThemeHelper().themeData(), localizationsDelegates: const [ @@ -17,12 +17,17 @@ void main() { GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [Locale('ru')], - home: Scaffold(body: child), + home: Material( + child: MyRecipesTab( + selectedIndex: 0, + onTabChanged: (_) {}, + ), + ), ); } testWidgets('renders my recipes tab', (tester) async { - await tester.pumpWidget(wrap(const MyRecipesTab())); + await tester.pumpWidget(wrap()); await tester.pump(); expect(find.byType(MyRecipesTab), findsOneWidget); From 6e7894b9115c47b80b7b17910230b9d397b1fff4 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 16 Feb 2026 12:48:08 +0300 Subject: [PATCH 03/37] build: Remove `eatvio/` from `.gitignore`. --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0d94aecf..530ea713 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,4 @@ env/.env .env android/key.properties app/upload-keystore.jks -coverage/ -eatvio/ \ No newline at end of file +coverage/ \ No newline at end of file From 5b149e2fd2eecc53463098a12bb50c7c2df04e06 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 16 Feb 2026 18:16:26 +0300 Subject: [PATCH 04/37] refactor: Corrected typo in `MyRecipesCubit` filename and updated related tests, widgets, services, and DI registrations. --- lib/core/di/cubit_registrations.dart | 2 +- .../services/recipe_service.dart | 1 - ...cieps_cubit.dart => my_recipes_cubit.dart} | 0 .../presentation/pages/my_recipes_screen.dart | 2 +- .../widgets/my_recipe_widget.dart | 4 +- temp_analyze_output.txt | 2 + temp_test_output.txt | 92 +++ temp_test_output_recipes.txt | 1 + .../create_recipe_cubit_test.dart | 1 + .../reporitories/recipe_repository_test.dart | 6 +- .../services/recipe_service_test.dart | 6 +- .../my_recipes_cubit_test.dart | 2 +- .../pages/my_recipes_screen_smoke_test.dart | 16 +- .../widgets/my_recipe_widget_test.dart | 2 +- .../cubit/my_recipes_cubit_test.dart | 2 +- test_failures.txt | 57 ++ test_results.txt | 663 ++++++++++++++++++ 17 files changed, 845 insertions(+), 14 deletions(-) rename lib/features/recipe/presentation/cubit/my_recipes_cubit/{my_recieps_cubit.dart => my_recipes_cubit.dart} (100%) create mode 100644 temp_analyze_output.txt create mode 100644 temp_test_output.txt create mode 100644 temp_test_output_recipes.txt create mode 100644 test_failures.txt create mode 100644 test_results.txt diff --git a/lib/core/di/cubit_registrations.dart b/lib/core/di/cubit_registrations.dart index 7b12e0fb..ad4ce637 100644 --- a/lib/core/di/cubit_registrations.dart +++ b/lib/core/di/cubit_registrations.dart @@ -45,7 +45,7 @@ import 'package:eatvio_app/features/profile/presentation/bloc/plans_cubit/plans_ import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart'; import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/about_recipe_cubit.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_cubit.dart'; import 'package:eatvio_app/features/registration_v2/cubit/registration_cubit.dart'; diff --git a/lib/features/create_recipe/services/recipe_service.dart b/lib/features/create_recipe/services/recipe_service.dart index 199c7d54..2341d1d2 100644 --- a/lib/features/create_recipe/services/recipe_service.dart +++ b/lib/features/create_recipe/services/recipe_service.dart @@ -2,7 +2,6 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/features/create_recipe/models/recipe_model.dart'; import 'package:eatvio_app/features/create_recipe/models/recipe_tag_model.dart'; import 'package:retrofit/retrofit.dart'; -import 'package:retrofit/http.dart'; import 'package:eatvio_app/features/create_recipe/models/product.dart'; part 'recipe_service.g.dart'; diff --git a/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart b/lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart similarity index 100% rename from lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart rename to lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart diff --git a/lib/features/recipe/presentation/pages/my_recipes_screen.dart b/lib/features/recipe/presentation/pages/my_recipes_screen.dart index 1f276cf6..4c409ea7 100644 --- a/lib/features/recipe/presentation/pages/my_recipes_screen.dart +++ b/lib/features/recipe/presentation/pages/my_recipes_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/presentation/widgets/my_recipe_widget.dart'; import 'package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart'; diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart index a47b6161..941971fa 100644 --- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart +++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart @@ -8,7 +8,7 @@ import 'package:eatvio_app/core/utils/toasts.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/models/my_recipe_model.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -207,7 +207,7 @@ class _MyRecipeWidgetState extends State { onPressed: () { // Publish draft context.read().publishRecipe(true, widget.recipe.slug).then((success) { - if (success) { + if (success && context.mounted) { context.read().setDraftedState(); } }); diff --git a/temp_analyze_output.txt b/temp_analyze_output.txt new file mode 100644 index 00000000..693739d0 --- /dev/null +++ b/temp_analyze_output.txt @@ -0,0 +1,2 @@ +Analyzing create_recipe, recipe, create_recipe, recipe... +No issues found! diff --git a/temp_test_output.txt b/temp_test_output.txt new file mode 100644 index 00000000..a39d9c57 --- /dev/null +++ b/temp_test_output.txt @@ -0,0 +1,92 @@ + 00:00 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:01 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:02 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:03 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:04 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:05 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:05 +0: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +1: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +2: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +3: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +4: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +5: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +6: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +7: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +8: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +9: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +10: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +11: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +12: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +13: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:05 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:05 +15: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:05 +16: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:05 +17: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +17: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +18: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +19: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +20: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:06 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +22: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +23: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +24: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +25: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +26: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:06 +26: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:06 +27: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:06 +27: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +28: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +29: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +30: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +31: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +32: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +33: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:06 +33: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:07 +33: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:07 +34: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:07 +34: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:07 +35: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:07 +35: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:07 +36: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:07 +36: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:07 +37: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:07 +37: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:07 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:07 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display loading state 00:07 +39: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag создает RecipeTag с правильными значениями 00:07 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:07 +41: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:07 +42: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:07 +43: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:07 +44: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag toJson serializes RecipeTag correctly 00:07 +45: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:07 +46: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:07 +47: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:07 +47: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:07 +48: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:07 +48: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:07 +49: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:07 +49: loading /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart 00:07 +49: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:07 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:07 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:07 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:07 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:07 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:07 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:07 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:07 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:07 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:07 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:07 +55: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:08 +55: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:08 +55: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart 00:08 +55: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:08 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:08 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:08 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:08 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:08 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:08 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:08 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:08 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:08 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:08 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:08 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:08 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:08 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:08 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:08 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:08 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:08 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:08 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:08 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:08 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:08 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:08 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:08 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:08 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:08 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:08 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:08 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:08 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:08 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:08 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:08 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:08 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:08 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:08 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:08 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:08 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:08 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:08 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:08 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:08 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:08 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:08 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:08 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:08 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:08 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:08 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:08 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:08 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:08 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:08 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:08 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:08 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:08 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:08 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:08 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:08 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:08 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:08 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:08 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:08 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:08 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:08 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:08 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:08 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:08 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:08 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:08 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:08 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:08 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:08 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:08 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:08 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:08 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:08 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:08 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:08 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:08 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:08 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:08 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:08 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:08 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:08 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:08 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:08 +97: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart 00:08 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke (setUpAll) 00:09 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke (setUpAll) 00:09 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +98: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +99: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +100: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +101: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:10 +102: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:10 +103: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:11 +103: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:11 +104: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:11 +105: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:11 +106: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/info_about_recipe_widget_test.dart: InfoAboutRecipeWidget smoke renders info about recipe widget 00:11 +107: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:11 +108: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +108: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +109: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +110: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +111: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +112: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +113: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +114: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +115: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +116: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +117: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +118: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +119: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +120: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +121: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +122: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +123: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +124: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +125: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +126: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +127: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +128: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +129: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +130: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +131: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +132: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:12 +133: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +134: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +135: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +136: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +137: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +138: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:12 +138: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke (tearDownAll) 00:13 +138: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke (tearDownAll) 00:13 +138: loading /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart 00:13 +138: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +138: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +139: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +140: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +141: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +142: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +143: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +144: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +145: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +146: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:14 +147: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:14 +148: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:14 +149: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:14 +150: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:14 +151: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:14 +152: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +152: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +153: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +154: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +155: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +156: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +157: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +158: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:15 +159: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:15 +160: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should update calories when user types in calories field 00:15 +161: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:15 +162: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:15 +163: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +163: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +164: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +165: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +166: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +167: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +168: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +169: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +170: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:16 +171: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:16 +172: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:16 +173: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +173: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +174: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +175: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +176: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +177: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +178: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +179: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +180: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +181: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen 00:17 +182: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:17 +183: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:17 +184: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:17 +185: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:17 +186: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:18 +186: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:18 +187: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/ingredients_widget_test.dart: IngredientsWidget smoke renders ingredients widget 00:18 +188: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +189: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +190: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +191: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +192: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +193: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +194: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +195: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +196: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +197: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +198: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +199: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +200: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +201: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:18 +202: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:19 +202: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:19 +203: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:19 +204: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:19 +205: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:19 +206: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:19 +207: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:19 +208: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:19 +209: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:19 +210: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:20 +210: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:20 +211: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:20 +212: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:20 +213: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display app bar with correct title for new recipe 00:20 +214: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:20 +215: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:21 +215: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:21 +216: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:21 +216: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:22 +216: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:23 +216: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:23 +217: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:23 +217: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:23 +218: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:23 +218: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:24 +218: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:24 +219: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:24 +219: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - обработка ошибки 00:24 +220: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - обработка ошибки 00:24 +220: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - не выполняет действие если state не loaded 00:24 +221: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - не выполняет действие если state не loaded 00:24 +221: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - не выполняет действие если state не loaded 00:24 +222: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - не выполняет действие если state не loaded 00:24 +222: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - не выполняет действие если state не loaded 00:24 +223: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - не выполняет действие если state не loaded 00:24 +223: All tests passed! + 00:00 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:01 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:02 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:4:8: Error: Error when reading 'lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart': No such file or directory +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; + ^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:19:5: Error: 'MyRecipesCubit' isn't a type. + MyRecipesCubit? myRecipesCubit; + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:99:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:107:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:127:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:141:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:161:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:175:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:195:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:209:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ +test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:225:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + 00:03 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:03 +0 -1: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart [E] + Failed to load "/home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart": + Compilation failed for testPath=/home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:4:8: Error: Error when reading 'lib/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart': No such file or directory + import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; + ^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:19:5: Error: 'MyRecipesCubit' isn't a type. + MyRecipesCubit? myRecipesCubit; + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:99:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:107:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:127:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:141:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:161:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:175:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:195:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:209:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart:225:24: Error: Method not found: 'MyRecipesCubit'. + myRecipesCubit = MyRecipesCubit( + ^^^^^^^^^^^^^^ + . + +To run this test again: /home/alexander/fvm/versions/3.38.9/bin/cache/dart-sdk/bin/dart test /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart -p vm --plain-name 'loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart' + Error: The Dart compiler exited unexpectedly. + package:flutter_tools/src/base/common.dart 34:3 throwToolExit + package:flutter_tools/src/compile.dart 911:11 DefaultResidentCompiler._compile. + dart:async/zone.dart 1538:47 _rootRunUnary + dart:async/zone.dart 1429:19 _CustomZone.runUnary + dart:async/future_impl.dart 948:45 Future._propagateToListeners.handleValueCallback + dart:async/future_impl.dart 977:13 Future._propagateToListeners + dart:async/future_impl.dart 862:9 Future._propagateToListeners + dart:async/future_impl.dart 720:5 Future._completeWithValue + dart:async/future_impl.dart 804:7 Future._asyncCompleteWithValue. + dart:async/zone.dart 1525:13 _rootRun + dart:async/zone.dart 1422:19 _CustomZone.run + dart:async/zone.dart 1321:7 _CustomZone.runGuarded + dart:async/zone.dart 1362:23 _CustomZone.bindCallbackGuarded. + dart:async/schedule_microtask.dart 40:35 _microtaskLoop + dart:async/schedule_microtask.dart 49:5 _startMicrotaskLoop + dart:isolate-patch/isolate_patch.dart 127:13 _runPendingImmediateCallback + dart:isolate-patch/isolate_patch.dart 194:5 _RawReceivePort._handleMessage + + 00:06 +0 -1: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart 00:06 +0 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit начальное состояние - initial state 00:06 +1 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit начальное состояние - initial state 00:06 +1 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - загружает рецепты успешно 00:07 +1 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - загружает рецепты успешно 00:07 +2 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - загружает рецепты успешно 00:07 +2 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - обрабатывает ошибку 00:07 +3 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:07 +4 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:07 +5 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:07 +6 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +6 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +7 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +8 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +9 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +10 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +11 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +12 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +13 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:08 +14 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +15 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +16 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +17 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +18 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +19 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +20 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +21 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:08 +22 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests StepsWidget should display StepsWidget with steps 00:08 +23 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +24 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +25 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +26 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +27 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +28 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +29 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +30 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:08 +31 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +31 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +32 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +33 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +34 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +35 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +36 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:09 +37 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:09 +38 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:09 +39 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:09 +39 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loaded state 00:09 +40 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loaded state 00:09 +40 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with error state 00:09 +41 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with error state 00:09 +41 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:09 +42 -1: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:09 +42 -1: Some tests failed. diff --git a/temp_test_output_recipes.txt b/temp_test_output_recipes.txt new file mode 100644 index 00000000..87d22b46 --- /dev/null +++ b/temp_test_output_recipes.txt @@ -0,0 +1 @@ + 00:00 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:01 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:02 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:03 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:04 +0: loading /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart 00:04 +0: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit начальное состояние - loading 00:04 +1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit начальное состояние - loading 00:04 +1: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - загружает активные рецепты 00:04 +2: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - загружает активные рецепты 00:04 +2: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - обрабатывает ошибку 00:05 +2: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - обрабатывает ошибку 00:05 +3: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - обрабатывает ошибку 00:05 +3: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit setActiveState - устанавливает активное состояние 00:05 +4: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit начальное состояние - initial state 00:05 +5: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit setActiveState - обрабатывает ошибку 00:05 +6: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - загружает рецепты успешно 00:05 +7: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit setArchivedState - устанавливает архивное состояние 00:05 +8: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit loadRecipesList - обрабатывает ошибку 00:05 +9: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit setArchivedState - обрабатывает ошибку 00:05 +10: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit setArchivedState - обрабатывает ошибку 00:05 +11: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:06 +11: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:06 +12: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:06 +13: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should create RecipesCubit successfully 00:06 +14: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:06 +15: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit likeRecipe - лайкает рецепт 00:06 +16: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +17: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +18: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +19: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +20: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +21: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +22: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:06 +23: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +23: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +24: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +25: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +26: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +27: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +28: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/widgets_test.dart: Recipes Widgets Tests IngredientsWidget should display IngredientsWidget with ingredients 00:07 +29: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +30: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +31: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +32: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +33: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +34: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +35: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +36: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +37: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +38: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:07 +39: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:07 +40: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: ... Widget Tests should display RecipesWidget with description when description is present 00:07 +41: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/recipes_cubit_test.dart: RecipesCubit deleteRecipe - удаляет рецепт 00:07 +42: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +43: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +44: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +45: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +46: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +47: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget structure correctly 00:07 +47: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:08 +47: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:08 +48: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loading state 00:08 +48: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loaded state 00:08 +49: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with loaded state 00:08 +49: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with error state 00:08 +50: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with error state 00:08 +50: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:09 +50: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:09 +51: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:09 +51: All tests passed! diff --git a/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart b/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart index 241a9a91..2fb3fb7b 100644 --- a/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart +++ b/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart @@ -433,6 +433,7 @@ void main() { final tempFile = File('${Directory.systemTemp.path}/test_image.jpg'); await tempFile.writeAsBytes([1, 2, 3]); cubit.replaceImage(tempFile); + cubit.addIngredient(const i.Ingredient(name: 'Test Ingredient', unit: 'gr', portion: '100', productId: 1)); cubit.replaceDescriptionInStep('Step 1 description', 0); expect(cubit.validateAll(), true); diff --git a/test/features/create_recipe/reporitories/recipe_repository_test.dart b/test/features/create_recipe/reporitories/recipe_repository_test.dart index 4a82a264..8392d3b7 100644 --- a/test/features/create_recipe/reporitories/recipe_repository_test.dart +++ b/test/features/create_recipe/reporitories/recipe_repository_test.dart @@ -116,7 +116,7 @@ void main() { test('deleteRecipe - удаляет рецепт', () async { const slug = 'recipe-slug'; - when(() => mockService.deleteRecipe(slug: slug)).thenAnswer((_) async => Future.value(mockHttpResponse)); + when(() => mockService.deleteRecipe(slug: slug)).thenAnswer((_) async => Future.value()); await repository.deleteRecipe(slug); @@ -147,7 +147,7 @@ void main() { energyPerServing: 300, ); - await repository.publishRecipe(recipe); + expect(() => repository.publishRecipe(recipe), throwsException); // Методы не должны вызываться, так как изображение отсутствует verifyNever(() => mockService.publishRecipe(formData: any(named: 'formData'))); @@ -169,7 +169,7 @@ void main() { energyPerServing: 300, ); - await repository.publishRecipe(recipe); + expect(() => repository.publishRecipe(recipe), throwsException); // Методы не должны вызываться, так как изображение пустое verifyNever(() => mockService.publishRecipe(formData: any(named: 'formData'))); diff --git a/test/features/create_recipe/services/recipe_service_test.dart b/test/features/create_recipe/services/recipe_service_test.dart index 022eb89a..e9b0f900 100644 --- a/test/features/create_recipe/services/recipe_service_test.dart +++ b/test/features/create_recipe/services/recipe_service_test.dart @@ -9,6 +9,10 @@ import 'package:mockito/mockito.dart'; import 'recipe_service_test.mocks.dart'; +import 'package:retrofit/retrofit.dart'; + +final mockHttpResponse = HttpResponse(null, Response(requestOptions: RequestOptions())); + @GenerateNiceMocks([MockSpec()]) void main() { group('CreateRecipeService', () { @@ -77,7 +81,7 @@ void main() { final formData = FormData.fromMap({}); when(mockCreateRecipeService.publishRecipe(formData: formData)) - .thenAnswer((_) async => Future.value()); + .thenAnswer((_) async => Future.value(mockHttpResponse)); await mockCreateRecipeService.publishRecipe(formData: formData); diff --git a/test/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit_test.dart b/test/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit_test.dart index a77e0a7f..3bd1f05f 100644 --- a/test/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit_test.dart +++ b/test/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit_test.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/features/recipe/models/my_recipe_model.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/repositories/about_recipe_repository.dart'; import 'package:eatvio_app/features/recipe/repositories/my_recipes_repository.dart'; diff --git a/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart b/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart index fac14897..ebd26e01 100644 --- a/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart +++ b/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart @@ -2,11 +2,13 @@ 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/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/presentation/pages/my_recipes_screen.dart'; +import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -26,7 +28,17 @@ void main() { }); Widget wrap(Widget child) { - return MaterialApp(theme: ThemeHelper().themeData(), home: child); + return MaterialApp( + theme: ThemeHelper().themeData(), + localizationsDelegates: const [ + S.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: S.delegate.supportedLocales, + home: child, + ); } testWidgets('renders my recipes screen', (tester) async { diff --git a/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart b/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart index 52fca10f..caa91380 100644 --- a/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart +++ b/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart @@ -5,7 +5,7 @@ import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_state.dart'; import 'package:eatvio_app/features/recipe/models/my_recipe_model.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/presentation/widgets/my_recipe_widget.dart'; import 'package:eatvio_app/generated/l10n.dart'; diff --git a/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart b/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart index 267e5191..e116dc1e 100644 --- a/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart +++ b/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/features/feed/models/recipes_model.dart'; import 'package:eatvio_app/features/recipe/models/my_recipe_model.dart'; -import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart'; +import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_cubit.dart'; import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recipes_state.dart'; import 'package:eatvio_app/features/recipe/repositories/about_recipe_repository.dart'; import 'package:eatvio_app/features/recipe/repositories/my_recipes_repository.dart'; diff --git a/test_failures.txt b/test_failures.txt new file mode 100644 index 00000000..a655442b --- /dev/null +++ b/test_failures.txt @@ -0,0 +1,57 @@ + 00:00 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:01 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:02 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:02 +0: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:02 +1: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:02 +1: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +2: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +3: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +4: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +5: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +6: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +7: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +8: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +9: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +10: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +11: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +12: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +13: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +15: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +16: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +17: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +18: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +19: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +20: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:03 +22: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:03 +22: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:03 +23: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:03 +23: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:03 +24: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_create_model_test.dart: RecipeType enum has all expected values 00:03 +25: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +26: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +27: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +28: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +29: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +29: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:03 +30: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:03 +30: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:03 +31: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:03 +31: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:03 +32: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:03 +32: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +33: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +34: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +35: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +36: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +37: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display loading state 00:03 +39: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display loading state 00:03 +39: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:03 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:03 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +41: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +41: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:04 +42: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:04 +42: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:04 +43: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:04 +43: loading /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart 00:04 +43: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag создает RecipeTag с правильными значениями 00:04 +44: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag создает RecipeTag с правильными значениями 00:04 +44: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel создает RecipeTagModel с правильными значениями 00:04 +45: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel создает RecipeTagModel с правильными значениями 00:04 +45: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel fromJson создает RecipeTagModel из JSON 00:04 +46: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel fromJson создает RecipeTagModel из JSON 00:04 +46: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag fromJson создает RecipeTag из JSON 00:04 +47: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag fromJson создает RecipeTag из JSON 00:04 +47: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag toJson serializes RecipeTag correctly 00:04 +48: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag toJson serializes RecipeTag correctly 00:04 +48: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel toJson serializes RecipeTagModel correctly 00:04 +49: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel toJson serializes RecipeTagModel correctly 00:04 +49: loading /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart 00:04 +49: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:04 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:04 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:04 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:04 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:04 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:04 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:04 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:04 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:04 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:04 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:04 +55: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:04 +55: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart 00:04 +55: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:04 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:04 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:04 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:04 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:04 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:04 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:04 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:04 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:04 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:04 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:04 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:04 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:04 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:04 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:04 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:04 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:04 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:04 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:04 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:04 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:04 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:04 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:04 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:04 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:04 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:04 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:04 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:04 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:04 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:04 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:04 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:04 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:04 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:04 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:04 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:04 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:04 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:04 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:04 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:04 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:04 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:04 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:04 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:04 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:04 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:04 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:04 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:04 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:04 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:04 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:04 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:04 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:04 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:04 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:04 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:04 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:04 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:04 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:04 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:04 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:04 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:04 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:04 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:04 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:04 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:04 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:04 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:04 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:04 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:04 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:04 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:04 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:04 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:04 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:04 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:04 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:05 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:05 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:05 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:05 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:05 +97: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke (setUpAll) 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +98: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +99: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +100: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:06 +101: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +101: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +102: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +103: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +104: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +105: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +106: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +107: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +108: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +109: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +110: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +111: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +112: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +113: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +114: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +115: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +116: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +117: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +118: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +119: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +120: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +121: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +122: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +123: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +124: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +125: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +126: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +127: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +128: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +129: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +130: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +131: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +132: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +133: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +134: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +135: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +136: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +137: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:08 +137: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:08 +138: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +139: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +140: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +141: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +142: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +143: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +144: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +145: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +146: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:09 +146: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:09 +147: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +148: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +149: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +150: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +151: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +152: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +153: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +154: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +155: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +156: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +157: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +158: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +159: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +160: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:09 +161: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +161: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +162: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +163: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +164: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +165: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +166: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +167: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +168: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +169: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +170: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +171: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +172: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +173: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +174: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +174: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The relevant error-causing widget was: +This is considered an error condition because it indicates that there is content that cannot be +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. + Test failed. See exception logs above. +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The relevant error-causing widget was: +This is considered an error condition because it indicates that there is content that cannot be +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. + Test failed. See exception logs above. + 00:11 +178 -2: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +178 -2: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with error state +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The relevant error-causing widget was: +This is considered an error condition because it indicates that there is content that cannot be +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +Failed assertion: line 47 pos 7: 'instance != null' +The relevant error-causing widget was: +When the exception was thrown, this was the stack: +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. + 00:11 +178 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with error state [E] + Test failed. See exception logs above. + The test description was: renders my recipes screen with error state +To run this test again: /home/alexander/fvm/versions/3.38.9/bin/cache/dart-sdk/bin/dart test /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart -p vm --plain-name 'MyRecipesScreen smoke renders my recipes screen with error state' + 00:11 +178 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +179 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +180 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +181 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +182 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +183 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +184 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +184 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +185 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +186 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +187 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +188 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +189 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +190 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +191 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +192 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +193 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +194 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +195 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +196 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +197 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +198 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +199 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +200 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +201 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - загружает активные рецепты 00:12 +202 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:12 +203 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:13 +203 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:13 +204 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +205 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +206 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +207 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +208 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +209 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +210 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +211 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +212 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +213 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +214 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +215 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +216 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +217 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +218 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +219 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +219 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +220 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +221 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +222 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +223 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +224 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +225 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +226 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +227 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +228 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +229 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +230 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +231 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +232 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +233 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +234 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +235 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +236 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +237 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +238 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +239 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +240 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +241 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +242 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +243 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +244 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +245 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +246 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +247 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +248 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +249 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +250 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +251 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +252 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +253 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +253 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +254 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +255 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +256 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +257 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +258 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +259 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +260 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +261 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +262 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +263 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +264 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +265 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +266 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +267 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +268 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +269 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +270 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +271 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +272 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +273 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +274 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +275 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +276 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +277 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +278 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +279 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +280 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +281 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +282 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +283 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +284 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +285 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +286 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +287 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +288 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +289 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +290 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +291 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +292 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +293 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +294 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +295 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +296 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +297 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +298 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +298 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +299 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +300 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +301 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +302 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +303 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +304 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +305 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +306 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +307 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +308 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +309 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +310 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +310 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +311 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +312 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +313 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +314 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +315 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +316 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +317 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +318 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +319 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +320 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +321 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +322 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +323 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +324 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +325 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +326 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +327 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +328 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +329 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +330 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +331 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +331 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +332 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +333 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +334 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +335 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +336 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +337 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +338 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +339 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +340 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +341 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +342 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +343 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +344 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +345 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +346 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +347 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +348 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +349 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +350 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +351 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +352 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +352 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:17 +353 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:17 +353 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +354 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +355 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +356 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +357 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +358 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +359 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +359 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +360 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +361 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +362 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +363 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +364 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +365 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +366 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +367 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +368 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +369 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +370 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +371 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +372 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +373 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +374 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +375 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +376 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +377 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +378 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +379 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +380 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +381 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +382 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +383 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +384 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +385 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:19 +386 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadDiets - обработка ошибки 00:19 +387 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadDiets - обработка ошибки 00:19 +388 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit начальное состояние - loading 00:19 +389 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обработка ошибки 00:19 +390 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +391 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +392 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +393 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +394 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +395 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +396 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +397 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +398 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +399 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обрабатывает ошибку 00:19 +400 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обрабатывает ошибку 00:19 +401 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:19 +402 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +402 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +403 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +404 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +405 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +406 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +407 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +408 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +409 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +410 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +411 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +412 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +413 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже на последней странице 00:20 +414 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadPlans - обработка ошибки 00:20 +415 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +416 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +417 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +418 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +419 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже загружается 00:20 +420 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже загружается 00:20 +421 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +421 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +422 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +423 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +424 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +425 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - убирает лайк 00:21 +426 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit loadNextPage - загружает следующую страницу 00:21 +427 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit loadNextPage - загружает следующую страницу 00:21 +428 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +428 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +429 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +430 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit addDietToFavorite - добавляет диету в избранное 00:21 +431 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:21 +432 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +432 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +433 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +434 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +435 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +436 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +437 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +438 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +439 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +440 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +441 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +442 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +443 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +444 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +445 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +446 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +447 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +448 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +448 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +449 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +450 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +451 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +452 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +453 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +454 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +455 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +456 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +456 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/basic_widget_test.dart: Feed Basic Widget Tests should display BlogPosts widget with loaded state diff --git a/test_results.txt b/test_results.txt new file mode 100644 index 00000000..6558de97 --- /dev/null +++ b/test_results.txt @@ -0,0 +1,663 @@ + 00:00 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:01 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:02 +0: loading /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart 00:02 +0: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:02 +1: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should create CreateRecipeCubit successfully 00:02 +1: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +2: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +3: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +4: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +5: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +6: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +7: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +8: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +9: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +10: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +11: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +12: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +13: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:02 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +14: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +15: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +16: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +17: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +18: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +19: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +20: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display basic form fields 00:03 +21: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:03 +22: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update title when user types in title field 00:03 +22: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:03 +23: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update description when user types in description field 00:03 +23: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update portions when user types in portions field 00:03 +24: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_create_model_test.dart: RecipeType enum has all expected values 00:03 +25: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +26: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +27: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +28: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +29: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should update calories when user types in calories field 00:03 +29: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:03 +30: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form labels correctly 00:03 +30: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:03 +31: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display placeholder text in title field 00:03 +31: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:03 +32: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display publish button 00:03 +32: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +33: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +34: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +35: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +36: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +37: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should handle button tap 00:03 +38: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display loading state 00:03 +39: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display loading state 00:03 +39: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:03 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display error message 00:03 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +40: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +41: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display success message 00:04 +41: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:04 +42: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should validate required fields 00:04 +42: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:04 +43: /home/alexander/eatvio_app/test/features/create_recipe/basic_widget_test.dart: Recipe Creation Basic Widget Tests should display form with all required fields 00:04 +43: loading /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart 00:04 +43: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag создает RecipeTag с правильными значениями 00:04 +44: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag создает RecipeTag с правильными значениями 00:04 +44: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel создает RecipeTagModel с правильными значениями 00:04 +45: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel создает RecipeTagModel с правильными значениями 00:04 +45: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel fromJson создает RecipeTagModel из JSON 00:04 +46: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel fromJson создает RecipeTagModel из JSON 00:04 +46: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag fromJson создает RecipeTag из JSON 00:04 +47: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag fromJson создает RecipeTag из JSON 00:04 +47: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag toJson serializes RecipeTag correctly 00:04 +48: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTag toJson serializes RecipeTag correctly 00:04 +48: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel toJson serializes RecipeTagModel correctly 00:04 +49: /home/alexander/eatvio_app/test/features/create_recipe/models/recipe_tag_model_test.dart: RecipeTagModel toJson serializes RecipeTagModel correctly 00:04 +49: loading /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart 00:04 +49: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:04 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с правильными значениями 00:04 +50: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:04 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step создает Step с null значениями 00:04 +51: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:04 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON 00:04 +52: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:04 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step fromJson создает Step из JSON с null значениями 00:04 +53: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:04 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step correctly 00:04 +54: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:04 +55: /home/alexander/eatvio_app/test/features/create_recipe/models/step_test.dart: Step toJson serializes Step with null values correctly 00:04 +55: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart 00:04 +55: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:04 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit initial state has default values 00:04 +56: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:04 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addStep adds a new empty step 00:04 +57: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:04 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeStep removes provided step 00:04 +58: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:04 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addIngredient appends ingredient to list 00:04 +59: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:04 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit removeIngredient removes ingredient by index 00:04 +60: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:04 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit updateIngredient replaces ingredient at index 00:04 +61: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:04 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceIngredientPosition moves ingredient 00:04 +62: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:04 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle and replaceDescription update entity 00:04 +63: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:04 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit addTag and removeTag work correctly 00:04 +64: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:04 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit portion and energy setters update entity 00:04 +65: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:04 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit replaceVideoUrl and replaceImage update entity 00:04 +66: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:04 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceDescriptionInStep and replaceImageInStep update step 00:04 +67: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:04 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit disableLoading sets loading to false 00:04 +68: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:04 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit changeType updates type of recipe 00:04 +69: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:04 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... replaceTitle with empty string sets title to null 00:04 +70: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:04 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... with empty string sets description to null 00:04 +71: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:04 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - успешно публикует рецепт 00:04 +72: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:04 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обновляет рецепт 00:04 +73: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:04 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit publishRecipe - обрабатывает ошибку 00:04 +74: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:04 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - успешно удаляет рецепт 00:04 +75: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:04 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit deleteRecipe - обрабатывает ошибку 00:04 +76: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:04 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... getGlossaryListByQuery - получает список глоссария 00:04 +77: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:04 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateTitle - возвращает false для null 00:04 +78: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:04 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для пустой строки 00:04 +79: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:04 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает false для короткого названия 00:04 +80: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:04 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateTitle - возвращает true для валидного названия 00:04 +81: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:04 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для null 00:04 +82: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:04 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает false для пустой строки 00:04 +83: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:04 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false для короткого описания 00:04 +84: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:04 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateDescription - возвращает true для валидного описания 00:04 +85: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:04 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateServings - возвращает false для null 00:04 +86: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:04 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateServings - возвращает true для валидного значения 00:04 +87: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:04 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateEnergyPerServing - возвращает false для null 00:04 +88: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:04 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true для валидного значения 00:04 +89: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:04 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда оба поля null 00:04 +90: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:04 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда хотя бы одно поле заполнено 00:04 +91: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:04 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает false когда одно из полей null 00:04 +92: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:04 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... - возвращает true когда оба поля заполнены 00:04 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +93: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: CreateRecipeCubit validateImage - возвращает false для null 00:05 +94: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:05 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateImage - возвращает true для валидного изображения 00:05 +95: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:05 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает false когда не все поля валидны 00:05 +96: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit_test.dart: ... validateAll - возвращает true когда все поля валидны 00:05 +97: loading /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke (setUpAll) 00:05 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +97: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +98: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +99: /home/alexander/eatvio_app/test/features/create_recipe/presentation/pages/recipe_create_screen_test.dart: RecipeCreateScreen smoke renders recipe create screen - initial state 00:06 +100: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:06 +101: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +101: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +102: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/portion_widget_test.dart: PortionWidget smoke renders portion widget 00:07 +103: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +104: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +105: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +106: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +107: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +108: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +109: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +110: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +111: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +112: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +113: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +114: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +115: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +116: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +117: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +118: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +119: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +120: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +121: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +122: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +123: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +124: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +125: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +126: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +127: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +128: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +129: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +130: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/steps_widget_test.dart: StepsWidget smoke renders steps widget 00:07 +131: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +132: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +133: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +134: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +135: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +136: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:07 +137: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:08 +137: /home/alexander/eatvio_app/test/features/create_recipe/presentation/widgets/time_of_cook_widget_test.dart: TimeOfCookWidget smoke renders time of cook widget 00:08 +138: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +139: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +140: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +141: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +142: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +143: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +144: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +145: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:08 +146: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:09 +146: /home/alexander/eatvio_app/test/features/create_recipe/simple_widget_test.dart: Recipe Creation Widget Tests should display InfoAboutRecipeWidget with all form fields 00:09 +147: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +148: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +149: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +150: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +151: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +152: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +153: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +154: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +155: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +156: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +157: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +158: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +159: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should display all required form fields 00:09 +160: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:09 +161: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +161: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +162: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +163: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +164: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +165: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +166: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - лайк рецепта 00:10 +167: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +168: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +169: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +170: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +171: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +172: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +173: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +174: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:10 +174: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dirty, dependencies: +[_LocalizationsScope-[GlobalKey#5add2]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5802:5) +#8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5796:5) +#9 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#10 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#11 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (9 frames) +#20 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (15 frames) +#35 _InheritedProviderScopeElement.mount (package:provider/src/inherited_provider.dart:424:11) +... Normal element mounting (7 frames) +#42 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (7 frames) +#49 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (25 frames) +#74 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#75 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#76 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (370 frames) +#446 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#447 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#448 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (465 frames) +#913 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#914 Element.updateChild (package:flutter/src/widgets/framework.dart:4053:20) +#915 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#916 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#917 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#918 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#919 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#920 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#921 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#922 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#923 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#924 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#925 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#926 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#927 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#928 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#929 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#930 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#931 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#932 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#933 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#934 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#935 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#936 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#937 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#938 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#939 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#940 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#941 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#942 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#943 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#944 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#945 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#946 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#947 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#948 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#949 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#950 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#951 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#952 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#953 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#954 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#955 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#956 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#957 _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16) +#958 _RawViewElement.update (package:flutter/src/widgets/view.dart:568:5) +#959 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#960 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#961 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#962 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#963 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#964 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#965 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#966 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#967 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#968 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#969 RootElement._rebuild (package:flutter/src/widgets/binding.dart:1782:16) +#970 RootElement.update (package:flutter/src/widgets/binding.dart:1760:5) +#971 RootElement.performRebuild (package:flutter/src/widgets/binding.dart:1774:7) +#972 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#973 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#974 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#975 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#976 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#977 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#978 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#979 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#980 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#983 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#984 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#985 WidgetTester.pumpWidget. (package:flutter_test/src/widget_tester.dart:598:22) +#988 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#989 WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:595:27) +#990 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:44:20) +#991 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:29) + +#992 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The following assertion was thrown during layout: +A RenderFlex overflowed by 99456 pixels on the bottom. + +The relevant error-causing widget was: + Column + Column:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:36:20 + +The overflowing RenderFlex has an orientation of Axis.vertical. +The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and +black striped pattern. This is usually caused by the contents being too big for the RenderFlex. +Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the +RenderFlex to fit within the available space instead of being sized to their natural size. +This is considered an error condition because it indicates that there is content that cannot be +seen. If the content is legitimately bigger than the available space, consider clipping it with a +ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex, +like a ListView. +The specific RenderFlex in question is: RenderFlex#1a36f relayoutBoundary=up1 OVERFLOWING: + creator: Column ← BlocListener ← BlocBuilder ← _InheritedProviderScope ← InheritedProvider ← + BlocProvider ← KeyedSubtree-[GlobalKey#37e81] ← _BodyBuilder ← MediaQuery ← + LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ← _ActionsScope ← ⋯ + parentData: offset=Offset(0.0, 56.0); id=_ScaffoldSlot.body (can use size) + constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=544.0) + size: Size(800.0, 544.0) + direction: vertical + mainAxisAlignment: start + mainAxisSize: max + crossAxisAlignment: center + verticalDirection: down + spacing: 0.0 +◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤ +════════════════════════════════════════════════════════════════════════════════════════════════════ + 00:10 +175: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:11 +175: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:11 +175: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dependencies: +[_LocalizationsScope-[GlobalKey#5add2]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#8 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#9 Element.updateChildren (package:flutter/src/widgets/framework.dart:4194:32) +#10 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7302:17) +#11 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#12 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#13 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#14 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#15 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#16 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#17 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#18 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#19 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#20 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#21 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#22 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#23 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#24 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#25 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#26 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#27 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#30 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#31 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#32 WidgetTester.pump. (package:flutter_test/src/widget_tester.dart:652:53) +#35 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#36 WidgetTester.pump (package:flutter_test/src/widget_tester.dart:652:27) +#37 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:45:20) + +#38 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:15) + +#39 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ + 00:11 +176: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:11 +176: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +The following message was thrown: +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. +════════════════════════════════════════════════════════════════════════════════════════════════════ + 00:11 +176 -1: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen [E] + Test failed. See exception logs above. + The test description was: renders my recipes screen + + +To run this test again: /home/alexander/fvm/versions/3.38.9/bin/cache/dart-sdk/bin/dart test /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart -p vm --plain-name 'MyRecipesScreen smoke renders my recipes screen' + 00:11 +177 -1: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/about_recipe_screen_smoke_test.dart: AboutRecipeScreen smoke renders loading state 00:11 +177 -1: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with loaded state +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dirty, dependencies: +[_LocalizationsScope-[GlobalKey#bd6eb]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5802:5) +#8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5796:5) +#9 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#10 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#11 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (9 frames) +#20 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (15 frames) +#35 _InheritedProviderScopeElement.mount (package:provider/src/inherited_provider.dart:424:11) +... Normal element mounting (7 frames) +#42 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (7 frames) +#49 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (25 frames) +#74 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#75 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#76 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (370 frames) +#446 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#447 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#448 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (465 frames) +#913 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#914 Element.updateChild (package:flutter/src/widgets/framework.dart:4053:20) +#915 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#916 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#917 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#918 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#919 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#920 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#921 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#922 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#923 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#924 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#925 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#926 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#927 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#928 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#929 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#930 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#931 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#932 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#933 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#934 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#935 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#936 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#937 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#938 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#939 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#940 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#941 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#942 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#943 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#944 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#945 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#946 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#947 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#948 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#949 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#950 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#951 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#952 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#953 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#954 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#955 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#956 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#957 _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16) +#958 _RawViewElement.update (package:flutter/src/widgets/view.dart:568:5) +#959 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#960 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#961 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#962 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#963 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#964 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#965 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#966 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#967 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#968 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#969 RootElement._rebuild (package:flutter/src/widgets/binding.dart:1782:16) +#970 RootElement.update (package:flutter/src/widgets/binding.dart:1760:5) +#971 RootElement.performRebuild (package:flutter/src/widgets/binding.dart:1774:7) +#972 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#973 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#974 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#975 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#976 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#977 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#978 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#979 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#980 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#983 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#984 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#985 WidgetTester.pumpWidget. (package:flutter_test/src/widget_tester.dart:598:22) +#988 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#989 WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:595:27) +#990 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:63:20) +#991 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:29) + +#992 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The following assertion was thrown during layout: +A RenderFlex overflowed by 99456 pixels on the bottom. + +The relevant error-causing widget was: + Column + Column:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:36:20 + +The overflowing RenderFlex has an orientation of Axis.vertical. +The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and +black striped pattern. This is usually caused by the contents being too big for the RenderFlex. +Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the +RenderFlex to fit within the available space instead of being sized to their natural size. +This is considered an error condition because it indicates that there is content that cannot be +seen. If the content is legitimately bigger than the available space, consider clipping it with a +ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex, +like a ListView. +The specific RenderFlex in question is: RenderFlex#64d94 relayoutBoundary=up1 OVERFLOWING: + creator: Column ← BlocListener ← BlocBuilder ← _InheritedProviderScope ← InheritedProvider ← + BlocProvider ← KeyedSubtree-[GlobalKey#a68dd] ← _BodyBuilder ← MediaQuery ← + LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ← _ActionsScope ← ⋯ + parentData: offset=Offset(0.0, 56.0); id=_ScaffoldSlot.body (can use size) + constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=544.0) + size: Size(800.0, 544.0) + direction: vertical + mainAxisAlignment: start + mainAxisSize: max + crossAxisAlignment: center + verticalDirection: down + spacing: 0.0 +◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤ +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dependencies: +[_LocalizationsScope-[GlobalKey#bd6eb]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#8 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#9 Element.updateChildren (package:flutter/src/widgets/framework.dart:4194:32) +#10 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7302:17) +#11 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#12 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#13 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#14 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#15 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#16 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#17 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#18 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#19 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#20 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#21 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#22 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#23 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#24 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#25 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#26 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#27 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#30 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#31 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#32 WidgetTester.pump. (package:flutter_test/src/widget_tester.dart:652:53) +#35 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#36 WidgetTester.pump (package:flutter_test/src/widget_tester.dart:652:27) +#37 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:64:20) + +#38 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:15) + +#39 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +The following message was thrown: +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. +════════════════════════════════════════════════════════════════════════════════════════════════════ + 00:11 +177 -2: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with loaded state [E] + Test failed. See exception logs above. + The test description was: renders my recipes screen with loaded state + + +To run this test again: /home/alexander/fvm/versions/3.38.9/bin/cache/dart-sdk/bin/dart test /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart -p vm --plain-name 'MyRecipesScreen smoke renders my recipes screen with loaded state' + 00:11 +178 -2: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +178 -2: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with error state +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dirty, dependencies: +[_LocalizationsScope-[GlobalKey#5fdae]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5802:5) +#8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5796:5) +#9 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#10 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#11 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (9 frames) +#20 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (15 frames) +#35 _InheritedProviderScopeElement.mount (package:provider/src/inherited_provider.dart:424:11) +... Normal element mounting (7 frames) +#42 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (7 frames) +#49 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11) +... Normal element mounting (25 frames) +#74 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#75 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#76 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (370 frames) +#446 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#447 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7269:36) +#448 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7285:32) +... Normal element mounting (465 frames) +#913 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20) +#914 Element.updateChild (package:flutter/src/widgets/framework.dart:4053:20) +#915 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#916 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#917 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#918 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#919 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#920 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#921 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#922 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#923 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#924 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#925 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#926 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#927 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#928 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11) +#929 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#930 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#931 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#932 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#933 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#934 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#935 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#936 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#937 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#938 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#939 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#940 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#941 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#942 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#943 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#944 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#945 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#946 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#947 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#948 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#949 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#950 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#951 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#952 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#953 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#954 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#955 ProxyElement.update (package:flutter/src/widgets/framework.dart:6152:5) +#956 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#957 _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16) +#958 _RawViewElement.update (package:flutter/src/widgets/view.dart:568:5) +#959 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#960 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#961 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#962 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#963 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#964 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#965 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#966 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#967 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#968 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#969 RootElement._rebuild (package:flutter/src/widgets/binding.dart:1782:16) +#970 RootElement.update (package:flutter/src/widgets/binding.dart:1760:5) +#971 RootElement.performRebuild (package:flutter/src/widgets/binding.dart:1774:7) +#972 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#973 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#974 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#975 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#976 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#977 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#978 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#979 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#980 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#983 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#984 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#985 WidgetTester.pumpWidget. (package:flutter_test/src/widget_tester.dart:598:22) +#988 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#989 WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:595:27) +#990 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:81:20) +#991 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:29) + +#992 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ +The following assertion was thrown during layout: +A RenderFlex overflowed by 99456 pixels on the bottom. + +The relevant error-causing widget was: + Column + Column:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:36:20 + +The overflowing RenderFlex has an orientation of Axis.vertical. +The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and +black striped pattern. This is usually caused by the contents being too big for the RenderFlex. +Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the +RenderFlex to fit within the available space instead of being sized to their natural size. +This is considered an error condition because it indicates that there is content that cannot be +seen. If the content is legitimately bigger than the available space, consider clipping it with a +ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex, +like a ListView. +The specific RenderFlex in question is: RenderFlex#b1ec5 relayoutBoundary=up1 OVERFLOWING: + creator: Column ← BlocListener ← BlocBuilder ← _InheritedProviderScope ← InheritedProvider ← + BlocProvider ← KeyedSubtree-[GlobalKey#1a452] ← _BodyBuilder ← MediaQuery ← + LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ← _ActionsScope ← ⋯ + parentData: offset=Offset(0.0, 56.0); id=_ScaffoldSlot.body (can use size) + constraints: BoxConstraints(0.0<=w<=800.0, 0.0<=h<=544.0) + size: Size(800.0, 544.0) + direction: vertical + mainAxisAlignment: start + mainAxisSize: max + crossAxisAlignment: center + verticalDirection: down + spacing: 0.0 +◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤ +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ +The following assertion was thrown building MyRecipesTab(dependencies: +[_LocalizationsScope-[GlobalKey#5fdae]]): +No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates? +'package:eatvio_app/generated/l10n.dart': +Failed assertion: line 47 pos 7: 'instance != null' + +The relevant error-causing widget was: + MyRecipesTab + MyRecipesTab:file:///home/alexander/eatvio_app/lib/features/recipe/presentation/pages/my_recipes_screen.dart:38:17 + +When the exception was thrown, this was the stack: +#2 S.of (package:eatvio_app/generated/l10n.dart:47:7) +#3 MyRecipesTab.build (package:eatvio_app/features/recipe/presentation/widgets/my_recipes_tab.dart:19:17) +#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:5892:49) +#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5820:15) +#6 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#7 StatelessElement.update (package:flutter/src/widgets/framework.dart:5898:5) +#8 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#9 Element.updateChildren (package:flutter/src/widgets/framework.dart:4194:32) +#10 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7302:17) +#11 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#12 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#13 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#14 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#15 StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5) +#16 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15) +#17 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16) +#18 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11) +#19 Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7) +#20 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15) +#21 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11) +#22 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18) +#23 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1506:19) +#24 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5) +#25 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15) +#26 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9) +#27 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1335:9) +#30 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#31 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1324:27) +#32 WidgetTester.pump. (package:flutter_test/src/widget_tester.dart:652:53) +#35 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41) +#36 WidgetTester.pump (package:flutter_test/src/widget_tester.dart:652:27) +#37 main.. (file:///home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart:82:20) + +#38 testWidgets.. (package:flutter_test/src/widget_tester.dart:192:15) + +#39 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1059:5) + + +(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace) + +════════════════════════════════════════════════════════════════════════════════════════════════════ +══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ +The following message was thrown: +Multiple exceptions (3) were detected during the running of the current test, and at least one was +unexpected. +════════════════════════════════════════════════════════════════════════════════════════════════════ + 00:11 +178 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart: MyRecipesScreen smoke renders my recipes screen with error state [E] + Test failed. See exception logs above. + The test description was: renders my recipes screen with error state + + +To run this test again: /home/alexander/fvm/versions/3.38.9/bin/cache/dart-sdk/bin/dart test /home/alexander/eatvio_app/test/features/recipe/presentation/pages/my_recipes_screen_smoke_test.dart -p vm --plain-name 'MyRecipesScreen smoke renders my recipes screen with error state' + 00:11 +178 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +179 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +180 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - убирает лайк если уже лайкнуто 00:11 +181 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +182 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +183 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:11 +184 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +184 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +185 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +186 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +187 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +188 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +189 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +190 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +191 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +192 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +193 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +194 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/widgets/my_recipe_widget_test.dart: MyRecipeWidget smoke renders my recipe widget 00:12 +195 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +196 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +197 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +198 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +199 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +200 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - добавляет рецепт в избранное 00:12 +201 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/cubit/my_recipes_cubit_test.dart: MyRecipesCubit getMyRecipes - загружает активные рецепты 00:12 +202 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:12 +203 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:13 +203 -3: /home/alexander/eatvio_app/test/features/create_recipe/widget_test.dart: RecipeCreateScreen Widget Tests should show validation error for invalid portions 00:13 +204 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +205 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +206 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +207 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +208 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +209 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +210 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +211 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +212 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +213 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +214 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +215 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +216 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +217 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +218 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:13 +219 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +219 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +220 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +221 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +222 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +223 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +224 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +225 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +226 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +227 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +228 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +229 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - удаляет рецепт из избранного 00:14 +230 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +231 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +232 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +233 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +234 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +235 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +236 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display RecipesWidget with recipe title 00:14 +237 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +238 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +239 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +240 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +241 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +242 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +243 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +244 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +245 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +246 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +247 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +248 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +249 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +250 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +251 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +252 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:14 +253 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +253 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +254 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +255 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +256 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +257 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +258 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +259 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +260 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +261 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +262 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +263 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - с recipeIndexInFeed параметром 00:15 +264 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +265 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +266 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +267 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +268 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +269 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +270 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +271 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +272 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +273 -3: /home/alexander/eatvio_app/test/features/recipes/presentation/widgets/basic_widget_test.dart: Recipes Basic Widget Tests should display Recipes widget with multiple recipes 00:15 +274 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +275 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +276 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +277 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +278 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +279 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +280 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +281 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +282 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +283 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +284 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +285 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +286 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +287 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +288 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +289 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +290 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +291 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +292 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +293 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +294 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +295 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +296 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +297 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:15 +298 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +298 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +299 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +300 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +301 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +302 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +303 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +304 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +305 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +306 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +307 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +308 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +309 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +310 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit likeRecipe - обработка ошибки 00:16 +310 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +311 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +312 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +313 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +314 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +315 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +316 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +317 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +318 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +319 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +320 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +321 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +322 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +323 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +324 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +325 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +326 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +327 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +328 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +329 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +330 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:16 +331 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +331 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +332 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +333 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +334 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +335 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +336 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +337 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +338 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +339 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +340 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +341 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +342 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +343 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +344 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +345 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +346 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +347 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +348 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +349 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +350 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +351 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +352 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - с recipeIndex параметром 00:17 +352 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:17 +353 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit addToFavorite - обработка ошибки 00:17 +353 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +354 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +355 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +356 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +357 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +358 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:17 +359 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +359 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +360 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +361 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +362 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +363 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +364 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +365 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +366 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +367 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +368 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +369 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +370 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +371 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +372 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +373 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +374 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +375 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +376 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +377 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +378 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +379 -3: /home/alexander/eatvio_app/test/features/recipe/presentation/cubit/about_recipe_cubit_test.dart: AboutRecipeCubit removeFromFavorite - с recipeIndex параметром 00:18 +380 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +381 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +382 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +383 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +384 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:18 +385 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - успешная загрузка постов 00:19 +386 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadDiets - обработка ошибки 00:19 +387 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadDiets - обработка ошибки 00:19 +388 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit начальное состояние - loading 00:19 +389 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обработка ошибки 00:19 +390 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +391 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +392 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +393 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +394 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +395 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +396 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +397 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +398 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - загружает следующую страницу 00:19 +399 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обрабатывает ошибку 00:19 +400 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadFeedBlogPostList - обрабатывает ошибку 00:19 +401 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:19 +402 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +402 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +403 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +404 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +405 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +406 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +407 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +408 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +409 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +410 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +411 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +412 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit loadNextPage - не загружает если уже загружается 00:20 +413 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже на последней странице 00:20 +414 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadPlans - обработка ошибки 00:20 +415 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +416 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +417 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +418 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - добавляет лайк 00:20 +419 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже загружается 00:20 +420 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/feed_cubit_test.dart: FeedCubit loadNextPage - не загружает если уже загружается 00:20 +421 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +421 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +422 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +423 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +424 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - загружает следующую страницу 00:21 +425 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit likeDiet - убирает лайк 00:21 +426 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit loadNextPage - загружает следующую страницу 00:21 +427 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit loadNextPage - загружает следующую страницу 00:21 +428 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +428 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +429 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/plans_cubit/plans_cubit_test.dart: PlansCubit loadNextPage - не загружает если уже загружается 00:21 +430 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit addDietToFavorite - добавляет диету в избранное 00:21 +431 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:21 +432 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +432 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +433 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +434 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +435 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/pages/feed_screen_smoke_test.dart: FeedScreen smoke renders FeedScreen with all tabs 00:22 +436 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +437 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +438 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +439 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +440 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/diets_cubit/diets_cubit_test.dart: DietsCubit removeDietFromFavorite - убирает диету из избранного 00:22 +441 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +442 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +443 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +444 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/blog_posts_test.dart: BlogPosts smoke renders blog posts widget 00:22 +445 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +446 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +447 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:22 +448 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +448 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +449 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +450 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +451 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +452 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +453 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/bloc/recipes_cubit/recipes_cubit_test.dart: RecipesCubit removeRecipeFromFavorite - удаляет рецепт из избранного 00:23 +454 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +455 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +456 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/chip_group_test.dart: ChipGroup smoke renders chip group 00:23 +456 ~1 -3: /home/alexander/eatvio_app/test/features/feed/presentation/widgets/basic_widget_test.dart: Feed Basic Widget Tests should display BlogPosts widget with loaded state +unhandled element