Skip to content

Commit 7492c74

Browse files
committed
Add tests
1 parent 24157a9 commit 7492c74

2 files changed

Lines changed: 100 additions & 9 deletions

File tree

packages/components/src/internal/components/files/FileAttachmentContainer.test.tsx

Lines changed: 97 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@
1616
import React from 'react';
1717
import { render } from '@testing-library/react';
1818

19-
import { FileAttachmentContainer } from './FileAttachmentContainer';
19+
import {
20+
FileAttachmentContainer,
21+
getTransferItemDirectoryEntry,
22+
isDirectoryEntry,
23+
isFileEntry,
24+
} from './FileAttachmentContainer';
2025

2126
describe('FileAttachmentContainer', () => {
2227
test('with single file', () => {
@@ -29,7 +34,7 @@ describe('FileAttachmentContainer', () => {
2934
);
3035

3136
expect(document.querySelector('.file-upload__container').className).toContain('hidden');
32-
expect(document.querySelector('.attached-file__container').textContent).toBe('file1.txt');
37+
expect(document.querySelector('.attached-file__container')).toHaveTextContent('file1.txt');
3338
});
3439

3540
test('with multiple files', () => {
@@ -46,8 +51,8 @@ describe('FileAttachmentContainer', () => {
4651

4752
expect(document.querySelector('.file-upload__container').className).toContain('block');
4853
expect(document.querySelectorAll('.attached-file__container')).toHaveLength(2);
49-
expect(document.querySelectorAll('.attached-file__container')[0].textContent).toBe('file1.txt');
50-
expect(document.querySelectorAll('.attached-file__container')[1].textContent).toBe('file2.txt');
54+
expect(document.querySelectorAll('.attached-file__container')[0]).toHaveTextContent('file1.txt');
55+
expect(document.querySelectorAll('.attached-file__container')[1]).toHaveTextContent('file2.txt');
5156

5257
expect(document.querySelectorAll('.file-upload__file-entry-listing')).toHaveLength(1);
5358
expect(document.querySelectorAll('.file-upload__scroll-footer')).toHaveLength(0);
@@ -91,7 +96,7 @@ describe('FileAttachmentContainer', () => {
9196
expect(document.querySelector('.file-upload__container').className).toContain('block');
9297
expect(document.querySelectorAll('.attached-file__container')).toHaveLength(2);
9398
expect(document.querySelectorAll('.file-upload__file-entry-listing')).toHaveLength(1);
94-
expect(document.querySelector('.file-upload__scroll-footer').textContent).toBe('2 files will be uploaded.');
99+
expect(document.querySelector('.file-upload__scroll-footer')).toHaveTextContent('2 files will be uploaded.');
95100
});
96101

97102
test('fileCountSuffix with single', () => {
@@ -109,6 +114,92 @@ describe('FileAttachmentContainer', () => {
109114
expect(document.querySelector('.file-upload__container').className).toContain('block');
110115
expect(document.querySelectorAll('.attached-file__container')).toHaveLength(1);
111116
expect(document.querySelectorAll('.file-upload__file-entry-listing')).toHaveLength(1);
112-
expect(document.querySelector('.file-upload__scroll-footer').textContent).toBe('1 file will be uploaded.');
117+
expect(document.querySelector('.file-upload__scroll-footer')).toHaveTextContent('1 file will be uploaded.');
118+
});
119+
});
120+
121+
describe('File System Helper Functions', () => {
122+
function mockFileSystemEntry(isDirectory: boolean, isFile: boolean): FileSystemEntry {
123+
return {
124+
filesystem: undefined,
125+
fullPath: undefined,
126+
isDirectory,
127+
isFile,
128+
name: undefined,
129+
getParent: jest.fn(),
130+
};
131+
}
132+
133+
function mockDataTransferItemList(entry: FileSystemEntry): DataTransferItemList {
134+
return {
135+
0: {
136+
webkitGetAsEntry: jest.fn().mockReturnValue(entry),
137+
},
138+
} as unknown as DataTransferItemList;
139+
}
140+
141+
describe('isDirectoryEntry', () => {
142+
it('should return true when entry is a directory', () => {
143+
const mockDirEntry = mockFileSystemEntry(true, false);
144+
expect(isDirectoryEntry(mockDirEntry)).toBe(true);
145+
});
146+
147+
it('should return false when entry is a file', () => {
148+
const mockFileEntry = mockFileSystemEntry(false, true);
149+
expect(isDirectoryEntry(mockFileEntry)).toBe(false);
150+
});
151+
152+
it('should return false when entry is undefined', () => {
153+
expect(isDirectoryEntry(undefined)).toBe(false);
154+
expect(isDirectoryEntry(null)).toBe(false);
155+
expect(isDirectoryEntry({} as unknown as FileSystemEntry)).toBe(false);
156+
});
157+
});
158+
159+
describe('isFileEntry', () => {
160+
it('should return true when entry is a file', () => {
161+
const mockFileEntry = mockFileSystemEntry(false, true);
162+
expect(isFileEntry(mockFileEntry)).toBe(true);
163+
});
164+
165+
it('should return false when entry is a directory', () => {
166+
const mockDirEntry = mockFileSystemEntry(true, false);
167+
expect(isFileEntry(mockDirEntry)).toBe(false);
168+
});
169+
170+
it('should return false when entry is undefined', () => {
171+
expect(isFileEntry(undefined)).toBe(false);
172+
expect(isFileEntry(null)).toBe(false);
173+
expect(isFileEntry({} as unknown as FileSystemEntry)).toBe(false);
174+
});
175+
});
176+
177+
describe('getTransferItemDirectoryEntry', () => {
178+
it('should return directory entry when item at index is a directory', () => {
179+
const mockDirEntry = mockFileSystemEntry(true, false);
180+
const mockTransferItems = mockDataTransferItemList(mockDirEntry);
181+
182+
const result = getTransferItemDirectoryEntry(mockTransferItems, 0);
183+
expect(result).toBe(mockDirEntry);
184+
expect(mockTransferItems[0].webkitGetAsEntry).toHaveBeenCalledTimes(1);
185+
});
186+
187+
it('should return undefined when item at index is a file', () => {
188+
const mockFileEntry = mockFileSystemEntry(false, true);
189+
const mockTransferItems = mockDataTransferItemList(mockFileEntry);
190+
191+
const result = getTransferItemDirectoryEntry(mockTransferItems, 0);
192+
expect(result).toBeUndefined();
193+
});
194+
195+
it('should return undefined when index is out of bounds', () => {
196+
expect(getTransferItemDirectoryEntry(undefined as DataTransferItemList, 0)).toBeUndefined();
197+
expect(getTransferItemDirectoryEntry({} as DataTransferItemList, 999)).toBeUndefined();
198+
});
199+
200+
it('should return undefined when webkitGetAsEntry returns null', () => {
201+
const mockTransferItems = mockDataTransferItemList(null);
202+
expect(getTransferItemDirectoryEntry(mockTransferItems, 0)).toBeUndefined();
203+
});
113204
});
114205
});

packages/components/src/internal/components/files/FileAttachmentContainer.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ import { fileMatchesAcceptedFormat, fileSizeLimitCompare } from './actions';
2929
import { FileAttachmentEntry } from './FileAttachmentEntry';
3030
import { ALL_FILES_LIMIT_KEY } from './models';
3131

32-
const isDirectoryEntry = (entry: FileSystemEntry): entry is FileSystemDirectoryEntry => !!entry?.isDirectory;
33-
const isFileEntry = (entry: FileSystemEntry): entry is FileSystemFileEntry => !!entry?.isFile;
32+
export const isDirectoryEntry = (entry: FileSystemEntry): entry is FileSystemDirectoryEntry => !!entry?.isDirectory;
33+
export const isFileEntry = (entry: FileSystemEntry): entry is FileSystemFileEntry => !!entry?.isFile;
3434
export const getTransferItemDirectoryEntry = (
3535
transferItems: DataTransferItemList,
3636
index: number
3737
): FileSystemDirectoryEntry | undefined => {
38-
const entry = transferItems?.[index]?.webkitGetAsEntry();
38+
const entry = transferItems?.[index]?.webkitGetAsEntry?.();
3939
if (entry && isDirectoryEntry(entry)) return entry;
4040
return undefined;
4141
};

0 commit comments

Comments
 (0)