Files
gymflow/tests/01_core_auth.spec.ts

218 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, expect } from './fixtures';
test.describe('I. Core & Authentication', () => {
test.beforeEach(async ({ page }) => {
// Console logs for debugging
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
page.on('pageerror', exception => console.log(`PAGE ERROR: ${exception}`));
await page.goto('/');
});
// Helper to handle first login if needed
async function handleFirstLogin(page: any) {
console.log('Starting handleFirstLogin helper...');
const dashboard = page.getByText(/Free Workout|Свободная тренировка/i).first();
const changePass = page.getByRole('heading', { name: /Change Password|Смена пароля/i });
const initAcc = page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i });
try {
await expect(dashboard.or(changePass).or(initAcc)).toBeVisible({ timeout: 10000 });
if (await changePass.isVisible()) {
console.log('Change Password screen detected. Handling...');
await page.getByLabel(/New Password|Новый пароль/i).fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
await expect(dashboard.or(initAcc)).toBeVisible({ timeout: 10000 });
}
if (await initAcc.isVisible()) {
console.log('Initialization screen detected. Handling...');
await page.getByRole('button', { name: /Get Started|Начать работу/i }).click();
await expect(dashboard).toBeVisible({ timeout: 10000 });
}
} catch (e) {
console.log('handleFirstLogin timeout or already reached dashboard');
}
// Final check with assertion to fail the test if not reached
await expect(dashboard).toBeVisible({ timeout: 5000 });
}
// 1.1. A. Login - Successful Authentication
test('1.1 Login - Successful Authentication', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
await handleFirstLogin(page);
// Expect redirection to dashboard
await expect(page).not.toHaveURL(/\/login/);
await expect(page.getByText(/Free Workout|Свободная тренировка/i).first()).toBeVisible();
});
// 1.2. A. Login - Invalid Credentials
test('1.2 Login - Invalid Credentials', async ({ page }) => {
await page.getByLabel(/Email/i).fill('invalid@user.com');
await page.getByLabel(/Password|Пароль/i).fill('wrongpassword');
await page.getByRole('button', { name: /Login|Войти/i }).click();
await expect(page.getByText('Invalid credentials')).toBeVisible();
await expect(page.getByRole('button', { name: 'Login' })).toBeVisible();
});
test('1.3 & 1.4 Login - First-Time Password Change', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
await expect(page.getByRole('heading', { name: /Change Password|Смена пароля/i }).first()).toBeVisible({ timeout: 10000 });
// 1.4 Test short password
await page.getByLabel(/New Password|Новый пароль/i).fill('123');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
await expect(page.getByText(/Password too short|Пароль слишком короткий/i)).toBeVisible();
// 1.3 Test successful change
await page.getByLabel(/New Password|Новый пароль/i).fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
// Now we should be on Setup Account page
await expect(page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i })).toBeVisible();
await page.getByRole('button', { name: /Get Started|Начать работу/i }).click();
// Now we should be logged in
await expect(page.getByText(/Free Workout|Свободная тренировка/i).first()).toBeVisible();
});
test('1.5 Login - Language Selection (English)', async ({ page }) => {
await page.getByRole('combobox').selectOption('en');
await expect(page.getByLabel(/Email/i)).toBeVisible();
await expect(page.getByRole('button', { name: /Login|Войти/i })).toBeVisible();
});
// 1.6. A. Login - Language Selection (Russian)
test('1.6 Login - Language Selection (Russian)', async ({ page }) => {
await page.getByRole('combobox').selectOption('ru');
await expect(page.getByRole('button', { name: 'Войти' })).toBeVisible();
});
// 1.7. B. Navigation - Desktop Navigation Rail
test('1.7 Navigation - Desktop Navigation Rail', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
await handleFirstLogin(page);
// Set viewport to desktop
await page.setViewportSize({ width: 1280, height: 720 });
await expect(page.getByRole('button', { name: /Tracker|Трекер/i }).first()).toBeVisible();
await expect(page.getByRole('button', { name: /Plans|Планы/i }).first()).toBeVisible();
});
// 1.8. B. Navigation - Mobile Bottom Navigation Bar
test('1.8 Navigation - Mobile Bottom Navigation Bar', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
await handleFirstLogin(page);
// Set viewport to mobile
await page.setViewportSize({ width: 375, height: 667 });
await page.waitForTimeout(500); // Allow layout transition
// Verify visibility of mobile nav items
await expect(page.getByRole('button', { name: /Tracker|Трекер/i }).last()).toBeVisible();
});
// 1.9. C. Initialization - Russian Language Seeding
test('1.9 Initialization - Russian Language Seeding', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
// Handle password change
await expect(page.getByRole('heading', { name: /Change Password|Смена пароля/i })).toBeVisible();
await page.getByLabel(/New Password|Новый пароль/i).fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
// Handle initialization - Select Russian
await expect(page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i })).toBeVisible();
await page.getByText('Русский').click();
await page.getByRole('button', { name: /Начать работу|Get Started/i }).click();
// Expect dashboard
await expect(page.getByText('Свободная тренировка')).toBeVisible();
// Verify some exercise is in Russian
await page.getByText(/Свободная тренировка|Free Workout/i).first().click();
await page.getByLabel(/Выберите упражнение|Select Exercise/i).click();
// "Air Squats" should be "Приседания" in suggestions
await expect(page.getByRole('button', { name: 'Приседания', exact: true })).toBeVisible();
await page.getByRole('button', { name: 'Приседания', exact: true }).click();
// Verify it's selected in the input
const exerciseInput = page.getByLabel(/Выберите упражнение|Select Exercise/i);
await expect(exerciseInput).toHaveValue('Приседания');
// Verify "Log Set" button is now in Russian
await expect(page.getByRole('button', { name: /Записать подход|Log Set/i })).toBeVisible();
});
// 1.10. C. Initialization - Optional Profile Data
test('1.10 Initialization - Optional Profile Data', async ({ page, createUniqueUser }) => {
const user = await createUniqueUser();
await page.getByLabel(/Email/i).fill(user.email);
await page.getByLabel(/Password|Пароль/i).fill(user.password);
await page.getByRole('button', { name: /Login|Войти/i }).click();
// Handle password change
await expect(page.getByRole('heading', { name: /Change Password|Смена пароля/i })).toBeVisible();
await page.getByLabel(/New Password|Новый пароль/i).fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
// Handle initialization
await expect(page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i })).toBeVisible();
// Fill data
await page.getByLabel(/Birth Date|Дата рожд./i).fill('1990-01-01');
await page.keyboard.press('Enter');
await page.getByLabel(/Height|Рост/i).fill('180');
await page.getByLabel(/Bodyweight|Вес тела/i).fill('80');
await page.getByLabel(/Gender|Пол/i).selectOption('MALE');
await page.getByRole('button', { name: /Get Started|Начать работу/i }).click();
// Expect dashboard
await expect(page.getByText(/Free Workout|Свободная тренировка/i).first()).toBeVisible();
// Navigate to profile to verify
await page.getByRole('button', { name: /Profile|Профиль/i }).first().click();
// Verify values in Profile section
await expect(page.getByLabel(/Height|Рост/i)).toHaveValue('180');
await expect(page.getByLabel(/Birth Date|Дата рожд./i)).toHaveValue('1990-01-01');
await expect(page.getByLabel(/Gender|Пол/i)).toHaveValue('MALE');
});
});