Добавлены позитивные UI, API тесты для регистрации выпускника
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -2,5 +2,5 @@ node_modules/
|
|||||||
allure-results/
|
allure-results/
|
||||||
allure-report/
|
allure-report/
|
||||||
test-results/
|
test-results/
|
||||||
playwright-report/
|
playwright-report
|
||||||
.env
|
.env
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "npx playwright test",
|
"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:ui": "npx playwright test tests/ui",
|
||||||
"test:api": "npx playwright test tests/api",
|
"test:api": "npx playwright test tests/api",
|
||||||
"report": "npx playwright show-report",
|
"report": "npx playwright show-report",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ export class RegisterPage {
|
|||||||
this.page = page;
|
this.page = page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Этап 1: Общие поля ---
|
||||||
async goto() {
|
async goto() {
|
||||||
await this.page.goto('/registration');
|
await this.page.goto('/registration');
|
||||||
}
|
}
|
||||||
@@ -49,7 +50,47 @@ export class RegisterPage {
|
|||||||
await this.page.locator('span.Checkmark_checkmark__58fWm').click();
|
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() {
|
async submit() {
|
||||||
await this.page.locator('button[data-testid="btn-save"]').click();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -41,6 +41,9 @@ test('API: регистрация абитуриента + подтвержде
|
|||||||
const registerRes = await axios.post(`${BASE_URL}/auth/register`, registerPayload);
|
const registerRes = await axios.post(`${BASE_URL}/auth/register`, registerPayload);
|
||||||
expect(registerRes.status).toBe(201);
|
expect(registerRes.status).toBe(201);
|
||||||
|
|
||||||
|
const userId = registerRes.data.id;
|
||||||
|
console.log('🆔 ID зарегистрированного пользователя:', userId);
|
||||||
|
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('❌ Ошибка регистрации:', error.response?.data || error.message);
|
console.error('❌ Ошибка регистрации:', error.response?.data || error.message);
|
||||||
throw error;
|
throw error;
|
||||||
|
|||||||
65
tests/api/registration/register-graduate.api.spec.ts
Normal file
65
tests/api/registration/register-graduate.api.spec.ts
Normal file
@@ -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('🎉 Почта подтверждена успешно');
|
||||||
|
});
|
||||||
55
tests/ui/registration/register-graduate.spec.ts
Normal file
55
tests/ui/registration/register-graduate.spec.ts
Normal file
@@ -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');
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user