Skip to content

✨ Add Sign Up e2e tests #1268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion frontend/src/routes/signup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ function SignUp() {
<Input
id="full_name"
minLength={3}
{...register("full_name")}
{...register("full_name", { required: "Full Name is required" })}
placeholder="Full Name"
type="text"
/>
Expand All @@ -102,6 +102,7 @@ function SignUp() {
<Input
id="email"
{...register("email", {
required: "Email is required",
pattern: emailPattern,
})}
placeholder="Email"
Expand Down
169 changes: 169 additions & 0 deletions frontend/tests/sign-up.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
import { type Page, expect, test } from "@playwright/test"

import { randomEmail } from "./utils/random"

test.use({ storageState: { cookies: [], origins: [] } })

type OptionsType = {
exact?: boolean
}

const fillForm = async (
page: Page,
full_name: string,
email: string,
password: string,
confirm_password: string,
) => {
await page.getByPlaceholder("Full Name").fill(full_name)
await page.getByPlaceholder("Email").fill(email)
await page.getByPlaceholder("Password", { exact: true }).fill(password)
await page.getByPlaceholder("Repeat Password").fill(confirm_password)
}

const verifyInput = async (
page: Page,
placeholder: string,
options?: OptionsType,
) => {
const input = page.getByPlaceholder(placeholder, options)
await expect(input).toBeVisible()
await expect(input).toHaveText("")
await expect(input).toBeEditable()
}

test("Inputs are visible, empty and editable", async ({ page }) => {
await page.goto("/signup")

await verifyInput(page, "Full Name")
await verifyInput(page, "Email")
await verifyInput(page, "Password", { exact: true })
await verifyInput(page, "Repeat Password")
})

test("Sign Up button is visible", async ({ page }) => {
await page.goto("/signup")

await expect(page.getByRole("button", { name: "Sign Up" })).toBeVisible()
})

test("Log In link is visible", async ({ page }) => {
await page.goto("/signup")

await expect(page.getByRole("link", { name: "Log In" })).toBeVisible()
})

test("Sign up with valid name, email, and password", async ({ page }) => {
const full_name = "Test User"
const email = randomEmail()
const password = "changethis"

await page.goto("/signup")
await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()
})

test("Sign up with invalid email", async ({ page }) => {
await page.goto("/signup")

await fillForm(
page,
"Playwright Test",
"invalid-email",
"changethis",
"changethis",
)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(page.getByText("Invalid email address")).toBeVisible()
})

test("Sign up with existing email", async ({ page }) => {
const full_name = "Test User"
const email = randomEmail()
const password = "changethis"

// Sign up with an email
await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

// Sign up again with the same email
await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

await page
.getByText("The user with this email already exists in the system")
.click()
})

test("Sign up with weak password", async ({ page }) => {
const full_name = "Test User"
const email = randomEmail()
const password = "weak"

await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(
page.getByText("Password must be at least 8 characters"),
).toBeVisible()
})

test("Sign up with mismatched passwords", async ({ page }) => {
const full_name = "Test User"
const email = randomEmail()
const password = "changethis"
const password2 = "changethat"

await page.goto("/signup")

await fillForm(page, full_name, email, password, password2)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(page.getByText("Passwords do not match")).toBeVisible()
})

test("Sign up with missing full name", async ({ page }) => {
const full_name = ""
const email = randomEmail()
const password = "changethis"

await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(page.getByText("Full Name is required")).toBeVisible()
})

test("Sign up with missing email", async ({ page }) => {
const full_name = "Test User"
const email = ""
const password = "changethis"

await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(page.getByText("Email is required")).toBeVisible()
})

test("Sign up with missing password", async ({ page }) => {
const full_name = ""
const email = randomEmail()
const password = ""

await page.goto("/signup")

await fillForm(page, full_name, email, password, password)
await page.getByRole("button", { name: "Sign Up" }).click()

await expect(page.getByText("Password is required")).toBeVisible()
})
11 changes: 11 additions & 0 deletions frontend/tests/utils/random.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const randomEmail = () =>
`test_${Math.random().toString(36).substring(7)}@example.com`

export const randomTeamName = () =>
`Team ${Math.random().toString(36).substring(7)}`

export const slugify = (text: string) =>
text
.toLowerCase()
.replace(/\s+/g, "-")
.replace(/[^\w-]+/g, "")