From 1dde72e77621ae5e0f5d918b6bd6528e4b7c117d Mon Sep 17 00:00:00 2001 From: Will Chen Date: Mon, 2 Jun 2025 22:06:21 -0700 Subject: [PATCH] Delete app E2E (#313) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- e2e-tests/delete_app.spec.ts | 28 ++++++++++++++++++++++++++++ e2e-tests/helpers/test_helper.ts | 11 +++++++++++ src/components/AppList.tsx | 3 ++- src/pages/app-details.tsx | 7 ++++++- 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 e2e-tests/delete_app.spec.ts diff --git a/e2e-tests/delete_app.spec.ts b/e2e-tests/delete_app.spec.ts new file mode 100644 index 0000000..017540f --- /dev/null +++ b/e2e-tests/delete_app.spec.ts @@ -0,0 +1,28 @@ +import fs from "fs"; +import { test } from "./helpers/test_helper"; +import { expect } from "@playwright/test"; +test("delete app", async ({ po }) => { + await po.setUp(); + await po.sendPrompt("hi"); + const appName = await po.getCurrentAppName(); + if (!appName) { + throw new Error("App name not found"); + } + const appPath = await po.getCurrentAppPath(); + await po.getTitleBarAppNameButton().click(); + await expect(po.getAppListItem({ appName })).toBeVisible(); + + // Delete app + await po.clickAppDetailsMoreOptions(); + // Open delete dialog + await po.page.getByRole("button", { name: "Delete" }).click(); + // Confirm delete + await po.page.getByRole("button", { name: "Delete App" }).click(); + + // Make sure the app is deleted + await expect(async () => { + expect(await po.getCurrentAppName()).toBe("(no app selected)"); + }).toPass(); + expect(fs.existsSync(appPath)).toBe(false); + expect(po.getAppListItem({ appName })).not.toBeVisible(); +}); diff --git a/e2e-tests/helpers/test_helper.ts b/e2e-tests/helpers/test_helper.ts index 3484ffb..b9a3659 100644 --- a/e2e-tests/helpers/test_helper.ts +++ b/e2e-tests/helpers/test_helper.ts @@ -232,6 +232,10 @@ class PageObject { return this.page.getByTestId("title-bar-app-name-button"); } + getAppListItem({ appName }: { appName: string }) { + return this.page.getByTestId(`app-list-item-${appName}`); + } + async getCurrentAppName() { return (await this.getTitleBarAppNameButton().textContent())?.replace( "App: ", @@ -246,6 +250,13 @@ class PageObject { } return path.join(this.userDataDir, "dyad-apps", currentAppName); } + async clickAppListItem({ appName }: { appName: string }) { + await this.page.getByTestId(`app-list-item-${appName}`).click(); + } + + async clickAppDetailsMoreOptions() { + await this.page.getByTestId("app-details-more-options-button").click(); + } //////////////////////////////// // Settings related diff --git a/src/components/AppList.tsx b/src/components/AppList.tsx index 0cfd8f7..8c5eafb 100644 --- a/src/components/AppList.tsx +++ b/src/components/AppList.tsx @@ -63,7 +63,7 @@ export function AppList({ show }: { show?: boolean }) { ) : apps.length === 0 ? (
No apps found
) : ( - + {apps.map((app) => (