fix: recepty přesnuty k jídlům

feat: přidána podpora fotek
This commit is contained in:
Ondřej Anděl committed 2026-10-12 10:20:12 +02:00
1 parent efed5e6e86
commit e13f7ce8e5
39 files changed
+1266 -511

No files matched your search

+100
View File
@@ -0,0 +1,100 @@
process.env.CALORIE_PROVIDER = 'none';
import { addMeal } from "../meals";
import { getMealGroups, renameMealGroup } from "../mealGroups";
import { getMealTemplates, saveMealTemplate } from "../mealTemplates";
import { addMealPhoto, deleteMealPhoto, getMealPhotos } from "../mealPhotos";
import { resetMemoryStorage } from "../storage/memory";
import { MealType } from "../../../types/gen/types.gen";
const LOGIN = 'tester';
const IMAGE = 'data:image/jpeg;base64,AAAA';
const THUMBNAIL = 'data:image/jpeg;base64,BBBB';
beforeEach(() => resetMemoryStorage());
const rizoto = {
name: 'Rizoto', source: 'doma', servings: 2, cookedWeight: 800,
ingredients: [{ name: 'Rýže', weight: 200, caloriesPer100g: 350 }, { name: 'Kuře', weight: 300, calories: 400 }],
};
describe('recept jídla v seznamu jídel', () => {
it('patří ke skupině se stejným názvem a zdrojem a předvyplní z něj porci', async () => {
await addMeal(LOGIN, { date: '2025-03-01', mealType: MealType.VECERE, name: 'rizoto', source: 'Doma' });
await saveMealTemplate(LOGIN, rizoto);
const [group] = await getMealGroups(LOGIN);
// (700 + 400) kcal na 800 g, porce je polovina
expect(group).toMatchObject({
count: 1, recipe: { name: 'Rizoto' }, values: { weight: 400, caloriesPer100g: 138 },
});
});
it('recept jídla, které se ještě nejedlo, je v seznamu sám', async () => {
await addMeal(LOGIN, { date: '2025-03-01', mealType: MealType.OBED, name: 'Guláš' });
await saveMealTemplate(LOGIN, rizoto);
const groups = await getMealGroups(LOGIN);
expect(groups.map(group => `${group.name} ${group.count}`)).toEqual(['Guláš 1', 'Rizoto 0']);
expect(groups[1].lastDate).toBeUndefined();
});
it('druhý recept téhož jídla nejde založit', async () => {
await saveMealTemplate(LOGIN, rizoto);
await expect(saveMealTemplate(LOGIN, { ...rizoto, name: 'RIZOTO' })).rejects.toThrow(/už recept má/);
});
it('přejmenování vezme recept i fotky s sebou', async () => {
await addMeal(LOGIN, { date: '2025-03-01', mealType: MealType.VECERE, ...rizoto });
await saveMealTemplate(LOGIN, rizoto);
await addMealPhoto(LOGIN, 'Rizoto', 'doma', IMAGE, THUMBNAIL);
await renameMealGroup(LOGIN, 'Rizoto', 'doma', 'Houbové rizoto', undefined);
const [recipe] = await getMealTemplates(LOGIN);
expect(recipe.name).toBe('Houbové rizoto');
expect(recipe).not.toHaveProperty('source');
expect(await getMealPhotos(LOGIN, 'Houbové rizoto', undefined)).toHaveLength(1);
expect(await getMealPhotos(LOGIN, 'Rizoto', 'doma')).toHaveLength(0);
});
it('dvě jídla s recepty přejmenováním nesloučí', async () => {
await saveMealTemplate(LOGIN, rizoto);
await saveMealTemplate(LOGIN, { ...rizoto, name: 'Rizoto 2' });
await expect(renameMealGroup(LOGIN, 'Rizoto 2', 'doma', 'Rizoto', 'doma')).rejects.toThrow(/Obě jídla/);
});
});
describe('fotky jídla', () => {
it('patří jídlu podle názvu a zdroje a skupina nese počet a náhled', async () => {
await addMeal(LOGIN, { date: '2025-03-01', mealType: MealType.OBED, name: 'Gyros', source: 'Everest' });
await addMeal(LOGIN, { date: '2025-03-02', mealType: MealType.OBED, name: 'Gyros', source: 'Namaste' });
await addMealPhoto(LOGIN, 'gyros', 'everest', IMAGE, THUMBNAIL);
const groups = await getMealGroups(LOGIN);
expect(groups.find(group => group.source === 'Everest')).toMatchObject({ photoCount: 1, thumbnail: THUMBNAIL });
expect(groups.find(group => group.source === 'Namaste')).toMatchObject({ photoCount: 0 });
expect(await getMealPhotos(LOGIN, 'Gyros', 'Everest')).toMatchObject([{ image: IMAGE }]);
});
it('smazaná fotka zmizí z jídla', async () => {
const photo = await addMealPhoto(LOGIN, 'Gyros', undefined, IMAGE, THUMBNAIL);
await deleteMealPhoto(LOGIN, photo.id);
expect(await getMealPhotos(LOGIN, 'Gyros', undefined)).toEqual([]);
await expect(deleteMealPhoto(LOGIN, photo.id)).rejects.toThrow(/nebyla nalezena/);
});
it('odmítne něco jiného než obrázek', async () => {
await expect(addMealPhoto(LOGIN, 'Gyros', undefined, 'data:text/html;base64,AAAA', THUMBNAIL))
.rejects.toThrow(/obrázek/);
});
});