This commit is contained in:
Daniil
2026-04-04 14:51:40 +03:00
parent 10a1d28f77
commit 0523ef3d72
191 changed files with 12065 additions and 2658 deletions
@@ -0,0 +1,70 @@
import { test, expect } from "#tests/e2e/fixtures/real-auth"
test.describe("Login (Integration)", () => {
test("should login with registered credentials and stay authenticated after reload", async ({
realLoginPage,
}) => {
const { page, user } = realLoginPage
await realLoginPage.login()
await expect(page).toHaveURL("/")
await expect(
page.getByRole("heading", {
name: new RegExp(`Добро пожаловать, ${user.firstName}`),
}),
).toBeVisible()
await expect
.poll(() => realLoginPage.getCookie("access_token"))
.toBeTruthy()
await expect
.poll(() => realLoginPage.getCookie("refresh_token"))
.toBeTruthy()
await page.reload()
await expect(page).toHaveURL("/")
await expect(
page.getByRole("heading", {
name: new RegExp(`Добро пожаловать, ${user.firstName}`),
}),
).toBeVisible()
})
test("should keep user on login page and avoid auth cookies for invalid password", async ({
realLoginPage,
}) => {
const { page, user } = realLoginPage
const wrongPassword = `${user.password}_wrong`
await realLoginPage.login(wrongPassword)
await expect(page).toHaveURL(/\/login$/)
await expect(page.getByRole("button", { name: "Войти" })).toBeEnabled()
await expect(page.getByRole("textbox", { name: "Логин" })).toHaveValue(
user.username,
)
await expect(page.getByLabel("Пароль")).toHaveValue(wrongPassword)
await expect
.poll(() => realLoginPage.getCookie("access_token"))
.toBeFalsy()
await expect
.poll(() => realLoginPage.getCookie("refresh_token"))
.toBeFalsy()
})
test("should submit the login form with Enter from password field", async ({
realLoginPage,
}) => {
const { page, user } = realLoginPage
await realLoginPage.submitWithEnter()
await expect(page).toHaveURL("/")
await expect(
page.getByRole("heading", {
name: new RegExp(`Добро пожаловать, ${user.firstName}`),
}),
).toBeVisible()
})
})
+110
View File
@@ -0,0 +1,110 @@
import { test, expect } from "#tests/e2e/fixtures/auth"
test.describe("Login Page", () => {
test("should display login form with all fields", async ({ loginPage }) => {
const { page } = loginPage
await expect(page.getByRole("heading", { name: "Вход" })).toBeVisible()
await expect(
page.getByRole("textbox", { name: "Логин" }),
).toBeVisible()
await expect(
page.getByRole("textbox", { name: "Пароль" }),
).toBeVisible()
await expect(
page.getByRole("button", { name: "Войти" }),
).toBeVisible()
await expect(
page.getByRole("link", { name: /Зарегистрироваться/ }),
).toBeVisible()
})
test("should have link to registration page", async ({ loginPage }) => {
const { page } = loginPage
await page.getByRole("link", { name: /Зарегистрироваться/ }).click()
await expect(page).toHaveURL(/\/register/)
})
test("should login successfully and set auth cookies", async ({
loginPage,
}) => {
const { page } = loginPage
await loginPage.mockLoginSuccess()
await loginPage.login("testuser", "password123")
// Verify the mutation succeeded by checking auth cookies are set
await expect(async () => {
const cookies = await page.evaluate(() => document.cookie)
expect(cookies).toContain("access_token=fake-access-jwt")
expect(cookies).toContain("refresh_token=fake-refresh-jwt")
}).toPass({ timeout: 5_000 })
})
test("should show error on invalid credentials", async ({ loginPage }) => {
const { page } = loginPage
const consoleErrors: string[] = []
page.on("console", (msg) => {
if (msg.type() === "error") {
consoleErrors.push(msg.text())
}
})
await loginPage.mockLoginError(401)
await loginPage.login("wronguser", "wrongpassword")
await page.waitForTimeout(1000)
await expect(page).toHaveURL(/\/login/)
expect(consoleErrors.some((e) => e.includes("Login failed"))).toBe(true)
})
test("should handle network error gracefully", async ({ loginPage }) => {
const { page } = loginPage
await loginPage.mockLoginNetworkError()
await loginPage.login("testuser", "password123")
await page.waitForTimeout(1000)
await expect(page).toHaveURL(/\/login/)
})
test("should handle server error (500)", async ({ loginPage }) => {
const { page } = loginPage
await loginPage.mockLoginError(500, {
detail: "Internal server error",
})
await loginPage.login("testuser", "password123")
await page.waitForTimeout(1000)
await expect(page).toHaveURL(/\/login/)
})
test("should submit with empty fields", async ({ loginPage }) => {
const { page } = loginPage
await loginPage.mockLoginError(422, { detail: "Validation error" })
await page.getByRole("button", { name: "Войти" }).click()
await page.waitForTimeout(500)
await expect(page).toHaveURL(/\/login/)
})
test("should disable submit button while request is pending", async ({
loginPage,
}) => {
const { page } = loginPage
await loginPage.mockLoginDelayed(2000)
await page.getByRole("textbox", { name: "Логин" }).fill("testuser")
await page.getByRole("textbox", { name: "Пароль" }).fill("password123")
const submitButton = page.getByRole("button", { name: "Войти" })
await submitButton.click()
await expect(submitButton).toBeDisabled()
})
})