You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ra...@apache.org on 2026/02/25 12:11:43 UTC
(airflow) 01/02: Remove pagination and sorting tests
This is an automated email from the ASF dual-hosted git repository.
rahulvats pushed a commit to branch fix-e2e-tests
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a1d087e683d017752e42947f3925611e81e50ee9
Author: Harsh Thakur <73...@users.noreply.github.com>
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,
}