caterium-app/tests/promo-entry.spec.mjs
pavlov346346-source 298b29cd52
Expose developer promo creation with three subscription plans (#39)
Load the missing promo module, add a prominent creation button and place Promos beside Overview. Use existing AAL2-guarded server RPCs with selected plan, subscription duration and code validity; preserve form input, honest clipboard feedback and scope async responses. Full PR QA succeeded in run 35547013076. No live data, SQL, MFA or unfinished training branch changes. Preserve normal main QA and exact-asset/browser publication verification.
2026-09-21 03:30:21 +03:00

56 lines
3.5 KiB
JavaScript

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');
});