This is an automated email from the ASF dual-hosted git repository. rahulvats pushed a commit to branch remove-pagination-sorting-tests in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a1d087e683d017752e42947f3925611e81e50ee9 Author: Harsh Thakur <[email protected]> AuthorDate: Wed Feb 25 13:21:44 2026 +0530 Remove pagination and sorting tests --- .../{ProvidersPage.ts => ConfigurationPage.ts} | 60 +++--------- .../src/airflow/ui/tests/e2e/pages/DagRunsPage.ts | 43 --------- .../airflow/ui/tests/e2e/pages/DagRunsTabPage.ts | 78 --------------- .../src/airflow/ui/tests/e2e/pages/DagsPage.ts | 76 --------------- .../src/airflow/ui/tests/e2e/pages/EventsPage.ts | 107 +-------------------- .../airflow/ui/tests/e2e/pages/ProvidersPage.ts | 34 +------ .../ui/tests/e2e/pages/RequiredActionsPage.ts | 67 +------------ .../ui/tests/e2e/pages/TaskInstancesPage.ts | 46 --------- .../src/airflow/ui/tests/e2e/pages/XComsPage.ts | 40 -------- .../ui/tests/e2e/specs/Configuration.spec.ts | 46 +++++++++ .../src/airflow/ui/tests/e2e/specs/asset.spec.ts | 20 ---- .../ui/tests/e2e/specs/dag-audit-log.spec.ts | 37 ------- .../ui/tests/e2e/specs/dag-runs-tab.spec.ts | 19 ---- .../airflow/ui/tests/e2e/specs/dag-runs.spec.ts | 4 - .../airflow/ui/tests/e2e/specs/dags-list.spec.ts | 85 ---------------- .../airflow/ui/tests/e2e/specs/events-page.spec.ts | 2 +- .../airflow/ui/tests/e2e/specs/providers.spec.ts | 50 ---------- .../ui/tests/e2e/specs/requiredAction.spec.ts | 5 - .../ui/tests/e2e/specs/task-instances.spec.ts | 23 ----- .../src/airflow/ui/tests/e2e/specs/xcoms.spec.ts | 5 - .../airflow_breeze/commands/testing_commands.py | 1 + 21 files changed, 69 insertions(+), 779 deletions(-) diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/ConfigurationPage.ts similarity index 51% copy from airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts copy to airflow-core/src/airflow/ui/tests/e2e/pages/ConfigurationPage.ts index 6b597938f33..0e393040fd8 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/ConfigurationPage.ts @@ -16,51 +16,25 @@ * specific language governing permissions and limitations * under the License. */ -import { expect, type Locator, type Page } from "@playwright/test"; +import type { Locator, Page } from "@playwright/test"; import { BasePage } from "./BasePage"; -export class ProvidersPage extends BasePage { +export class ConfigurationPage extends BasePage { public readonly heading: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public readonly rows: Locator; public readonly table: Locator; public constructor(page: Page) { super(page); - this.heading = page.getByRole("heading", { name: /^providers$/i }); + this.heading = page.getByRole("heading", { + name: /config/i, + }); this.table = page.getByTestId("table-list"); this.rows = this.table.locator("tbody tr").filter({ has: page.locator("td"), }); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); - } - - /** - * Click next page button - */ - public async clickNextPage(): Promise<void> { - const initialProviderNames = await this.providerNames(); - - await this.paginationNextButton.click(); - - await expect.poll(() => this.providerNames(), { timeout: 10_000 }).not.toEqual(initialProviderNames); - await this.waitForTableData(); - } - - /** - * Click previous page button - */ - public async clickPrevPage(): Promise<void> { - const initialProviderNames = await this.providerNames(); - - await this.paginationPrevButton.click(); - - await expect.poll(() => this.providerNames(), { timeout: 10_000 }).not.toEqual(initialProviderNames); - await this.waitForTableData(); } public async getRowCount(): Promise<number> { @@ -71,23 +45,19 @@ export class ProvidersPage extends BasePage { const row = this.rows.nth(index); const cells = row.locator("td"); - const pkg = await cells.nth(0).locator("a").textContent(); - const ver = await cells.nth(1).textContent(); - const desc = await cells.nth(2).textContent(); + const section = await cells.nth(0).textContent(); + const key = await cells.nth(1).textContent(); + const value = await cells.nth(2).textContent(); return { - description: (desc ?? "").trim(), - packageName: (pkg ?? "").trim(), - version: (ver ?? "").trim(), + key: (key ?? "").trim(), + section: (section ?? "").trim(), + value: (value ?? "").trim(), }; } public async navigate(): Promise<void> { - await this.navigateTo("/providers"); - } - - public async providerNames(): Promise<Array<string>> { - return this.rows.locator("td a").allTextContents(); + await this.navigateTo("/configs"); } public async waitForLoad(): Promise<void> { @@ -96,7 +66,6 @@ export class ProvidersPage extends BasePage { } private async waitForTableData(): Promise<void> { - // Wait for actual data links to appear (not skeleton loaders) await this.page.waitForFunction( () => { const table = document.querySelector('[data-testid="table-list"]'); @@ -105,10 +74,9 @@ export class ProvidersPage extends BasePage { return false; } - // Check for actual links in tbody (real data, not skeleton) - const links = table.querySelectorAll("tbody tr td a"); + const cells = table.querySelectorAll("tbody tr td"); - return links.length > 0; + return cells.length > 0; }, undefined, { timeout: 30_000 }, diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsPage.ts index 080def6218d..8ace70b132e 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsPage.ts @@ -82,49 +82,6 @@ export class DagRunsPage extends BasePage { expect(await dataLinks.count()).toBeGreaterThan(0); } - /** - * Verify pagination controls and navigation - */ - public async verifyPagination(limit: number): Promise<void> { - await this.navigateTo(`${DagRunsPage.dagRunsUrl}?offset=0&limit=${limit}`); - await this.page.waitForURL(/.*limit=/, { timeout: 10_000 }); - await this.page.waitForLoadState("networkidle"); - await this.dagRunsTable.waitFor({ state: "visible", timeout: 10_000 }); - - const dataLinks = this.dagRunsTable.locator("a[href*='/dags/']"); - - await expect(dataLinks.first()).toBeVisible({ timeout: 30_000 }); - - const rows = this.dagRunsTable.locator("tbody tr"); - - expect(await rows.count()).toBeGreaterThan(0); - - const paginationNav = this.page.locator('nav[aria-label="pagination"], [role="navigation"]'); - - await expect(paginationNav.first()).toBeVisible({ timeout: 10_000 }); - - const page1Button = this.page.getByRole("button", { name: /page 1|^1$/ }); - - await expect(page1Button.first()).toBeVisible({ timeout: 5000 }); - - const page2Button = this.page.getByRole("button", { name: /page 2|^2$/ }); - const hasPage2 = await page2Button - .first() - .isVisible() - .catch(() => false); - - if (hasPage2) { - await page2Button.first().click(); - await this.page.waitForLoadState("networkidle"); - await this.dagRunsTable.waitFor({ state: "visible", timeout: 10_000 }); - - const dataLinksPage2 = this.dagRunsTable.locator("a[href*='/dags/']"); - const noDataMessage = this.page.locator("text=/no.*data|no.*runs|no.*results/i"); - - await expect(dataLinksPage2.first().or(noDataMessage.first())).toBeVisible({ timeout: 30_000 }); - } - } - /** * Verify that run details are displayed in the table row */ diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsTabPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsTabPage.ts index 1e5a3e0c943..f89130f0a20 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsTabPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/DagRunsTabPage.ts @@ -21,57 +21,18 @@ import { BasePage } from "tests/e2e/pages/BasePage"; export class DagRunsTabPage extends BasePage { public readonly markRunAsButton: Locator; - public readonly nextPageButton: Locator; - public readonly prevPageButton: Locator; public readonly runsTable: Locator; public readonly tableRows: Locator; public readonly triggerButton: Locator; - private currentDagId?: string; - private currentLimit?: number; - public constructor(page: Page) { super(page); this.markRunAsButton = page.locator('[data-testid="mark-run-as-button"]').first(); - this.nextPageButton = page.locator('[data-testid="next"]'); - this.prevPageButton = page.locator('[data-testid="prev"]'); this.runsTable = page.locator('[data-testid="table-list"]'); this.tableRows = this.runsTable.locator("tbody tr"); this.triggerButton = page.locator('[data-testid="trigger-dag-button"]'); } - public async clickNextPage(): Promise<void> { - await this.waitForRunsTableToLoad(); - const firstRunLink = this.tableRows.first().locator("a[href*='/runs/']").first(); - - await expect(firstRunLink).toBeVisible(); - const firstRunId = await firstRunLink.textContent(); - - if (firstRunId === null || firstRunId === "") { - throw new Error("Could not get first run ID before pagination"); - } - - await this.nextPageButton.click(); - await expect(this.tableRows.first()).not.toContainText(firstRunId, { timeout: 10_000 }); - await this.ensureUrlParams(); - } - - public async clickPrevPage(): Promise<void> { - await this.waitForRunsTableToLoad(); - const firstRunLink = this.tableRows.first().locator("a[href*='/runs/']").first(); - - await expect(firstRunLink).toBeVisible(); - const firstRunId = await firstRunLink.textContent(); - - if (firstRunId === null || firstRunId === "") { - throw new Error("Could not get first run ID before pagination"); - } - - await this.prevPageButton.click(); - await expect(this.tableRows.first()).not.toContainText(firstRunId, { timeout: 10_000 }); - await this.ensureUrlParams(); - } - public async clickRunAndVerifyDetails(): Promise<void> { const firstRunLink = this.tableRows.first().locator("a[href*='/runs/']").first(); @@ -90,17 +51,6 @@ export class DagRunsTabPage extends BasePage { await this.waitForRunsTableToLoad(); } - public async clickRunsTabWithPageSize(dagId: string, pageSize: number): Promise<void> { - this.currentDagId = dagId; - this.currentLimit = pageSize; - - await this.navigateTo(`/dags/${dagId}/runs?offset=0&limit=${pageSize}`); - await this.page.waitForURL(/.*\/dags\/[^/]+\/runs.*offset=0&limit=/, { - timeout: 15_000, - }); - await this.waitForRunsTableToLoad(); - } - public async filterByState(state: string): Promise<void> { const currentUrl = new URL(this.page.url()); @@ -110,12 +60,6 @@ export class DagRunsTabPage extends BasePage { await this.waitForRunsTableToLoad(); } - public async getRowCount(): Promise<number> { - await this.waitForRunsTableToLoad(); - - return this.tableRows.count(); - } - public async markRunAs(state: "failed" | "success"): Promise<void> { const stateBadge = this.page.locator('[data-testid="state-badge"]').first(); @@ -269,26 +213,4 @@ export class DagRunsTabPage extends BasePage { await expect(dataLink.or(noDataMessage)).toBeVisible({ timeout: 30_000 }); } - - private async ensureUrlParams(): Promise<void> { - if (this.currentLimit === undefined || this.currentDagId === undefined) { - return; - } - - const currentUrl = this.page.url(); - const url = new URL(currentUrl); - const hasLimit = url.searchParams.has("limit"); - const hasOffset = url.searchParams.has("offset"); - - if (hasLimit && !hasOffset) { - url.searchParams.set("offset", "0"); - await this.navigateTo(url.pathname + url.search); - await this.waitForRunsTableToLoad(); - } else if (!hasLimit && !hasOffset) { - url.searchParams.set("offset", "0"); - url.searchParams.set("limit", String(this.currentLimit)); - await this.navigateTo(url.pathname + url.search); - await this.waitForRunsTableToLoad(); - } - } } diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts index b3e65857339..5f510b797b1 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts @@ -35,14 +35,11 @@ export class DagsPage extends BasePage { public readonly failedFilter: Locator; public readonly needsReviewFilter: Locator; public readonly operatorFilter: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public readonly queuedFilter: Locator; public readonly retriesFilter: Locator; public readonly runningFilter: Locator; public readonly searchBox: Locator; public readonly searchInput: Locator; - public readonly sortSelect: Locator; public readonly stateElement: Locator; public readonly successFilter: Locator; public readonly tableViewButton: Locator; @@ -61,8 +58,6 @@ export class DagsPage extends BasePage { // page trigger button has visible text or is icon-only. this.confirmButton = page.locator('button:has-text("Trigger")').last(); this.stateElement = page.locator('*:has-text("State") + *').first(); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); this.searchBox = page.getByRole("textbox", { name: /search/i }); this.searchInput = page.getByPlaceholder("Search DAGs"); this.operatorFilter = page.getByRole("combobox").filter({ hasText: /operator/i }); @@ -71,8 +66,6 @@ export class DagsPage extends BasePage { // View toggle buttons this.cardViewButton = page.locator('button[aria-label="Show card view"]'); this.tableViewButton = page.locator('button[aria-label="Show table view"]'); - // Sort select (card view only) - this.sortSelect = page.locator('[data-testid="sort-by-select"]'); // Status filter buttons this.successFilter = page.locator('button:has-text("Success")'); this.failedFilter = page.locator('button:has-text("Failed")'); @@ -106,75 +99,6 @@ export class DagsPage extends BasePage { await this.waitForDagList(); } - /** - * Click next page button and wait for list to change - */ - public async clickNextPage(): Promise<void> { - const initialDagNames = await this.getDagNames(); - - // Set up API listener before action - const responsePromise = this.page - .waitForResponse((resp) => resp.url().includes("/dags") && resp.status() === 200, { - timeout: 30_000, - }) - .catch(() => { - /* API might be cached */ - }); - - await this.paginationNextButton.click(); - - // Wait for API response - await responsePromise; - - // Wait for UI to actually change (increased timeout for slower browsers like Firefox) - await expect - .poll(() => this.getDagNames(), { - message: "List did not update after clicking next page", - timeout: 30_000, - }) - .not.toEqual(initialDagNames); - - await this.waitForDagList(); - } - - /** - * Click previous page button and wait for list to change - */ - public async clickPrevPage(): Promise<void> { - const initialDagNames = await this.getDagNames(); - - // Set up API listener before action - const responsePromise = this.page - .waitForResponse((resp) => resp.url().includes("/dags") && resp.status() === 200, { - timeout: 30_000, - }) - .catch(() => { - /* API might be cached */ - }); - - await this.paginationPrevButton.click(); - - // Wait for API response - await responsePromise; - - // Wait for UI to actually change (increased timeout for slower browsers like Firefox) - await expect - .poll(() => this.getDagNames(), { - message: "List did not update after clicking prev page", - timeout: 30_000, - }) - .not.toEqual(initialDagNames); - - await this.waitForDagList(); - } - - /** - * Click sort select (only works in card view) - */ - public async clickSortSelect(): Promise<void> { - await this.sortSelect.click(); - } - public async filterByOperator(operator: string): Promise<void> { await this.selectDropdownOption(this.operatorFilter, operator); } diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts index 35a84242f6f..4ea00c99366 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts @@ -27,14 +27,9 @@ export class EventsPage extends BasePage { public readonly extraColumn: Locator; public readonly filterBar: Locator; public readonly ownerColumn: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public readonly tableRows: Locator; public readonly whenColumn: Locator; - private currentDagId?: string; - private currentLimit?: number; - public constructor(page: Page) { super(page); this.eventsPageTitle = page.locator('h2:has-text("Audit Log")'); @@ -46,8 +41,6 @@ export class EventsPage extends BasePage { .filter({ has: page.locator('button:has-text("Filter")') }) .first(); this.ownerColumn = this.eventsTable.locator('th:has-text("User")'); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); this.tableRows = this.eventsTable.locator("tbody tr"); this.whenColumn = this.eventsTable.locator('th:has-text("When")'); } @@ -70,35 +63,6 @@ export class EventsPage extends BasePage { await menuItem.click(); } - public async clickColumnHeader(columnKey: string): Promise<void> { - const columnHeader = this.eventsTable.locator("th").filter({ hasText: new RegExp(columnKey, "i") }); - const sortButton = columnHeader.locator('button[aria-label="sort"]'); - - await sortButton.click(); - await this.waitForTableLoad(); - } - - public async clickColumnToSort(columnName: "Event" | "User" | "When"): Promise<void> { - const columnHeader = this.eventsTable.locator(`th:has-text("${columnName}")`); - const sortButton = columnHeader.locator('button[aria-label="sort"]'); - - await sortButton.click(); - await this.waitForTableLoad(); - await this.ensureUrlParams(); - } - - public async clickNextPage(): Promise<void> { - await this.paginationNextButton.click(); - await this.waitForTableLoad(); - await this.ensureUrlParams(); - } - - public async clickPrevPage(): Promise<void> { - await this.paginationPrevButton.click(); - await this.waitForTableLoad(); - await this.ensureUrlParams(); - } - public async getCellByColumnName(row: Locator, columnName: string): Promise<Locator> { const headers = await this.eventsTable.locator("thead th").allTextContents(); const index = headers.findIndex((h) => h.toLowerCase().includes(columnName.toLowerCase())); @@ -120,7 +84,7 @@ export class EventsPage extends BasePage { return this.tableRows.all(); } - public async getEventTypes(allPages: boolean = false): Promise<Array<string>> { + public async getEventTypes(): Promise<Array<string>> { const rows = await this.getEventLogRows(); if (rows.length === 0) { @@ -138,24 +102,7 @@ export class EventsPage extends BasePage { } } - if (!allPages) { - return eventTypes; - } - - const allEventTypes = [...eventTypes]; - const startUrl = this.page.url(); - - while (await this.hasNextPage()) { - await this.clickNextPage(); - const pageEvents = await this.getEventTypes(false); - - allEventTypes.push(...pageEvents); - } - - await this.page.goto(startUrl, { timeout: 30_000, waitUntil: "domcontentloaded" }); - await this.waitForTableLoad(); - - return allEventTypes; + return eventTypes; } public getFilterPill(filterLabel: string): Locator { @@ -166,29 +113,13 @@ export class EventsPage extends BasePage { return this.tableRows.count(); } - public async hasNextPage(): Promise<boolean> { - const count = await this.paginationNextButton.count(); - - if (count === 0) { - return false; - } - - return await this.paginationNextButton.isEnabled(); - } - public async navigate(): Promise<void> { await this.navigateTo("/events"); await this.waitForTableLoad(); } - public async navigateToAuditLog(dagId: string, limit?: number): Promise<void> { - this.currentDagId = dagId; - this.currentLimit = limit; - - const baseUrl = EventsPage.getEventsUrl(dagId); - const url = limit === undefined ? baseUrl : `${baseUrl}?offset=0&limit=${limit}`; - - await this.page.goto(url, { + public async navigateToAuditLog(dagId: string): Promise<void> { + await this.page.goto(EventsPage.getEventsUrl(dagId), { timeout: 30_000, waitUntil: "domcontentloaded", }); @@ -297,34 +228,4 @@ export class EventsPage extends BasePage { ); } - /** - * Ensure offset=0 is present when limit is set to prevent limit from being ignored - */ - private async ensureUrlParams(): Promise<void> { - if (this.currentLimit === undefined || this.currentDagId === undefined) { - return; - } - - const currentUrl = this.page.url(); - const url = new URL(currentUrl); - const hasLimit = url.searchParams.has("limit"); - const hasOffset = url.searchParams.has("offset"); - - if (hasLimit && !hasOffset) { - url.searchParams.set("offset", "0"); - await this.page.goto(url.toString(), { - timeout: 30_000, - waitUntil: "domcontentloaded", - }); - await this.waitForTableLoad(); - } else if (!hasLimit && !hasOffset) { - url.searchParams.set("offset", "0"); - url.searchParams.set("limit", String(this.currentLimit)); - await this.page.goto(url.toString(), { - timeout: 30_000, - waitUntil: "domcontentloaded", - }); - await this.waitForTableLoad(); - } - } } diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts index 6b597938f33..3bd886d696a 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/ProvidersPage.ts @@ -16,14 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { expect, type Locator, type Page } from "@playwright/test"; +import { type Locator, type Page } from "@playwright/test"; import { BasePage } from "./BasePage"; export class ProvidersPage extends BasePage { public readonly heading: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public readonly rows: Locator; public readonly table: Locator; @@ -35,32 +33,6 @@ export class ProvidersPage extends BasePage { this.rows = this.table.locator("tbody tr").filter({ has: page.locator("td"), }); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); - } - - /** - * Click next page button - */ - public async clickNextPage(): Promise<void> { - const initialProviderNames = await this.providerNames(); - - await this.paginationNextButton.click(); - - await expect.poll(() => this.providerNames(), { timeout: 10_000 }).not.toEqual(initialProviderNames); - await this.waitForTableData(); - } - - /** - * Click previous page button - */ - public async clickPrevPage(): Promise<void> { - const initialProviderNames = await this.providerNames(); - - await this.paginationPrevButton.click(); - - await expect.poll(() => this.providerNames(), { timeout: 10_000 }).not.toEqual(initialProviderNames); - await this.waitForTableData(); } public async getRowCount(): Promise<number> { @@ -86,10 +58,6 @@ export class ProvidersPage extends BasePage { await this.navigateTo("/providers"); } - public async providerNames(): Promise<Array<string>> { - return this.rows.locator("td a").allTextContents(); - } - public async waitForLoad(): Promise<void> { await this.table.waitFor({ state: "visible", timeout: 30_000 }); await this.waitForTableData(); diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/RequiredActionsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/RequiredActionsPage.ts index 6c4b86fcd14..9381cc69d25 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/RequiredActionsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/RequiredActionsPage.ts @@ -25,32 +25,18 @@ export class RequiredActionsPage extends BasePage { public readonly actionsTable: Locator; public readonly emptyStateMessage: Locator; public readonly pageHeading: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public constructor(page: Page) { super(page); this.pageHeading = page.getByRole("heading").filter({ hasText: /required action/i }); this.actionsTable = page.getByTestId("table-list"); this.emptyStateMessage = page.getByText(/no required actions found/i); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); } public static getRequiredActionsUrl(): string { return "/required_actions"; } - public async clickNextPage(): Promise<void> { - await this.paginationNextButton.click(); - await expect(this.actionsTable).toBeVisible({ timeout: 10_000 }); - } - - public async clickPrevPage(): Promise<void> { - await this.paginationPrevButton.click(); - await expect(this.actionsTable).toBeVisible({ timeout: 10_000 }); - } - public async getActionsTableRowCount(): Promise<number> { const rows = this.page.locator("table tbody tr"); const isTableVisible = await this.actionsTable.isVisible(); @@ -62,35 +48,16 @@ export class RequiredActionsPage extends BasePage { return rows.count(); } - public async getActionSubjects(): Promise<Array<string>> { - const rows = this.page.locator("table tbody tr td:nth-child(2)"); - const texts = await rows.allTextContents(); - - return texts.map((text) => text.trim()).filter((text) => text !== ""); - } - - public async hasNextPage(): Promise<boolean> { - const isDisabled = await this.paginationNextButton.isDisabled(); - - return !isDisabled; - } - public async isEmptyStateDisplayed(): Promise<boolean> { return this.emptyStateMessage.isVisible(); } - public async isPaginationVisible(): Promise<boolean> { - return this.paginationNextButton.isVisible(); - } - public async isTableDisplayed(): Promise<boolean> { return this.actionsTable.isVisible(); } - public async navigateToRequiredActionsPage(limit?: number): Promise<void> { - await (limit === undefined - ? this.navigateTo(RequiredActionsPage.getRequiredActionsUrl()) - : this.navigateTo(`${RequiredActionsPage.getRequiredActionsUrl()}?limit=${limit}&offset=0`)); + public async navigateToRequiredActionsPage(): Promise<void> { + await this.navigateTo(RequiredActionsPage.getRequiredActionsUrl()); await expect(this.pageHeading).toBeVisible({ timeout: 10_000 }); } @@ -102,36 +69,6 @@ export class RequiredActionsPage extends BasePage { await this.runHITLFlow(dagId, false); } - public async verifyPagination(limit: number): Promise<void> { - await this.navigateToRequiredActionsPage(limit); - - await expect(this.paginationNextButton).toBeVisible(); - await expect(this.paginationPrevButton).toBeVisible(); - - const page1Actions = await this.getActionSubjects(); - - expect(page1Actions.length).toBeGreaterThan(0); - - await this.clickNextPage(); - - await expect - .poll( - async () => { - const subjects = await this.getActionSubjects(); - - return subjects.length > 0 && subjects.join(",") !== page1Actions.join(","); - }, - { timeout: 30_000 }, - ) - .toBe(true); - - const page2Actions = await this.getActionSubjects(); - - await this.clickPrevPage(); - - await expect.poll(() => this.getActionSubjects(), { timeout: 30_000 }).not.toEqual(page2Actions); - } - private async clickButtonAndWaitForHITLResponse(button: Locator): Promise<void> { const responsePromise = this.page.waitForResponse( (res) => res.url().includes("hitlDetails") && res.request().method() === "PATCH", diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/TaskInstancesPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/TaskInstancesPage.ts index 9c560888ec1..87506271fad 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/TaskInstancesPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/TaskInstancesPage.ts @@ -24,59 +24,13 @@ export class TaskInstancesPage extends BasePage { return "/task_instances"; } - public readonly paginationNextButton: Locator; - - public readonly paginationPrevButton: Locator; - public readonly taskInstancesTable: Locator; public constructor(page: Page) { super(page); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); this.taskInstancesTable = page.locator('table, div[role="table"]'); } - /** - * Click next page button - */ - public async clickNextPage(): Promise<void> { - const initialTaskInstanceIds = await this.getTaskInstanceIds(); - - await this.paginationNextButton.click(); - - await expect - .poll(() => this.getTaskInstanceIds(), { timeout: 10_000 }) - .not.toEqual(initialTaskInstanceIds); - - await this.waitForTaskInstanceList(); - } - - /** - * Click previous page button - */ - public async clickPrevPage(): Promise<void> { - const initialTaskInstanceIds = await this.getTaskInstanceIds(); - - await this.paginationPrevButton.click(); - - await expect - .poll(() => this.getTaskInstanceIds(), { timeout: 10_000 }) - .not.toEqual(initialTaskInstanceIds); - await this.waitForTaskInstanceList(); - } - - /** - * Get all task instance identifiers from the current page - */ - public async getTaskInstanceIds(): Promise<Array<string>> { - await this.waitForTaskInstanceList(); - const taskLinks = this.taskInstancesTable.locator("a[href*='/dags/']"); - const texts = await taskLinks.allTextContents(); - - return texts.map((text) => text.trim()).filter((text) => text !== ""); - } - /** * Navigate to Task Instances page and wait for data to load */ diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/XComsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/XComsPage.ts index d28e34b2cd7..188a5d81fd9 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/XComsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/XComsPage.ts @@ -27,8 +27,6 @@ export class XComsPage extends BasePage { public readonly addFilterButton: Locator; public readonly collapseAllButton: Locator; public readonly expandAllButton: Locator; - public readonly paginationNextButton: Locator; - public readonly paginationPrevButton: Locator; public readonly xcomsTable: Locator; public constructor(page: Page) { @@ -36,8 +34,6 @@ export class XComsPage extends BasePage { this.addFilterButton = page.locator('[data-testid="add-filter-button"]'); this.collapseAllButton = page.locator('[data-testid="collapse-all-button"]'); this.expandAllButton = page.locator('[data-testid="expand-all-button"]'); - this.paginationNextButton = page.locator('[data-testid="next"]'); - this.paginationPrevButton = page.locator('[data-testid="prev"]'); this.xcomsTable = page.locator('[data-testid="table-list"]'); } @@ -127,42 +123,6 @@ export class XComsPage extends BasePage { } } - public async verifyPagination(limit: number): Promise<void> { - await this.navigateTo(`${XComsPage.xcomsUrl}?offset=0&limit=${limit}`); - await this.page.waitForURL(/.*offset=0.*limit=/, { timeout: 10_000 }); - await this.page.waitForLoadState("networkidle"); - await this.xcomsTable.waitFor({ state: "visible", timeout: 10_000 }); - - const rows = this.xcomsTable.locator("tbody tr"); - - expect(await rows.count()).toBeGreaterThan(0); - - await expect(this.paginationNextButton).toBeVisible({ timeout: 10_000 }); - await this.paginationNextButton.click(); - await this.page.waitForLoadState("networkidle"); - await this.xcomsTable.waitFor({ state: "visible", timeout: 10_000 }); - - const urlPage2 = this.page.url(); - - expect(urlPage2).toContain(`limit=${limit}`); - expect(urlPage2).not.toContain("offset=0&"); - - const rows2 = this.xcomsTable.locator("tbody tr"); - - expect(await rows2.count()).toBeGreaterThan(0); - - await expect(this.paginationPrevButton).toBeVisible({ timeout: 5000 }); - await this.paginationPrevButton.click(); - await this.page.waitForLoadState("networkidle"); - await this.xcomsTable.waitFor({ state: "visible", timeout: 10_000 }); - - const urlBackToPage1 = this.page.url(); - - expect(urlBackToPage1).toContain(`limit=${limit}`); - const isPage1 = urlBackToPage1.includes("offset=0") || !urlBackToPage1.includes("offset="); - - expect(isPage1).toBeTruthy(); - } public async verifyXComDetailsDisplay(): Promise<void> { const firstRow = this.xcomsTable.locator("tbody tr").first(); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/Configuration.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/Configuration.spec.ts new file mode 100644 index 00000000000..ea75fe21f4c --- /dev/null +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/Configuration.spec.ts @@ -0,0 +1,46 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { expect, test } from "@playwright/test"; + +import { ConfigurationPage } from "../pages/ConfigurationPage"; + +test.describe("Configuration Page", () => { + let configPage: ConfigurationPage; + + test.beforeEach(async ({ page }) => { + configPage = new ConfigurationPage(page); + await configPage.navigate(); + await configPage.waitForLoad(); + }); + + test("verify configuration displays", async () => { + await expect(configPage.heading).toBeVisible(); + await expect(configPage.table).toBeVisible(); + + const count = await configPage.getRowCount(); + + expect(count).toBeGreaterThan(0); + + const { key, section, value } = await configPage.getRowDetails(0); + + expect(section.length).toBeGreaterThan(0); + expect(key.length).toBeGreaterThan(0); + expect(value.length).toBeGreaterThan(0); + }); +}); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/asset.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/asset.spec.ts index a123b64b101..be99eebab23 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/asset.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/asset.spec.ts @@ -117,26 +117,6 @@ test.describe("Assets Page", () => { } }); - test("verify pagination controls navigate between pages", async () => { - await assets.navigateTo("/assets?limit=5&offset=0"); - await assets.waitForLoad(); - - const page1Initial = await assets.assetNames(); - - expect(page1Initial.length).toBeGreaterThan(0); - - const pagination = assets.page.locator('[data-scope="pagination"]'); - - await pagination.getByRole("button", { name: /page 2/i }).click(); - await expect.poll(() => assets.assetNames(), { timeout: 30_000 }).not.toEqual(page1Initial); - - const page2Assets = await assets.assetNames(); - - await pagination.getByRole("button", { name: /page 1/i }).click(); - - await expect.poll(() => assets.assetNames(), { timeout: 30_000 }).not.toEqual(page2Assets); - }); - test("verify asset details and dependencies", async ({ page }) => { const assetDetailPage = new AssetDetailPage(page); const assetName = testConfig.asset.name; diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-audit-log.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-audit-log.spec.ts index ebbfdb6b719..2cf5f1c341c 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-audit-log.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-audit-log.spec.ts @@ -118,41 +118,4 @@ test.describe("DAG Audit Log", () => { expect(userText?.trim()).not.toBe(""); }); - test("verify pagination through audit log entries", async () => { - await eventsPage.navigateToAuditLog(testDagId, 3); - - const hasNext = await eventsPage.hasNextPage(); - - expect(hasNext).toBe(true); - - const urlPage1 = eventsPage.page.url(); - - expect(urlPage1).toContain("offset=0"); - expect(urlPage1).toContain("limit=3"); - - await eventsPage.clickNextPage(); - - const urlPage2 = eventsPage.page.url(); - - expect(urlPage2).toContain("limit=3"); - expect(urlPage2).not.toContain("offset=0"); - - await eventsPage.clickPrevPage(); - - const urlBackToPage1 = eventsPage.page.url(); - - expect(urlBackToPage1).toContain("offset=0"); - expect(urlBackToPage1).toContain("limit=3"); - }); - - test("verify sorting when clicking column header", async () => { - await eventsPage.navigateToAuditLog(testDagId); - - await eventsPage.clickColumnToSort("Event"); - - const sortedEvents = await eventsPage.getEventTypes(true); - - expect(sortedEvents.length).toBeGreaterThan(0); - expect(sortedEvents).toEqual([...sortedEvents].sort()); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs-tab.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs-tab.spec.ts index 14dcd6e3e2a..4005a5f9eb2 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs-tab.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs-tab.spec.ts @@ -101,23 +101,4 @@ test.describe("DAG Runs Tab", () => { await dagRunsTabPage.verifySearchResults("manual"); }); - test("paginate through runs", async () => { - await dagRunsTabPage.clickRunsTabWithPageSize(testDagId, 2); - - const initialRowCount = await dagRunsTabPage.getRowCount(); - - expect(initialRowCount).toBe(2); - - await dagRunsTabPage.clickNextPage(); - - const nextPageRowCount = await dagRunsTabPage.getRowCount(); - - expect(nextPageRowCount).toBeGreaterThan(0); - - await dagRunsTabPage.clickPrevPage(); - - const backRowCount = await dagRunsTabPage.getRowCount(); - - expect(backRowCount).toBe(initialRowCount); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs.spec.ts index 718f00b7cd0..5567ba6d58b 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-runs.spec.ts @@ -139,8 +139,4 @@ test.describe("DAG Runs Page", () => { await dagRunsPage.navigate(); await dagRunsPage.verifyDagIdFiltering(testDagId1); }); - - test("verify pagination with offset and limit", async () => { - await dagRunsPage.verifyPagination(3); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/dags-list.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/dags-list.spec.ts index 193c2af6652..6d0a257757c 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/dags-list.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/dags-list.spec.ts @@ -20,39 +20,6 @@ import { expect, test } from "@playwright/test"; import { testConfig } from "playwright.config"; import { DagsPage } from "tests/e2e/pages/DagsPage"; -test.describe("Dags Pagination", () => { - let dagsPage: DagsPage; - - test.beforeEach(({ page }) => { - dagsPage = new DagsPage(page); - }); - - test("should verify pagination works on the Dags list page", async () => { - test.setTimeout(120_000); // 2 minutes for slower browsers like Firefox - await dagsPage.navigate(); - - await expect(dagsPage.paginationNextButton).toBeVisible(); - await expect(dagsPage.paginationPrevButton).toBeVisible(); - - const initialDagNames = await dagsPage.getDagNames(); - - expect(initialDagNames.length).toBeGreaterThan(0); - - await dagsPage.clickNextPage(); - - const dagNamesAfterNext = await dagsPage.getDagNames(); - - expect(dagNamesAfterNext.length).toBeGreaterThan(0); - expect(dagNamesAfterNext).not.toEqual(initialDagNames); - - await dagsPage.clickPrevPage(); - - const dagNamesAfterPrev = await dagsPage.getDagNames(); - - expect(dagNamesAfterPrev).toEqual(initialDagNames); - }); -}); - test.describe("Dag Trigger Workflow", () => { let dagsPage: DagsPage; const testDagId = testConfig.testDag.id; @@ -228,55 +195,3 @@ test.describe("Dags Status Filtering", () => { await dagsPage.verifyDagsListVisible(); }); }); - -test.describe("Dags Sorting", () => { - let dagsPage: DagsPage; - - test.beforeEach(({ page }) => { - dagsPage = new DagsPage(page); - }); - - test("should sort Dags by name in card view", async () => { - test.setTimeout(120_000); // 2 minutes for slower browsers like Firefox - await dagsPage.navigate(); - await dagsPage.verifyDagsListVisible(); - - await dagsPage.switchToCardView(); - - await expect(dagsPage.sortSelect).toBeVisible(); - - const ascNames = await dagsPage.getDagNames(); - - expect(ascNames.length).toBeGreaterThan(1); - - await dagsPage.clickSortSelect(); - - await expect(dagsPage.page.getByRole("option").first()).toBeVisible(); - - await dagsPage.page.getByRole("option", { name: "Sort by Display Name (Z-A)" }).click(); - - // Poll until the list order actually changes instead of a fixed delay - await expect - .poll(async () => dagsPage.getDagNames(), { - message: "List did not re-sort within timeout", - timeout: 10_000, - }) - .not.toEqual(ascNames); - - const descNames = await dagsPage.getDagNames(); - - expect(descNames.length).toBeGreaterThan(1); - - const [firstName] = descNames; - const lastName = descNames[descNames.length - 1]; - - expect(firstName).toBeDefined(); - expect(lastName).toBeDefined(); - - expect(firstName).not.toEqual(ascNames[0]); - - if (firstName !== undefined && firstName !== "" && lastName !== undefined && lastName !== "") { - expect(firstName.localeCompare(lastName)).toBeGreaterThan(0); - } - }); -}); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/events-page.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/events-page.spec.ts index bd2ae48b677..d8638e7026a 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/events-page.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/events-page.spec.ts @@ -114,7 +114,7 @@ test.describe("Events with Generated Data", () => { await expect(eventsPage.eventsTable).toBeVisible(); await expect(async () => { - const filteredEvents = await eventsPage.getEventTypes(false); + const filteredEvents = await eventsPage.getEventTypes(); expect(filteredEvents.length).toBeGreaterThan(0); for (const event of filteredEvents) { diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/providers.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/providers.spec.ts index dc20c518d3e..1202c9fddc8 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/providers.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/providers.spec.ts @@ -68,54 +68,4 @@ test.describe("Providers Page", () => { } }); - test("verify providers pagination", async () => { - const limit = 5; - - await providers.navigateTo(`/providers?offset=0&limit=${limit}`); - await providers.waitForLoad(); - - const rows = await providers.getRowCount(); - - expect(rows).toBeGreaterThan(0); - - const initialProviderNames = await providers.providerNames(); - - expect(initialProviderNames.length).toBeGreaterThan(0); - - await expect(providers.paginationNextButton).toBeVisible(); - await expect(providers.paginationPrevButton).toBeVisible(); - - await providers.paginationNextButton.click(); - await providers.waitForLoad(); - - await providers.page.waitForURL((url) => { - const u = new URL(url); - const offset = u.searchParams.get("offset"); - - return offset !== null && offset !== "0"; - }); - - const rowsPage2 = await providers.getRowCount(); - - expect(rowsPage2).toBeGreaterThan(0); - - const ProviderNamesAfterNext = await providers.providerNames(); - - expect(ProviderNamesAfterNext.length).toBeGreaterThan(0); - expect(ProviderNamesAfterNext).not.toEqual(initialProviderNames); - - await providers.paginationPrevButton.click(); - await providers.waitForLoad(); - - await providers.page.waitForURL((url) => { - const u = new URL(url); - const offset = u.searchParams.get("offset"); - - return offset === "0" || offset === null; - }); - - const rowsBack = await providers.getRowCount(); - - expect(rowsBack).toBeGreaterThan(0); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/requiredAction.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/requiredAction.spec.ts index 0b40d0d66fc..6e9f06a4f6c 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/requiredAction.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/requiredAction.spec.ts @@ -69,9 +69,4 @@ test.describe("Verify Required Action page", () => { } }); - test("verify pagination with offset and limit", async ({ page }) => { - const browsePage = new RequiredActionsPage(page); - - await browsePage.verifyPagination(3); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/task-instances.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/task-instances.spec.ts index 12c05aba057..52a2ebf2449 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/task-instances.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/task-instances.spec.ts @@ -137,27 +137,4 @@ test.describe("Task Instances Page", () => { await taskInstancesPage.verifyStateFiltering("Success"); }); - test("verify pagination with offset and limit", async () => { - await taskInstancesPage.navigate(); - - await expect(taskInstancesPage.paginationNextButton).toBeVisible(); - await expect(taskInstancesPage.paginationPrevButton).toBeVisible(); - - const initialTaskInstanceIds = await taskInstancesPage.getTaskInstanceIds(); - - expect(initialTaskInstanceIds.length).toBeGreaterThan(0); - - await taskInstancesPage.clickNextPage(); - - const taskInstanceIdsAfterNext = await taskInstancesPage.getTaskInstanceIds(); - - expect(taskInstanceIdsAfterNext.length).toBeGreaterThan(0); - expect(taskInstanceIdsAfterNext).not.toEqual(initialTaskInstanceIds); - - await taskInstancesPage.clickPrevPage(); - - const taskInstanceIdsAfterPrev = await taskInstancesPage.getTaskInstanceIds(); - - expect(taskInstanceIdsAfterPrev).toEqual(initialTaskInstanceIds); - }); }); diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/xcoms.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/xcoms.spec.ts index dcbe8a43835..3911ab27c8a 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/xcoms.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/xcoms.spec.ts @@ -27,7 +27,6 @@ test.describe("XComs Page", () => { let xcomsPage: XComsPage; const testDagId = testConfig.xcomDag.id; const testXComKey = "return_value"; - const paginationLimit = 3; const triggerCount = 2; test.beforeAll(async ({ browser }) => { @@ -97,8 +96,4 @@ test.describe("XComs Page", () => { test("verify filtering by DAG display name", async () => { await xcomsPage.verifyDagDisplayNameFiltering(testDagId); }); - - test("verify pagination works", async () => { - await xcomsPage.verifyPagination(paginationLimit); - }); }); diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py index bd878e90b10..c8cad6db6c3 100644 --- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py +++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py @@ -1518,6 +1518,7 @@ def ui_e2e_tests( env_vars = { "AIRFLOW_UID": str(os.getuid()), "AIRFLOW__CORE__LOAD_EXAMPLES": "true", + "AIRFLOW__API__EXPOSE_CONFIG": "true", "AIRFLOW_IMAGE_NAME": image_name, }
