Files
kokken/scripts/seed-menus.mjs
Alex Polo 570c41f465 Add comprehensive Playwright tests for calendar functionality
- Implemented tests for debugging browser cache vs server response.
- Verified calendar displays correct dates for November 2025.
- Added visual inspection screenshot for calendar layout.
- Created tests to ensure calendar fits within its container.
- Checked for correct styling of available and blocked dates.
- Debugged login form behavior and cookie handling.
- Added tests for forced browser refresh and cache verification.
- Conducted visual tests to compare actual calendar layout with expected.
- Enhanced logging for better traceability during test execution.
2025-11-07 14:09:22 +01:00

146 lines
5.4 KiB
JavaScript

import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
dotenv.config();
const connection = await mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
console.log('=== Seeding Menus Data ===\n');
// Hardcoded menu data from data.ts
const menus = [
{
id: 'klassisk-3-retter',
title: 'Klassisk Menu',
description: 'En traditionel dansk menu med et moderne twist. Populært valg til familiefester.',
courses: ['Varmrøget laks med rygeostcreme, dild og radiser', 'Rosastegt kalvefilet med sæsonens grøntsager og rødvinssauce', 'Chokoladekage med bær og vaniljeis'],
sides: [],
tags: ['Nordisk', 'Klassisk', 'Populær'],
image: '/img/klassisk.png',
featured: true,
baseIngredientsPerCover: 65,
ingredientsCostIndex: 1.0,
baseLabourHours: 4,
incrementalLabourPerCover: 0.05,
minCovers: 15,
leadTimeDays: 7,
basePricePerCover: 295,
ingredients: [
{ name: 'Varmrøget laks', quantity: '100g', perCover: true },
{ name: 'Rygeost', quantity: '30g', perCover: true },
{ name: 'Dild, frisk', quantity: '5g', perCover: true },
{ name: 'Radiser', quantity: '3 stk', perCover: true },
{ name: 'Kalvefilet', quantity: '200g', perCover: true },
{ name: 'Kartofler', quantity: '150g', perCover: true },
{ name: 'Gulerødder', quantity: '50g', perCover: true },
{ name: 'Rødvin til sauce', quantity: '100ml', perCover: false },
{ name: 'Chokolade, mørk', quantity: '80g', perCover: true },
{ name: 'Bær, blandede', quantity: '50g', perCover: true },
{ name: 'Vaniljeis', quantity: '100g', perCover: true },
{ name: 'Fløde', quantity: '500ml', perCover: false },
{ name: 'Smør', quantity: '200g', perCover: false }
]
},
{
id: 'gron-3-retter',
title: 'Grøn Menu',
description: 'Sæsonbaseret vegetarisk menu med fokus på smag og farver. Perfekt til både vegetarer og kødelskere.',
courses: ['Grillet asparges med hollandaise og karse', 'Svamperisotto med parmesan og urter', 'Pocherede pærer med vaniljeis og hasselnødder'],
sides: [],
tags: ['Vegetarisk', 'Sæson', 'Populær'],
image: '/img/veg.png',
featured: true,
baseIngredientsPerCover: 55,
ingredientsCostIndex: 0.95,
baseLabourHours: 4,
incrementalLabourPerCover: 0.05,
minCovers: 15,
leadTimeDays: 7,
basePricePerCover: 275,
ingredients: [
{ name: 'Asparges', quantity: '150g', perCover: true },
{ name: 'Æg til hollandaise', quantity: '2 stk', perCover: false },
{ name: 'Smør', quantity: '100g', perCover: false },
{ name: 'Karse', quantity: '5g', perCover: true },
{ name: 'Risottoris', quantity: '80g', perCover: true },
{ name: 'Blandede svampe', quantity: '100g', perCover: true },
{ name: 'Parmesan', quantity: '30g', perCover: true },
{ name: 'Løg', quantity: '50g', perCover: false },
{ name: 'Hvidvin', quantity: '200ml', perCover: false },
{ name: 'Pærer', quantity: '1 stk', perCover: true },
{ name: 'Hasselnødder', quantity: '20g', perCover: true },
{ name: 'Vaniljeis', quantity: '100g', perCover: true }
]
}
// Add more menus as needed
];
try {
console.log(`Inserting ${menus.length} menus...\n`);
for (const menu of menus) {
await connection.execute(`
INSERT INTO menus (
id, title, description, courses, sides, tags, image,
base_ingredients_per_cover, ingredients_cost_index, base_labour_hours,
incremental_labour_per_cover, min_covers, lead_time_days, base_price_per_cover
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
title = VALUES(title),
description = VALUES(description),
courses = VALUES(courses),
sides = VALUES(sides),
tags = VALUES(tags),
image = VALUES(image),
base_ingredients_per_cover = VALUES(base_ingredients_per_cover),
ingredients_cost_index = VALUES(ingredients_cost_index),
base_labour_hours = VALUES(base_labour_hours),
incremental_labour_per_cover = VALUES(incremental_labour_per_cover),
min_covers = VALUES(min_covers),
lead_time_days = VALUES(lead_time_days),
base_price_per_cover = VALUES(base_price_per_cover)
`, [
menu.id,
menu.title,
menu.description,
JSON.stringify(menu.courses),
JSON.stringify(menu.sides),
JSON.stringify(menu.tags),
menu.image,
menu.baseIngredientsPerCover,
menu.ingredientsCostIndex,
menu.baseLabourHours,
menu.incrementalLabourPerCover,
menu.minCovers,
menu.leadTimeDays,
menu.basePricePerCover
]);
// Delete and re-insert ingredients
await connection.execute('DELETE FROM menu_ingredients WHERE menu_id = ?', [menu.id]);
for (let i = 0; i < menu.ingredients.length; i++) {
const ing = menu.ingredients[i];
await connection.execute(`
INSERT INTO menu_ingredients (menu_id, name, quantity, per_cover, sort_order)
VALUES (?, ?, ?, ?, ?)
`, [menu.id, ing.name, ing.quantity, ing.perCover, i]);
}
console.log(`${menu.title} (${menu.ingredients.length} ingredienser)`);
}
console.log('\n✅ Seed completed!');
} catch (error) {
console.error('❌ Seed failed:', error);
process.exit(1);
} finally {
await connection.end();
}