Files
eatvio_app/test/features/feed/models/recipes_model_test.dart
2026-01-14 18:47:11 +03:00

352 lines
9.0 KiB
Dart

import 'package:eatvio_app/features/feed/models/recipes_model.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('Recipe', () {
test('creates Recipe with all parameters', () {
const author = Author(
authorSlug: 'chef',
authorName: 'Chef Name',
authorProfileIcon: 'icon.jpg',
authorIsMe: false,
isEntitySubscribedByMe: false,
authorPlaceInRating: null,
);
const recipe = Recipe(
id: 1,
image: 'recipe.jpg',
state: 'published',
cookingTime: 30,
activeCookingTime: 15,
ingredients: null,
description: 'Test recipe description',
steps: null,
videoUrl: null,
createdAt: null,
updatedAt: null,
title: 'Test Recipe',
type: 'main',
slug: 'test-recipe',
commentsCount: 5,
wasLikedByMe: false,
isFavorite: false,
calories: 250.0,
servings: 4,
likesCount: 10,
viewsCount: 100,
tags: [],
author: author,
);
expect(recipe.id, 1);
expect(recipe.title, 'Test Recipe');
expect(recipe.slug, 'test-recipe');
expect(recipe.cookingTime, 30);
expect(recipe.calories, 250.0);
expect(recipe.author.authorName, 'Chef Name');
});
test('creates Recipe with ingredients and steps', () {
const author = Author(
authorSlug: 'chef',
authorName: 'Chef',
authorProfileIcon: 'icon.jpg',
authorIsMe: false,
isEntitySubscribedByMe: false,
authorPlaceInRating: null,
);
final ingredients = [
const Ingredient(name: 'Flour', unit: 'cup', portion: '1', productId: 1),
const Ingredient(name: 'Sugar', unit: 'tbsp', portion: '2', productId: 2),
];
final steps = [
const Step(image: 'step1.jpg', description: 'Step 1 description'),
const Step(image: 'step2.jpg', description: 'Step 2 description'),
];
final recipe = Recipe(
id: 1,
image: 'recipe.jpg',
state: 'published',
cookingTime: 30,
activeCookingTime: 15,
ingredients: ingredients,
description: 'Recipe with steps',
steps: steps,
videoUrl: 'video.mp4',
createdAt: DateTime(2023, 1, 1),
updatedAt: DateTime(2023, 1, 2),
title: 'Complete Recipe',
type: 'dessert',
slug: 'complete-recipe',
commentsCount: 10,
wasLikedByMe: true,
isFavorite: true,
calories: 300.0,
servings: 6,
likesCount: 20,
viewsCount: 200,
tags: [const Tag(name: 'sweet'), const Tag(name: 'dessert')],
author: author,
);
expect(recipe.ingredients, isNotNull);
expect(recipe.ingredients!.length, 2);
expect(recipe.steps, isNotNull);
expect(recipe.steps!.length, 2);
expect(recipe.videoUrl, 'video.mp4');
expect(recipe.tags.length, 2);
});
test('creates Recipe from JSON', () {
final json = {
'id': 1,
'image': 'recipe.jpg',
'state': 'published',
'cooking_time': 30,
'active_time': 15,
'ingredients': null,
'description_md': 'Test description',
'steps': null,
'video_url': null,
'created_at': null,
'updated_at': null,
'title': 'Test Recipe',
'type': 'main',
'slug': 'test-recipe',
'total_comments': 5,
'was_liked_by_me': false,
'is_favorite': false,
'energy_per_serving': 250.0,
'servings': 4,
'total_likes': 10,
'total_views': 100,
'tags': [],
'author': {
'author_slug': 'chef',
'author_name': 'Chef',
'author_profile_icon': 'icon.jpg',
'author_is_me': false,
},
};
final recipe = Recipe.fromJson(json);
expect(recipe.id, 1);
expect(recipe.title, 'Test Recipe');
expect(recipe.cookingTime, 30);
});
});
group('Tag', () {
test('creates Tag with name', () {
const tag = Tag(name: 'dessert');
expect(tag.name, 'dessert');
});
test('creates Tag from JSON', () {
final json = {'name': 'sweet'};
final tag = Tag.fromJson(json);
expect(tag.name, 'sweet');
});
});
group('Ingredient', () {
test('creates Ingredient with all parameters', () {
const ingredient = Ingredient(
name: 'Flour',
unit: 'cup',
portion: '1',
productId: 1,
);
expect(ingredient.name, 'Flour');
expect(ingredient.unit, 'cup');
expect(ingredient.portion, '1');
expect(ingredient.productId, 1);
});
test('creates Ingredient with null unit', () {
const ingredient = Ingredient(
name: 'Salt',
unit: null,
portion: 'pinch',
productId: 2,
);
expect(ingredient.unit, null);
});
test('creates Ingredient from JSON with string productId', () {
final json = {
'name': 'Flour',
'unit': 'cup',
'portion': '1',
'product_nutritional_id': '123',
};
final ingredient = Ingredient.fromJson(json);
expect(ingredient.productId, 123);
});
test('creates Ingredient from JSON with int productId', () {
final json = {
'name': 'Sugar',
'unit': 'tbsp',
'portion': '2',
'product_nutritional_id': 456,
};
final ingredient = Ingredient.fromJson(json);
expect(ingredient.productId, 456);
});
});
group('Step', () {
test('creates Step with image and description', () {
const step = Step(
image: 'step1.jpg',
description: 'Step 1 description',
);
expect(step.image, 'step1.jpg');
expect(step.description, 'Step 1 description');
});
test('creates Step from JSON', () {
final json = {
'image': 'step1.jpg',
'description_md': 'Step description',
};
final step = Step.fromJson(json);
expect(step.image, 'step1.jpg');
expect(step.description, 'Step description');
});
test('toJson serializes Step correctly', () {
const step = Step(
image: 'step1.jpg',
description: 'Step description',
);
final json = step.toJson();
expect(json['image'], 'step1.jpg');
expect(json['description_md'], 'Step description');
});
});
group('Recipe', () {
test('toJson serializes Recipe correctly', () {
const author = Author(
authorSlug: 'chef',
authorName: 'Chef Name',
authorProfileIcon: 'icon.jpg',
authorIsMe: false,
isEntitySubscribedByMe: false,
authorPlaceInRating: null,
);
final ingredients = [
const Ingredient(name: 'Flour', unit: 'cup', portion: '1', productId: 1),
];
final steps = [
const Step(image: 'step1.jpg', description: 'Step 1 description'),
];
final recipe = Recipe(
id: 1,
image: 'recipe.jpg',
state: 'published',
cookingTime: 30,
activeCookingTime: 15,
ingredients: ingredients,
description: 'Recipe description',
steps: steps,
videoUrl: 'video.mp4',
createdAt: DateTime(2023, 1, 1),
updatedAt: DateTime(2023, 1, 2),
title: 'Test Recipe',
type: 'main',
slug: 'test-recipe',
commentsCount: 5,
wasLikedByMe: false,
isFavorite: false,
calories: 250.0,
servings: 4,
likesCount: 10,
viewsCount: 100,
tags: [const Tag(name: 'sweet')],
author: author,
);
final json = recipe.toJson();
expect(json['id'], 1);
expect(json['title'], 'Test Recipe');
expect(json['slug'], 'test-recipe');
expect(json['cooking_time'], 30);
expect(json['energy_per_serving'], 250.0);
expect(json.containsKey('ingredients'), isTrue);
expect(json.containsKey('steps'), isTrue);
expect(json.containsKey('tags'), isTrue);
});
});
group('Tag', () {
test('toJson serializes Tag correctly', () {
const tag = Tag(name: 'dessert');
final json = tag.toJson();
expect(json['name'], 'dessert');
});
});
group('Ingredient', () {
test('toJson serializes Ingredient correctly', () {
const ingredient = Ingredient(
name: 'Flour',
unit: 'cup',
portion: '1',
productId: 1,
);
final json = ingredient.toJson();
expect(json['name'], 'Flour');
expect(json['unit'], 'cup');
expect(json['portion'], '1');
expect(json['product_nutritional_id'], 1);
});
test('toJson serializes Ingredient with null unit correctly', () {
const ingredient = Ingredient(
name: 'Salt',
unit: null,
portion: 'pinch',
productId: 2,
);
final json = ingredient.toJson();
expect(json['name'], 'Salt');
expect(json['unit'], isNull);
expect(json['portion'], 'pinch');
});
});
}