From 96394f726b028e26e648c84f3308943bae53509e Mon Sep 17 00:00:00 2001 From: Vlad Smykov Date: Wed, 4 Feb 2026 14:58:02 +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=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=B8=D0=B2=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20API=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B2=D0=BE?= =?UTF-8?q?=D1=81=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- playwright.config.ts | 2 +- temp/user.json | 2 +- tests/api/auth/recover-password.api.spec.ts | 42 +++++++++++++++++++ .../register-applicant.api.spec.ts | 1 + .../register-graduate.api.spec.ts | 1 + .../register-organization.api.spec.ts | 1 + tests/ui/auth/recover-password.spec.ts | 16 +++---- .../registration/register-applicant.spec.ts | 1 + .../ui/registration/register-graduate.spec.ts | 1 + .../register-organization.spec.ts | 1 + 11 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 tests/api/auth/recover-password.api.spec.ts diff --git a/package.json b/package.json index e06aac2..d1c5fa5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "keywords": [], "author": "Vlad Smykov", "license": "ISC", - "type": "commonjs", + "type": "module", "devDependencies": { "@playwright/test": "^1.57.0", "@types/node": "^25.1.0", diff --git a/playwright.config.ts b/playwright.config.ts index 70b3ed9..3258df1 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ use: { headless: false, launchOptions: { - slowMo: 900, + slowMo: 300, }, viewport: { width: 1280, height: 720 }, ignoreHTTPSErrors: true, diff --git a/temp/user.json b/temp/user.json index 2bf7790..0d849e0 100644 --- a/temp/user.json +++ b/temp/user.json @@ -1 +1 @@ -{"email":"testuser1769775617223@virgilian.com","password":"!Test123456","mailToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3Njk3NzU2MTgsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJhZGRyZXNzIjoidGVzdHVzZXIxNzY5Nzc1NjE3MjIzQHZpcmdpbGlhbi5jb20iLCJpZCI6IjY5N2NhMjAxM2ExZjhmNWE1MDA3MTEyNSIsIm1lcmN1cmUiOnsic3Vic2NyaWJlIjpbIi9hY2NvdW50cy82OTdjYTIwMTNhMWY4ZjVhNTAwNzExMjUiXX19.t8gDCA6xtLYnAex_f3OYj5aYJgls4g8IQs2K37gc6HiqdaKkZveB1ckB31_hhYJag23Ekdi6RW9CNm0RCLsDDQ"} \ No newline at end of file +{"email":"testuser1770028019439@virgilian.com","password":"!Test123456","mailToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3NzAwMjgwMjAsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJhZGRyZXNzIjoidGVzdHVzZXIxNzcwMDI4MDE5NDM5QHZpcmdpbGlhbi5jb20iLCJpZCI6IjY5ODA3YmY0NmFiNTlkMDJiMzBhMzNhOCIsIm1lcmN1cmUiOnsic3Vic2NyaWJlIjpbIi9hY2NvdW50cy82OTgwN2JmNDZhYjU5ZDAyYjMwYTMzYTgiXX19.xWXF4bN07584CE0AGiuUfH7XpNLNKFRp7DnLQbbf1jhzRHPgQuHaqh39_lShcFSl5GU1Hxqdk41s9yJMBFkuYw"} \ No newline at end of file diff --git a/tests/api/auth/recover-password.api.spec.ts b/tests/api/auth/recover-password.api.spec.ts new file mode 100644 index 0000000..d0b9dd2 --- /dev/null +++ b/tests/api/auth/recover-password.api.spec.ts @@ -0,0 +1,42 @@ +import { test, expect } from '@playwright/test'; +import axios from 'axios'; +import fs from 'fs'; + +const BASE_URL = 'https://rumc.dev.rdcenter.ru/api'; +const NEW_PASSWORD = '!Test123456'; + +const user = JSON.parse(fs.readFileSync('temp/user.json', 'utf-8')); + +test('API: восстановление пароля', async () => { + const email = user.email; + + const sendResetRes = await axios.post(`${BASE_URL}/auth/resetPassword?type=reset`, { + email, + }); + expect(sendResetRes.status).toBe(201); + + console.log('📬 Письмо с кодом отправлено'); + + const { waitForConfirmationCode } = await import('../../../utils/mailTmApi'); + const code = await waitForConfirmationCode(email, user.mailToken, 'recover', 60000); + expect(code).toMatch(/^\d{6}$/); + console.log('✅ Код подтверждения:', code); + + const confirmRes = await axios.post(`${BASE_URL}/auth/confirmReset`, { + email, + code + }); + expect(confirmRes.status).toBe(201); + const resetTokenRaw = confirmRes.data.resetTokenRaw; + console.log('🔑 Получен resetToken:', resetTokenRaw); + + const recoveryRes = await axios.post(`${BASE_URL}/auth/recovery`, { + email, + resetToken: resetTokenRaw, + passwordReset: NEW_PASSWORD + }); + expect(recoveryRes.status).toBe(201); + + const accessToken = recoveryRes.data.access_token; + console.log('🪪 Новый access_token:', accessToken); +}); diff --git a/tests/api/registration/register-applicant.api.spec.ts b/tests/api/registration/register-applicant.api.spec.ts index 3d69155..9adfd1a 100644 --- a/tests/api/registration/register-applicant.api.spec.ts +++ b/tests/api/registration/register-applicant.api.spec.ts @@ -16,6 +16,7 @@ import { const BASE_URL = 'https://rumc.dev.rdcenter.ru/api'; test('API: регистрация абитуриента + подтверждение почты', async () => { + await new Promise(r => setTimeout(r, 3000)); const { email, token: mailToken } = await createTempEmail(); const surname = generateLastName(); diff --git a/tests/api/registration/register-graduate.api.spec.ts b/tests/api/registration/register-graduate.api.spec.ts index ac6840b..98810c1 100644 --- a/tests/api/registration/register-graduate.api.spec.ts +++ b/tests/api/registration/register-graduate.api.spec.ts @@ -15,6 +15,7 @@ import { const BASE_URL = 'https://rumc.dev.rdcenter.ru/api'; test('API: регистрация выпускника + подтверждение почты', async () => { + await new Promise(r => setTimeout(r, 3000)); const { email, token: mailToken } = await createTempEmail(); const surname = generateLastName(); diff --git a/tests/api/registration/register-organization.api.spec.ts b/tests/api/registration/register-organization.api.spec.ts index 5bfd004..f1b9178 100644 --- a/tests/api/registration/register-organization.api.spec.ts +++ b/tests/api/registration/register-organization.api.spec.ts @@ -19,6 +19,7 @@ import { const BASE_URL = 'https://rumc.dev.rdcenter.ru/api'; test('API: регистрация организации + подтверждение почты', async () => { + await new Promise(r => setTimeout(r, 3000)); const { email, token: mailToken } = await createTempEmail(); const surname = generateLastName(); diff --git a/tests/ui/auth/recover-password.spec.ts b/tests/ui/auth/recover-password.spec.ts index d119868..97b4659 100644 --- a/tests/ui/auth/recover-password.spec.ts +++ b/tests/ui/auth/recover-password.spec.ts @@ -6,39 +6,33 @@ import { } from '../../../utils/mailTmApi'; test('UI: восстановление пароля', async ({ page }) => { - // Загружаем email пользователя из файла temp/user.json + const loginPage = new LoginPage(page); const user = JSON.parse(fs.readFileSync('temp/user.json', 'utf-8')); const newPassword = '!Test12345678'; - // Переход на главную + await loginPage.goto(); - // Нажимаем "Забыли пароль?" + await page.getByText('Забыли пароль?').click(); await expect(page).toHaveURL(/.*confirmation-code/); - // Вводим почту + await page.fill('input[name="email"]', user.email); await page.getByRole('button', { name: 'Далее' }).click(); - // Получаем код из почты const code = await waitForConfirmationCode(user.email, user.mailToken, 'recover'); expect(code).toMatch(/^\d{6}$/); console.log('✅ Код получен:', code); - // Вводим код + await page.fill('input[name="code"]', code); await page.getByRole('button', { name: 'Далее' }).click(); - // Вводим новый пароль await page.fill('input[name="password"]', newPassword); await page.fill('input[name="passwordRepeat"]', newPassword); await page.getByRole('button', { name: 'Далее' }).click(); - // Проверяем успешную авторизацию await expect(page).toHaveURL(/.*\/account\/profile/); - // (необязательно) обновляем сохранённый пароль - //user.password = newPassword; - //fs.writeFileSync('temp/user.json', JSON.stringify(user)); }); diff --git a/tests/ui/registration/register-applicant.spec.ts b/tests/ui/registration/register-applicant.spec.ts index 32abaf9..8a97ace 100644 --- a/tests/ui/registration/register-applicant.spec.ts +++ b/tests/ui/registration/register-applicant.spec.ts @@ -20,6 +20,7 @@ import { } from '../../../utils/mailTmApi'; test('Полная регистрация абитуриента с подтверждением почты', async ({ page }) => { + await new Promise(r => setTimeout(r, 3000)); const registerPage = new RegisterPage(page); const { email, token } = await createTempEmail(); diff --git a/tests/ui/registration/register-graduate.spec.ts b/tests/ui/registration/register-graduate.spec.ts index 717c553..6354dd4 100644 --- a/tests/ui/registration/register-graduate.spec.ts +++ b/tests/ui/registration/register-graduate.spec.ts @@ -10,6 +10,7 @@ import { import { createTempEmail, waitForConfirmationCode } from '../../../utils/mailTmApi'; test('Полная регистрация выпускника с подтверждением почты', async ({ page }) => { + await new Promise(r => setTimeout(r, 3000)); // Создаём временный email const { email, token } = await createTempEmail(); diff --git a/tests/ui/registration/register-organization.spec.ts b/tests/ui/registration/register-organization.spec.ts index 3d38aab..2f8862f 100644 --- a/tests/ui/registration/register-organization.spec.ts +++ b/tests/ui/registration/register-organization.spec.ts @@ -24,6 +24,7 @@ import { } from '../../../utils/mailTmApi'; test('Полная регистрация организации с подтверждением почты', async ({ page }) => { + await new Promise(r => setTimeout(r, 3000)); const registerPage = new RegisterPage(page); const { email, token } = await createTempEmail();