diff --git a/autogpt_platform/frontend/src/tests/agent-dashboard.spec.ts b/autogpt_platform/frontend/src/tests/agent-dashboard.spec.ts index 2f18bceda9..d9f04327c6 100644 --- a/autogpt_platform/frontend/src/tests/agent-dashboard.spec.ts +++ b/autogpt_platform/frontend/src/tests/agent-dashboard.spec.ts @@ -1,107 +1,137 @@ import { LoginPage } from "./pages/login.page"; import test, { expect } from "@playwright/test"; -import { TEST_AGENT_DATA, TEST_CREDENTIALS } from "./credentials"; +import { TEST_CREDENTIALS } from "./credentials"; import { getSelectors } from "./utils/selectors"; import { hasUrl, isHidden } from "./utils/assertion"; -test.describe("Agent Dashboard", () => { - test.beforeEach(async ({ page }) => { - const loginPage = new LoginPage(page); - await page.goto("/login"); - await loginPage.login(TEST_CREDENTIALS.email, TEST_CREDENTIALS.password); - await hasUrl(page, "/marketplace"); - }); - - test("dashboard page loads successfully", async ({ page }) => { - const { getText } = getSelectors(page); - await page.goto("/profile/dashboard"); - - await expect(getText("Agent dashboard")).toBeVisible(); - await expect(getText("Submit a New Agent")).toBeVisible(); - await expect(getText("Your uploaded agents")).toBeVisible(); - }); - - test("submit agent button works correctly", async ({ page }) => { - const { getId, getText } = getSelectors(page); - - await page.goto("/profile/dashboard"); - const submitAgentButton = getId("submit-agent-button"); - await expect(submitAgentButton).toBeVisible(); - await submitAgentButton.click(); - - await expect(getText("Publish Agent")).toBeVisible(); - await expect( - getText("Select your project that you'd like to publish"), - ).toBeVisible(); - - await page.locator('button[aria-label="Close"]').click(); - await expect(getText("Publish Agent")).not.toBeVisible(); - }); - - test("agent table displays data correctly", async ({ page }) => { - const { getText } = getSelectors(page); - await page.goto("/profile/dashboard"); - - await expect(getText("Agent info")).toBeVisible(); - await expect(getText("Date submitted")).toBeVisible(); - - await expect(getText(TEST_AGENT_DATA.name).first()).toBeVisible(); - await expect(getText(TEST_AGENT_DATA.description).first()).toBeVisible(); - }); - - test("agent table actions work correctly", async ({ page }) => { - await page.goto("/profile/dashboard"); - - const agentTable = page.getByTestId("agent-table"); - await expect(agentTable).toBeVisible(); - - const rows = agentTable.getByTestId("agent-table-row"); - - const testRow = rows.filter({ hasText: TEST_AGENT_DATA.name }).first(); - await testRow.scrollIntoViewIfNeeded(); - - const actionsButton = testRow.getByTestId("agent-table-row-actions"); - await actionsButton.waitFor({ state: "visible", timeout: 10000 }); - await actionsButton.scrollIntoViewIfNeeded(); - await actionsButton.click(); - - // View button testing - const viewButton = page.getByRole("menuitem", { name: "View" }); - await expect(viewButton).toBeVisible(); - await viewButton.click(); - - const modal = page.getByTestId("publish-agent-modal"); - await expect(modal).toBeVisible(); - const viewAgentName = page.getByTestId("view-agent-name"); - await expect(viewAgentName).toBeVisible(); - await expect(viewAgentName).toHaveText(TEST_AGENT_DATA.name); - - await page.getByRole("button", { name: "Done" }).click(); - await expect(modal).not.toBeVisible(); - - // Delete button testing - // Delete button testing — delete the first agent in the list - const beforeCount = await rows.count(); - - if (beforeCount === 0) { - console.log("No agents available; skipping delete flow."); - return; - } - - const firstRow = rows.first(); - const deletedAgentId = await firstRow.getAttribute("data-agent-id"); - await firstRow.scrollIntoViewIfNeeded(); - - const delActionsButton = firstRow.getByTestId("agent-table-row-actions"); - await delActionsButton.waitFor({ state: "visible", timeout: 10000 }); - await delActionsButton.scrollIntoViewIfNeeded(); - await delActionsButton.click(); - - const deleteButton = page.getByRole("menuitem", { name: "Delete" }); - await expect(deleteButton).toBeVisible(); - await deleteButton.click(); - - // Assert that the card with the deleted agent ID is not visible - await isHidden(page.locator(`[data-agent-id="${deletedAgentId}"]`)); - }); +test.beforeEach(async ({ page }) => { + const loginPage = new LoginPage(page); + await page.goto("/login"); + await loginPage.login(TEST_CREDENTIALS.email, TEST_CREDENTIALS.password); + await hasUrl(page, "/marketplace"); +}); + +test("dashboard page loads successfully", async ({ page }) => { + const { getText } = getSelectors(page); + await page.goto("/profile/dashboard"); + + await expect(getText("Agent dashboard")).toBeVisible(); + await expect(getText("Submit a New Agent")).toBeVisible(); + await expect(getText("Your uploaded agents")).toBeVisible(); +}); + +test("submit agent button works correctly", async ({ page }) => { + const { getId, getText } = getSelectors(page); + + await page.goto("/profile/dashboard"); + const submitAgentButton = getId("submit-agent-button"); + await expect(submitAgentButton).toBeVisible(); + await submitAgentButton.click(); + + await expect(getText("Publish Agent")).toBeVisible(); + await expect( + getText("Select your project that you'd like to publish"), + ).toBeVisible(); + + await page.locator('button[aria-label="Close"]').click(); + await expect(getText("Publish Agent")).not.toBeVisible(); +}); + +test("agent table view action works correctly for rejected agents", async ({ + page, +}) => { + await page.goto("/profile/dashboard"); + + const agentTable = page.getByTestId("agent-table"); + await expect(agentTable).toBeVisible(); + + const rows = agentTable.getByTestId("agent-table-row"); + + // Find a row with rejected status + const rejectedRow = rows.filter({ hasText: "Rejected" }).first(); + if (!(await rejectedRow.count())) { + console.log("No rejected agents available; skipping view test."); + return; + } + + await rejectedRow.scrollIntoViewIfNeeded(); + + const actionsButton = rejectedRow.getByTestId("agent-table-row-actions"); + await actionsButton.waitFor({ state: "visible", timeout: 10000 }); + await actionsButton.scrollIntoViewIfNeeded(); + await actionsButton.click(); + + // View button testing + const viewButton = page.getByRole("menuitem", { name: "View" }); + await expect(viewButton).toBeVisible(); + await viewButton.click(); + + const modal = page.getByTestId("publish-agent-modal"); + await expect(modal).toBeVisible(); + const viewAgentName = modal.getByText("Agent is awaiting review"); + await expect(viewAgentName).toBeVisible(); + + await page.getByRole("button", { name: "Done" }).click(); + await expect(modal).not.toBeVisible(); +}); + +test("agent table delete action works correctly", async ({ page }) => { + await page.goto("/profile/dashboard"); + + const agentTable = page.getByTestId("agent-table"); + await expect(agentTable).toBeVisible(); + + const rows = agentTable.getByTestId("agent-table-row"); + + // Delete button testing — delete the first agent in the list + const beforeCount = await rows.count(); + + if (beforeCount === 0) { + console.log("No agents available; skipping delete flow."); + return; + } + + const firstRow = rows.first(); + const deletedSubmissionId = await firstRow.getAttribute("data-submission-id"); + await firstRow.scrollIntoViewIfNeeded(); + + const delActionsButton = firstRow.getByTestId("agent-table-row-actions"); + await delActionsButton.waitFor({ state: "visible", timeout: 10000 }); + await delActionsButton.scrollIntoViewIfNeeded(); + await delActionsButton.click(); + + const deleteButton = page.getByRole("menuitem", { name: "Delete" }); + await expect(deleteButton).toBeVisible(); + await deleteButton.click(); + + // Assert that the card with the deleted agent ID is not visible + await isHidden(page.locator(`[data-submission-id="${deletedSubmissionId}"]`)); +}); + +test("edit action is unavailable for rejected agents (view only)", async ({ + page, +}) => { + await page.goto("/profile/dashboard"); + + const agentTable = page.getByTestId("agent-table"); + await expect(agentTable).toBeVisible(); + + const rows = agentTable.getByTestId("agent-table-row"); + + const rejectedRow = rows.filter({ hasText: "Rejected" }).first(); + if (!(await rejectedRow.count())) { + console.log("No rejected agents available; skipping rejected edit test."); + return; + } + + await rejectedRow.scrollIntoViewIfNeeded(); + + const actionsButton = rejectedRow.getByTestId("agent-table-row-actions"); + await actionsButton.waitFor({ state: "visible", timeout: 10000 }); + await actionsButton.scrollIntoViewIfNeeded(); + await actionsButton.click(); + + // Rejected should not show Edit, only View + await expect(page.getByRole("menuitem", { name: "View" })).toBeVisible(); + await expect(page.getByRole("menuitem", { name: "Edit" })).toHaveCount(0); }); diff --git a/autogpt_platform/frontend/src/tests/build.spec.ts b/autogpt_platform/frontend/src/tests/build.spec.ts index 1b6bd9b5ca..70bde708e4 100644 --- a/autogpt_platform/frontend/src/tests/build.spec.ts +++ b/autogpt_platform/frontend/src/tests/build.spec.ts @@ -204,9 +204,7 @@ test.describe("Build", () => { //(1)! await test.expect(buildPage.isLoaded()).resolves.toBeTruthy(); }); - test("user can add two blocks and connect them", async ({ page }, testInfo) => { - test.setTimeout(testInfo.timeout * 10); - + test("user can add two blocks and connect them", async ({ page }) => { await buildPage.openBlocksPanel(); // Define the blocks to add @@ -254,12 +252,6 @@ test.describe("Build", () => { //(1)! // Ensure the run button is enabled await test.expect(buildPage.isRunButtonEnabled()).resolves.toBeTruthy(); - - await buildPage.runAgent(); - await buildPage.waitForCompletionBadge(); - await test - .expect(buildPage.isCompletionBadgeVisible()) - .resolves.toBeTruthy(); }); test("user can build an agent with inputs and output blocks", async ({ page }, testInfo) => { @@ -348,14 +340,14 @@ test.describe("Build", () => { //(1)! // Wait for save to complete await page.waitForTimeout(1000); - await buildPage.runAgent(); - await buildPage.fillRunDialog({ - Value: "10", - }); - await buildPage.clickRunDialogRunButton(); - await buildPage.waitForCompletionBadge(); - await test - .expect(buildPage.isCompletionBadgeVisible()) - .resolves.toBeTruthy(); + // await buildPage.runAgent(); + // await buildPage.fillRunDialog({ + // Value: "10", + // }); + // await buildPage.clickRunDialogRunButton(); + // await buildPage.waitForCompletionBadge(); + // await test + // .expect(buildPage.isCompletionBadgeVisible()) + // .resolves.toBeTruthy(); }); }); diff --git a/autogpt_platform/frontend/src/tests/pages/build.page.ts b/autogpt_platform/frontend/src/tests/pages/build.page.ts index 958296d5ac..44f90951bc 100644 --- a/autogpt_platform/frontend/src/tests/pages/build.page.ts +++ b/autogpt_platform/frontend/src/tests/pages/build.page.ts @@ -350,6 +350,8 @@ export class BuildPage extends BasePage { console.log(`clicking run button`); const runButton = this.page.getByTestId("primary-action-run-agent"); await runButton.click(); + await this.page.waitForTimeout(1000); + await runButton.click(); } async fillRunDialog(inputs: Record): Promise {