feat(e2e): add fixtures and data seeding
This commit is contained in:
parent
cd09843b99
commit
ce7a94e492
|
@ -0,0 +1,20 @@
|
||||||
|
import axios, { AxiosError } from "axios"
|
||||||
|
|
||||||
|
axios.defaults.baseURL = "http://localhost:3000"
|
||||||
|
|
||||||
|
export async function seedUser (username?: string, password?: string, name?: string) {
|
||||||
|
try {
|
||||||
|
return await axios.post("/api/v1/users", {
|
||||||
|
username: username || "test",
|
||||||
|
password: password || "password",
|
||||||
|
name: name || "Test User",
|
||||||
|
})
|
||||||
|
} catch (e: any) {
|
||||||
|
if (e instanceof AxiosError) {
|
||||||
|
if (e.response?.status === 400) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { Locator, Page } from "playwright";
|
||||||
|
import { BasePage } from "./page";
|
||||||
|
|
||||||
|
export class DashboardPage extends BasePage {
|
||||||
|
container: Locator;
|
||||||
|
constructor(page: Page) {
|
||||||
|
super(page);
|
||||||
|
this.container = this.page.getByTestId("dashboard-wrapper");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { Locator, Page } from "@playwright/test";
|
||||||
|
|
||||||
|
export class BaseModal {
|
||||||
|
page: Page;
|
||||||
|
container: Locator;
|
||||||
|
mobileContainer: Locator;
|
||||||
|
closeModalButton: Locator;
|
||||||
|
mobileModalSlider: Locator;
|
||||||
|
|
||||||
|
constructor(page: Page) {
|
||||||
|
this.page = page;
|
||||||
|
this.container = page.getByTestId("modal-container");
|
||||||
|
this.mobileContainer = page.getByTestId("mobile-modal-container");
|
||||||
|
this.closeModalButton = this.container.getByTestId("close-modal-button");
|
||||||
|
this.mobileModalSlider = this.mobileContainer.getByTestId(
|
||||||
|
"mobile-modal-slider"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async close() {
|
||||||
|
if (await this.container.isVisible()) {
|
||||||
|
await this.closeModalButton.click();
|
||||||
|
}
|
||||||
|
if (await this.mobileContainer.isVisible()) {
|
||||||
|
const box = await this.mobileModalSlider.boundingBox();
|
||||||
|
if (!box) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const pageHeight = await this.page.evaluate(() => window.innerHeight);
|
||||||
|
const startX = box.x + box.width / 2;
|
||||||
|
const startY = box.y + box.height / 2;
|
||||||
|
await this.page.mouse.move(startX, startY);
|
||||||
|
await this.page.mouse.down();
|
||||||
|
await this.page.mouse.move(startX, startY + pageHeight / 2);
|
||||||
|
await this.page.mouse.up();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async isOpen() {
|
||||||
|
return (
|
||||||
|
(await this.container.isVisible()) ||
|
||||||
|
(await this.mobileContainer.isVisible())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { Locator, Page } from "@playwright/test";
|
||||||
|
|
||||||
|
export class BasePage {
|
||||||
|
page: Page;
|
||||||
|
toastMessage: Locator;
|
||||||
|
|
||||||
|
constructor(page: Page) {
|
||||||
|
this.page = page;
|
||||||
|
this.toastMessage = this.page.getByTestId("toast-message-container");
|
||||||
|
}
|
||||||
|
|
||||||
|
async getLatestToast() {
|
||||||
|
const toast = this.toastMessage.first();
|
||||||
|
return {
|
||||||
|
locator: toast,
|
||||||
|
closeButton: toast.getByTestId("close-toast-button"),
|
||||||
|
message: toast.getByTestId("toast-message"),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { test as baseTest } from "@playwright/test";
|
||||||
|
import { LoginPage } from "./login-page";
|
||||||
|
import { RegistrationPage } from "./registration-page";
|
||||||
|
import { DashboardPage } from "./base/dashboard-page";
|
||||||
|
|
||||||
|
export const test = baseTest.extend<{
|
||||||
|
dashboardPage: DashboardPage;
|
||||||
|
loginPage: LoginPage;
|
||||||
|
registrationPage: RegistrationPage;
|
||||||
|
}>({
|
||||||
|
page: async ({ page }, use) => {
|
||||||
|
await page.goto("/");
|
||||||
|
use(page);
|
||||||
|
},
|
||||||
|
dashboardPage: async ({ page }, use) => {
|
||||||
|
const dashboardPage = new DashboardPage(page);
|
||||||
|
await use(dashboardPage);
|
||||||
|
},
|
||||||
|
loginPage: async ({ page }, use) => {
|
||||||
|
const loginPage = new LoginPage(page);
|
||||||
|
await use(loginPage);
|
||||||
|
},
|
||||||
|
registrationPage: async ({ page }, use) => {
|
||||||
|
const registrationPage = new RegistrationPage(page);
|
||||||
|
await use(registrationPage);
|
||||||
|
},
|
||||||
|
});
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { Locator, Page } from "@playwright/test";
|
||||||
|
import { BasePage } from "./base/page";
|
||||||
|
|
||||||
|
export class LoginPage extends BasePage {
|
||||||
|
submitLoginButton: Locator;
|
||||||
|
loginForm: Locator;
|
||||||
|
registerLink: Locator;
|
||||||
|
passwordInput: Locator;
|
||||||
|
usernameInput: Locator;
|
||||||
|
|
||||||
|
constructor(page: Page) {
|
||||||
|
super(page);
|
||||||
|
|
||||||
|
this.submitLoginButton = page.getByTestId("submit-login-button");
|
||||||
|
|
||||||
|
this.loginForm = page.getByTestId("login-form");
|
||||||
|
|
||||||
|
this.registerLink = page.getByTestId("register-link");
|
||||||
|
|
||||||
|
this.passwordInput = page.getByTestId("password-input");
|
||||||
|
this.usernameInput = page.getByTestId("username-input");
|
||||||
|
}
|
||||||
|
|
||||||
|
async goto() {
|
||||||
|
await this.page.goto("/login");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { Locator, Page } from "@playwright/test";
|
||||||
|
import { BasePage } from "./base/page";
|
||||||
|
|
||||||
|
export class RegistrationPage extends BasePage {
|
||||||
|
registerButton: Locator;
|
||||||
|
registrationForm: Locator;
|
||||||
|
|
||||||
|
loginLink: Locator;
|
||||||
|
|
||||||
|
displayNameInput: Locator;
|
||||||
|
passwordConfirmInput: Locator;
|
||||||
|
passwordInput: Locator;
|
||||||
|
usernameInput: Locator;
|
||||||
|
|
||||||
|
constructor(page: Page) {
|
||||||
|
super(page);
|
||||||
|
|
||||||
|
this.registerButton = page.getByTestId("register-button");
|
||||||
|
this.registrationForm = page.getByTestId("registration-form");
|
||||||
|
|
||||||
|
this.loginLink = page.getByTestId("login-link");
|
||||||
|
|
||||||
|
this.displayNameInput = page.getByTestId("display-name-input");
|
||||||
|
this.passwordConfirmInput = page.getByTestId("password-confirm-input");
|
||||||
|
this.passwordInput = page.getByTestId("password-input");
|
||||||
|
this.usernameInput = page.getByTestId("username-input");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
export { test } from "./fixtures";
|
||||||
|
export { expect } from "@playwright/test";
|
Ŝarĝante…
Reference in New Issue