import * as React from 'react';
import { render, screen } from '../../../test-utils/testing-library';
import Content, { ContentProps } from '../Content';
import {
VIEW_ERROR,
VIEW_METADATA,
VIEW_MODE_LIST,
VIEW_MODE_GRID,
VIEW_FOLDER,
VIEW_RECENTS,
} from '../../../constants';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import { Collection } from '../../common/types/core';
const mockProps: ContentProps = {
canDelete: true,
canDownload: true,
canPreview: true,
canRename: true,
canShare: true,
currentCollection: { items: [], percentLoaded: 100 } as Collection,
isMedium: false,
isSmall: false,
isTouch: false,
onItemClick: jest.fn(),
onItemDelete: jest.fn(),
onItemDownload: jest.fn(),
onItemPreview: jest.fn(),
onItemRename: jest.fn(),
onItemSelect: jest.fn(),
onItemShare: jest.fn(),
onMetadataFilter: jest.fn(),
onMetadataUpdate: jest.fn(),
onSortChange: jest.fn(),
portalElement: null,
view: VIEW_RECENTS,
viewMode: VIEW_MODE_LIST,
};
jest.mock('../MetadataViewContainer', () => ({
__esModule: true,
default: () =>
MetadataViewContainer
,
}));
describe('Content Component', () => {
const renderComponent = (props: Partial = {}) => {
return render();
};
test('renders ProgressBar when view is not VIEW_ERROR or VIEW_SELECTED', () => {
renderComponent({ view: VIEW_FOLDER });
expect(screen.getByRole('progressbar')).toBeInTheDocument();
});
test('renders error message in empty view when there is an error', () => {
renderComponent({ view: VIEW_ERROR });
expect(screen.getByText('A network error has occurred while trying to load.')).toBeInTheDocument();
});
test('renders MetadataBasedItemList when view is VIEW_METADATA', () => {
const collection = { boxItem: {}, id: '0', items: [{ id: 1 }], name: 'name' };
renderComponent({ view: VIEW_METADATA, fieldsToShow: ['id'], currentCollection: collection });
expect(screen.getByTestId('metadata-based-item-list')).toBeInTheDocument();
});
test('renders ItemList when viewMode is VIEW_MODE_LIST', () => {
const collection = {
boxItem: {},
id: '0',
items: [{ id: 1, name: 'Item 1', size: 1000, modified_at: '2023-10-10T10:00:00Z', type: 'file' }],
name: 'name',
percentLoaded: 100,
};
renderComponent({ viewMode: VIEW_MODE_LIST, currentCollection: collection });
expect(screen.getByText('Item 1')).toBeInTheDocument();
expect(screen.getByText('1000 Bytes')).toBeInTheDocument();
expect(screen.getByText('Viewed Oct 10, 2023')).toBeInTheDocument();
expect(screen.getByLabelText('File')).toBeInTheDocument();
});
test('renders ItemGrid when viewMode is VIEW_MODE_GRID', () => {
const item1 = { id: 1, name: 'Item 1', size: 1000, modified_at: '2023-10-10T10:00:00Z', type: 'file' };
const collection = { boxItem: {}, id: '0', items: [item1], name: 'name', percentLoaded: 100 };
render();
expect(screen.getByText('Item 1')).toBeInTheDocument();
expect(screen.getByText('Viewed Oct 10, 2023')).toBeInTheDocument();
expect(screen.getByLabelText('File')).toBeInTheDocument();
});
describe('MetadataView V2 feature', () => {
const features = {
contentExplorer: { metadataViewV2: true },
};
const collection = {
percentLoaded: 100,
boxItem: {},
id: '0',
items: [{ id: 1 }],
name: 'name',
};
test('does not render MetadataBasedItemList when contentExplorer.metadataViewV2 is enabled', () => {
renderComponent({
currentCollection: collection,
features,
fieldsToShow: ['id'],
view: VIEW_METADATA,
});
expect(screen.queryByTestId('metadata-based-item-list')).not.toBeInTheDocument();
});
test('renders new metadata view when contentExplorer.metadataViewV2 is enabled', () => {
renderComponent({
currentCollection: collection,
features,
fieldsToShow: ['id'],
view: VIEW_METADATA,
});
expect(screen.getByText('MetadataViewContainer')).toBeInTheDocument();
});
describe('EmptyView rendering for VIEW_ERROR with metadataViewV2 feature', () => {
test('renders EmptyView with isLoading=false when metadataViewV2 feature is enabled and view is VIEW_ERROR', () => {
// This test verifies that the EmptyView receives isLoading={false}
// We can verify this by checking that the loading message is not shown
renderComponent({
features,
view: VIEW_ERROR,
});
// Should show error message, not loading message
expect(screen.getByText('A network error has occurred while trying to load.')).toBeInTheDocument();
expect(screen.queryByText('Please wait while the items load...')).not.toBeInTheDocument();
});
test('does not render EmptyView when metadataViewV2 feature is enabled but view is not VIEW_ERROR', () => {
renderComponent({
features,
view: VIEW_FOLDER,
});
expect(
screen.queryByText('A network error has occurred while trying to load.'),
).not.toBeInTheDocument();
});
});
});
});