import {test,expect} from '@playwright/test'; import {bootPromoFixture,exercisePromoCreation} from './promo-entry-fixture.mjs'; test.use({serviceWorkers:'block'}); test('the real app loads promo controls and shows an obvious creation entry',async({page})=>{ await bootPromoFixture(page); expect(await page.locator('[data-dev-tab="overview"]').evaluate(el=>el.nextElementSibling?.dataset.devTab)).toBe('promos'); await exercisePromoCreation(page); expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+1)).toBe(true); await page.locator('#ctmPromoReload').click(); await expect(page.locator('#ctmInvitationText')).toHaveValue(/CTM-UI-TEST/); await page.locator('[data-toggle-code="0"]').click(); await expect(page.locator('#ctmPromoList')).toContainText('Отключён'); }); test('all three plans reach the RPC and invalid input sends no creation request',async({page})=>{ await bootPromoFixture(page);await page.locator('[data-dev-tab="promos"]').click(); await page.locator('#ctmPromoTrial').fill('0');await page.locator('#ctmPromoCreate').click(); expect(await page.evaluate(()=>promoCalls.filter(c=>c.name==='sun_dev_create_trial_promo').length)).toBe(0); await page.locator('#ctmPromoTrial').fill('21'); for(const plan of ['basic','professional','full']){ await page.locator('#ctmPromoPlan').selectOption(plan);await page.locator('#ctmPromoCreate').click(); await expect.poll(()=>page.evaluate(()=>promoCalls.filter(c=>c.name==='sun_dev_create_trial_promo').at(-1)?.args.p_plan)).toBe(plan); await expect(page.locator('#ctmPromoCreate')).toBeEnabled(); } }); test('failed creation is shown as an error and is not automatically retried',async({page})=>{ await bootPromoFixture(page);await page.locator('#ctmPromoOpen').click(); await page.evaluate(()=>{promoCreateError='Подтвердите 2FA';});await page.locator('#ctmPromoCreate').click(); await expect(page.locator('#ctmPromoError')).toContainText('Подтвердите 2FA');await expect(page.locator('#ctmInvitationText')).toHaveCount(0); expect(await page.evaluate(()=>promoCalls.filter(c=>c.name==='sun_dev_create_trial_promo').length)).toBe(1); await expect(page.locator('#ctmPromoCreate')).toBeEnabled(); }); test('a delayed creation response cannot take over another tab or account',async({page})=>{ await bootPromoFixture(page);await page.locator('#ctmPromoOpen').click(); await page.evaluate(()=>{promoDelay=true;});await page.locator('#ctmPromoCreate').click(); await expect(page.locator('#ctmPromoCreate')).toBeDisabled(); await page.locator('[data-dev-tab="overview"]').click();await page.evaluate(()=>completePromo()); await expect(page.locator('#ctmInvitationText')).toHaveCount(0); await expect(page.locator('[data-dev-tab="overview"]')).toHaveClass(/on/); await page.locator('#ctmPromoOpen').click(); await expect(page.locator('#ctmPromoCreate')).toBeEnabled(); await page.evaluate(()=>{window.dispatchEvent(new Event('sun:cloud-tenant-changing'));}); await expect(page.locator('#ctmPromoPanel')).toHaveCount(0); }); test('maintenance does not rebuild a form or lose unsaved input',async({page})=>{ await bootPromoFixture(page);await page.locator('#ctmPromoOpen').click(); await page.locator('#ctmPromoEmail').fill('draft@example.invalid'); await page.evaluate(()=>{window.promoInput=document.getElementById('ctmPromoEmail');for(let i=0;i<10;i++)CateriumTrialPromoDeveloperV181.bind();}); expect(await page.evaluate(()=>promoInput===document.getElementById('ctmPromoEmail'))).toBe(true); await expect(page.locator('#ctmPromoEmail')).toHaveValue('draft@example.invalid'); });