test: add tests for the search dropdown in /bookings/upcoming filter (#21141)

* fix: trigger lingo.dev by removing duplicate value

* feat: add filter dropdown item search tests for bookings list

* refactor: update page navigation to wait for DOM content in bookings list tests and add new filter item search test

* remove comments

---------

Co-authored-by: Tushar Bhatt <95581504+TusharBhatt1@users.noreply.github.com>
This commit is contained in:
amritandTushar Bhatt authored and GitHub committed 2025-05-09 11:12:30 +05:30
1 parent 71e7300830
commit 0b3f9d06a9
1 file changed
+93 -3
+93 -3
View File
@@ -1,4 +1,5 @@
import { expect } from "@playwright/test";
import type { Page } from "@playwright/test";
import prisma from "@calcom/prisma";
import { BookingStatus } from "@calcom/prisma/client";
@@ -72,7 +73,7 @@ test.describe("Bookings", () => {
const bookingsGetResponse = page.waitForResponse((response) =>
/\/api\/trpc\/bookings\/get.*/.test(response.url())
);
await page.goto(`/bookings/upcoming`);
await page.goto(`/bookings/upcoming`, { waitUntil: "domcontentloaded" });
await bookingsGetResponse;
await page.locator('[data-testid="add-filter-button"]').click();
@@ -350,7 +351,7 @@ test.describe("Bookings", () => {
const bookingsGetResponse = page.waitForResponse((response) =>
/\/api\/trpc\/bookings\/get.*/.test(response.url())
);
await page.goto(`/bookings/upcoming`);
await page.goto(`/bookings/upcoming`, { waitUntil: "domcontentloaded" });
await bookingsGetResponse;
await page.locator('[data-testid="add-filter-button"]').click();
@@ -457,7 +458,7 @@ test.describe("Bookings", () => {
const bookingsGetResponse1 = page.waitForResponse((response) =>
/\/api\/trpc\/bookings\/get.*/.test(response.url())
);
await page.goto("/bookings/upcoming");
await page.goto("/bookings/upcoming", { waitUntil: "domcontentloaded" });
await bookingsGetResponse1;
await page.locator('[data-testid="add-filter-button"]').click();
@@ -470,6 +471,95 @@ test.describe("Bookings", () => {
await expect(page.locator('[data-testid="booking-item"]')).toHaveCount(0);
});
test.describe("Filter Dropdown Item Search", () => {
const filterItemsConfig = [
{ key: "eventTypeId", name: "Event Type", testId: "add-filter-item-eventTypeId" },
{ key: "teamId", name: "Team", testId: "add-filter-item-teamId" },
{ key: "userId", name: "Member", testId: "add-filter-item-userId" },
{ key: "attendeeName", name: "Attendees Name", testId: "add-filter-item-attendeeName" },
{ key: "attendeeEmail", name: "Attendee Email", testId: "add-filter-item-attendeeEmail" },
{ key: "dateRange", name: "Date Range", testId: "add-filter-item-dateRange" },
];
const searchInputSelector = "[cmdk-input]";
const getFilterItemLocator = (page: Page, testId: string) => page.locator(`[data-testid="${testId}"]`);
test.beforeEach(async ({ page, users }) => {
const user = await users.create();
await user.apiLogin();
const bookingsGetResponse = page.waitForResponse((response) =>
/\/api\/trpc\/bookings\/get.*/.test(response.url())
);
await page.goto(`/bookings/upcoming`, { waitUntil: "domcontentloaded" });
await bookingsGetResponse;
await page.locator('[data-testid="add-filter-button"]').click();
await expect(page.locator(searchInputSelector)).toBeVisible();
});
test("should show all filter items initially and after clearing search", async ({ page }) => {
const searchInput = page.locator(searchInputSelector);
// Initial check: all defined filter items should be visible
for (const item of filterItemsConfig) {
await expect(
getFilterItemLocator(page, item.testId),
`Item ${item.name} should be visible initially`
).toBeVisible();
}
// Type something and then clear the search
await searchInput.fill("Some text");
await searchInput.clear();
// After clearing: all defined filter items should be visible again
for (const item of filterItemsConfig) {
await expect(
getFilterItemLocator(page, item.testId),
`Item ${item.name} should be visible after clearing search`
).toBeVisible();
}
});
test("search should be case-insensitive", async ({ page }) => {
const searchInput = page.locator(searchInputSelector);
// Search for "member" (lowercase)
await searchInput.fill("member");
await expect(getFilterItemLocator(page, "add-filter-item-userId")).toBeVisible();
await expect(getFilterItemLocator(page, "add-filter-item-eventTypeId")).toBeHidden();
await expect(getFilterItemLocator(page, "add-filter-item-teamId")).toBeHidden();
});
test("should individually find each filter item by its full name", async ({ page }) => {
const searchInput = page.locator(searchInputSelector);
for (const targetItem of filterItemsConfig) {
await searchInput.fill(targetItem.name);
// Check that the target item is visible
await expect(
getFilterItemLocator(page, targetItem.testId),
`Searching for "${targetItem.name}", item "${targetItem.name}" should be visible`
).toBeVisible();
await searchInput.clear();
}
});
test("should show no items for a non-matching search term", async ({ page }) => {
const searchInput = page.locator(searchInputSelector);
const nonExistentTerm = "NonExistentFilterXYZ123";
await searchInput.fill(nonExistentTerm);
for (const item of filterItemsConfig) {
await expect(
getFilterItemLocator(page, item.testId),
`Item ${item.name} should be hidden for non-matching term '${nonExistentTerm}'`
).toBeHidden();
}
});
});
});
async function createBooking({