Skip to content

Commit a819371

Browse files
committed
update tests
1 parent 3c496ca commit a819371

7 files changed

Lines changed: 297 additions & 67 deletions

File tree

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ RUN npm run build
1515
FROM node:22.2.0 as server-builder
1616
WORKDIR /app/server
1717
COPY server/package*.json ./
18-
RUN npm install
18+
5t2f y<RUN npm install
1919
RUN npm install typescript
2020
COPY server/ .
2121
RUN npm run build

client/playwright.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const reporters = isCI
1515

1616
export default defineConfig({
1717
testDir: "tests/e2e",
18-
fullyParallel: true,
18+
fullyParallel: false,
1919
forbidOnly: isCI,
2020
retries: isCI ? 2 : 0,
2121
workers: isCI ? 1 : undefined,
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
import { test, expect, Page } from "@playwright/test";
2+
import { loginAsServerAdmin } from "../utils/authenticate";
3+
import {
4+
generateUniqueUsername,
5+
selectVuetifyFirstOption,
6+
selectVuetifyOptionByName,
7+
} from "../utils/helpers";
8+
9+
async function setupCreateUserAccountPage(page: Page) {
10+
await page.goto("/user-accounts/create");
11+
await expect(
12+
page.getByTestId("createUserAccount-form-container"),
13+
).toBeVisible();
14+
15+
const institutionSelect = page.getByTestId(
16+
"createUserAccount-institution-select",
17+
);
18+
const username = page
19+
.getByTestId("createUserAccount-username-input")
20+
.getByRole("textbox");
21+
const name = page
22+
.getByTestId("createUserAccount-name-input")
23+
.getByRole("textbox");
24+
const surname = page
25+
.getByTestId("createUserAccount-surname-input")
26+
.getByRole("textbox");
27+
const email = page
28+
.getByTestId("createUserAccount-email-input")
29+
.getByRole("textbox");
30+
const timezoneSelect = page.getByTestId(
31+
"createUserAccount-timezone-select",
32+
);
33+
const password = page
34+
.getByTestId("createUserAccount-password-input")
35+
.getByRole("textbox");
36+
const confirmPassword = page
37+
.getByTestId("createUserAccount-confirmPassword-input")
38+
.getByRole("textbox");
39+
const roleSelect = page.getByTestId("createUserAccount-role-select");
40+
41+
const saveButton = page.getByTestId("createUserAccount-save-button");
42+
const cancelButton = page.getByTestId("createUserAccount-cancel-button");
43+
44+
return {
45+
institutionSelect,
46+
username,
47+
name,
48+
surname,
49+
email,
50+
timezoneSelect,
51+
password,
52+
confirmPassword,
53+
roleSelect,
54+
saveButton,
55+
cancelButton,
56+
};
57+
}
58+
59+
async function expectSuccessfulCreateRedirect(page: Page) {
60+
await expect(page).toHaveURL(/\/user-accounts(?:$|[?#])/i, {
61+
timeout: 10_000,
62+
});
63+
}
64+
65+
test.describe("1.1 User Accounts - CREATE Add", () => {
66+
test.beforeEach(async ({ page }) => {
67+
await loginAsServerAdmin(page);
68+
});
69+
70+
test("A Success - creates a new INACTIVE user account", async ({
71+
page,
72+
}) => {
73+
const {
74+
institutionSelect,
75+
username,
76+
name,
77+
surname,
78+
email,
79+
timezoneSelect,
80+
password,
81+
confirmPassword,
82+
roleSelect,
83+
saveButton,
84+
} = await setupCreateUserAccountPage(page);
85+
86+
const uname = generateUniqueUsername("e2e-create");
87+
88+
if (await institutionSelect.isEnabled()) {
89+
await selectVuetifyOptionByName(
90+
page,
91+
institutionSelect,
92+
"SEB Server",
93+
);
94+
}
95+
96+
await username.fill(uname);
97+
await name.fill("John");
98+
await surname.fill("Doe");
99+
await email.fill(`${uname}@example.com`);
100+
101+
await selectVuetifyFirstOption(page, timezoneSelect);
102+
103+
await password.fill("StrongPass123!");
104+
await confirmPassword.fill("StrongPass123!");
105+
106+
await selectVuetifyFirstOption(page, roleSelect);
107+
108+
await saveButton.click();
109+
110+
await expectSuccessfulCreateRedirect(page);
111+
});
112+
113+
test("B Failed Validation - password too short", async ({ page }) => {
114+
const {
115+
institutionSelect,
116+
username,
117+
name,
118+
surname,
119+
email,
120+
timezoneSelect,
121+
password,
122+
confirmPassword,
123+
roleSelect,
124+
saveButton,
125+
} = await setupCreateUserAccountPage(page);
126+
127+
const uname = generateUniqueUsername("e2e-invalid");
128+
129+
if (await institutionSelect.isEnabled()) {
130+
await selectVuetifyOptionByName(
131+
page,
132+
institutionSelect,
133+
"SEB Server",
134+
);
135+
}
136+
137+
await username.fill(uname);
138+
await name.fill("Test");
139+
await surname.fill("User");
140+
await email.fill(`${uname}@example.com`);
141+
142+
await selectVuetifyFirstOption(page, timezoneSelect);
143+
144+
// too short (<8)
145+
await password.fill("Abc1");
146+
await confirmPassword.fill("Abc1");
147+
148+
await selectVuetifyFirstOption(page, roleSelect);
149+
150+
await saveButton.click();
151+
152+
await expect(page).toHaveURL(/\/user-accounts\/create(?:$|[?#])/i);
153+
154+
const anyValidationMessage = page.locator(
155+
".v-messages .v-messages__message",
156+
);
157+
await expect(anyValidationMessage.first()).toBeVisible();
158+
});
159+
160+
test("C Server Error - user account already exists (duplicate username)", async ({
161+
page,
162+
}) => {
163+
const {
164+
institutionSelect,
165+
username,
166+
name,
167+
surname,
168+
email,
169+
timezoneSelect,
170+
password,
171+
confirmPassword,
172+
roleSelect,
173+
saveButton,
174+
} = await setupCreateUserAccountPage(page);
175+
176+
// Seeded by Flyway/SQL (precondition)
177+
const uname = "createtests";
178+
179+
if (await institutionSelect.isEnabled()) {
180+
await selectVuetifyOptionByName(
181+
page,
182+
institutionSelect,
183+
"SEB Server",
184+
);
185+
}
186+
187+
await username.fill(uname);
188+
await name.fill("John");
189+
await surname.fill("Doe");
190+
await email.fill(`${uname}@example.com`);
191+
192+
await selectVuetifyFirstOption(page, timezoneSelect);
193+
194+
await password.fill("StrongPass123!");
195+
await confirmPassword.fill("StrongPass123!");
196+
197+
await selectVuetifyFirstOption(page, roleSelect);
198+
199+
await saveButton.click();
200+
201+
await expect(page).toHaveURL(/\/user-accounts\/create(?:$|[?#])/i);
202+
});
203+
});

client/tests/e2e/1-user-account/1.2-create-register.spec.ts

Lines changed: 15 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,9 @@
1-
import { test, expect, Page, Locator } from "@playwright/test";
2-
3-
// create an unique username based on current datetime -> So that there is absolutely no way this test fails because of a duplicate username
4-
// todo, maybe extreact into a separate method to add current date time to whatever variable
5-
function uniqueUsername(prefix = "e2e") {
6-
const d = new Date();
7-
const pad = (n: number) => String(n).padStart(2, "0");
8-
const ts = [
9-
d.getUTCFullYear(),
10-
pad(d.getUTCMonth() + 1),
11-
pad(d.getUTCDate()),
12-
"-",
13-
pad(d.getUTCHours()),
14-
pad(d.getUTCMinutes()),
15-
pad(d.getUTCSeconds()),
16-
"-",
17-
d.getUTCMilliseconds(),
18-
].join("");
19-
return `${prefix}-${ts}`;
20-
}
1+
import { test, expect, Page } from "@playwright/test";
2+
import {
3+
generateUniqueUsername,
4+
selectVuetifyFirstOption,
5+
selectVuetifyOptionByName,
6+
} from "../utils/helpers";
217

228
// Setup Method for page
239
async function setupRegisterPage(page: Page) {
@@ -65,36 +51,6 @@ async function setupRegisterPage(page: Page) {
6551
};
6652
}
6753

68-
// select option by text from selector (for institution)
69-
async function selectVuetifyOptionByName(
70-
page: Page,
71-
selectRoot: Locator,
72-
optionName: string,
73-
) {
74-
const input = selectRoot.locator(".v-field__input").first();
75-
await input.click();
76-
77-
const option = page.getByRole("option", { name: optionName });
78-
await option.click();
79-
80-
await page.keyboard.press("Escape").catch(() => {});
81-
}
82-
83-
// select first option from selector (for timezone)
84-
// todo Consider exporting to utils file
85-
async function selectVuetifyFirstOption(page: Page, selectRoot: Locator) {
86-
const input = selectRoot.locator(".v-field__input").first();
87-
await input.click();
88-
89-
await expect(page.getByRole("option").first()).toBeVisible({
90-
timeout: 10000,
91-
});
92-
93-
await page.keyboard.press("ArrowDown");
94-
await page.keyboard.press("Enter");
95-
await page.keyboard.press("Escape").catch(() => {});
96-
}
97-
9854
//tests
9955
test.describe("1.1.2 User Accounts - CREATE Register", () => {
10056
test("A Success", async ({ page }) => {
@@ -111,13 +67,13 @@ test.describe("1.1.2 User Accounts - CREATE Register", () => {
11167
successAlert,
11268
} = await setupRegisterPage(page);
11369

114-
const uname = uniqueUsername("e2e-user");
70+
const uname = generateUniqueUsername("e2e-user");
11571

11672
await selectVuetifyOptionByName(page, institutionSelect, "SEB Server");
11773

11874
await username.fill(uname);
119-
await name.fill("Andrei");
120-
await surname.fill("Mititelu");
75+
await name.fill("John");
76+
await surname.fill("Doe");
12177
await email.fill(`${uname}@example.com`);
12278

12379
await selectVuetifyFirstOption(page, timezoneSelect);
@@ -144,7 +100,7 @@ test.describe("1.1.2 User Accounts - CREATE Register", () => {
144100
submitButton,
145101
} = await setupRegisterPage(page);
146102

147-
const uname = uniqueUsername("e2e-invalid");
103+
const uname = generateUniqueUsername("e2e-invalid");
148104

149105
await username.fill(uname);
150106
await name.fill("Test");
@@ -166,8 +122,9 @@ test.describe("1.1.2 User Accounts - CREATE Register", () => {
166122
await expect(anyValidationMessage.first()).toBeVisible();
167123
});
168124

169-
//createtests as username
170-
test("C Server error on register (simulated)", async ({ page }) => {
125+
test("C Server error on register - username already exists", async ({
126+
page,
127+
}) => {
171128
const {
172129
institutionSelect,
173130
username,
@@ -186,8 +143,8 @@ test.describe("1.1.2 User Accounts - CREATE Register", () => {
186143
await selectVuetifyOptionByName(page, institutionSelect, "SEB Server");
187144

188145
await username.fill(uname);
189-
await name.fill("Andrei");
190-
await surname.fill("Mititelu");
146+
await name.fill("John");
147+
await surname.fill("Doe");
191148
await email.fill(`${uname}@example.com`);
192149

193150
await selectVuetifyFirstOption(page, timezoneSelect);

client/tests/e2e/1-user-account/2.1-read-login.spec.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { test, expect, Page } from "@playwright/test";
2+
import { loginAsServerAdmin } from "../utils/authenticate";
23

34
const correctUser = "testmain";
45
const correctPass = "testmain";
@@ -28,13 +29,7 @@ test.use({
2829

2930
test.describe("1.2.1 User Accounts - READ Log in", () => {
3031
test("A Successful login", async ({ page }) => {
31-
const { username, password } = await setupLoginPage(page);
32-
33-
await username.fill(correctUser);
34-
await password.fill(correctPass);
35-
await page.keyboard.press("Enter");
36-
37-
await expect(page).toHaveURL(/\/home(?:$|[?#])/i, { timeout: 5000 });
32+
await loginAsServerAdmin(page, correctUser, correctPass);
3833
});
3934

4035
test("B Failed login, bad credentials", async ({ page }) => {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { expect, Page } from "@playwright/test";
2+
3+
const SEB_SERVER_ADMIN_USERNAME = "testmain";
4+
const SEB_SERVER_ADMIN_PASSWORD = "testmain";
5+
6+
export async function loginAsServerAdmin(
7+
page: Page,
8+
username: string = SEB_SERVER_ADMIN_USERNAME,
9+
password: string = SEB_SERVER_ADMIN_PASSWORD,
10+
) {
11+
await page.goto("/");
12+
await expect(page.getByTestId("login-page-container")).toBeVisible();
13+
14+
const usernameField = page.getByRole("textbox", { name: "Username *" });
15+
const passwordField = page.getByRole("textbox", { name: "Password *" });
16+
17+
await usernameField.fill(username);
18+
await passwordField.fill(password);
19+
20+
await page.keyboard.press("Enter");
21+
22+
await expect(page).toHaveURL(/\/home(?:$|[?#])/i, {
23+
timeout: 10_000,
24+
});
25+
}

0 commit comments

Comments
 (0)