mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
144 lines
5.0 KiB
TypeScript
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");
|
|
});
|
|
});
|