diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..2b9639e Binary files /dev/null and b/.DS_Store differ 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'); +});