This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch mobile-dashboard-support
in repository https://gitbox.apache.org/repos/asf/superset.git

commit ed26910cd733e0c2610b2a9a14a277ee303abe21
Author: Evan Rusackas <[email protected]>
AuthorDate: Wed Jan 14 13:05:34 2026 -0800

    test(mobile): Add tests for mobile support props
    
    - Add tests for forceViewMode prop in ListView
    - Add tests for mobile filter drawer props (mobileFiltersOpen, 
setMobileFiltersOpen)
    - Add tests for leftIcon/rightIcon props in SubMenu
    
    Co-Authored-By: Claude Opus 4.5 <[email protected]>
---
 .../src/components/ListView/ListView.test.tsx      | 81 ++++++++++++++++++++++
 .../src/features/home/SubMenu.test.tsx             | 24 +++++++
 2 files changed, 105 insertions(+)

diff --git a/superset-frontend/src/components/ListView/ListView.test.tsx 
b/superset-frontend/src/components/ListView/ListView.test.tsx
index 9d55ec1ad8..44fdde6b4a 100644
--- a/superset-frontend/src/components/ListView/ListView.test.tsx
+++ b/superset-frontend/src/components/ListView/ListView.test.tsx
@@ -359,3 +359,84 @@ describe('ListView', () => {
     expect(mockedPropsComprehensive.fetchData).toHaveBeenCalled();
   });
 });
+
+// Mobile support tests
+test('respects forceViewMode prop and hides view toggle', () => {
+  // Omit cardSortSelectOptions to avoid CardSortSelect needing initialSort
+  const { cardSortSelectOptions, ...propsWithoutSort } = 
mockedPropsComprehensive;
+  render(
+    <QueryParamProvider location={makeMockLocation()}>
+      <ListView
+        {...propsWithoutSort}
+        renderCard={() => <div>Card</div>}
+        forceViewMode="card"
+      />
+    </QueryParamProvider>,
+    { store: mockStore() },
+  );
+
+  // View toggle should not be present when forceViewMode is set
+  expect(screen.queryByLabelText('card-view')).not.toBeInTheDocument();
+  expect(screen.queryByLabelText('list-view')).not.toBeInTheDocument();
+});
+
+test('shows card view when forceViewMode is card', () => {
+  // Omit cardSortSelectOptions to avoid CardSortSelect needing initialSort
+  const { cardSortSelectOptions, ...propsWithoutSort } = 
mockedPropsComprehensive;
+  render(
+    <QueryParamProvider location={makeMockLocation()}>
+      <ListView
+        {...propsWithoutSort}
+        renderCard={() => <div data-test="test-card">Card Content</div>}
+        forceViewMode="card"
+      />
+    </QueryParamProvider>,
+    { store: mockStore() },
+  );
+
+  // Should render cards, not table rows
+  expect(screen.getAllByTestId('test-card')).toHaveLength(2);
+});
+
+test('renders mobile filter drawer when mobileFiltersOpen is true', () => {
+  const setMobileFiltersOpen = jest.fn();
+  // Omit cardSortSelectOptions to avoid CardSortSelect needing initialSort
+  const { cardSortSelectOptions, ...propsWithoutSort } = 
mockedPropsComprehensive;
+  render(
+    <QueryParamProvider location={makeMockLocation()}>
+      <ListView
+        {...propsWithoutSort}
+        mobileFiltersOpen
+        setMobileFiltersOpen={setMobileFiltersOpen}
+        mobileFiltersDrawerTitle="Search Dashboards"
+      />
+    </QueryParamProvider>,
+    { store: mockStore() },
+  );
+
+  // Drawer should be visible with custom title
+  expect(screen.getByText('Search Dashboards')).toBeInTheDocument();
+});
+
+test('calls setMobileFiltersOpen(false) when drawer is closed', async () => {
+  const setMobileFiltersOpen = jest.fn();
+  // Omit cardSortSelectOptions to avoid CardSortSelect needing initialSort
+  const { cardSortSelectOptions, ...propsWithoutSort } = 
mockedPropsComprehensive;
+  render(
+    <QueryParamProvider location={makeMockLocation()}>
+      <ListView
+        {...propsWithoutSort}
+        mobileFiltersOpen
+        setMobileFiltersOpen={setMobileFiltersOpen}
+        mobileFiltersDrawerTitle="Search"
+      />
+    </QueryParamProvider>,
+    { store: mockStore() },
+  );
+
+  // Click the close button on the drawer
+  const closeButton = screen.getByLabelText('Close');
+  await userEvent.click(closeButton);
+
+  expect(setMobileFiltersOpen).toHaveBeenCalledWith(false);
+});
diff --git a/superset-frontend/src/features/home/SubMenu.test.tsx 
b/superset-frontend/src/features/home/SubMenu.test.tsx
index 2dc716f64e..25ed69d67d 100644
--- a/superset-frontend/src/features/home/SubMenu.test.tsx
+++ b/superset-frontend/src/features/home/SubMenu.test.tsx
@@ -127,3 +127,27 @@ test('should render the buttons', async () => {
   userEvent.click(testButton);
   expect(mockFunc).toHaveBeenCalled();
 });
+
+// Mobile support tests
+test('should render leftIcon when provided', async () => {
+  setup({
+    leftIcon: <button data-test="left-icon-button">Search</button>,
+  });
+  expect(await screen.findByTestId('left-icon-button')).toBeInTheDocument();
+});
+
+test('should render rightIcon when provided', async () => {
+  setup({
+    rightIcon: <button data-test="right-icon-button">Menu</button>,
+  });
+  expect(await screen.findByTestId('right-icon-button')).toBeInTheDocument();
+});
+
+test('should render both leftIcon and rightIcon together', async () => {
+  setup({
+    leftIcon: <span data-test="mobile-left">Left</span>,
+    rightIcon: <span data-test="mobile-right">Right</span>,
+  });
+  expect(await screen.findByTestId('mobile-left')).toBeInTheDocument();
+  expect(await screen.findByTestId('mobile-right')).toBeInTheDocument();
+});

Reply via email to