From cfc335e911662703fbae56d3a0d0db936e6e2efc Mon Sep 17 00:00:00 2001 From: nns Date: Fri, 9 Oct 2026 07:18:53 +0500 Subject: [PATCH] =?UTF-8?q?test(e2e):=20=D0=B1=D1=80=D0=B0=D1=83=D0=B7?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D1=82=D0=B0=20=E2=80=94?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D1=8C=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9,=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=B3=D0=B5=D0=BD=20=D0=A8=D0=9A=20(=D0=BF.10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stage-ui-parity.spec.ts (3 теста, стенд): блок «Прибыль за сегодня/месяц»; в карточке нового товара штрихкод автозаполнен + кнопка «Сгенерировать» меняет его; товар только с именем получает сгенерированный EAN-13. Co-Authored-By: Claude Opus 4.8 --- tests/e2e/scenarios/stage-ui-parity.spec.ts | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/e2e/scenarios/stage-ui-parity.spec.ts diff --git a/tests/e2e/scenarios/stage-ui-parity.spec.ts b/tests/e2e/scenarios/stage-ui-parity.spec.ts new file mode 100644 index 0000000..d5b3c13 --- /dev/null +++ b/tests/e2e/scenarios/stage-ui-parity.spec.ts @@ -0,0 +1,58 @@ +/** + * E2E (браузер): паритет с МойСкладом — видимые элементы. + * - Дашборд: блок «Прибыль за сегодня/месяц» (п.8). + * - Карточка нового товара: штрихкод автозаполнен + кнопка «Сгенерировать» (п.4). + * - Создание товара только с именем через API → в карточке виден сгенерированный ШК. + */ +import { test, expect } from '@playwright/test' +import { apiSignup, attachSession } from '../lib/ui.js' +import { request as apiRequest } from '@playwright/test' + +const BASE = process.env.E2E_ADMIN_URL ?? 'https://test.admin.food-market.kz' + +test.describe('MoySklad parity UI', () => { + test('дашборд: блок «Прибыль за сегодня/месяц»', async ({ page }) => { + test.setTimeout(90_000) + const sess = await apiSignup('parity') + await attachSession(page, sess, '/dashboard') + await expect(page.getByText('Прибыль за сегодня')).toBeVisible({ timeout: 15_000 }) + await expect(page.getByText('Прибыль за месяц')).toBeVisible() + }) + + test('карточка товара: штрихкод автозаполнен + кнопка «Сгенерировать»', async ({ page }) => { + test.setTimeout(90_000) + const sess = await apiSignup('paritycard') + await attachSession(page, sess, '/catalog/products/new') + await page.waitForLoadState('networkidle') + // В секции «Штрихкоды» есть поле с кодом (автозаполнено, 13 цифр) и кнопка генерации. + await expect(page.getByText('Штрихкоды')).toBeVisible({ timeout: 15_000 }) + const genBtn = page.getByRole('button', { name: 'Сгенерировать внутренний штрихкод' }) + await expect(genBtn).toBeVisible() + // Код — непустой; клик по «Сгенерировать» меняет его на другой 13-значный. + const codeInput = page.getByPlaceholder('Код').first() + const before = await codeInput.inputValue() + expect(before).toMatch(/^[0-9]{13}$/) + await genBtn.click() + const after = await codeInput.inputValue() + expect(after).toMatch(/^[0-9]{13}$/) + }) + + test('товар только с именем: сгенерированный ШК виден в карточке', async ({ page }) => { + test.setTimeout(90_000) + const sess = await apiSignup('parityname') + const ctx = await apiRequest.newContext({ + baseURL: BASE, ignoreHTTPSErrors: true, timeout: 60_000, + extraHTTPHeaders: { Authorization: `Bearer ${sess.accessToken}` }, + }) + const r = await ctx.post('/api/catalog/products', { data: { name: 'Товар только имя' } }) + expect(r.status()).toBe(201) + const id = (await r.json()).id + await ctx.dispose() + + await attachSession(page, sess, `/catalog/products/${id}`) + await page.waitForLoadState('networkidle') + await expect(page.getByText('Штрихкоды')).toBeVisible({ timeout: 15_000 }) + const code = await page.getByPlaceholder('Код').first().inputValue() + expect(code).toMatch(/^[0-9]{13}$/) + }) +})