-
Notifications
You must be signed in to change notification settings - Fork 16
Add e2e tests for login, survey and dashboard #681
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: staging
Are you sure you want to change the base?
Changes from 3 commits
6861c6a
bbfc98d
3c7eb78
4ae903e
1dce813
4b44e73
9771064
5852aaa
fa216ee
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| name : ZenML Playwright test pipelines | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - main | ||
| pull_request: | ||
| branches: | ||
| - main | ||
|
|
||
| jobs: | ||
| run_zenml_tests: | ||
| runs-on: ubunto-latest | ||
|
|
||
| steps: | ||
| - name: checkout repository | ||
| uses: actions/checkout@v3 | ||
|
|
||
| - name: Set up Python 3.12 | ||
| uses: actions/setup-python@v4 | ||
| with: | ||
| python-version: "3.12" | ||
|
|
||
| - name: Install ZenML | ||
| run: | | ||
| pip install --upgrade pip | ||
| pip install zenml | ||
|
|
||
| - name: ZenMl up | ||
| run: | | ||
| zenml init | ||
| zenml up | ||
|
|
||
| - name: Run Playwright Tests | ||
| run: npx playwright test --workers=1 | ||
|
|
||
| - name: Verify ZenML Installation | ||
| run: zenml version | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| import { test } from "@playwright/test"; | ||
| import { login } from "./utils"; | ||
|
|
||
| test.describe("Survey", () => { | ||
| test("Fill survey for first time", async ({ page }) => { | ||
| await login(page); | ||
|
|
||
| const isVisible = await page.locator("text=Add your account details").isVisible(); | ||
|
|
||
| if (!isVisible) { | ||
| return; | ||
| } | ||
|
|
||
| //survey form - Step 1 | ||
| await page.fill('input[name="fullName"]', "test"); | ||
| await page.fill('input[name="email"]', "[email protected]"); | ||
| await page | ||
| .getByLabel("I want to receive news and recommendations about how to use ZenML") | ||
| .check(); | ||
| await page.click('button span:has-text("Continue")'); | ||
| await page.waitForSelector("text=What will be your primary use for ZenML?"); | ||
|
|
||
| //survey form - Step 2 | ||
| await page.click('div label:has-text("Personal")'); | ||
| await page.click('button span:has-text("Continue")'); | ||
| await page.waitForSelector("text=What best describes your current situation with ZenML?"); | ||
|
|
||
| //survey form - Step 3 | ||
| await page.check('label:has-text("I\'m new to MLOps and exploring")'); | ||
| await page.click('button span:has-text("Continue")'); | ||
| await page.waitForSelector("text=What is your current infrastructure?"); | ||
|
|
||
| //survey form - Step 4 | ||
| await page.check('label:has-text("GCP") button'); | ||
| await page.check('label:has-text("Azure")'); | ||
| await page.check('label:has-text("Openshift")'); | ||
| await page.check('label:has-text("AWS")'); | ||
| await page.check('label:has-text("Native Kubernetes")'); | ||
| await page.click('button span:has-text("Continue")'); | ||
| await page.waitForSelector("text=Join The ZenML Slack Community"); | ||
|
|
||
| //survey form - Step 5 | ||
| await page.click('button span:has-text("Skip")'); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| import { test } from "@playwright/test"; | ||
| import { login } from "./utils"; | ||
|
|
||
| test.describe("Login", () => { | ||
| test("Login with default username", async ({ page }) => { | ||
| await login(page); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| import { test, expect } from "@playwright/test"; | ||
| import { login } from "./utils"; | ||
|
|
||
| test.describe("Dashboard", () => { | ||
| test("Check dashboard and Navbar", async ({ page }) => { | ||
| await login(page); | ||
|
|
||
| const overviewLink = await page.locator('a:has-text("Overview")').isVisible(); | ||
|
|
||
| if (!overviewLink) { | ||
| return; | ||
| } | ||
|
Comment on lines
+6
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider using an assertion instead of an early return for the "Overview" link. While checking for the "Overview" link visibility is a good practice, using an early return might lead to silently skipping important test assertions if the link is not visible. Consider replacing the visibility check and early return with an assertion: await expect(page.locator('a:has-text("Overview")')).toBeVisible({ timeout: 5000 });This change will make the test fail explicitly if the "Overview" link is not visible, providing clearer feedback about the application's state. |
||
| //Visible the navbar | ||
| await expect(page.locator('a:has-text("Pipelines")')).toBeVisible(); | ||
| await expect(page.locator('a:has-text("Models")')).toBeVisible(); | ||
| await expect(page.locator('a:has-text("Artifacts")')).toBeVisible(); | ||
| await expect(page.locator('a:has-text("Stacks")')).toBeVisible(); | ||
|
|
||
| //Change the URL by clicking each nav item | ||
| await page.click('a:has-text("Pipelines")'); | ||
| await expect(page).toHaveURL(/\/pipelines\?tab=pipelines/); | ||
|
|
||
| await page.click('a:has-text("Models")'); | ||
| await expect(page).toHaveURL(/\/models/); | ||
|
|
||
| await page.click('a:has-text("Artifacts")'); | ||
| await expect(page).toHaveURL(/\/artifacts/); | ||
|
|
||
| await page.click('a:has-text("Stacks")'); | ||
| await expect(page).toHaveURL(/\/stacks/); | ||
| }); | ||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| import { Page, expect } from "@playwright/test"; | ||
|
|
||
| // reusable login function | ||
| export async function login(page: Page) { | ||
| await page.goto("http://127.0.0.1:8237/"); | ||
| await expect(page.locator('h1:has-text("Log in to your account")')).toBeVisible(); | ||
| await page.fill('input[name="username"]', "default"); | ||
| await page.fill('input[name="password"]', ""); | ||
| await page.click('button span:has-text("Login")'); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix the runner specification typo.
There's a critical typo in the runner specification that needs to be corrected.
Please apply the following change:
This will ensure that the workflow runs on the latest Ubuntu runner provided by GitHub Actions.
📝 Committable suggestion
🧰 Tools
🪛 actionlint