forked from eatvio/eatvio_app
feat(tests): tests coverage 67.2
This commit is contained in:
@@ -220,5 +220,120 @@ void main() {
|
||||
cubit.pasteCopiedDay(0);
|
||||
expect(cubit.state.dietData.dailySchedule?[0][0], isEmpty);
|
||||
});
|
||||
|
||||
test('getDietForPreview returns null when form is invalid', () async {
|
||||
final result = await cubit.getDietForPreview();
|
||||
expect(result, null);
|
||||
});
|
||||
|
||||
test('createDiet returns validation error when form is invalid', () async {
|
||||
final result = await cubit.createDiet();
|
||||
expect(result, 'validation');
|
||||
expect(cubit.state.isDietPublishing, false);
|
||||
});
|
||||
|
||||
test('updateDiet returns error when form is invalid', () async {
|
||||
final result = await cubit.updateDiet(1);
|
||||
expect(result, 'error');
|
||||
});
|
||||
|
||||
test('updateDiet handles error when image compression fails', () async {
|
||||
cubit.setName('Test Diet');
|
||||
cubit.setDetails('Test Description');
|
||||
cubit.setDuration(0);
|
||||
cubit.setDietState(DietState.active);
|
||||
const portion = DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: DailyNutrition(energy: 52.0, proteins: 0.3, fats: 0.2, carbohydrates: 14.0),
|
||||
productNutritionalValueId: '1',
|
||||
);
|
||||
cubit.addPortion(dayIndex: 0, mealIndex: 0, portion: portion);
|
||||
// Set image with non-existent file to trigger error in compression
|
||||
final image = XFile('non_existent_image.jpg');
|
||||
cubit.setImage(image);
|
||||
|
||||
final result = await cubit.updateDiet(1);
|
||||
|
||||
// Should return 'error' due to image compression failure
|
||||
expect(result, 'error');
|
||||
});
|
||||
|
||||
test('createDiet validates name length', () async {
|
||||
cubit.setName('Te'); // Less than 3 characters
|
||||
cubit.setDetails('Test Description');
|
||||
cubit.setDuration(0);
|
||||
cubit.setDietState(DietState.active);
|
||||
const portion = DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: DailyNutrition(energy: 52.0, proteins: 0.3, fats: 0.2, carbohydrates: 14.0),
|
||||
productNutritionalValueId: '1',
|
||||
);
|
||||
cubit.addPortion(dayIndex: 0, mealIndex: 0, portion: portion);
|
||||
final image = XFile('test_image.jpg');
|
||||
cubit.setImage(image);
|
||||
|
||||
final result = await cubit.createDiet();
|
||||
|
||||
expect(result, 'validation');
|
||||
expect(cubit.state.dietNameError, 'Длинна названия не может быть меньше 3 символов');
|
||||
});
|
||||
|
||||
test('createDiet validates details length', () async {
|
||||
cubit.setName('Test Diet');
|
||||
cubit.setDetails('Te'); // Less than 3 characters
|
||||
cubit.setDuration(0);
|
||||
cubit.setDietState(DietState.active);
|
||||
const portion = DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: DailyNutrition(energy: 52.0, proteins: 0.3, fats: 0.2, carbohydrates: 14.0),
|
||||
productNutritionalValueId: '1',
|
||||
);
|
||||
cubit.addPortion(dayIndex: 0, mealIndex: 0, portion: portion);
|
||||
final image = XFile('test_image.jpg');
|
||||
cubit.setImage(image);
|
||||
|
||||
final result = await cubit.createDiet();
|
||||
|
||||
expect(result, 'validation');
|
||||
expect(cubit.state.dietDescriptionError, 'Длинна описания не может быть меньше 3 символов');
|
||||
});
|
||||
|
||||
test('addPortion validates day when adding portion', () {
|
||||
cubit.setDuration(0);
|
||||
const portion = DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: DailyNutrition(energy: 52.0, proteins: 0.3, fats: 0.2, carbohydrates: 14.0),
|
||||
productNutritionalValueId: '1',
|
||||
);
|
||||
|
||||
cubit.addPortion(dayIndex: 0, mealIndex: 0, portion: portion);
|
||||
|
||||
expect(cubit.state.dailyScheduleErrors[0], '');
|
||||
});
|
||||
|
||||
test('removePortion removes portion from daily schedule', () {
|
||||
cubit.setDuration(0);
|
||||
const portion = DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: DailyNutrition(energy: 52.0, proteins: 0.3, fats: 0.2, carbohydrates: 14.0),
|
||||
productNutritionalValueId: '1',
|
||||
);
|
||||
|
||||
cubit.addPortion(dayIndex: 0, mealIndex: 0, portion: portion);
|
||||
expect(cubit.state.dietData.dailySchedule?[0][0].length, 1);
|
||||
|
||||
cubit.removePortion(day: 0, meal: 0, portionIndex: 0);
|
||||
expect(cubit.state.dietData.dailySchedule?[0][0].length, 0);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -183,5 +183,208 @@ void main() {
|
||||
|
||||
verify(mockService.updatePersonal(diet: dietId, formData: anyNamed('formData'))).called(1);
|
||||
});
|
||||
|
||||
test('createDiet - создает диету с dailySchedule содержащим продукты', () async {
|
||||
final testFile = File('${Directory.systemTemp.path}/test_file.jpg');
|
||||
await testFile.writeAsString('test content');
|
||||
const expectedDiet = CreatedDiet(id: 1);
|
||||
final dailySchedule = [
|
||||
[
|
||||
[
|
||||
const DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: null,
|
||||
productNutritionalValueId: '1',
|
||||
),
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
when(mockService.createPublishedDiet(formData: anyNamed('formData'))).thenAnswer((_) async => expectedDiet);
|
||||
|
||||
final result = await repository.createDiet(
|
||||
name: 'Test Diet',
|
||||
duration: 7,
|
||||
state: DietState.active,
|
||||
meatType: '0',
|
||||
carbType: '0',
|
||||
vegType: '1',
|
||||
lightType: '0',
|
||||
details: 'Test details',
|
||||
image: testFile,
|
||||
dailySchedule: dailySchedule,
|
||||
);
|
||||
|
||||
expect(result, equals(expectedDiet));
|
||||
verify(mockService.createPublishedDiet(formData: anyNamed('formData'))).called(1);
|
||||
|
||||
// Cleanup
|
||||
if (await testFile.exists()) {
|
||||
await testFile.delete();
|
||||
}
|
||||
});
|
||||
|
||||
test('updateDiet - обновляет диету с dailySchedule', () async {
|
||||
const dietId = 1;
|
||||
final dailySchedule = [
|
||||
[
|
||||
[
|
||||
const DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: null,
|
||||
productNutritionalValueId: '1',
|
||||
),
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
when(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).thenAnswer((_) async => Future<void>.value());
|
||||
|
||||
await repository.updateDiet(
|
||||
dietId: dietId,
|
||||
state: DietState.active,
|
||||
name: 'Updated Diet',
|
||||
dailySchedule: dailySchedule,
|
||||
);
|
||||
|
||||
verify(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).called(1);
|
||||
});
|
||||
|
||||
test('updateDiet - обновляет диету без image', () async {
|
||||
const dietId = 1;
|
||||
|
||||
when(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).thenAnswer((_) async => Future<void>.value());
|
||||
|
||||
await repository.updateDiet(
|
||||
dietId: dietId,
|
||||
state: DietState.active,
|
||||
name: 'Updated Diet',
|
||||
duration: 14,
|
||||
details: 'Updated details',
|
||||
);
|
||||
|
||||
verify(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).called(1);
|
||||
});
|
||||
|
||||
test('updateDiet - обновляет диету только с типами', () async {
|
||||
const dietId = 1;
|
||||
|
||||
when(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).thenAnswer((_) async => Future<void>.value());
|
||||
|
||||
await repository.updateDiet(
|
||||
dietId: dietId,
|
||||
state: DietState.active,
|
||||
meatType: '1',
|
||||
carbType: '0',
|
||||
vegType: '1',
|
||||
lightType: '0',
|
||||
);
|
||||
|
||||
verify(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).called(1);
|
||||
});
|
||||
|
||||
test('updateDiet - обновляет диету со всеми параметрами', () async {
|
||||
const dietId = 1;
|
||||
final testFile = File('${Directory.systemTemp.path}/test_file.jpg');
|
||||
await testFile.writeAsString('test content');
|
||||
final dailySchedule = [
|
||||
[
|
||||
[
|
||||
const DailySchedule(
|
||||
name: 'Apple',
|
||||
portion: Portion.grams,
|
||||
quantity: 100,
|
||||
dailyNutrition: null,
|
||||
productNutritionalValueId: '1',
|
||||
),
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
when(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).thenAnswer((_) async => Future<void>.value());
|
||||
|
||||
await repository.updateDiet(
|
||||
dietId: dietId,
|
||||
state: DietState.active,
|
||||
name: 'Updated Diet',
|
||||
duration: 14,
|
||||
meatType: '1',
|
||||
carbType: '0',
|
||||
vegType: '1',
|
||||
lightType: '0',
|
||||
details: 'Updated details',
|
||||
image: testFile,
|
||||
dailySchedule: dailySchedule,
|
||||
);
|
||||
|
||||
verify(mockService.updatePublished(diet: dietId, formData: anyNamed('formData'))).called(1);
|
||||
|
||||
// Cleanup
|
||||
if (await testFile.exists()) {
|
||||
await testFile.delete();
|
||||
}
|
||||
});
|
||||
|
||||
test('getDietPortionsNutrition - обрабатывает пустой dailySchedule', () async {
|
||||
const dietId = 1;
|
||||
final responseData = <String, dynamic>{};
|
||||
final response = HttpResponse(
|
||||
responseData,
|
||||
Response(
|
||||
data: responseData,
|
||||
statusCode: 200,
|
||||
requestOptions: RequestOptions(path: '/api/diets/show/$dietId/per_portion_nutritions'),
|
||||
),
|
||||
);
|
||||
|
||||
when(mockService.getDietPortionsNutrition(diet: dietId)).thenAnswer((_) async => response);
|
||||
|
||||
final result = await repository.getDietPortionsNutrition(dietId);
|
||||
|
||||
expect(result, isA<Map<int, Map<int, Map<int, DailySchedule>>>>());
|
||||
expect(result.length, 0);
|
||||
verify(mockService.getDietPortionsNutrition(diet: dietId)).called(1);
|
||||
});
|
||||
|
||||
test('getDietPortionsNutrition - обрабатывает dailySchedule с несколькими днями и приемами пищи', () async {
|
||||
const dietId = 1;
|
||||
final responseData = {
|
||||
'1': {
|
||||
'1': {
|
||||
'1': {'name': 'Product 1', 'portion': 'gr', 'quantity': 100, 'product_nutritional_value_id': '1'},
|
||||
},
|
||||
'2': {
|
||||
'1': {'name': 'Product 2', 'portion': 'gr', 'quantity': 200, 'product_nutritional_value_id': '2'},
|
||||
},
|
||||
},
|
||||
'2': {
|
||||
'1': {
|
||||
'1': {'name': 'Product 3', 'portion': 'gr', 'quantity': 150, 'product_nutritional_value_id': '3'},
|
||||
},
|
||||
},
|
||||
};
|
||||
final response = HttpResponse(
|
||||
responseData,
|
||||
Response(
|
||||
data: responseData,
|
||||
statusCode: 200,
|
||||
requestOptions: RequestOptions(path: '/api/diets/show/$dietId/per_portion_nutritions'),
|
||||
),
|
||||
);
|
||||
|
||||
when(mockService.getDietPortionsNutrition(diet: dietId)).thenAnswer((_) async => response);
|
||||
|
||||
final result = await repository.getDietPortionsNutrition(dietId);
|
||||
|
||||
expect(result, isA<Map<int, Map<int, Map<int, DailySchedule>>>>());
|
||||
expect(result.length, 2);
|
||||
expect(result[1]?.length, 2);
|
||||
expect(result[2]?.length, 1);
|
||||
verify(mockService.getDietPortionsNutrition(diet: dietId)).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user