Skip to content

Commit 39031db

Browse files
committed
Update tests to support repeat each better
1 parent 0951eec commit 39031db

File tree

3 files changed

+168
-165
lines changed

3 files changed

+168
-165
lines changed

playwright.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export default defineConfig({
2424
/* Opt out of parallel tests on CI. */
2525
workers: process.env.CI ? 1 : undefined,
2626
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
27-
reporter: "html",
27+
reporter: [["html", { open: "never" }]],
2828
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
2929
use: {
3030
/* Base URL to use in actions like `await page.goto('/')`. */

tests/change-password.spec.ts

Lines changed: 88 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,104 @@
11
import { expect, test } from "@playwright/test";
2+
import { testWithNewUser } from "./test-with-new-user";
23

34
test.describe("User Password Change Flow", () => {
4-
test("should successfully change password and sign in with new credentials", async ({
5-
page,
6-
}) => {
7-
let userEmail: string;
8-
9-
await test.step("navigate to the dashboard", async () => {
10-
await page.goto("/");
11-
await page.getByTestId("user-menu-trigger").click();
12-
await page.getByRole("menuitem", { name: "Dashboard" }).click();
13-
14-
await expect(page).toHaveURL(/.*\/dashboard/);
15-
await expect(
16-
page.getByRole("heading", { name: "Team Settings" }),
17-
).toBeVisible();
18-
});
19-
20-
await test.step("navigate to general settings and capture user email", async () => {
21-
await page.getByRole("link", { name: "General" }).click();
22-
23-
await expect(page).toHaveURL(/.*\/dashboard\/general/);
24-
await expect(
25-
page.getByRole("heading", { name: "General Settings" }),
26-
).toBeVisible();
27-
28-
const emailField = page.getByRole("textbox", { name: "Email" });
29-
await expect(emailField).toBeVisible();
30-
userEmail = await emailField.inputValue();
31-
32-
expect(userEmail).toBeTruthy();
33-
expect(userEmail).toContain("@");
34-
console.log("User email captured:", userEmail);
35-
});
36-
37-
await test.step("navigate to security settings", async () => {
38-
await page.getByRole("link", { name: "Security" }).click();
39-
40-
await expect(page).toHaveURL(/.*\/dashboard\/security/);
41-
await expect(
42-
page.getByRole("heading", { name: "Security Settings" }),
43-
).toBeVisible();
44-
});
45-
46-
await test.step("fill password change form and submit", async () => {
47-
const currentPasswordField = await page.getByRole("textbox", {
48-
name: "Current Password",
5+
testWithNewUser(
6+
"should successfully change password and sign in with new credentials",
7+
async ({ page }) => {
8+
let userEmail: string;
9+
10+
await test.step("navigate to the dashboard", async () => {
11+
await page.goto("/");
12+
await page.getByTestId("user-menu-trigger").click();
13+
await page.getByRole("menuitem", { name: "Dashboard" }).click();
14+
15+
await expect(page).toHaveURL(/.*\/dashboard/);
16+
await expect(
17+
page.getByRole("heading", { name: "Team Settings" }),
18+
).toBeVisible();
4919
});
50-
const newPasswordField = await page.getByRole("textbox", {
51-
name: "New Password",
52-
exact: true,
20+
21+
await test.step("navigate to general settings and capture user email", async () => {
22+
await page.getByRole("link", { name: "General" }).click();
23+
24+
await expect(page).toHaveURL(/.*\/dashboard\/general/);
25+
await expect(
26+
page.getByRole("heading", { name: "General Settings" }),
27+
).toBeVisible();
28+
29+
const emailField = page.getByRole("textbox", { name: "Email" });
30+
await expect(emailField).toBeVisible();
31+
userEmail = await emailField.inputValue();
32+
33+
expect(userEmail).toBeTruthy();
34+
expect(userEmail).toContain("@");
35+
console.log("User email captured:", userEmail);
5336
});
54-
const confirmPasswordField = await page.getByRole("textbox", {
55-
name: "Confirm New Password",
37+
38+
await test.step("navigate to security settings", async () => {
39+
await page.getByRole("link", { name: "Security" }).click();
40+
41+
await expect(page).toHaveURL(/.*\/dashboard\/security/);
42+
await expect(
43+
page.getByRole("heading", { name: "Security Settings" }),
44+
).toBeVisible();
5645
});
57-
const updatePasswordButton = await page.getByRole("button", {
58-
name: "Update Password",
46+
47+
await test.step("fill password change form and submit", async () => {
48+
const currentPasswordField = await page.getByRole("textbox", {
49+
name: "Current Password",
50+
});
51+
const newPasswordField = await page.getByRole("textbox", {
52+
name: "New Password",
53+
exact: true,
54+
});
55+
const confirmPasswordField = await page.getByRole("textbox", {
56+
name: "Confirm New Password",
57+
});
58+
const updatePasswordButton = await page.getByRole("button", {
59+
name: "Update Password",
60+
});
61+
62+
await currentPasswordField.fill("testpassword123");
63+
await newPasswordField.fill("newpassword123");
64+
await confirmPasswordField.fill("newpassword123");
65+
66+
await updatePasswordButton.click();
67+
await expect(
68+
page.getByText("Password updated successfully."),
69+
).toBeVisible();
5970
});
6071

61-
await currentPasswordField.fill("testpassword123");
62-
await newPasswordField.fill("newpassword123");
63-
await confirmPasswordField.fill("newpassword123");
72+
await test.step("sign out after password change", async () => {
73+
await page.getByTestId("user-menu-trigger").click();
74+
await page.getByRole("menuitem", { name: "Sign out" }).click();
6475

65-
await updatePasswordButton.click();
66-
await expect(
67-
page.getByText("Password updated successfully."),
68-
).toBeVisible();
69-
});
76+
await expect(page).toHaveTitle(/Playwright Tutorial/);
77+
await expect(page.getByRole("link", { name: "Sign Up" })).toBeVisible();
78+
});
7079

71-
await test.step("sign out after password change", async () => {
72-
await page.getByTestId("user-menu-trigger").click();
73-
await page.getByRole("menuitem", { name: "Sign out" }).click();
80+
await test.step("sign in with new password", async () => {
81+
await page.goto("/sign-in");
7482

75-
await expect(page).toHaveTitle(/Playwright Tutorial/);
76-
await expect(page.getByRole("link", { name: "Sign Up" })).toBeVisible();
77-
});
83+
await expect(
84+
page.getByRole("heading", { name: "Sign in to your account" }),
85+
).toBeVisible();
7886

79-
await test.step("sign in with new password", async () => {
80-
await page.goto("/sign-in");
87+
const emailSignInField = page.getByRole("textbox", { name: "Email" });
88+
const passwordSignInField = page.getByRole("textbox", {
89+
name: "Password",
90+
});
91+
const signInButton = page.getByRole("button", { name: "Sign in" });
8192

82-
await expect(
83-
page.getByRole("heading", { name: "Sign in to your account" }),
84-
).toBeVisible();
93+
await emailSignInField.fill(userEmail);
94+
await passwordSignInField.fill("newpassword123");
95+
await signInButton.click();
8596

86-
const emailSignInField = page.getByRole("textbox", { name: "Email" });
87-
const passwordSignInField = page.getByRole("textbox", {
88-
name: "Password",
97+
await expect(page).toHaveURL(/.*\/dashboard/);
98+
await expect(
99+
page.getByRole("heading", { name: "Team Settings" }),
100+
).toBeVisible();
89101
});
90-
const signInButton = page.getByRole("button", { name: "Sign in" });
91-
92-
await emailSignInField.fill(userEmail);
93-
await passwordSignInField.fill("newpassword123");
94-
await signInButton.click();
95-
96-
await expect(page).toHaveURL(/.*\/dashboard/);
97-
await expect(
98-
page.getByRole("heading", { name: "Team Settings" }),
99-
).toBeVisible();
100-
});
101-
});
102+
},
103+
);
102104
});

tests/team-invitation.spec.ts

Lines changed: 79 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,95 @@
11
import { expect, test } from "@playwright/test";
2+
import { testWithNewUser } from "./test-with-new-user";
23

34
test.describe("Team Invitation Flow", () => {
4-
test("should successfully invite a team member and complete signup process", async ({
5-
page,
6-
context,
7-
}) => {
8-
const newUserEmail = `testuser${Date.now()}@example.com`;
9-
let invitationId: string | null = null;
5+
testWithNewUser(
6+
"should successfully invite a team member and complete signup process",
7+
async ({ page }) => {
8+
const newUserEmail = `testuser${Date.now()}@example.com`;
9+
let invitationId: string | null = null;
1010

11-
const existingMemberName =
12-
await test.step("Navigate to dashboard and verify current team member", async () => {
13-
await page.goto("/dashboard");
14-
await expect(
15-
page.getByRole("heading", { name: "Team Settings" }),
16-
).toBeVisible();
11+
const existingMemberName =
12+
await test.step("Navigate to dashboard and verify current team member", async () => {
13+
await page.goto("/dashboard");
14+
await expect(
15+
page.getByRole("heading", { name: "Team Settings" }),
16+
).toBeVisible();
1717

18-
const existingMember = await page.getByTestId("team-member");
19-
const existingMemberName = await existingMember
20-
.getByTestId("team-member-name")
21-
.textContent();
22-
if (!existingMemberName) {
23-
throw new Error("Existing member name not found");
24-
}
25-
expect(
26-
await existingMember.getByTestId("team-member-role"),
27-
).toContainText("owner");
18+
const existingMember = await page.getByTestId("team-member");
19+
const existingMemberName = await existingMember
20+
.getByTestId("team-member-name")
21+
.textContent();
22+
if (!existingMemberName) {
23+
throw new Error("Existing member name not found");
24+
}
25+
expect(
26+
await existingMember.getByTestId("team-member-role"),
27+
).toContainText("owner");
2828

29-
return existingMemberName;
30-
});
29+
return existingMemberName;
30+
});
3131

32-
await test.step("Send team invitation", async () => {
33-
page.on("console", (msg) => {
34-
const text = msg.text();
35-
const match = text.match(/\[inviteState\]\s+(\d+)/);
36-
if (match) {
37-
invitationId = match[1];
38-
console.log(`Captured invitation ID: ${invitationId}`);
39-
}
40-
});
32+
await test.step("Send team invitation", async () => {
33+
page.on("console", (msg) => {
34+
const text = msg.text();
35+
const match = text.match(/\[inviteState\]\s+(\d+)/);
36+
if (match) {
37+
invitationId = match[1];
38+
console.log(`Captured invitation ID: ${invitationId}`);
39+
}
40+
});
4141

42-
await page.getByRole("textbox", { name: "Email" }).fill(newUserEmail);
43-
await expect(page.getByRole("radio", { name: "Member" })).toBeChecked();
44-
await page.getByRole("button", { name: "Invite Member" }).click();
45-
await expect(
46-
page.getByText("Invitation sent successfully"),
47-
).toBeVisible();
42+
await page.getByRole("textbox", { name: "Email" }).fill(newUserEmail);
43+
await expect(page.getByRole("radio", { name: "Member" })).toBeChecked();
44+
await page.getByRole("button", { name: "Invite Member" }).click();
45+
await expect(
46+
page.getByText("Invitation sent successfully"),
47+
).toBeVisible();
4848

49-
await page.waitForTimeout(1000);
50-
expect(invitationId).not.toBeNull();
51-
});
49+
await page.waitForTimeout(1000);
50+
expect(invitationId).not.toBeNull();
51+
});
5252

53-
await test.step("Sign out current user", async () => {
54-
await page.getByTestId("user-menu-trigger").click();
55-
await page.getByRole("button", { name: "Sign out" }).click();
56-
});
53+
await test.step("Sign out current user", async () => {
54+
await page.getByTestId("user-menu-trigger").click();
55+
await page.getByRole("button", { name: "Sign out" }).click();
56+
});
5757

58-
await test.step("Complete signup process with invitation", async () => {
59-
await page.goto("/sign-up?inviteId=" + invitationId);
60-
await expect(
61-
page.getByRole("heading", { name: "Create your account" }),
62-
).toBeVisible();
58+
await test.step("Complete signup process with invitation", async () => {
59+
await page.goto("/sign-up?inviteId=" + invitationId);
60+
await expect(
61+
page.getByRole("heading", { name: "Create your account" }),
62+
).toBeVisible();
6363

64-
await page.getByRole("textbox", { name: "Email" }).fill(newUserEmail);
65-
await page
66-
.getByRole("textbox", { name: "Password" })
67-
.fill("testpassword123");
68-
await page.getByRole("button", { name: "Sign up" }).click();
69-
});
64+
await page.getByRole("textbox", { name: "Email" }).fill(newUserEmail);
65+
await page
66+
.getByRole("textbox", { name: "Password" })
67+
.fill("testpassword123");
68+
await page.getByRole("button", { name: "Sign up" }).click();
69+
});
7070

71-
await test.step("Verify successful team member addition", async () => {
72-
await expect(
73-
page.getByRole("heading", { name: "Team Settings" }),
74-
).toBeVisible();
75-
await expect(page).toHaveURL("/dashboard");
71+
await test.step("Verify successful team member addition", async () => {
72+
await expect(
73+
page.getByRole("heading", { name: "Team Settings" }),
74+
).toBeVisible();
75+
await expect(page).toHaveURL("/dashboard");
7676

77-
const firstTeamMember = await page.getByTestId("team-member").first();
78-
expect(firstTeamMember.getByTestId("team-member-name")).toContainText(
79-
existingMemberName,
80-
);
81-
expect(firstTeamMember.getByTestId("team-member-role")).toContainText(
82-
"owner",
83-
);
77+
const firstTeamMember = await page.getByTestId("team-member").first();
78+
expect(firstTeamMember.getByTestId("team-member-name")).toContainText(
79+
existingMemberName,
80+
);
81+
expect(firstTeamMember.getByTestId("team-member-role")).toContainText(
82+
"owner",
83+
);
8484

85-
const secondTeamMember = await page.getByTestId("team-member").nth(1);
86-
expect(secondTeamMember.getByTestId("team-member-name")).toContainText(
87-
newUserEmail,
88-
);
89-
expect(secondTeamMember.getByTestId("team-member-role")).toContainText(
90-
"member",
91-
);
92-
});
93-
});
85+
const secondTeamMember = await page.getByTestId("team-member").nth(1);
86+
expect(secondTeamMember.getByTestId("team-member-name")).toContainText(
87+
newUserEmail,
88+
);
89+
expect(secondTeamMember.getByTestId("team-member-role")).toContainText(
90+
"member",
91+
);
92+
});
93+
},
94+
);
9495
});

0 commit comments

Comments
 (0)