Skip to content
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

Feat/multiple user support in e2e tests #1182

Merged
Show file tree
Hide file tree
Changes from 3 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
9 changes: 6 additions & 3 deletions .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,12 @@ jobs:
GITHUB_ID: ${{ secrets.E2E_GITHUB_ID }}
GITHUB_SECRET: ${{ secrets.E2E_GITHUB_SECRET }}
NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
E2E_USER_EMAIL: [email protected]
E2E_USER_ID: 8e3179ce-f32b-4d0a-ba3b-234d66b836ad
E2E_USER_SESSION_ID: df8a11f2-f20a-43d6-80a0-a213f1efedc1
E2E_USER_ONE_EMAIL: [email protected]
E2E_USER_ONE_ID: 8e3179ce-f32b-4d0a-ba3b-234d66b836ad
E2E_USER_ONE_SESSION_ID: df8a11f2-f20a-43d6-80a0-a213f1efedc1
E2E_USER_TWO_EMAIL: [email protected]
E2E_USER_TWO_ID: a15a104a-0e34-4101-8800-ed25c9231345
E2E_USER_TWO_SESSION_ID: 10134766-bc6c-4b52-83d7-46ec0a4cb95d

steps:
- name: Checkout repository
Expand Down
31 changes: 24 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,15 +141,32 @@ You shouldn't need to change the default value here. This is a variable used by
NEXTAUTH_URL=http://localhost:3000/api/auth
```

### E2E_USER_SESSION_ID
### E2E_USER_ONE_SESSION_ID

This is the sessionToken uuid that .
This is currently hardcoded and there is no reason to change this until we require multiple E2E test users within the same test suite
This is the sessionToken uuid that is used to identify a users current active session.
This is currently hardcoded and their is no reason to change this value.
**Note: This value must be different to E2E_USER_TWO_SESSION_ID**
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved

### E2E_USER_ID

This is the userId if the E2E user used for testing .
This is currently hardcoded and there is no reason to change this until we require multiple E2E test users within the same test suite
### E2E_USER_TWO_SESSION_ID

This is the sessionToken uuid that is used to identify a users current active session.
This is currently hardcoded and their is no reason to change this value.
**Note: This value must be different to E2E_USER_ONE_SESSION_ID**


### E2E_USER_ONE_ID

This is the userId of one of our E2E users and is used for testing .
This is currently hardcoded and their is no reason to change this value.
**Note: This value must be different to E2E_USER_TWO_ID**


### E2E_USER_TWO_ID

This is the userId of one of our E2E users and is used for testing .
This is currently hardcoded and their is no reason to change this value.
**Note: This value must be different to E2E_USER_ONE_ID**
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved

For more information, you can read the documentation [here](https://next-auth.js.org/configuration/options).
**Example .env file can be found [here](./sample.env). You can rename this to .env to get started**
Expand All @@ -173,7 +190,7 @@ Please ensure you have the following variables set in your `.env` file:

- `E2E_USER_ID`: The id of the E2E user for testing.
- `E2E_USER_EMAIL`: The email of the E2E user for testing.
- `E2E_USER_SESSION_ID`: The session id that the user will use to authenticate.
- `E2E_USER_ONE_SESSION_ID`: The session id that the user will use to authenticate.
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved


Note the sample .env [here](./sample.env) is fine to use.
Expand Down
49 changes: 33 additions & 16 deletions drizzle/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,19 @@ import postgres from "postgres";

const DATABASE_URL = process.env.DATABASE_URL || "";
// These can be removed in a follow on PR. Until this hits main we cant add E2E_USER_* stuff to the env.
const E2E_SESSION_ID =
process.env.E2E_USER_SESSION_ID || "df8a11f2-f20a-43d6-80a0-a213f1efedc1";
const E2E_USER_ID =
process.env.E2E_USER_ID || "8e3179ce-f32b-4d0a-ba3b-234d66b836ad";
const E2E_USER_EMAIL = process.env.E2E_USER_EMAIL || "[email protected]";
const E2E_USER_ONE_SESSION_ID =
process.env.E2E_USER_ONE_SESSION_ID || "df8a11f2-f20a-43d6-80a0-a213f1efedc1";
const E2E_USER_ONE_ID =
process.env.E2E_USER_ONE_ID || "8e3179ce-f32b-4d0a-ba3b-234d66b836ad";
const E2E_USER_ONE_EMAIL =
process.env.E2E_USER_ONE_EMAIL || "[email protected]";

const E2E_USER_TWO_SESSION_ID =
process.env.E2E_USER_TWO_SESSION_ID || "10134766-bc6c-4b52-83d7-46ec0a4cb95d";
const E2E_USER_TWO_ID =
process.env.E2E_USER_TWO_ID || "a15a104a-0e34-4101-8800-ed25c9231345";
const E2E_USER_TWO_EMAIL =
process.env.E2E_USER_TWO_EMAIL || "[email protected]";

if (!DATABASE_URL) {
throw new Error("DATABASE_URL is not set");
Expand Down Expand Up @@ -116,27 +124,25 @@ ${chance.paragraph()}
return users;
};

const seedE2EUser = async () => {
const name = "E2E Test User";

const seedE2EUser = async (email: string, id: string, name: string) => {
const [existingE2EUser] = await db
.selectDistinct()
.from(user)
.where(eq(user.id, E2E_USER_ID));
.where(eq(user.id, id));

if (existingE2EUser) {
console.log("E2E Test user already exists. Skipping creation");
return existingE2EUser;
}

const userData = {
id: E2E_USER_ID,
id: id,
username: `${name.split(" ").join("-").toLowerCase()}-${chance.integer({
min: 0,
max: 999,
})}`,
name,
email: E2E_USER_EMAIL,
email,
image: `https://robohash.org/${encodeURIComponent(name)}?bgset=bg1`,
location: chance.country({ full: true }),
bio: chance.sentence({ words: 10 }),
Expand All @@ -146,11 +152,11 @@ ${chance.paragraph()}
return createdUser;
};

