Files
SnapOtter/tests/e2e-editor/editor-layers.spec.ts
T

144 lines
5.0 KiB
TypeScript

import { createNewDocument, expect, test } from "./helpers";
test.describe("Editor Layers Panel", () => {
test.beforeEach(async ({ editorPage: page }) => {
await createNewDocument(page);
// Ensure layers tab is active
await page.locator("[data-testid='tab-layers']").click();
await page.waitForTimeout(300);
});
test("layers panel shows default Layer 1", async ({ editorPage: page }) => {
const layersPanel = page.locator("[data-testid='layers-panel']");
await expect(layersPanel).toBeVisible();
// Should have at least one layer with "Layer 1" text
const layerRows = layersPanel.locator("[role='option']");
await expect(layerRows).toHaveCount(1);
await expect(layersPanel.getByText("Layer 1")).toBeVisible();
});
test("add layer button creates new layer", async ({ editorPage: page }) => {
const addBtn = page.locator("[data-testid='add-layer-btn']");
await expect(addBtn).toBeVisible();
await addBtn.click();
await page.waitForTimeout(300);
// Now there should be 2 layers
const layersPanel = page.locator("[data-testid='layers-panel']");
const layerRows = layersPanel.locator("[role='option']");
await expect(layerRows).toHaveCount(2);
});
test("cannot delete last layer", async ({ editorPage: page }) => {
const deleteBtn = page.locator("[data-testid='delete-layer-btn']");
await expect(deleteBtn).toBeVisible();
// With only one layer, delete button should be disabled
await expect(deleteBtn).toBeDisabled();
});
test("delete button enabled with multiple layers", async ({ editorPage: page }) => {
// Add a second layer
await page.locator("[data-testid='add-layer-btn']").click();
await page.waitForTimeout(300);
const deleteBtn = page.locator("[data-testid='delete-layer-btn']");
await expect(deleteBtn).toBeEnabled();
});
test("eye icon toggles visibility", async ({ editorPage: page }) => {
const layersPanel = page.locator("[data-testid='layers-panel']");
const layerRow = layersPanel.locator("[role='option']").first();
// Initially visible (Eye icon, aria-label "Hide layer")
const hideBtn = layerRow.locator("button[aria-label='Hide layer']");
await expect(hideBtn).toBeVisible();
// Click to hide
await hideBtn.click();
await page.waitForTimeout(300);
// Now should show "Show layer" button
const showBtn = layerRow.locator("button[aria-label='Show layer']");
await expect(showBtn).toBeVisible();
// Click again to show
await showBtn.click();
await page.waitForTimeout(300);
await expect(layerRow.locator("button[aria-label='Hide layer']")).toBeVisible();
});
test("lock icon toggles lock state", async ({ editorPage: page }) => {
const layersPanel = page.locator("[data-testid='layers-panel']");
const layerRow = layersPanel.locator("[role='option']").first();
// Initially unlocked
const lockBtn = layerRow.locator("button[aria-label='Lock layer']");
await expect(lockBtn).toBeVisible();
await lockBtn.click();
await page.waitForTimeout(300);
// Now should show "Unlock layer"
const unlockBtn = layerRow.locator("button[aria-label='Unlock layer']");
await expect(unlockBtn).toBeVisible();
});
test("blend mode dropdown shows modes", async ({ editorPage: page }) => {
const blendSelect = page.locator("[data-testid='blend-mode-select']");
await expect(blendSelect).toBeVisible();
// Check that it has the expected blend mode options
const options = blendSelect.locator("option");
const texts = await options.allTextContents();
expect(texts).toContain("Normal");
expect(texts).toContain("Multiply");
expect(texts).toContain("Screen");
expect(texts).toContain("Overlay");
expect(texts).toContain("Darken");
expect(texts).toContain("Lighten");
});
test("opacity slider works", async ({ editorPage: page }) => {
const slider = page.locator("[data-testid='layer-opacity-slider']");
await expect(slider).toBeVisible();
// Default opacity should be 100
await expect(slider).toHaveValue("100");
// Change opacity
await slider.fill("50");
await page.waitForTimeout(300);
await expect(slider).toHaveValue("50");
});
test("double-click layer name enters rename mode", async ({ editorPage: page }) => {
const layersPanel = page.locator("[data-testid='layers-panel']");
// Double-click the layer name button
const nameBtn = layersPanel
.locator("[role='option']")
.first()
.locator("button")
.filter({ hasText: "Layer 1" });
await nameBtn.dblclick();
await page.waitForTimeout(300);
// An input for renaming should appear
const renameInput = layersPanel.locator("input[type='text'][class*='bg-muted']");
await expect(renameInput).toBeVisible();
});
test("layer row highlights active layer", async ({ editorPage: page }) => {
const layersPanel = page.locator("[data-testid='layers-panel']");
const layerRow = layersPanel.locator("[role='option']").first();
await expect(layerRow).toHaveAttribute("aria-selected", "true");
});
});