From 5198432cfce48d8b99254e63526be2ed32d9a8f5 Mon Sep 17 00:00:00 2001 From: Ionys <9364594+Ionys320@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:32:23 +0200 Subject: [PATCH] feat: Add E2E test for multi-admin users --- src/components/settings/Users/AddUser.vue | 8 +-- src/components/settings/Users/EditUser.vue | 1 + src/components/settings/Users/Users.vue | 4 +- test/e2e/specs/multiple-users.spec.js | 63 ++++++++++++++++++++++ test/e2e/util-test.js | 7 +-- 5 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 test/e2e/specs/multiple-users.spec.js diff --git a/src/components/settings/Users/AddUser.vue b/src/components/settings/Users/AddUser.vue index 5f38420b8..3f0eaf14e 100644 --- a/src/components/settings/Users/AddUser.vue +++ b/src/components/settings/Users/AddUser.vue @@ -14,7 +14,7 @@ :placeholder="$t('Username')" required :disabled="creating" - data-cy="username-input" + data-testid="username-input" > @@ -29,7 +29,7 @@ :placeholder="$t('Password')" required :disabled="creating" - data-cy="password-input" + data-testid="password-input" > @@ -44,12 +44,12 @@ :placeholder="$t('Repeat Password')" required :disabled="creating" - data-cy="password-repeat-input" + data-testid="password-repeat-input" > - diff --git a/src/components/settings/Users/EditUser.vue b/src/components/settings/Users/EditUser.vue index 59a8a1747..64cb8727f 100644 --- a/src/components/settings/Users/EditUser.vue +++ b/src/components/settings/Users/EditUser.vue @@ -83,6 +83,7 @@ type="checkbox" :disabled="saving" @click="debounceCheckboxClick(() => { active = !active; save({ active }); })" + data-testid="active-checkbox" >
{{ $t("Active") }}
diff --git a/src/components/settings/Users/Users.vue b/src/components/settings/Users/Users.vue index e367fd76d..4f58c2035 100644 --- a/src/components/settings/Users/Users.vue +++ b/src/components/settings/Users/Users.vue @@ -10,12 +10,13 @@ -
+
{{ username }} @@ -31,6 +32,7 @@ :class="active ? 'btn-outline-danger' : 'btn-outline-success'" :disabled="processing" @click.prevent="active ? disableConfirm(usersList[index]) : toggleActiveUser(usersList[index])" + :data-testid="`toggle-active-user-${username}`" > diff --git a/test/e2e/specs/multiple-users.spec.js b/test/e2e/specs/multiple-users.spec.js new file mode 100644 index 000000000..63ff6545e --- /dev/null +++ b/test/e2e/specs/multiple-users.spec.js @@ -0,0 +1,63 @@ +import { expect, test } from "@playwright/test"; +import { login, restoreSqliteSnapshot, screenshot } from "../util-test"; + +test.describe("Multiple Users", () => { + test.beforeEach(async ({ page }) => { + await restoreSqliteSnapshot(page); + }); + + test("test multiple users", async ({ page }, testInfo) => { + // Login as admin + await page.goto("./settings/users"); + await login(page, "admin"); + + // Check if the user list contains only the admin user + await expect(page.getByTestId("users-list")).toHaveCount(1); + + await screenshot(testInfo, page); + + // Add a second user + await page.goto("./settings/users/add"); + + await expect(page.getByTestId("username-input")).toBeVisible(); + await page.getByTestId("username-input").fill("newuser"); + await page.getByTestId("password-input").fill("newuser123"); + await page.getByTestId("password-repeat-input").fill("newuser123"); + await page.getByTestId("submit-create-admin-form").click(); + + // Ensure the new user is created and visible in the user list + await page.waitForURL("./settings/users"); + await expect(page.getByTestId("users-list")).toContainText("newuser"); + await expect(page.getByTestId("users-list").locator("[data-testid='user-item']")).toHaveCount(2); + + await screenshot(testInfo, page); + + // Disable the admin user + await page.getByTestId("toggle-active-user-admin").click(); + // Click on the button containing Yes and having btn-danger class + await page.getByRole("button", { name: "Yes", exact: true}).click(); + await expect(page.getByText("You are not logged in.")).toBeVisible(); + + // Make sure we're back on the login page after refresh + await page.reload(); + await expect(page.getByText("Log in")).toBeVisible(); + + // Login as the new user + await page.goto("./dashboard"); // Assuming the new user has ID 2 + await login(page, "newuser"); + await screenshot(testInfo, page); + + // Disable self-user + await page.goto("./settings/users/edit/2"); + await expect(page.getByTestId("active-checkbox")).toBeVisible(); + await page.getByTestId("active-checkbox").uncheck(); + + await screenshot(testInfo, page); + + // Make sure we're back on the login page after refresh + await page.reload(); + await expect(page.getByText("Log in")).toBeVisible(); + + await screenshot(testInfo, page); + }); +}); diff --git a/test/e2e/util-test.js b/test/e2e/util-test.js index f6af3cbd2..e22c909de 100644 --- a/test/e2e/util-test.js +++ b/test/e2e/util-test.js @@ -19,14 +19,15 @@ export async function screenshot(testInfo, page) { /** * @param {Page} page Page + * @param {string} [user="admin"] Username to log in with * @returns {Promise} */ -export async function login(page) { +export async function login(page, user = "admin") { // Login await page.getByPlaceholder("Username").click(); - await page.getByPlaceholder("Username").fill("admin"); + await page.getByPlaceholder("Username").fill(user); await page.getByPlaceholder("Username").press("Tab"); - await page.getByPlaceholder("Password").fill("admin123"); + await page.getByPlaceholder("Password").fill(user + "123"); await page.getByLabel("Remember me").check(); await page.getByRole("button", { name: "Log in" }).click(); await page.isVisible("text=Add New Monitor");