45 lines
5.5 KiB
JavaScript
45 lines
5.5 KiB
JavaScript
import {test,expect} from '@playwright/test';
|
||
const menu={packageId:'test',packageName:'Тестовое меню',packagePrice:900,packageGrams:300,estimated:true};
|
||
const catalog=[
|
||
{id:'salad',category:6,name:'Салат <img src=x onerror=alert(1)>',catalogSection:'Салаты',price:300,weight:'100 г',banquet:menu,ingredients:[]},
|
||
{id:'meat',category:6,name:'Горячее мясо',catalogSection:'Горячие блюда',price:600,weight:'200 г',banquet:{...menu,choiceGroup:'main',defaultChoice:true},ingredients:[]},
|
||
{id:'fish',category:6,name:'Горячая рыба',catalogSection:'Горячие блюда',price:600,weight:'200 г',banquet:{...menu,choiceGroup:'main'},ingredients:[]}
|
||
];
|
||
test('banquet package selection keeps totals across filters and replaces just one hot main',async({page})=>{
|
||
await page.route('**/index.html',r=>r.fulfill({contentType:'text/html',body:'<html><head></head><body><div id="tiles"></div></body></html>'}));
|
||
await page.goto('/index.html');await page.addScriptTag({url:'/core/banquet-menu.js'});
|
||
await page.evaluate(items=>{window.menuItems=items;window.menuDraft={lines:[{id:'box',qty:2,price:500}],guestsCount:10};window.drawMenu=()=>{const root=document.getElementById('tiles'),ctx={items:window.menuItems,catalog:window.menuItems,draft:window.menuDraft,rerender:window.drawMenu};root.innerHTML=window.CateriumBanquet.render(ctx);window.CateriumBanquet.bind(root,ctx)};window.drawMenu()},catalog);
|
||
await page.locator('[data-banquet-package="test"]').click();await page.locator('[data-banquet-preset]').click();
|
||
await expect(page.locator('[data-banquet-per-guest]')).toHaveText('900 ₽');await expect(page.locator('[data-banquet-weight]')).toHaveText('300 г');
|
||
await page.locator('[data-banquet-group="salads"]').click();
|
||
await expect(page.locator('[data-banquet-row]')).toHaveCount(1);await expect(page.locator('[data-banquet-per-guest]')).toHaveText('900 ₽');
|
||
expect(await page.locator('.ct-banquet img').count()).toBe(0);
|
||
await page.locator('[data-banquet-group="main"]').click();await page.locator('[data-banquet-item="fish"]').check();
|
||
await expect(page.locator('[data-banquet-item="meat"]')).not.toBeChecked();await expect(page.locator('[data-banquet-per-guest]')).toHaveText('900 ₽');
|
||
await page.locator('[data-banquet-guests]').fill('12');await expect(page.locator('[data-banquet-total]')).toHaveText('10 800 ₽');
|
||
await page.locator('[data-banquet-apply]').click();
|
||
expect(await page.evaluate(()=>window.menuDraft.lines.map(({id,qty,price})=>({id,qty,price})))).toEqual([{id:'box',qty:2,price:500},{id:'salad',qty:12,price:300},{id:'fish',qty:12,price:600}]);
|
||
await page.locator('[data-banquet-apply]').click();expect(await page.evaluate(()=>window.menuDraft.lines.length)).toBe(3);
|
||
});
|
||
|
||
test('banquet dishes reach the actual order, preserve quantities on save and show weight in proposals',async({page})=>{
|
||
page.on('dialog',d=>d.accept());
|
||
await page.route('**://api.caterium.ru/**',r=>r.abort());await page.route('**://*.supabase.co/**',r=>r.abort());
|
||
await page.goto('/index.html',{waitUntil:'domcontentloaded'});
|
||
await page.waitForFunction(()=>window.CateriumDataV1773&&window.SunAdminRBACV3&&window.__cateriumOrderEnhancementsV1775);
|
||
await page.evaluate(items=>{window.SunCloudV2={getSession:()=>({user:{id:'test'}}),getWorkspace:()=>({id:'test',role:'admin',permissions:{}}),getClient:()=>null,status:()=>({connected:true,signedIn:true,membershipsLoaded:true}),hasPermission:()=>true};boxes.push(...items);window.dispatchEvent(new Event('sun:cloud-permissions-changed'));window.render()},catalog);
|
||
await page.getByRole('button',{name:'Банкетное меню',exact:true}).click();
|
||
await page.locator('#sunCatalogSearch').fill('рыба');await expect(page.locator('[data-banquet-row]')).toHaveCount(1);await expect(page.locator('[data-banquet-row="fish"]')).toBeVisible();await page.locator('#sunCatalogSearch').fill('');
|
||
await page.locator('[data-banquet-package="test"]').click();await page.locator('[data-banquet-preset]').click();await page.locator('[data-banquet-guests]').fill('4');await page.locator('[data-banquet-apply]').click();
|
||
expect(await page.evaluate(()=>window.sunBaseOrderTotal(draft))).toBe(3600);
|
||
await expect(page.locator('.sun-order-line-row')).toHaveCount(2);
|
||
await page.evaluate(()=>{draft.event='Банкет';draft.date='2099-12-20';draft.time='12:00';document.getElementById('date').value='2099-12-20';document.getElementById('time').value='12:00';window.saveOrder()});
|
||
const saved=await page.evaluate(()=>{const o=orders.at(-1);window.openOrder(o.id);return {id:o.id,guests:o.guestsCount,total:o.total,lines:o.lines.map(l=>({id:l.id,qty:l.qty,price:l.price}))}});
|
||
expect(saved.guests).toBe(4);expect(saved.total).toBe(3600);expect(saved.lines).toEqual([{id:'salad',qty:4,price:300},{id:'meat',qty:4,price:600}]);
|
||
expect(await page.evaluate(async()=>(await window.sunClientOfferDebugCreateSnapshot(draft)).foodGrams)).toBe(1200);
|
||
await page.getByRole('button',{name:'Банкетное меню',exact:true}).click();await page.locator('[data-banquet-edit="salad"]').click();
|
||
await expect(page.locator('#banquetWeightGrams')).toHaveValue('100');await expect(page.locator('#ctBanquetPackage')).toHaveValue('Тестовое меню');
|
||
await page.locator('#banquetWeightGrams').fill('110');await page.locator('#boxPrice').fill('330');await page.evaluate(()=>window.saveBox());
|
||
expect(await page.evaluate(()=>({weight:boxes.find(i=>i.id==='salad').weight,price:boxes.find(i=>i.id==='salad').price,estimated:boxes.find(i=>i.id==='salad').banquet.estimated}))).toEqual({weight:'110 г',price:330,estimated:true});
|
||
});
|