Skip to content

Commit 3b2c500

Browse files
committed
feat: refactor Playwright tests to use base URL and clean database utility; add global setup for test environment
1 parent 6947cd1 commit 3b2c500

File tree

10 files changed

+55
-59
lines changed

10 files changed

+55
-59
lines changed

.env.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
DATABASE_URL="postgresql://diego@localhost:5432/fullstock_test?schema=public"
22

33
# Admin Database (for database creation/deletion)
4-
ADMIN_DB_NAME=postgres
4+
ADMIN_DB_NAME=postgres

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ dist-ssr
2626
# React Router
2727
.react-router/
2828

29-
.build/
29+
build/
3030
.env
3131

3232
# Playwright

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
"prisma:migrate:status": "prisma migrate status",
1919
"prisma:studio": "prisma studio",
2020
"prisma:seed": "prisma db seed",
21-
"test:prisma:migrate:deploy": "dotenv -e .env.test -- prisma migrate deploy"
21+
"test:prisma:migrate:deploy": "dotenv -e .env.test -- prisma migrate deploy",
22+
"test:e2e": "playwright test",
23+
"test:prisma:seed": "dotenv -e .env.test prisma db seed"
2224
},
2325
"prisma": {
2426
"seed": "tsx ./prisma/seed.ts"

playwright.config.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { defineConfig, devices } from "@playwright/test";
22
import dotenv from "dotenv";
33

4+
import { baseUrl, command } from "@/e2e/utils-tests-e2e";
5+
46
// Load test environment variables
57
dotenv.config({ path: ".env.test" });
68

@@ -18,15 +20,16 @@ dotenv.config({ path: ".env.test" });
1820
export default defineConfig({
1921
testDir: "./src/e2e",
2022
/* Run tests in files in parallel */
21-
fullyParallel: true,
23+
// globalSetup: require.resolve("./src/e2e/setup.ts"),
24+
fullyParallel: false,
2225
/* Fail the build on CI if you accidentally left test.only in the source code. */
2326
forbidOnly: !!process.env.CI,
2427
/* Retry on CI only */
2528
retries: process.env.CI ? 2 : 0,
2629
/* Opt out of parallel tests on CI. */
27-
workers: process.env.CI ? 1 : undefined,
30+
workers: 1,
2831
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
29-
reporter: "html",
32+
reporter: "list",
3033
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
3134
use: {
3235
/* Base URL to use in actions like `await page.goto('/')`. */
@@ -75,9 +78,9 @@ export default defineConfig({
7578
],
7679

7780
/* Run your local dev server before starting the tests */
78-
// webServer: {
79-
// command: 'npm run start',
80-
// url: 'http://localhost:3000',
81-
// reuseExistingServer: !process.env.CI,
82-
// },
81+
webServer: {
82+
command: command,
83+
url: baseUrl,
84+
reuseExistingServer: !process.env.CI,
85+
},
8386
});

src/e2e/demo.signin.spec.ts

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,32 @@ import { prisma } from "@/db/prisma";
44
import { hashPassword } from "@/lib/security";
55
import type { CreateUserDTO } from "@/models/user.model";
66

7+
import { baseUrl, cleanDatabase } from "./utils-tests-e2e";
8+
79
test.describe("Visitante inicio sesion", () => {
8-
let testUserId: number;
10+
test.beforeEach(async () => {
11+
await cleanDatabase();
912

10-
test.beforeAll(async () => {
1113
const testUser: CreateUserDTO = {
1214
1315
name: null,
1416
password: await hashPassword("letmein"),
1517
isGuest: false,
1618
};
1719

18-
const existingUser = await prisma.user.findUnique({
19-
where: { email: testUser.email },
20-
});
21-
22-
if (existingUser) {
23-
await prisma.user.delete({
24-
where: { id: existingUser.id },
25-
});
26-
}
27-
28-
const user = await prisma.user.create({
20+
await prisma.user.create({
2921
data: testUser,
3022
});
31-
testUserId = user.id;
32-
});
33-
34-
test.afterAll(async () => {
35-
await prisma.user.delete({
36-
where: { id: testUserId },
37-
});
3823
});
3924

4025
test("test", async ({ page }) => {
41-
await page.goto("http://localhost:5173/");
26+
await page.goto(baseUrl);
4227
await page.getByTestId("login").click();
4328
await page.getByRole("textbox", { name: "Correo electrónico" }).click();
4429
await page
4530
.getByRole("textbox", { name: "Correo electrónico" })
4631
47-
await page
48-
.getByRole("textbox", { name: "Correo electrónico" })
49-
.press("Tab");
32+
5033
await page.getByRole("textbox", { name: "Contraseña" }).fill("letmein");
5134
await page.getByRole("button", { name: "Iniciar sesión" }).click();
5235

src/e2e/demo.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { test, expect } from "@playwright/test";
22

3+
import { baseUrl } from "./utils-tests-e2e";
4+
35
test.describe("Visitor", () => {
46
test("can add a product to the cart", async ({ page }) => {
5-
await page.goto("http://localhost:5173/");
7+
await page.goto(baseUrl);
68

79
await expect(page).toHaveTitle(/inicio/i);
810

src/e2e/guest-create-order.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
// import { createOrderFormData } from "@/lib/utils.tests";
22
import { expect, test } from "@playwright/test";
33

4-
import { createOrderFormData } from "./utils-tests-e2e";
4+
import { baseUrl, createOrderFormData } from "./utils-tests-e2e";
55

66
export type OrderFormData = Record<string, string>;
77

88
test.describe("Guest", () => {
99
test("Guest can create an order", async ({ page }) => {
1010
// Navegar a la tienda y agregar un producto
11-
await page.goto("http://localhost:5173/");
11+
await page.goto(baseUrl);
1212

1313
await page.getByRole("menuitem", { name: "Polos" }).click();
1414
await page.getByTestId("product-item").first().click();

src/e2e/setup.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { cleanDatabase } from "./utils-tests-e2e";
2+
3+
export default async function globalSetup() {
4+
await cleanDatabase();
5+
}

src/e2e/user-create-order.spec.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,26 @@ import { prisma } from "@/db/prisma";
44
import { hashPassword } from "@/lib/security";
55
import type { CreateUserDTO } from "@/models/user.model";
66

7+
import { baseUrl, cleanDatabase } from "./utils-tests-e2e";
8+
79
test.describe("User", () => {
8-
let testUserId: number;
10+
test.beforeEach(async () => {
11+
await cleanDatabase();
912

10-
test.beforeAll(async () => {
1113
const testUser: CreateUserDTO = {
1214
1315
name: null,
1416
password: await hashPassword("letmein"),
1517
isGuest: false,
1618
};
1719

18-
const existingUser = await prisma.user.findUnique({
19-
where: { email: testUser.email },
20-
});
21-
22-
if (existingUser) {
23-
await prisma.user.delete({
24-
where: { id: existingUser.id },
25-
});
26-
}
27-
28-
const user = await prisma.user.create({
20+
await prisma.user.create({
2921
data: testUser,
3022
});
31-
testUserId = user.id;
32-
});
33-
34-
test.afterAll(async () => {
35-
await prisma.user.delete({
36-
where: { id: testUserId },
37-
});
3823
});
3924

4025
test("User can create an order", async ({ page }) => {
41-
await page.goto("http://localhost:5173/");
26+
await page.goto(baseUrl);
4227

4328
await page.getByRole("link", { name: "Iniciar sesión" }).click();
4429

src/e2e/utils-tests-e2e.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/* Helper functions → Playwright */
22

3+
import { prisma } from "@/db/prisma";
4+
35
export type OrderFormData = Record<string, string>;
46

57
export const createOrderFormData = (
@@ -16,3 +18,17 @@ export const createOrderFormData = (
1618
Teléfono: "987456321",
1719
...overrides,
1820
});
21+
22+
export async function cleanDatabase() {
23+
await prisma.order.deleteMany();
24+
await prisma.cart.deleteMany();
25+
await prisma.user.deleteMany();
26+
27+
// Mantenemos product y category
28+
}
29+
30+
export const baseUrl = process.env.CI
31+
? "http://localhost:3000/"
32+
: "http://localhost:5173/";
33+
34+
export const command = process.env.CI ? "npm run start" : "npm run dev";

0 commit comments

Comments
 (0)