/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import wrapper from '@cloudscape-design/components/test-utils/dom'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import FileUpload from '../../../src/components/common-components/FileUpload'; const fileName = 'hello.world'; const fileItem = { name: fileName, size: 100, type: 'file', relativePath: `folder_one/${fileName}`, file: (resolve: any) => resolve(fileItem), isFile: true, }; const directoryEntry = { webkitGetAsEntry: () => ({ name: 'folder_one', createReader: () => ({ readEntries: (resolve: any) => resolve([fileItem]), }), isDirectory: true, }), }; const items = [directoryEntry]; function createDragEvent(type: string) { const event = new CustomEvent(type, { bubbles: true }); (event as any).dataTransfer = { items: items, }; return event; } const testFile = new File(['hello'], 'hello.world', { type: 'text/plain' }); describe('File Upload', () => { test('fires onChange on drop', async () => { const onChange = jest.fn(); const { container } = render(); const dropzone = container.querySelector('.dropzone')!; fireEvent(dropzone, createDragEvent('dragover')); fireEvent(dropzone, createDragEvent('dragleave')); fireEvent(dropzone, createDragEvent('drop')); await waitFor(() => expect(onChange).toHaveBeenCalled()); }); test('fires onChange on file input', async () => { const onChange = jest.fn(); render(); const filesButton = screen.getByTestId('multiple-files-button'); expect(filesButton).toBeTruthy(); filesButton.click(); await userEvent.upload(screen.getByTestId('folder-select'), [testFile]); await waitFor(() => expect(onChange).toHaveBeenCalled()); }); test('fires onChange on folder select', async () => { const onChange = jest.fn(); render(); const folderButton = screen.getByTestId('single-folder-button'); expect(folderButton).toBeTruthy(); folderButton.click(); await userEvent.upload(screen.getByTestId('file-select'), [testFile]); await waitFor(() => expect(onChange).toHaveBeenCalled()); }); test('fires onChange on remove item', async () => { const onChange = jest.fn(); const { container } = render(); const fileList = wrapper(container).findTokenGroup()!.findTokens()!; expect(fileList).toBeTruthy(); // fire dismiss button. fileList[0].findDismiss()!.click(); await waitFor(() => expect(onChange).toHaveBeenCalled()); }); });