import {test,expect} from '@playwright/test'; const menu={packageId:'test',packageName:'Тестовое меню',packagePrice:900,packageGrams:300,estimated:true}; const catalog=[ {id:'salad',category:6,name:'Салат ',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:'
'})); 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}); });