diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index cf2ebdc2..b1922382 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -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: e2e@codu.co - E2E_USER_ID: 8e3179ce-f32b-4d0a-ba3b-234d66b836ad + E2E_USER_ONE_EMAIL: e2e-user-one@codu.co + E2E_USER_ONE_ID: 8e3179ce-f32b-4d0a-ba3b-234d66b836ad E2E_USER_ONE_SESSION_ID: df8a11f2-f20a-43d6-80a0-a213f1efedc1 + E2E_USER_TWO_EMAIL: e2e-user-two@codu.co + E2E_USER_TWO_ID: a15a104a-0e34-4101-8800-ed25c9231345 + E2E_USER_TWO_SESSION_ID: 10134766-bc6c-4b52-83d7-46ec0a4cb95d steps: - name: Checkout repository diff --git a/README.md b/README.md index 1909e175..1bbcb11b 100644 --- a/README.md +++ b/README.md @@ -144,12 +144,29 @@ NEXTAUTH_URL=http://localhost:3000/api/auth ### E2E_USER_ONE_SESSION_ID This is the sessionToken uuid that is used to identify a users current active session. -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 currently hardcoded and their is no reason to change this value. +**Note: This value must be different to E2E_USER_TWO_SESSION_ID** -### 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 there is no reason to change this value. +**Note: This value must be different from 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 there is no reason to change this value. +**Note: This value must be different from E2E_USER_ONE_ID** 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** diff --git a/drizzle/seed.ts b/drizzle/seed.ts index c998ac8a..ce795e56 100644 --- a/drizzle/seed.ts +++ b/drizzle/seed.ts @@ -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 = +const E2E_USER_ONE_SESSION_ID = process.env.E2E_USER_ONE_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 || "e2e@codu.co"; +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 || "e2e-user-one@codu.co"; + +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 || "e2e-user-two@codu.co"; if (!DATABASE_URL) { throw new Error("DATABASE_URL is not set"); @@ -116,13 +124,11 @@ ${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"); @@ -130,13 +136,13 @@ ${chance.paragraph()} } 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 }), @@ -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"); @@ -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)), }) @@ -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); } catch (error) { console.log("Error:", error); } diff --git a/e2e/articles.spec.ts b/e2e/articles.spec.ts index f006fae6..c7fe8143 100644 --- a/e2e/articles.spec.ts +++ b/e2e/articles.spec.ts @@ -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)" }), diff --git a/e2e/teardown.ts b/e2e/teardown.ts index 720b1364..d5b1a416 100644 --- a/e2e/teardown.ts +++ b/e2e/teardown.ts @@ -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 + ) 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} `; // 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} `; console.log("DB clean up successful"); diff --git a/e2e/utils/utils.ts b/e2e/utils/utils.ts index e5b8f596..1d918d92 100644 --- a/e2e/utils/utils.ts +++ b/e2e/utils/utils.ts @@ -23,3 +23,29 @@ export const loggedInAsUserOne = async (page: Page) => { throw Error("Error while authenticating E2E test user one"); } }; + +export const loggedInAsUserTwo = async (page: Page) => { + try { + expect(process.env.E2E_USER_TWO_SESSION_ID).toBeDefined(); + + await page.context().clearCookies(); + + await page.context().addCookies([ + { + name: "next-auth.session-token", + value: process.env.E2E_USER_TWO_SESSION_ID as string, + domain: "localhost", + path: "/", + sameSite: "Lax", + }, + ]); + + expect( + (await page.context().cookies()).find( + (cookie) => cookie.name === "next-auth.session-token", + ), + ).toBeTruthy(); + } catch (err) { + throw Error("Error while authenticating E2E test user two"); + } +}; diff --git a/sample.env b/sample.env index 17494bd2..c3602d3a 100644 --- a/sample.env +++ b/sample.env @@ -6,5 +6,7 @@ NEXTAUTH_URL=http://localhost:3000/api/auth DATABASE_URL=postgresql://postgres:secret@127.0.0.1:5432/postgres E2E_USER_EMAIL=e2e@codu.co -E2E_USER_ID=8e3179ce-f32b-4d0a-ba3b-234d66b836ad +E2E_USER_ONE_ID=8e3179ce-f32b-4d0a-ba3b-234d66b836ad +E2E_USER_TWO_ID=a15a104a-0e34-4101-8800-ed25c9231345 E2E_USER_ONE_SESSION_ID=df8a11f2-f20a-43d6-80a0-a213f1efedc1 +E2E_USER_TWO_SESSION_ID=10134766-bc6c-4b52-83d7-46ec0a4cb95d