- 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.
146 lines
5.4 KiB
JavaScript
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();
|
|
}
|