superset-frontend/src/features/dashboards/DashboardCard.test.tsx
/**
* 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 { MemoryRouter } from 'react-router-dom';
import { FeatureFlag, JsonResponse, SupersetClient } from '@superset-ui/core';
import * as uiCore from '@superset-ui/core';
import { render, screen, waitFor } from 'spec/helpers/testing-library';
import DashboardCard from './DashboardCard';
const mockDashboard = {
id: 1,
dashboard_title: 'Sample Dashboard',
certified_by: 'John Doe',
certification_details: 'Certified on 2022-01-01',
published: true,
url: '/dashboard/1',
thumbnail_url: '/thumbnails/1.png',
changed_on_delta_humanized: '2 days ago',
owners: [
{ id: 1, name: 'Alice', first_name: 'Alice', last_name: 'Doe' },
{ id: 2, name: 'Bob', first_name: 'Bob', last_name: 'Smith' },
],
changed_by_name: 'John Doe',
changed_by: 'john.doe@example.com',
};
const mockHasPerm = jest.fn().mockReturnValue(true);
const mockOpenDashboardEditModal = jest.fn();
const mockSaveFavoriteStatus = jest.fn();
const mockHandleBulkDashboardExport = jest.fn();
const mockOnDelete = jest.fn();
let isFeatureEnabledMock: jest.MockInstance<boolean, [feature: FeatureFlag]>;
beforeAll(() => {
isFeatureEnabledMock = jest
.spyOn(uiCore, 'isFeatureEnabled')
.mockImplementation(() => true);
});
afterAll(() => {
// @ts-ignore
isFeatureEnabledMock.mockClear();
});
beforeEach(() => {
render(
<MemoryRouter>
<DashboardCard
dashboard={mockDashboard}
hasPerm={mockHasPerm}
bulkSelectEnabled={false}
loading={false}
openDashboardEditModal={mockOpenDashboardEditModal}
saveFavoriteStatus={mockSaveFavoriteStatus}
favoriteStatus={false}
handleBulkDashboardExport={mockHandleBulkDashboardExport}
onDelete={mockOnDelete}
/>
</MemoryRouter>,
);
});
it('Renders the dashboard title', () => {
const titleElement = screen.getByText('Sample Dashboard');
expect(titleElement).toBeInTheDocument();
});
it('Renders the certification details', () => {
const certificationDetailsElement = screen.getByLabelText(/certified/i);
expect(certificationDetailsElement).toBeInTheDocument();
});
it('Renders the published status', () => {
const publishedElement = screen.getByText(/published/i);
expect(publishedElement).toBeInTheDocument();
});
it('Renders the modified date', () => {
const modifiedDateElement = screen.getByText('Modified 2 days ago');
expect(modifiedDateElement).toBeInTheDocument();
});
it('should fetch thumbnail when dashboard has no thumbnail URL and feature flag is enabled', async () => {
const mockGet = jest.spyOn(SupersetClient, 'get').mockResolvedValue({
json: { result: { thumbnail_url: '/new-thumbnail.png' } },
} as unknown as JsonResponse);
const { rerender } = render(
<DashboardCard
dashboard={{
id: 1,
thumbnail_url: '',
changed_by_name: '',
changed_by: '',
dashboard_title: '',
published: false,
url: '',
owners: [],
}}
hasPerm={() => true}
bulkSelectEnabled={false}
loading={false}
saveFavoriteStatus={() => {}}
favoriteStatus={false}
handleBulkDashboardExport={() => {}}
onDelete={() => {}}
/>,
);
await waitFor(() => {
expect(mockGet).toHaveBeenCalledWith({
endpoint: '/api/v1/dashboard/1',
});
});
rerender(
<DashboardCard
dashboard={{
id: 1,
thumbnail_url: '/new-thumbnail.png',
changed_by_name: '',
changed_by: '',
dashboard_title: '',
published: false,
url: '',
owners: [],
}}
hasPerm={() => true}
bulkSelectEnabled={false}
loading={false}
saveFavoriteStatus={() => {}}
favoriteStatus={false}
handleBulkDashboardExport={() => {}}
onDelete={() => {}}
/>,
);
mockGet.mockRestore();
});