const seedE2EUserSession = async (userId: string) => {
const seedE2EUserSession = async (userId: string, sessionToken: string) => {
const [existingE2EUserSession] = await db
.selectDistinct()
.from(session)
.where(eq(session.sessionToken, E2E_SESSION_ID));
.where(eq(session.sessionToken, sessionToken));

if (existingE2EUserSession) {
console.log("E2E Test session already exists. Skipping creation");
Expand All @@ -164,7 +170,7 @@ ${chance.paragraph()}
.insert(session)
.values({
userId,
sessionToken: E2E_SESSION_ID,
sessionToken,
// Set session to expire in 6 months.
expires: new Date(currentDate.setMonth(currentDate.getMonth() + 6)),
})
Expand Down Expand Up @@ -249,8 +255,19 @@ ${chance.paragraph()}

try {
await addUserData();
const user = await seedE2EUser();
await seedE2EUserSession(user.id);
const userOne = await seedE2EUser(
E2E_USER_ONE_EMAIL,
E2E_USER_ONE_ID,
"E2E Test User One",
);
const userTwo = await seedE2EUser(
E2E_USER_TWO_EMAIL,
E2E_USER_TWO_ID,
"E2E Test User Two",
);

await seedE2EUserSession(userOne.id, E2E_USER_ONE_SESSION_ID);
await seedE2EUserSession(userTwo.id, E2E_USER_TWO_SESSION_ID);
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved
} catch (error) {
console.log("Error:", error);
}
Expand Down
10 changes: 5 additions & 5 deletions e2e/articles.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import { test, expect } from "playwright/test";
import { randomUUID } from "crypto";
import { loggedInAsUserOne } from "./utils";

test.describe("Unauthenticated Articles Page", () => {
test.beforeEach(async ({ page }) => {
await page.context().clearCookies();
});

test("Should show popular tags", async ({ page, isMobile }) => {
await page.goto("http://localhost:3000/articles");
await expect(
Expand Down Expand Up @@ -133,6 +130,9 @@ test.describe("Unauthenticated Articles Page", () => {
});

test.describe("Authenticated Articles Page", () => {
test.beforeEach(async ({ page }) => {
await loggedInAsUserOne(page);
});
test("Should show recent bookmarks", async ({ page, isMobile }) => {
await page.goto("http://localhost:3000/articles");
await expect(
Expand Down Expand Up @@ -251,7 +251,7 @@ test.describe("Authenticated Articles Page", () => {
page.getByRole("heading", { name: "Lorem Ipsum" }),
).toBeVisible();
await expect(
page.getByRole("heading", { name: "Written by E2E Test User" }),
page.getByRole("heading", { name: "Written by E2E Test User One" }),
).toBeVisible();
await expect(
page.getByRole("heading", { name: "Discussion (0)" }),
Expand Down
54 changes: 0 additions & 54 deletions e2e/auth.setup.ts

This file was deleted.

7 changes: 4 additions & 3 deletions e2e/home.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { test, expect } from "@playwright/test";
import { loggedInAsUserOne } from "./utils";

test.describe("Authenticated homepage", () => {
test.beforeEach(async ({ page }) => {
await loggedInAsUserOne(page);
});
test("Homepage view", async ({ page, isMobile }) => {
await page.goto("http://localhost:3000/");

Expand All @@ -24,9 +28,6 @@ test.describe("Authenticated homepage", () => {
});

test.describe("Unauthenticated homepage", () => {
test.beforeEach(async ({ page }) => {
await page.context().clearCookies();
});
test("Homepage view", async ({ page }) => {
await page.goto("http://localhost:3000/");

Expand Down
4 changes: 4 additions & 0 deletions e2e/login.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { test, expect } from "playwright/test";
import "dotenv/config";
import { loggedInAsUserOne } from "./utils";

test.describe("Unauthenticated Login Page", () => {
test.beforeEach(async ({ page }) => {
Expand Down Expand Up @@ -31,6 +32,9 @@ test.describe("Unauthenticated Login Page", () => {
});

test.describe("Authenticated Login Page", () => {
test.beforeEach(async ({ page }) => {
await loggedInAsUserOne(page);
});
test("Sign up page contains sign up links", async ({ page, isMobile }) => {
// authenticated users are kicked back to the homepage if they try to go to /get-started
await page.goto("http://localhost:3000/get-started");
Expand Down
7 changes: 4 additions & 3 deletions e2e/my-posts.spec.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import test from "@playwright/test";
import { loggedInAsUserOne } from "./utils";

test.describe("Unauthenticated my-posts Page", () => {
test.beforeEach(async ({ page }) => {
await page.context().clearCookies();
});
//
// Replace with tests for unauthenticated users
});

test.describe("Authenticated my-posts Page", () => {
test.beforeEach(async ({ page }) => {
await loggedInAsUserOne(page);
});
//
// Replace with tests for authenticated users
});
7 changes: 4 additions & 3 deletions e2e/settings.spec.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import test from "@playwright/test";
import { loggedInAsUserOne } from "./utils";

test.describe("Unauthenticated setttings Page", () => {
test.beforeEach(async ({ page }) => {
await page.context().clearCookies();
});
//
// Replace with tests for unauthenticated users
});

test.describe("Authenticated settings Page", () => {
test.beforeEach(async ({ page }) => {
await loggedInAsUserOne(page);
});
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved
//
// Replace with tests for authenticated users
});
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,27 @@ dotenv.config(); // Load .env file contents into process.env

export const teardown = async () => {
try {
if (!process.env.DATABASE_URL || !process.env.E2E_USER_ID)
if (
!process.env.DATABASE_URL ||
!process.env.E2E_USER_ONE_ID ||
!process.env.E2E_USER_TWO_ID
)
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved
throw new Error("Missing env variables for DB clean up script");
const db = postgres(process.env.DATABASE_URL as string);

// the test suit adds posts created by the E2E user. We want to remove them between test runs
// the test suit adds posts created by the E2E users. We want to remove them between test runs
await db`
DELETE FROM "Post" WHERE "userId" = ${process.env.E2E_USER_ID as string}
DELETE FROM "Post" WHERE "userId" = ${process.env.E2E_USER_ONE_ID as string}
`;
await db`
DELETE FROM "Post" WHERE "userId" = ${process.env.E2E_USER_TWO_ID as string}
`;
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved
// the test suit adds comments created by the E2E user. We want to remove them between test runs
await db`
DELETE FROM "Comment" WHERE "userId" = ${process.env.E2E_USER_ID as string}
DELETE FROM "Comment" WHERE "userId" = ${process.env.E2E_USER_ONE_ID as string}
`;
await db`
DELETE FROM "Comment" WHERE "userId" = ${process.env.E2E_USER_TWO_ID as string}
`;
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved
JohnAllenTech marked this conversation as resolved.
Show resolved Hide resolved

console.log("DB clean up successful");
Expand Down
1 change: 1 addition & 0 deletions e2e/utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./utils";
Loading
Loading