Files
main_frontend/tests/e2e/specs/project/create-project.integration.spec.ts
2026-04-04 14:51:40 +03:00

126 lines
4.5 KiB
TypeScript

import { test, expect } from "#tests/e2e/fixtures/real-backend"
// These tests run against the real backend (localhost:8000).
// Each test gets a fresh user with real JWT tokens.
// Created projects are cleaned up automatically after each test.
test.describe("Create Project (Integration)", () => {
test("should create project and see it in the list", async ({
realProjectsPage,
}) => {
const { page, modal } = realProjectsPage
// Empty state
await expect(page.getByText("У вас пока нет проектов")).toBeVisible()
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Интеграционный тест")
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
await expect(page.getByText("Интеграционный тест")).toBeVisible()
})
test("should create project with description", async ({
realProjectsPage,
}) => {
const { page, modal } = realProjectsPage
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Проект с описанием")
await modal
.locator("#project_description")
.fill("Описание для интеграционного теста")
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
await expect(page.getByText("Проект с описанием")).toBeVisible()
// Verify via API that description was saved
const projects = await realProjectsPage.getProjects()
const created = projects.find(
(p: { name: string }) => p.name === "Проект с описанием",
)
expect(created).toBeTruthy()
})
test("should create project with Russian language", async ({
realProjectsPage,
}) => {
const { page, modal } = realProjectsPage
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Русский проект")
await modal.locator("button").filter({ hasText: "Авто" }).click()
await page.locator("[role=option]", { hasText: "Русский" }).click()
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
// Verify language via API
const projects = await realProjectsPage.getProjects()
const created = projects.find(
(p: { name: string }) => p.name === "Русский проект",
) as { language: string } | undefined
expect(created?.language).toBe("ru")
})
test("should create multiple projects", async ({ realProjectsPage }) => {
const { page, modal } = realProjectsPage
// Create first project
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Первый проект")
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
await expect(page.getByText("Первый проект")).toBeVisible()
// Create second project
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Второй проект")
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
await expect(page.getByText("Второй проект")).toBeVisible()
// Both visible
await expect(page.getByText("Первый проект")).toBeVisible()
await expect(page.getByText("Второй проект")).toBeVisible()
// Verify via API
const projects = await realProjectsPage.getProjects()
expect(projects.length).toBe(2)
})
test("should persist project after page reload", async ({
realProjectsPage,
}) => {
const { page, modal } = realProjectsPage
await realProjectsPage.openCreateModal()
await modal.locator("#project_name").fill("Персистентный проект")
await modal.locator("button", { hasText: "Создать" }).click()
await expect(modal).toBeHidden()
await expect(page.getByText("Персистентный проект")).toBeVisible()
// Reload and verify project is still there
await page.reload()
await page.getByRole("heading", { name: "Мои проекты" }).waitFor()
await expect(page.getByText("Персистентный проект")).toBeVisible()
})
test("should show validation error for empty name (client-side)", async ({
realProjectsPage,
}) => {
const { modal } = realProjectsPage
await realProjectsPage.openCreateModal()
await modal.locator("button", { hasText: "Создать" }).click()
await expect(
modal.getByText("Введите название проекта"),
).toBeVisible()
await expect(modal).toBeVisible()
})
})