Files
eatvio_app/test/features/diary/models/diary_day_model_test.dart

374 lines
10 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:eatvio_app/features/diary/models/diary_day_model.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('PortionState enum', () {
test('has all expected values', () {
expect(PortionState.values.length, 10);
expect(PortionState.filledDiet, isNotNull);
expect(PortionState.eatenFromDiet, isNotNull);
expect(PortionState.eaten, isNotNull);
expect(PortionState.eatenDeleted, isNotNull);
expect(PortionState.eatenEdited, isNotNull);
expect(PortionState.commented, isNotNull);
expect(PortionState.commentedFromDiet, isNotNull);
expect(PortionState.reviewedByUser, isNotNull);
expect(PortionState.reviewedFromDiet, isNotNull);
expect(PortionState.unknown, isNotNull);
});
});
group('PortionModel.fromJson', () {
Map<String, dynamic> portionJson({required String state}) => {
'id': 1,
'product_nutritional_value_id': null,
'product_calories_info': null,
'product_name': 'Oatmeal',
'quantity': 1,
'portion': '100g',
'from_diet': true,
'state': state,
};
test('parses commented_from_diet state', () {
final model = PortionModel.fromJson(
portionJson(state: 'commented_from_diet'),
);
expect(model.portionState, PortionState.commentedFromDiet);
});
test('parses reviewed_from_diet state', () {
final model = PortionModel.fromJson(
portionJson(state: 'reviewed_from_diet'),
);
expect(model.portionState, PortionState.reviewedFromDiet);
});
test('does not throw on unknown state from backend', () {
final model = PortionModel.fromJson(
portionJson(state: 'some_future_state'),
);
expect(model.portionState, PortionState.unknown);
});
});
group('DiaryDayModel.user (владелец дневника)', () {
Map<String, dynamic> diaryJson({Object? user}) => {
'id': 1,
'date': '2026-11-09',
'closed': 0,
'comment': '',
'state': {
'has_chosen_diet': false,
'has_chosen_plan': false,
'last_state': null,
},
'meals': <dynamic>[],
'chosen_plan_id': null,
'day_of_chosen_diet': null,
'chosen_diet': null,
'user': ?user,
};
test('user.slug попадает в entity как ownerSlug', () {
final model = DiaryDayModel.fromJson(
diaryJson(user: {'id': 3577, 'slug': 'id-3577'}),
);
expect(model.owner?.id, 3577);
expect(model.toEntity()!.ownerSlug, 'id-3577');
});
test('старый ответ без user: ownerSlug == null', () {
expect(DiaryDayModel.fromJson(diaryJson()).toEntity()!.ownerSlug, isNull);
});
test('user.slug == null (у владельца нет slug): ownerSlug == null', () {
final model = DiaryDayModel.fromJson(
diaryJson(user: {'id': 1, 'slug': null}),
);
expect(model.toEntity()!.ownerSlug, isNull);
});
});
group('DiaryDayWrapperModel', () {
test('fromJson parses diary correctly', () {
final json = {
'diary': {
'id': 1,
'date': '2024-01-15',
'closed': 0,
'comment': 'Test comment',
'state': {
'has_chosen_diet': false,
'has_chosen_plan': false,
'last_state': null,
},
'meals': [],
'chosen_plan_id': null,
'day_of_chosen_diet': null,
'chosen_diet': null,
},
};
final model = DiaryDayWrapperModel.fromJson(json);
expect(model.diary.id, 1);
expect(model.diary.date, '2024-01-15');
expect(model.diary.comment, 'Test comment');
});
test('toJson serializes diary correctly', () {
const diary = DiaryDayModel(
id: 1,
date: '2024-01-15',
closed: 0,
comment: 'Test comment',
typeOfDiary: TypeOfDiaryModel(
hasChosenDiet: false,
hasChosenPlan: false,
diaryState: null,
),
meals: [],
chosenPlanId: null,
dayOfChosenDiet: null,
diet: null,
);
const model = DiaryDayWrapperModel(diary: diary);
final json = model.toJson();
expect(json, isA<Map<String, dynamic>>());
expect(json.containsKey('diary'), isTrue);
// Freezed may not serialize nested objects automatically, so we just verify the key exists
expect(json['diary'], isNotNull);
});
});
group('DiaryDietModel', () {
test('fromJson parses all fields correctly', () {
final json = {'id': 5, 'duration': 30, 'name': 'Test Diet'};
final model = DiaryDietModel.fromJson(json);
expect(model.id, 5);
expect(model.duration, 30);
expect(model.name, 'Test Diet');
});
test('toJson serializes all fields correctly', () {
const model = DiaryDietModel(id: 5, duration: 30, name: 'Test Diet');
final json = model.toJson();
expect(json['id'], 5);
expect(json['duration'], 30);
expect(json['name'], 'Test Diet');
});
});
group('DiaryPhotoModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 10,
'original_name': 'photo.jpg',
'path': '/path/to/photo.jpg',
'size': 1024,
};
final model = DiaryPhotoModel.fromJson(json);
expect(model.id, 10);
expect(model.originalName, 'photo.jpg');
expect(model.path, '/path/to/photo.jpg');
expect(model.size, 1024);
});
test('toJson serializes all fields correctly', () {
const model = DiaryPhotoModel(
id: 10,
originalName: 'photo.jpg',
path: '/path/to/photo.jpg',
size: 1024,
);
final json = model.toJson();
expect(json['id'], 10);
expect(json['original_name'], 'photo.jpg');
expect(json['path'], '/path/to/photo.jpg');
expect(json['size'], 1024);
});
});
group('ProductCaloriesInfoModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 1,
'product_name': 'Apple',
'energy_on_100gr': 52.0,
'proteins_on_100gr': 0.3,
'fats_on_100gr': 0.2,
'carbohydrates_on_100gr': 14.0,
'energy_on_portion': 26.0,
'proteins_on_portion': 0.15,
'fats_on_portion': 0.1,
'carbohydrates_on_portion': 7.0,
};
final model = ProductCaloriesInfoModel.fromJson(json);
expect(model.id, 1);
expect(model.productName, 'Apple');
expect(model.calories, 52.0);
expect(model.proteins, 0.3);
expect(model.fats, 0.2);
expect(model.carbohydrates, 14.0);
expect(model.energyOnPortion, 26.0);
expect(model.proteinsOnPortion, 0.15);
expect(model.fatsOnPortion, 0.1);
expect(model.carbohydratesOnPortion, 7.0);
});
test('toJson serializes all fields correctly', () {
const model = ProductCaloriesInfoModel(
id: 1,
productName: 'Apple',
calories: 52.0,
proteins: 0.3,
fats: 0.2,
carbohydrates: 14.0,
energyOnPortion: 26.0,
proteinsOnPortion: 0.15,
fatsOnPortion: 0.1,
carbohydratesOnPortion: 7.0,
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['product_name'], 'Apple');
expect(json['energy_on_100gr'], 52.0);
expect(json['proteins_on_100gr'], 0.3);
expect(json['fats_on_100gr'], 0.2);
expect(json['carbohydrates_on_100gr'], 14.0);
expect(json['energy_on_portion'], 26.0);
expect(json['proteins_on_portion'], 0.15);
expect(json['fats_on_portion'], 0.1);
expect(json['carbohydrates_on_portion'], 7.0);
});
});
group('ProductInMeal', () {
test('fromJson parses all fields correctly', () {
final json = {
'product_name': 'Banana',
'portion': '1 piece',
'quantity': 2,
};
final model = ProductInMeal.fromJson(json);
expect(model.productName, 'Banana');
expect(model.portion, '1 piece');
expect(model.quantity, 2);
});
test('toJson serializes all fields correctly', () {
const model = ProductInMeal(
productName: 'Banana',
portion: '1 piece',
quantity: 2,
);
final json = model.toJson();
expect(json['product_name'], 'Banana');
expect(json['portion'], '1 piece');
expect(json['quantity'], 2);
});
});
group('DiaryDayModel', () {
test('toEntity returns null when id is null', () {
const model = DiaryDayModel(
id: null,
date: '2024-01-15',
closed: 0,
comment: 'Test',
typeOfDiary: TypeOfDiaryModel(
hasChosenDiet: false,
hasChosenPlan: false,
diaryState: null,
),
meals: [],
chosenPlanId: null,
dayOfChosenDiet: null,
diet: null,
);
final entity = model.toEntity();
expect(entity, isNull);
});
test('toEntity returns entity when id is not null', () {
const model = DiaryDayModel(
id: 1,
date: '2024-01-15',
wakeup: '08:00',
retire: '22:00',
closed: 0,
comment: 'Test comment',
typeOfDiary: TypeOfDiaryModel(
hasChosenDiet: false,
hasChosenPlan: false,
diaryState: null,
),
meals: [],
chosenPlanId: null,
dayOfChosenDiet: null,
diet: null,
);
final entity = model.toEntity();
expect(entity, isNotNull);
expect(entity?.id, 1);
expect(entity?.date, '2024-01-15');
expect(entity?.wakeup, '08:00');
expect(entity?.retire, '22:00');
expect(entity?.comment, 'Test comment');
});
test('toDiaryFutureDayEntity returns correct entity', () {
const diet = DiaryDietModel(id: 1, duration: 30, name: 'Test Diet');
const model = DiaryDayModel(
id: 1,
date: '2024-01-15',
closed: 0,
comment: 'Test',
typeOfDiary: TypeOfDiaryModel(
hasChosenDiet: true,
hasChosenPlan: false,
diaryState: null,
),
meals: [],
chosenPlanId: null,
dayOfChosenDiet: 5,
diet: diet,
);
final entity = model.toDiaryFutureDayEntity();
expect(entity.date, '2024-01-15');
expect(entity.dayOfChosenDiet, 5);
expect(entity.diet, diet);
});
});
}