From 94d7a97fe4d879957c4b83810266cf3b9dfd147f Mon Sep 17 00:00:00 2001 From: Vlad Smykov Date: Tue, 27 Jan 2026 16:42:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=B8=D0=B2=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20UI,=20API=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=D1=8B=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 10244 bytes .gitignore | 2 +- package.json | 2 +- page-objects/RegisterPage.ts | 41 +++++++++ playwright-report/index.html | 85 ------------------ .../register-applicant.api.spec.ts | 3 + .../register-graduate.api.spec.ts | 65 ++++++++++++++ .../ui/registration/register-graduate.spec.ts | 55 ++++++++++++ 8 files changed, 166 insertions(+), 87 deletions(-) create mode 100644 .DS_Store delete mode 100644 playwright-report/index.html create mode 100644 tests/api/registration/register-graduate.api.spec.ts create mode 100644 tests/ui/registration/register-graduate.spec.ts diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2b9639eb7e79dcfacf03d3568636b52810d5c75e GIT binary patch literal 10244 zcmeHM&2JM&6n|q9vTh7)f>Q`8(h6UYNYl_FD5@%4lc6Kem{sa0CAb9iP;Ez~xrAnn}Cfa##XW#G5&TsSH?i&LD zDK*2(03HB1cu48yusfp3>+%?A88b4Ck{})+1_~dlzA<2J2P^}Y0n318z%pPNcpDhN zceZTKq?Wd~3|Iy%1BVRA{NUjsWzopCmMV2%r%C{nV>qlD>R1OTjAvxg$hMXWiavGq zKn#?a5`$$3 z?5W=co~6r7R0Adgw8Fs3#3&!XQcbx!c?2>+KMYbxda+PK#C#Vv2OI>1xMNU(y3!<$ z4&a{l;ijO0vsPgT`kV11rtQ z)YQFFdB+Uzb`M&}X@qxu7g3#kl3_gmLk~eKX_zPVOVD6Zk}fPfBbj4kJ z%}7%CEqt!@>^c{mW(&ntbIE~A@CAGW8yIpA;AeOQPvBSh9sYzD@RCfBS#p6~B3H=g zW#7GC;-_%ZqY*u2Y%!FG6l;d3gMQhiuZWt)+rsCr#wI+K$H) wxgD>z8E|YtUXu;=qLFPaaRl3c@nb*<=j|>cZ2kXlZQ%_q1#SKR7S;c+0W!iR(f|Me literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 83df913..bd615d6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ node_modules/ allure-results/ allure-report/ test-results/ -playwright-report/ +playwright-report .env \ No newline at end of file diff --git a/package.json b/package.json index 4b3ca5d..c1b3e90 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "npx playwright test", - "test:clean": "rm -rf allure-results allure-report", + "test:clean": "rm -rf allure-results allure-report playwright-report", "test:ui": "npx playwright test tests/ui", "test:api": "npx playwright test tests/api", "report": "npx playwright show-report", diff --git a/page-objects/RegisterPage.ts b/page-objects/RegisterPage.ts index 4585a69..f479184 100644 --- a/page-objects/RegisterPage.ts +++ b/page-objects/RegisterPage.ts @@ -9,6 +9,7 @@ export class RegisterPage { this.page = page; } + // --- Этап 1: Общие поля --- async goto() { await this.page.goto('/registration'); } @@ -49,7 +50,47 @@ export class RegisterPage { await this.page.locator('span.Checkmark_checkmark__58fWm').click(); } + async clickNextButton() { + await this.page.locator('button[type="submit"]', { hasText: 'Далее' }).click(); + } + + async submitGraduate() { + await this.page.locator('button[type="submit"]', { hasText: 'Зарегистрироваться' }).click(); + } + async submit() { await this.page.locator('button[data-testid="btn-save"]').click(); } + + // --- Этап 2: Образование выпускника --- + async selectGraduateRole() { + await this.page.locator('button.Registration_button_menu__AfPox', { hasText: 'Выпускник' }).click(); + } + + async selectDepartment() { + await this.page.locator('input[name="department"]').click(); + await this.page.getByText('Институт компьютерных технологий и информационной безопасности', { exact: true }).scrollIntoViewIfNeeded(); + await this.page.getByText('Институт компьютерных технологий и информационной безопасности', { exact: true }).click(); + } + + async selectEducationLevel() { + await this.page.locator('input[name="educationLevel"]').click(); + await this.page.getByText('Специалитет', { exact: true }).click(); + } + + async selectSpeciality() { + await this.page.locator('input[name="speciality"]').click(); + await this.page.getByText('Применение и эксплуатация автоматизированных систем специального назначения', { exact: true }).scrollIntoViewIfNeeded(); + await this.page.getByText('Применение и эксплуатация автоматизированных систем специального назначения', { exact: true }).click(); + } + + async selectProgram() { + await this.page.locator('input[name="program"]').click(); + await this.page.getByText('Автоматизированные системы обработки информации и управления', { exact: true }).first().click(); + } + + async selectEducationForm() { + await this.page.locator('input[name="educationForm"]').click(); + await this.page.getByText('Очная', { exact: true }).click(); + } } diff --git a/playwright-report/index.html b/playwright-report/index.html deleted file mode 100644 index d9bfee8..0000000 --- a/playwright-report/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - Playwright Test Report - - - - -
- - - \ No newline at end of file diff --git a/tests/api/registration/register-applicant.api.spec.ts b/tests/api/registration/register-applicant.api.spec.ts index cc29b66..c2f688e 100644 --- a/tests/api/registration/register-applicant.api.spec.ts +++ b/tests/api/registration/register-applicant.api.spec.ts @@ -41,6 +41,9 @@ test('API: регистрация абитуриента + подтвержде const registerRes = await axios.post(`${BASE_URL}/auth/register`, registerPayload); expect(registerRes.status).toBe(201); + const userId = registerRes.data.id; + console.log('🆔 ID зарегистрированного пользователя:', userId); + } catch (error: any) { console.error('❌ Ошибка регистрации:', error.response?.data || error.message); throw error; diff --git a/tests/api/registration/register-graduate.api.spec.ts b/tests/api/registration/register-graduate.api.spec.ts new file mode 100644 index 0000000..7a6fd8d --- /dev/null +++ b/tests/api/registration/register-graduate.api.spec.ts @@ -0,0 +1,65 @@ +import { test, expect } from '@playwright/test'; +import axios from 'axios'; +import { + createTempEmail, + waitForConfirmationCode +} from '../../../utils/mailTmApi'; +import { + generateFirstName, + generateLastName, + generateMiddleName, + generateLogin, + generatePhone, +} from '../../../utils/userGenerator'; + +const BASE_URL = 'https://rumc.dev.rdcenter.ru/api'; + +test('API: регистрация выпускника + подтверждение почты', async () => { + const { email, token: mailToken } = await createTempEmail(); + + const surname = generateLastName(); + const name = generateFirstName(); + const patronymic = generateMiddleName(); + const fullName = `${surname} ${name} ${patronymic}`; + const login = generateLogin(); + const phone = '+7 (900) 000-00-00'; + + const registerPayload = { + type: 'INDIVIDUAL', + programId: 'a0d11741-eeae-11ef-b5b3-00155d011a8e', + educationForm: 'Очная', + educationLevel: 'Специалитет', + login, + fullName, + email, + password: '!Test123456', + phone, + approval: true + }; + + try { + const registerRes = await axios.post(`${BASE_URL}/auth/register/graduate`, registerPayload); + expect(registerRes.status).toBe(200); + + const userId = registerRes.data.userId; + console.log('🆔 ID зарегистрированного пользователя:', userId); + +} catch (error: any) { + console.error('❌ Ошибка регистрации:', error.response?.data || error.message); + throw error; +} + + console.log('📬 Ожидание письма с кодом подтверждения...'); + const code = await waitForConfirmationCode(mailToken, 60000); + console.log('✅ Код получен:', code); + + const confirmPayload = { + email, + code + }; + + const confirmRes = await axios.post(`${BASE_URL}/auth/confirm`, confirmPayload); + expect(confirmRes.status).toBe(200); + + console.log('🎉 Почта подтверждена успешно'); +}); diff --git a/tests/ui/registration/register-graduate.spec.ts b/tests/ui/registration/register-graduate.spec.ts new file mode 100644 index 0000000..d10cd5a --- /dev/null +++ b/tests/ui/registration/register-graduate.spec.ts @@ -0,0 +1,55 @@ +import { test, expect } from '@playwright/test'; +import { RegisterPage } from '../../../page-objects/RegisterPage'; +import { + generateFirstName, + generateLastName, + generateMiddleName, + generateLogin, + generatePhone, +} from '../../../utils/userGenerator'; +import { createTempEmail, waitForConfirmationCode } from '../../../utils/mailTmApi'; + +test('Полная регистрация выпускника с подтверждением почты', async ({ page }) => { + // Создаём временный email + const { email, token } = await createTempEmail(); + + const firstName = generateFirstName(); + const lastName = generateLastName(); + const middleName = generateMiddleName(); + const login = generateLogin(); + const phone = generatePhone(); + const password = '!Test123456'; + + const registerPage = new RegisterPage(page); + await registerPage.goto(); + await registerPage.selectGraduateRole(); + + // Заполняем 1 этап регистрации + await registerPage.fillLastName(lastName); + await registerPage.fillFirstName(firstName); + await registerPage.fillMiddleName(middleName); + await registerPage.fillEmail(email); + await registerPage.fillLogin(login); + await registerPage.fillPhone(phone); + await registerPage.fillPassword(password); + await registerPage.fillPasswordRepeat(password); + await registerPage.clickNextButton(); + + // Заполняем 2 этап: образовательные данные + await registerPage.selectDepartment(); + await registerPage.selectEducationLevel(); + await registerPage.selectSpeciality(); + await registerPage.selectProgram(); + await registerPage.selectEducationForm(); + await registerPage.checkConsentCheckbox(); + await registerPage.submitGraduate(); + + await page.waitForTimeout(5000); + await expect(page).toHaveURL(/confirmation-code/); + const code = await waitForConfirmationCode(token, 60000); + + await page.fill('input[name="code"]', code); + await page.click('button.RecoverPassword_button__5QDxM'); + + await expect(page).toHaveURL('https://rumc.dev.rdcenter.ru'); +});