86 lines
3.1 KiB
TypeScript
86 lines
3.1 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
import type { Page } from "@playwright/test";
|
|
import { start, stop, baseUrl } from "./evcc";
|
|
import { expectModalVisible } from "./utils";
|
|
|
|
test.use({ baseURL: baseUrl() });
|
|
|
|
const templateFlags = [
|
|
"--disable-auth",
|
|
"--template-type",
|
|
"meter",
|
|
"--template",
|
|
"tests/config-param-service-modbus.tpl.yaml",
|
|
];
|
|
|
|
test.beforeAll(async () => {
|
|
await start(undefined, undefined, templateFlags);
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
await stop();
|
|
});
|
|
|
|
async function openMeterModal(page: Page) {
|
|
await page.goto("/#/config");
|
|
await page.getByRole("button", { name: "Add grid meter" }).click();
|
|
const meterModal = page.getByTestId("meter-modal");
|
|
await expectModalVisible(meterModal);
|
|
await meterModal.getByLabel("Manufacturer").selectOption("Service Modbus Test Meter");
|
|
return meterModal;
|
|
}
|
|
|
|
test.describe("modbus service expansion", async () => {
|
|
test("tcp/ip and serial switching", async ({ page }) => {
|
|
const meterModal = await openMeterModal(page);
|
|
|
|
await meterModal.getByLabel("Register address").fill("100");
|
|
await meterModal.getByLabel("IP address or hostname").fill("192.168.1.1");
|
|
await meterModal.getByLabel("Port").fill("502");
|
|
await expect(meterModal.getByLabel("Test value")).toHaveValue("100,id:2,tcp");
|
|
|
|
await meterModal.getByLabel("Test value").clear();
|
|
await meterModal.getByText("RS485").first().click();
|
|
|
|
await meterModal.getByLabel("Modbus ID").fill("44");
|
|
await meterModal.getByLabel("Device").fill("/dev/ttyUSB0");
|
|
await meterModal.getByLabel("Baud rate").selectOption("9600");
|
|
await meterModal.getByLabel("ComSet").selectOption("8N1");
|
|
await expect(meterModal.getByLabel("Test value")).toHaveValue("100,id:44,serial");
|
|
});
|
|
|
|
test("no service call without connection params", async ({ page }) => {
|
|
const meterModal = await openMeterModal(page);
|
|
|
|
await meterModal.getByLabel("Register address").fill("100");
|
|
|
|
await expect(meterModal.getByLabel("Test value")).toHaveValue("");
|
|
});
|
|
|
|
test("template default id and port are used", async ({ page }) => {
|
|
const meterModal = await openMeterModal(page);
|
|
|
|
await meterModal.getByLabel("Register address").fill("100");
|
|
await meterModal.getByLabel("IP address or hostname").fill("192.168.1.1");
|
|
await expect(meterModal.getByLabel("Test value")).toHaveValue("100,id:2,tcp");
|
|
});
|
|
|
|
test("template defaults are included in validation request", async ({ page }) => {
|
|
const meterModal = await openMeterModal(page);
|
|
|
|
// Fill required fields
|
|
await meterModal.getByLabel("Register address").fill("100");
|
|
await meterModal.getByLabel("IP address or hostname").fill("192.168.1.1");
|
|
await meterModal.getByLabel("Test value").fill("test");
|
|
|
|
// Intercept validation POST request
|
|
const requestPromise = page.waitForRequest(
|
|
(req) => req.url().includes("/api/config/test/meter") && req.method() === "POST"
|
|
);
|
|
await meterModal.getByRole("button", { name: "Save" }).click();
|
|
const body = (await requestPromise).postDataJSON();
|
|
|
|
// Template has id: 2 - verify it's included even though user didn't set it
|
|
expect(body.id).toBe(2);
|
|
});
|
|
});
|