81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
 | |
| import { decorateFiles, splitParent } from '~/ide/lib/files';
 | |
| import { decorateData, escapeFileUrl } from '~/ide/stores/utils';
 | |
| 
 | |
| const TEST_BRANCH_ID = 'lorem-ipsum';
 | |
| const TEST_PROJECT_ID = 10;
 | |
| 
 | |
| const createEntries = paths => {
 | |
|   const createEntry = (acc, { path, type, children }) => {
 | |
|     // Sometimes we need to end the url with a '/'
 | |
|     const createUrl = base => (type === 'tree' ? `${base}/` : base);
 | |
| 
 | |
|     const { name, parent } = splitParent(path);
 | |
|     const parentEntry = acc[parent];
 | |
|     const previewMode = viewerInformationForPath(name);
 | |
| 
 | |
|     acc[path] = {
 | |
|       ...decorateData({
 | |
|         projectId: TEST_PROJECT_ID,
 | |
|         branchId: TEST_BRANCH_ID,
 | |
|         id: path,
 | |
|         name,
 | |
|         path,
 | |
|         url: createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}/-/${escapeFileUrl(path)}`),
 | |
|         type,
 | |
|         previewMode,
 | |
|         binary: (previewMode && previewMode.binary) || false,
 | |
|         parentPath: parent,
 | |
|         parentTreeUrl: parentEntry
 | |
|           ? parentEntry.url
 | |
|           : createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}`),
 | |
|       }),
 | |
|       tree: children.map(childName => expect.objectContaining({ name: childName })),
 | |
|     };
 | |
| 
 | |
|     return acc;
 | |
|   };
 | |
| 
 | |
|   const entries = paths.reduce(createEntry, {});
 | |
| 
 | |
|   // Wrap entries in expect.objectContaining.
 | |
|   // We couldn't do this earlier because we still need to select properties from parent entries.
 | |
|   return Object.keys(entries).reduce((acc, key) => {
 | |
|     acc[key] = expect.objectContaining(entries[key]);
 | |
| 
 | |
|     return acc;
 | |
|   }, {});
 | |
| };
 | |
| 
 | |
| describe('IDE lib decorate files', () => {
 | |
|   it('creates entries and treeList', () => {
 | |
|     const data = ['app/assets/apples/foo.js', 'app/bugs.js', 'app/#weird#file?.txt', 'README.md'];
 | |
|     const expectedEntries = createEntries([
 | |
|       { path: 'app', type: 'tree', children: ['assets', '#weird#file?.txt', 'bugs.js'] },
 | |
|       { path: 'app/assets', type: 'tree', children: ['apples'] },
 | |
|       { path: 'app/assets/apples', type: 'tree', children: ['foo.js'] },
 | |
|       { path: 'app/assets/apples/foo.js', type: 'blob', children: [] },
 | |
|       { path: 'app/bugs.js', type: 'blob', children: [] },
 | |
|       { path: 'app/#weird#file?.txt', type: 'blob', children: [] },
 | |
|       { path: 'README.md', type: 'blob', children: [] },
 | |
|     ]);
 | |
| 
 | |
|     const { entries, treeList } = decorateFiles({
 | |
|       data,
 | |
|       branchId: TEST_BRANCH_ID,
 | |
|       projectId: TEST_PROJECT_ID,
 | |
|     });
 | |
| 
 | |
|     // Here we test the keys and then each key/value individually because `expect(entries).toEqual(expectedEntries)`
 | |
|     // was taking a very long time for some reason. Probably due to large objects and nested `expect.objectContaining`.
 | |
|     const entryKeys = Object.keys(entries);
 | |
| 
 | |
|     expect(entryKeys).toEqual(Object.keys(expectedEntries));
 | |
|     entryKeys.forEach(key => {
 | |
|       expect(entries[key]).toEqual(expectedEntries[key]);
 | |
|     });
 | |
| 
 | |
|     expect(treeList).toEqual([expectedEntries.app, expectedEntries['README.md']]);
 | |
|   });
 | |
| });
 |