Skip to content

Commit 143373e

Browse files
authored
chore: e2e stability, modal visibility (#20438)
1 parent 2460dbd commit 143373e

17 files changed

+113
-96
lines changed

assets/js/components/Config/LoadpointModal.vue

-2
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,6 @@ export default {
726726
this.updatePhases();
727727
},
728728
async loadConfiguration() {
729-
console.log("loadpoint modal loadConfiguration");
730729
try {
731730
const res = await api.get(`config/loadpoints/${this.id}`);
732731
this.values = deepClone(res.data.result);
@@ -766,7 +765,6 @@ export default {
766765
await api.post("config/loadpoints", this.values);
767766
this.$emit("updated");
768767
this.$refs.modal.close();
769-
this.reset();
770768
} catch (e) {
771769
console.error(e);
772770
const error = e.response?.data?.error;

assets/js/components/Helper/GenericModal.vue

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
:class="classes"
77
tabindex="-1"
88
role="dialog"
9-
aria-hidden="true"
9+
:aria-hidden="isModalVisible ? 'false' : 'true'"
1010
:data-bs-backdrop="uncloseable ? 'static' : 'true'"
1111
:data-bs-keyboard="uncloseable ? 'false' : 'true'"
1212
:data-testid="dataTestid"
@@ -88,9 +88,11 @@ export default {
8888
},
8989
methods: {
9090
handleShow() {
91+
console.log(this.dataTestid, "> show");
9192
this.$emit("open");
9293
},
9394
handleShown() {
95+
console.log(this.dataTestid, "> shown");
9496
this.$emit("opened");
9597
// focus first input or select
9698
this.$nextTick(() => {
@@ -102,16 +104,20 @@ export default {
102104
this.isModalVisible = true;
103105
},
104106
handleHide() {
107+
console.log(this.dataTestid, "> hide");
105108
this.$emit("close");
106109
},
107110
handleHidden() {
111+
console.log(this.dataTestid, "> hidden");
108112
this.$emit("closed");
109113
this.isModalVisible = false;
110114
},
111115
open() {
116+
console.log(this.dataTestid, "> open", this.$refs.modal._isShown);
112117
Modal.getOrCreateInstance(this.$refs.modal).show();
113118
},
114119
close() {
120+
console.log(this.dataTestid, "> close", this.$refs.modal._isShown);
115121
Modal.getOrCreateInstance(this.$refs.modal).hide();
116122
},
117123
},

assets/js/views/Config.vue

+1
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,7 @@ export default {
762762
},
763763
newLoadpoint() {
764764
this.selectedLoadpointId = undefined;
765+
this.$refs.loadpointModal.reset();
765766
this.$nextTick(() => this.loadpointModal().show());
766767
},
767768
async loadpointChanged() {

playwright.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default defineConfig({
77
testDir: "./tests",
88
forbidOnly: !!process.env.CI,
99
retries: process.env.CI ? 4 : 0,
10-
timeout: 20000, // default 30s
10+
timeout: 30000, // default 30s
1111
workers: process.env.CI ? 3 : 4,
1212
reporter: "html",
1313
use: {

tests/auth.spec.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { test, expect } from "@playwright/test";
22
import { start, stop, baseUrl } from "./evcc";
3-
3+
import { expectModalHidden, expectModalVisible } from "./utils";
44
test.use({ baseURL: baseUrl() });
55

66
const BASIC = "basics.evcc.yaml";
@@ -11,7 +11,7 @@ test("set initial password", async ({ page }) => {
1111

1212
const modal = page.getByTestId("password-modal");
1313

14-
await expect(modal).toBeVisible();
14+
await expectModalVisible(modal);
1515
await expect(modal.getByRole("heading", { name: "Set Administrator Password" })).toBeVisible();
1616

1717
// empty password
@@ -28,7 +28,7 @@ test("set initial password", async ({ page }) => {
2828
await modal.getByLabel("New password").fill("secret");
2929
await modal.getByLabel("Repeat password").fill("secret");
3030
await modal.getByRole("button", { name: "Create Password" }).click();
31-
await expect(modal).not.toBeVisible();
31+
await expectModalHidden(modal);
3232

3333
await stop();
3434
});
@@ -43,7 +43,7 @@ test("login", async ({ page }) => {
4343

4444
// login modal
4545
const login = page.getByTestId("login-modal");
46-
await expect(login).toBeVisible();
46+
await expectModalVisible(login);
4747
await expect(login.getByRole("heading", { name: "Authentication" })).toBeVisible();
4848

4949
// enter wrong password
@@ -54,7 +54,7 @@ test("login", async ({ page }) => {
5454
// enter correct password
5555
await login.getByLabel("Password").fill("secret");
5656
await login.getByRole("button", { name: "Login" }).click();
57-
await expect(login).not.toBeVisible();
57+
await expectModalHidden(login);
5858
await expect(page.getByRole("heading", { name: "Configuration" })).toBeVisible();
5959

6060
await stop();
@@ -70,7 +70,7 @@ test("http iframe hint", async ({ page }) => {
7070

7171
// login modal
7272
const login = page.getByTestId("login-modal");
73-
await expect(login).toBeVisible();
73+
await expectModalVisible(login);
7474
await expect(login.getByRole("heading", { name: "Authentication" })).toBeVisible();
7575

7676
// rewrite api call to simulate lost auth cookie
@@ -97,10 +97,10 @@ test("update password", async ({ page }) => {
9797
// login modal
9898
await page.goto("/#/config");
9999
const loginModal = page.getByTestId("login-modal");
100-
await expect(loginModal).toBeVisible();
100+
await expectModalVisible(loginModal);
101101
await loginModal.getByLabel("Password").fill(oldPassword);
102102
await loginModal.getByRole("button", { name: "Login" }).click();
103-
await expect(loginModal).not.toBeVisible();
103+
await expectModalHidden(loginModal);
104104

105105
// update password
106106
await page.getByTestId("generalconfig-password").getByRole("button", { name: "edit" }).click();
@@ -123,11 +123,11 @@ test("update password", async ({ page }) => {
123123
await expect(page.getByRole("button", { name: "Logout" })).not.toBeVisible();
124124
await page.getByRole("link", { name: "Configuration" }).click();
125125
const loginNew = page.getByTestId("login-modal");
126-
await expect(loginNew).toBeVisible();
126+
await expectModalVisible(loginNew);
127127
await loginNew.getByLabel("Password").fill(newPassword);
128128
await loginNew.getByRole("button", { name: "Login" }).click();
129129
await expect(page.getByRole("heading", { name: "Configuration" })).toBeVisible();
130-
await expect(loginNew).not.toBeVisible();
130+
await expectModalHidden(loginNew);
131131

132132
// revert to old password
133133
await page.getByTestId("generalconfig-password").getByRole("button", { name: "edit" }).click();
@@ -148,7 +148,7 @@ test("disable auth", async ({ page }) => {
148148

149149
// no password modal
150150
const modal = page.getByTestId("password-modal");
151-
await expect(modal).not.toBeVisible();
151+
await expectModalHidden(modal);
152152

153153
// configuration page without login
154154
await page.getByTestId("topnavigation-button").click();

tests/boot.spec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { test, expect } from "@playwright/test";
22
import { start, stop, baseUrl } from "./evcc";
3-
import { enableExperimental } from "./utils";
3+
import { enableExperimental, expectModalHidden } from "./utils";
44
test.use({ baseURL: baseUrl() });
55

66
test.beforeAll(async () => {
@@ -37,7 +37,7 @@ test.describe("boost", async () => {
3737
"Boost active for this charging session."
3838
);
3939
await modal.getByLabel("Close").click();
40-
await expect(modal).not.toBeVisible();
40+
await expectModalHidden(modal);
4141
await expect(page.getByTestId("vehicle-status-batteryboost")).toBeVisible();
4242
});
4343

tests/config-aux.spec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { test, expect } from "@playwright/test";
22
import { start, stop, restart, baseUrl } from "./evcc";
3-
import { enableExperimental } from "./utils";
3+
import { enableExperimental, expectModalHidden } from "./utils";
44

55
const CONFIG_GRID_ONLY = "config-grid-only.evcc.yaml";
66

@@ -29,7 +29,7 @@ test.describe("aux meter", async () => {
2929
await meterModal.getByLabel("Manufacturer").selectOption("Demo meter");
3030
await meterModal.getByLabel("Power (W)").fill("1200");
3131
await meterModal.getByRole("button", { name: "Validate & save" }).click();
32-
await expect(meterModal).not.toBeVisible();
32+
await expectModalHidden(meterModal);
3333

3434
// check
3535
await expect(page.getByTestId("aux")).toBeVisible(1);

tests/config-battery.spec.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { test, expect } from "@playwright/test";
22
import { start, stop, restart, baseUrl } from "./evcc";
33
import { startSimulator, stopSimulator, simulatorUrl, simulatorHost } from "./simulator";
4-
import { enableExperimental } from "./utils";
4+
import { enableExperimental, expectModalHidden, expectModalVisible } from "./utils";
55

66
const CONFIG_GRID_ONLY = "config-grid-only.evcc.yaml";
77

@@ -42,16 +42,16 @@ test.describe("battery meter", async () => {
4242
await expect(meterModal.getByTestId("device-tag-soc")).toContainText("75.0%");
4343
await expect(meterModal.getByTestId("device-tag-power")).toContainText("-2.5 kW");
4444
await meterModal.getByRole("button", { name: "Save" }).click();
45-
await expect(meterModal).not.toBeVisible();
45+
await expectModalHidden(meterModal);
4646
await expect(page.getByTestId("battery")).toBeVisible(1);
4747
await expect(page.getByTestId("battery")).toContainText("Battery Basement");
4848

4949
// edit #1
5050
await page.getByTestId("battery").getByRole("button", { name: "edit" }).click();
51-
await expect(meterModal).toBeVisible();
51+
await expectModalVisible(meterModal);
5252
await meterModal.getByLabel("Battery capacity in kWh").fill("20");
5353
await meterModal.getByRole("button", { name: "Validate & save" }).click();
54-
await expect(meterModal).not.toBeVisible();
54+
await expectModalHidden(meterModal);
5555

5656
const battery = page.getByTestId("battery");
5757
await expect(battery).toBeVisible(1);

tests/config-grid.spec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { test, expect } from "@playwright/test";
22
import { start, stop, restart, baseUrl } from "./evcc";
33
import { startSimulator, stopSimulator, simulatorUrl, simulatorHost } from "./simulator";
4-
import { enableExperimental } from "./utils";
4+
import { enableExperimental, expectModalHidden } from "./utils";
55

66
const CONFIG_ONE_LP = "config-one-lp.evcc.yaml";
77

@@ -47,7 +47,7 @@ test.describe("grid meter", async () => {
4747
await meterModal.getByRole("link", { name: "validate" }).click();
4848
await expect(meterModal.getByTestId("device-tag-power")).toContainText("5.0 kW");
4949
await meterModal.getByRole("button", { name: "Save" }).click();
50-
await expect(meterModal).not.toBeVisible();
50+
await expectModalHidden(meterModal);
5151

5252
// restart
5353
await restart(CONFIG_ONE_LP);
@@ -62,7 +62,7 @@ test.describe("grid meter", async () => {
6262
await page.goto("/#/config");
6363
await page.getByTestId("grid").getByRole("button", { name: "edit" }).click();
6464
await meterModal.getByRole("button", { name: "Delete" }).click();
65-
await expect(meterModal).not.toBeVisible();
65+
await expectModalHidden(meterModal);
6666

6767
await expect(page.getByTestId("grid")).not.toBeVisible();
6868
await expect(page.getByTestId("add-grid")).toBeVisible();

0 commit comments

Comments
 (0)