Добавил позитивные сценарии для UI, API регистрации организации
This commit is contained in:
@@ -51,10 +51,14 @@ export class RegisterPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async clickNextButton() {
|
async clickNextButton() {
|
||||||
await this.page.locator('button[type="submit"]', { hasText: 'Далее' }).click();
|
await this.page.locator('button[type="submit"]', { hasText: 'Далее' }).first().click();
|
||||||
}
|
}
|
||||||
|
|
||||||
async submitGraduate() {
|
async clickNextButtonOrg() {
|
||||||
|
await this.page.locator('button[type="submit"]', { hasText: 'Далее' }).last().click();
|
||||||
|
}
|
||||||
|
|
||||||
|
async submitGeneral() {
|
||||||
await this.page.locator('button[type="submit"]', { hasText: 'Зарегистрироваться' }).click();
|
await this.page.locator('button[type="submit"]', { hasText: 'Зарегистрироваться' }).click();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,10 +66,9 @@ export class RegisterPage {
|
|||||||
await this.page.locator('button[data-testid="btn-save"]').click();
|
await this.page.locator('button[data-testid="btn-save"]').click();
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Этап 2: Образование выпускника ---
|
async selectRole(roleName: 'Абитуриент' | 'Выпускник' | 'Организация') {
|
||||||
async selectGraduateRole() {
|
await this.page.getByRole('button', { name: roleName }).click();
|
||||||
await this.page.locator('button.Registration_button_menu__AfPox', { hasText: 'Выпускник' }).click();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
async selectDepartment() {
|
async selectDepartment() {
|
||||||
await this.page.locator('input[name="department"]').click();
|
await this.page.locator('input[name="department"]').click();
|
||||||
@@ -93,4 +96,61 @@ export class RegisterPage {
|
|||||||
await this.page.locator('input[name="educationForm"]').click();
|
await this.page.locator('input[name="educationForm"]').click();
|
||||||
await this.page.getByText('Очная', { exact: true }).click();
|
await this.page.getByText('Очная', { exact: true }).click();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Для организации
|
||||||
|
|
||||||
|
async fillShortName(shortName: string) {
|
||||||
|
await this.page.fill('input[name="shortName"]', shortName);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillFullName(fullName: string){
|
||||||
|
await this.page.fill('input[name="fullName"]', fullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillAddress(address: string) {
|
||||||
|
await this.page.fill('input[name="address"]', address);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillKPP(kpp: string) {
|
||||||
|
await this.page.fill('input[name="kpp"]', kpp);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillINN(inn: string) {
|
||||||
|
await this.page.fill('input[name="inn"]', inn);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillSite(site: string) {
|
||||||
|
await this.page.fill('input[name="site"]', site);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillDescription(description: string) {
|
||||||
|
await this.page.fill('textarea[name="description"]', description);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3
|
||||||
|
async fillDirectorFIO(fio: string) {
|
||||||
|
await this.page.fill('input[name="directorFIO"]', fio);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillPosition(position: string) {
|
||||||
|
await this.page.fill('input[name="position"]', position);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillBasis(basis: string) {
|
||||||
|
await this.page.fill('input[name="basis"]', basis);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillTelegram(tg: string) {
|
||||||
|
await this.page.fill('input[name="tg"]', tg);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillVK(vk: string) {
|
||||||
|
await this.page.fill('input[name="vk"]', vk);
|
||||||
|
}
|
||||||
|
|
||||||
|
async expectSuccessModal() {
|
||||||
|
await this.page.getByRole('heading', { name: 'Ваши данные отправлены на проверку!' }).waitFor();
|
||||||
|
await this.page.getByRole('button', { name: 'На главную' }).click();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { defineConfig } from '@playwright/test';
|
|||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
testDir: './tests',
|
testDir: './tests',
|
||||||
timeout: 30000,
|
timeout: 60000,
|
||||||
expect: {
|
expect: {
|
||||||
timeout: 5000
|
timeout: 5000
|
||||||
},
|
},
|
||||||
@@ -14,12 +14,13 @@ export default defineConfig({
|
|||||||
use: {
|
use: {
|
||||||
headless: false,
|
headless: false,
|
||||||
launchOptions: {
|
launchOptions: {
|
||||||
slowMo: 300,
|
slowMo: 900,
|
||||||
},
|
},
|
||||||
viewport: { width: 1280, height: 720 },
|
viewport: { width: 1280, height: 720 },
|
||||||
ignoreHTTPSErrors: true,
|
ignoreHTTPSErrors: true,
|
||||||
screenshot: 'only-on-failure',
|
screenshot: 'only-on-failure',
|
||||||
video: 'retain-on-failure',
|
video: 'retain-on-failure',
|
||||||
baseURL: 'https://rumc.dev.rdcenter.ru'
|
baseURL: 'https://rumc.dev.rdcenter.ru'
|
||||||
}
|
},
|
||||||
|
workers: 1
|
||||||
});
|
});
|
||||||
|
|||||||
81
tests/api/registration/register-organization.api.spec.ts
Normal file
81
tests/api/registration/register-organization.api.spec.ts
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
import axios from 'axios';
|
||||||
|
import {
|
||||||
|
createTempEmail,
|
||||||
|
waitForConfirmationCode
|
||||||
|
} from '../../../utils/mailTmApi';
|
||||||
|
import {
|
||||||
|
generateFirstName,
|
||||||
|
generateLastName,
|
||||||
|
generateMiddleName,
|
||||||
|
generateLogin,
|
||||||
|
generatePhone,
|
||||||
|
generateKPP,
|
||||||
|
generateINN,
|
||||||
|
generateShortOrgName,
|
||||||
|
generateFullOrgName
|
||||||
|
} 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 representativeName = `${surname} ${name} ${patronymic}`;
|
||||||
|
const login = generateLogin();
|
||||||
|
const phone = '+7 (900) 000-00-00';
|
||||||
|
const password = '!Test123456';
|
||||||
|
const shortName = generateShortOrgName();
|
||||||
|
const fullName = generateFullOrgName();
|
||||||
|
const kpp = generateKPP();
|
||||||
|
const inn = generateINN();
|
||||||
|
|
||||||
|
const registerPayload = {
|
||||||
|
shortName,
|
||||||
|
fullName,
|
||||||
|
description: "Абсолютно неуникальное тестовое описание",
|
||||||
|
website: "https://test-org.ru",
|
||||||
|
address: "г. Таганрог, ул. Тестовая, д. 1",
|
||||||
|
inn,
|
||||||
|
kpp,
|
||||||
|
representativeName,
|
||||||
|
position: "Генеральный директор",
|
||||||
|
phone,
|
||||||
|
basis: "федерального закона",
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
login,
|
||||||
|
socialLinks: {
|
||||||
|
tg: "https://t.me/test_user",
|
||||||
|
vk: "https://vk.com/test_user"
|
||||||
|
}};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const registerRes = await axios.post(`${BASE_URL}/auth/register/organization`, 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('🎉 Почта подтверждена успешно');
|
||||||
|
});
|
||||||
@@ -22,7 +22,7 @@ test('Полная регистрация выпускника с подтвер
|
|||||||
|
|
||||||
const registerPage = new RegisterPage(page);
|
const registerPage = new RegisterPage(page);
|
||||||
await registerPage.goto();
|
await registerPage.goto();
|
||||||
await registerPage.selectGraduateRole();
|
await registerPage.selectRole('Выпускник');
|
||||||
|
|
||||||
// Заполняем 1 этап регистрации
|
// Заполняем 1 этап регистрации
|
||||||
await registerPage.fillLastName(lastName);
|
await registerPage.fillLastName(lastName);
|
||||||
@@ -42,7 +42,7 @@ test('Полная регистрация выпускника с подтвер
|
|||||||
await registerPage.selectProgram();
|
await registerPage.selectProgram();
|
||||||
await registerPage.selectEducationForm();
|
await registerPage.selectEducationForm();
|
||||||
await registerPage.checkConsentCheckbox();
|
await registerPage.checkConsentCheckbox();
|
||||||
await registerPage.submitGraduate();
|
await registerPage.submitGeneral();
|
||||||
|
|
||||||
await page.waitForTimeout(5000);
|
await page.waitForTimeout(5000);
|
||||||
await expect(page).toHaveURL(/confirmation-code/);
|
await expect(page).toHaveURL(/confirmation-code/);
|
||||||
|
|||||||
90
tests/ui/registration/register-organization.spec.ts
Normal file
90
tests/ui/registration/register-organization.spec.ts
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// Позитивный тест регистрации организации
|
||||||
|
// Включает в себя:
|
||||||
|
// Ввод валидных тестовых данных
|
||||||
|
// Получение кода в письме
|
||||||
|
// Ввод кода из письма (is_confirm)
|
||||||
|
// Переход на главную (через модальное окно)
|
||||||
|
|
||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
import { RegisterPage } from '../../../page-objects/RegisterPage';
|
||||||
|
import {
|
||||||
|
generateFirstName,
|
||||||
|
generateLastName,
|
||||||
|
generateMiddleName,
|
||||||
|
generateLogin,
|
||||||
|
generatePhone,
|
||||||
|
generateKPP,
|
||||||
|
generateINN,
|
||||||
|
generateShortOrgName,
|
||||||
|
generateFullOrgName
|
||||||
|
} from '../../../utils/userGenerator';
|
||||||
|
import {
|
||||||
|
createTempEmail,
|
||||||
|
waitForConfirmationCode
|
||||||
|
} from '../../../utils/mailTmApi';
|
||||||
|
|
||||||
|
test('Полная регистрация организации с подтверждением почты', async ({ page }) => {
|
||||||
|
const registerPage = new RegisterPage(page);
|
||||||
|
|
||||||
|
const { email, token } = await createTempEmail();
|
||||||
|
|
||||||
|
const surname = generateLastName();
|
||||||
|
const name = generateFirstName();
|
||||||
|
const patronymic = generateMiddleName();
|
||||||
|
const directorFIO = `${surname} ${name} ${patronymic}`;
|
||||||
|
const login = generateLogin();
|
||||||
|
const phone = generatePhone();
|
||||||
|
const password = '!Test123456';
|
||||||
|
const shortName = generateShortOrgName();
|
||||||
|
const fullName = generateFullOrgName();
|
||||||
|
const address = 'г. Таганрог, ул. Тестовая, д. 1';
|
||||||
|
const kpp = generateKPP();
|
||||||
|
const inn = generateINN();
|
||||||
|
const site = 'https://test-org.ru';
|
||||||
|
const description = 'Абсолютно неуникальное тестовое описание';
|
||||||
|
const position = 'Генеральный директор';
|
||||||
|
const basis = 'закона';
|
||||||
|
const tg = 'https://t.me/test_user';
|
||||||
|
const vk = 'https://vk.com/test_user';
|
||||||
|
|
||||||
|
await registerPage.goto();
|
||||||
|
await registerPage.selectRole('Организация');
|
||||||
|
|
||||||
|
//Первый этап регистраци
|
||||||
|
await registerPage.fillLogin(login);
|
||||||
|
await registerPage.fillEmail(email);
|
||||||
|
await registerPage.fillPassword(password);
|
||||||
|
await registerPage.fillPasswordRepeat(password);
|
||||||
|
await registerPage.clickNextButton();
|
||||||
|
|
||||||
|
//Второй этап регистрации
|
||||||
|
await registerPage.fillShortName(shortName);
|
||||||
|
await registerPage.fillFullName(fullName);
|
||||||
|
await registerPage.fillAddress(address);
|
||||||
|
await registerPage.fillKPP(kpp);
|
||||||
|
await registerPage.fillINN(inn);
|
||||||
|
await registerPage.fillSite(site);
|
||||||
|
await registerPage.fillPhone(phone);
|
||||||
|
await registerPage.fillDescription(description);
|
||||||
|
await registerPage.clickNextButtonOrg();
|
||||||
|
|
||||||
|
//Третий этап регистрации
|
||||||
|
await registerPage.fillDirectorFIO(directorFIO);
|
||||||
|
await registerPage.fillPosition(position);
|
||||||
|
await registerPage.fillBasis(basis);
|
||||||
|
await registerPage.fillTelegram(tg);
|
||||||
|
await registerPage.fillVK(vk);
|
||||||
|
await registerPage.checkConsentCheckbox();
|
||||||
|
await registerPage.submitGeneral();
|
||||||
|
|
||||||
|
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 registerPage.expectSuccessModal();
|
||||||
|
|
||||||
|
await expect(page).toHaveURL('https://rumc.dev.rdcenter.ru');
|
||||||
|
|
||||||
|
});
|
||||||
@@ -43,3 +43,19 @@ export function generatePhone(): string {
|
|||||||
const random = Math.floor(100000000 + Math.random() * 900000000); // 9 цифр
|
const random = Math.floor(100000000 + Math.random() * 900000000); // 9 цифр
|
||||||
return `+790${random}`; // +79012345678
|
return `+790${random}`; // +79012345678
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function generateShortOrgName(): string {
|
||||||
|
return `Организация_${generateRandomString(3)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateFullOrgName(): string {
|
||||||
|
return `ООО Организация_${generateRandomString(3)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateKPP(): string {
|
||||||
|
return Array.from({ length: 9 }, () => Math.floor(Math.random() * 10)).join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateINN(): string {
|
||||||
|
return Array.from({ length: 10 }, () => Math.floor(Math.random() * 10)).join("");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user