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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
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
7 changes: 5 additions & 2 deletions .github/workflows/e2e-tests.yml
Original file line numberDiff line numberDiff 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: 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
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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**
Expand Down
47 changes: 32 additions & 15 deletions drizzle/seed.ts
Original file line numberDiff line numberDiff 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 =
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");
Expand DownExpand 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 DownExpand 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);
Comment thread
JohnAllenTech marked this conversation as resolved.
} catch (error) {
console.log("Error:", error);
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/articles.spec.ts
Original file line numberDiff line numberDiff line change
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
18 changes: 14 additions & 4 deletions e2e/teardown.ts
Original file line numberDiff line numberDiff 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
)
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as 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}
`;
Comment thread
JohnAllenTech marked this conversation as resolved.
Comment thread
JohnAllenTech marked this conversation as resolved.

console.log("DB clean up successful");
Expand Down
26 changes: 26 additions & 0 deletions e2e/utils/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -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");
}
};
Comment thread
JohnAllenTech marked this conversation as resolved.
4 changes: 3 additions & 1 deletion sample.env
Original file line numberDiff line numberDiff line change
Expand Up@@ -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