Files
moreminimore-vibe/e2e-tests/github-import.spec.ts
Adeniji Adekunle James 76875fefec fix: responsiveness for import app dialog (#1746) (#1786)
The diff appears large due to Prettier formatting, but actual code
changes are minimal.

- Made header sticky with proper flex layout
- Added responsive text sizes (`text-xs sm:text-sm`)
- Improved text wrapping (`break-words overflow-wrap-anywhere`)
- Made tab labels responsive (shorter for small screen)
- Added `flex-shrink-0` to prevent icon/button squishing
- Stack footer buttons vertically on small screen

closes #1746



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Made the Import App dialog responsive on small screens. Improves
readability and prevents controls from squishing.

- **Bug Fixes**
- Added a sticky header so the title/description stay visible while
scrolling.
- Made text and tab labels responsive, with better word wrapping to
avoid overflow.
- Prevented icon/button compression and stacked footer buttons
vertically on mobile.
- Updated e2e test by removing the AI_RULES snapshot to match the new
UI.

<sup>Written for commit 1025631018964aea37689ab2196e0169755e3739.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-11-21 07:02:35 -08:00

171 lines
6.2 KiB
TypeScript

import { expect } from "@playwright/test";
import { test } from "./helpers/test_helper";
test("should open GitHub import modal from home", async ({ po }) => {
await po.setUp();
// Click the "Import from Github" button
await po.page.getByRole("button", { name: "Import App" }).click();
// Verify modal opened with import UI (showing all tabs even when not authenticated)
await expect(
po.page.getByRole("heading", { name: "Import App" }),
).toBeVisible();
await expect(
po.page.getByText(
"Import existing app from local folder or clone from Github",
),
).toBeVisible();
// All tabs should be visible
await expect(
po.page.getByRole("tab", { name: "Local Folder" }),
).toBeVisible();
await expect(
po.page.getByRole("tab", { name: "Your GitHub Repos" }),
).toBeVisible();
await expect(po.page.getByRole("tab", { name: "GitHub URL" })).toBeVisible();
// Local Folder tab should be active by default
await expect(
po.page.getByRole("button", { name: "Select Folder" }),
).toBeVisible();
// Switch to Your GitHub Repos tab - should show GitHub connector
await po.page.getByRole("tab", { name: "Your GitHub Repos" }).click();
await expect(
po.page.getByRole("button", { name: "Connect to GitHub" }),
).toBeVisible();
});
test("should connect to GitHub and show import UI", async ({ po }) => {
await po.setUp();
// Open modal
await po.page.getByRole("button", { name: "Import App" }).click();
// Switch to Your GitHub Repos tab - should show GitHub connector when not authenticated
await po.page.getByRole("tab", { name: "Your GitHub Repos" }).click();
// Connect to GitHub (reuse existing connector)
await po.page.getByRole("button", { name: "Connect to GitHub" }).click();
// Wait for device flow code
await expect(po.page.locator("text=FAKE-CODE")).toBeVisible();
// After connection, should show repositories list instead of connector
await expect(po.page.getByText("testuser/existing-app")).toBeVisible();
// Should be able to see all tabs
await expect(
po.page.getByRole("tab", { name: "Your GitHub Repos" }),
).toBeVisible();
await expect(po.page.getByRole("tab", { name: "GitHub URL" })).toBeVisible();
await expect(
po.page.getByRole("tab", { name: "Local Folder" }),
).toBeVisible();
});
test("should import GitHub URL", async ({ po }) => {
await po.setUp();
// Open modal and connect
await po.page.getByRole("button", { name: "Import App" }).click();
await po.page.getByRole("tab", { name: "Your GitHub Repos" }).click();
await po.page.getByRole("button", { name: "Connect to GitHub" }).click();
await expect(po.page.locator("text=FAKE-CODE")).toBeVisible();
// Switch to "GitHub URL" tab
await po.page.getByRole("tab", { name: "GitHub URL" }).click();
// Enter URL
await po.page
.getByPlaceholder("https://github.com/user/repo.git")
.fill("https://github.com/dyad-sh/nextjs-template.git");
// Click import
await po.page.getByRole("button", { name: "Import", exact: true }).click();
// Should close modal and navigate to chat
await expect(
po.page.getByRole("heading", { name: "Import App" }),
).not.toBeVisible();
// Verify AI_RULES generation prompt was sent
});
test("should import from repository list", async ({ po }) => {
await po.setUp();
// Open modal and connect
await po.page.getByRole("button", { name: "Import App" }).click();
// Switch to Your GitHub Repos tab - should show GitHub connector when not authenticated
await po.page.getByRole("tab", { name: "Your GitHub Repos" }).click();
await po.page.getByRole("button", { name: "Connect to GitHub" }).click();
await expect(po.page.locator("text=FAKE-CODE")).toBeVisible();
// Switch to Your GitHub Repos tab
await po.page.getByRole("tab", { name: "Your GitHub Repos" }).click();
// Should show repositories list
await expect(po.page.getByText("testuser/existing-app")).toBeVisible();
// Click the first Import button in the repo list
await po.page.getByRole("button", { name: "Import" }).first().click();
// Should close modal and navigate to chat
await expect(
po.page.getByRole("heading", { name: "Import App" }),
).not.toBeVisible();
});
test("should support advanced options with custom commands", async ({ po }) => {
await po.setUp();
// Open modal and connect
await po.page.getByRole("button", { name: "Import App" }).click();
// Go to GitHub URL tab
await po.page.getByRole("tab", { name: "GitHub URL" }).click();
await po.page
.getByPlaceholder("https://github.com/user/repo.git")
.fill("https://github.com/dyad-sh/nextjs-template.git");
// Open advanced options
await po.page.getByRole("button", { name: "Advanced options" }).click();
// Fill one command - should show error
await po.page.getByPlaceholder("pnpm install").fill("npm install");
await expect(
po.page.getByText("Both commands are required when customizing"),
).toBeVisible();
await expect(
po.page.getByRole("button", { name: "Import", exact: true }),
).toBeDisabled();
// Fill both commands
await po.page.getByPlaceholder("pnpm dev").fill("npm start");
await expect(
po.page.getByRole("button", { name: "Import", exact: true }),
).toBeEnabled();
await expect(
po.page.getByText("Both commands are required when customizing"),
).not.toBeVisible();
// Import with custom commands
await po.page.getByRole("button", { name: "Import", exact: true }).click();
await expect(
po.page.getByRole("heading", { name: "Import App" }),
).not.toBeVisible();
});
test("should allow empty commands to use defaults", async ({ po }) => {
await po.setUp();
// Open modal and connect
await po.page.getByRole("button", { name: "Import App" }).click();
// Go to GitHub URL tab
await po.page.getByRole("tab", { name: "GitHub URL" }).click();
await po.page
.getByPlaceholder("https://github.com/user/repo.git")
.fill("https://github.com/dyad-sh/nextjs-template.git");
// Commands are empty by default, so import should be enabled
await expect(
po.page.getByRole("button", { name: "Import", exact: true }),
).toBeEnabled();
await po.page.getByRole("button", { name: "Import", exact: true }).click();
await expect(
po.page.getByRole("heading", { name: "Import App" }),
).not.toBeVisible();
});