- 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.
166 lines
4.6 KiB
JavaScript
166 lines
4.6 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 Packages ===\n');
|
|
|
|
const packages = [
|
|
{
|
|
id: 'basis',
|
|
name: 'Basis Pakke',
|
|
menuId: 'klassisk-3-retter',
|
|
pricePerCover: 295,
|
|
minCovers: 15,
|
|
maxCovers: 30,
|
|
includes: [
|
|
'Menu planlægning',
|
|
'Indkøb af råvarer',
|
|
'Madlavning på lokation',
|
|
'Let oprydning i køkken'
|
|
],
|
|
upsells: [
|
|
{ id: 'anretning', label: 'Tallerkenanretning', priceFlat: 500 },
|
|
{ id: 'kaffe', label: 'Kaffe/te', pricePerCover: 25 }
|
|
],
|
|
notes: 'God basis løsning til familiefester. Maden serveres på fade, hvor gæsterne selv tager.'
|
|
},
|
|
{
|
|
id: 'basis-gron',
|
|
name: 'Basis Pakke',
|
|
menuId: 'gron-3-retter',
|
|
pricePerCover: 275,
|
|
minCovers: 15,
|
|
maxCovers: 30,
|
|
includes: [
|
|
'Menu planlægning',
|
|
'Indkøb af råvarer',
|
|
'Madlavning på lokation',
|
|
'Let oprydning i køkken'
|
|
],
|
|
upsells: [
|
|
{ id: 'anretning', label: 'Tallerkenanretning', priceFlat: 500 },
|
|
{ id: 'kaffe', label: 'Kaffe/te', pricePerCover: 25 }
|
|
],
|
|
notes: 'God basis løsning til familiefester. Maden serveres på fade, hvor gæsterne selv tager.'
|
|
},
|
|
{
|
|
id: 'basis-italiensk',
|
|
name: 'Basis Pakke',
|
|
menuId: 'italiensk-aften',
|
|
pricePerCover: 250,
|
|
minCovers: 15,
|
|
maxCovers: 30,
|
|
includes: [
|
|
'Menu planlægning',
|
|
'Indkøb af råvarer',
|
|
'Madlavning på lokation',
|
|
'Let oprydning i køkken'
|
|
],
|
|
upsells: [
|
|
{ id: 'anretning', label: 'Tallerkenanretning', priceFlat: 500 },
|
|
{ id: 'kaffe', label: 'Kaffe/te', pricePerCover: 25 }
|
|
],
|
|
notes: 'God basis løsning til familiefester. Maden serveres \'family style\' på fade.'
|
|
},
|
|
{
|
|
id: 'service',
|
|
name: 'Service Pakke',
|
|
menuId: 'klassisk-3-retter',
|
|
pricePerCover: 395,
|
|
minCovers: 20,
|
|
maxCovers: 50,
|
|
includes: [
|
|
'Menu planlægning',
|
|
'Indkøb af råvarer',
|
|
'Madlavning på lokation',
|
|
'Tallerkenanretning',
|
|
'Professionel servering',
|
|
'Fuld oprydning'
|
|
],
|
|
upsells: [
|
|
{ id: 'velkomst', label: 'Velkomstdrink & snacks', pricePerCover: 45 },
|
|
{ id: 'vinmenu', label: 'Vinmenu (3 glas)', pricePerCover: 225 },
|
|
{ id: 'kaffe', label: 'Kaffe/te med sødt', pricePerCover: 35 }
|
|
],
|
|
notes: 'Komplet løsning med personlig service og professionel servering.'
|
|
},
|
|
{
|
|
id: 'gourmet',
|
|
name: 'Gourmet Pakke',
|
|
menuId: 'gourmet-upgrade',
|
|
pricePerCover: 595,
|
|
minCovers: 10,
|
|
maxCovers: 30,
|
|
includes: [
|
|
'Menu planlægning',
|
|
'Indkøb af kvalitetsråvarer',
|
|
'Madlavning på lokation',
|
|
'Tallerkenanretning',
|
|
'Professionel servering',
|
|
'Vinmenu (3 glas)',
|
|
'Kaffe med sødt',
|
|
'Fuld oprydning'
|
|
],
|
|
upsells: [
|
|
{ id: 'champagne', label: 'Champagne velkomst', pricePerCover: 95 },
|
|
{ id: 'ekstravin', label: 'Ekstra glas vin', pricePerCover: 75 },
|
|
{ id: 'natmad', label: 'Let natmad', pricePerCover: 75 }
|
|
],
|
|
notes: 'Eksklusiv løsning til de særlige anledninger med gourmetmenu og vinmenu inkluderet.'
|
|
}
|
|
];
|
|
|
|
try {
|
|
console.log(`Inserting ${packages.length} packages...\n`);
|
|
|
|
for (const pkg of packages) {
|
|
await connection.execute(`
|
|
INSERT INTO packages (
|
|
id, name, menu_id, price_per_cover, min_covers, max_covers,
|
|
includes, upsells, notes
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name),
|
|
menu_id = VALUES(menu_id),
|
|
price_per_cover = VALUES(price_per_cover),
|
|
min_covers = VALUES(min_covers),
|
|
max_covers = VALUES(max_covers),
|
|
includes = VALUES(includes),
|
|
upsells = VALUES(upsells),
|
|
notes = VALUES(notes)
|
|
`, [
|
|
pkg.id,
|
|
pkg.name,
|
|
pkg.menuId,
|
|
pkg.pricePerCover,
|
|
pkg.minCovers,
|
|
pkg.maxCovers,
|
|
JSON.stringify(pkg.includes),
|
|
JSON.stringify(pkg.upsells),
|
|
pkg.notes
|
|
]);
|
|
console.log(`✓ ${pkg.name} (${pkg.menuId}) - ${pkg.pricePerCover} kr/person`);
|
|
}
|
|
|
|
// Show summary
|
|
const [packageCount] = await connection.execute('SELECT COUNT(*) as count FROM packages');
|
|
|
|
console.log('\n=== Database Summary ===');
|
|
console.log(`Packages: ${packageCount[0].count}`);
|
|
console.log('\n✅ Seed completed successfully!');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Seed failed:', error);
|
|
process.exit(1);
|
|
} finally {
|
|
await connection.end();
|
|
}
|