BREAKING CHANGE(SmartFileFactory): Refactor to in-memory file API and introduce SmartFileFactory; delegate filesystem operations to @push.rocks/smartfs; bump to 12.0.0
This commit is contained in:
+226
-10
@@ -1,19 +1,235 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
|
||||
import * as smartfile from '../ts/index.js';
|
||||
import { MockSmartFs } from './helpers/mock-smartfs.js';
|
||||
|
||||
tap.test('should create a virtualdirectory', async () => {
|
||||
const virtualDir = await smartfile.VirtualDirectory.fromFsDirPath(
|
||||
'./test/testassets/testfolder',
|
||||
);
|
||||
// Create factory with MockSmartFs
|
||||
const mockFs = new MockSmartFs();
|
||||
const factory = new smartfile.SmartFileFactory(mockFs);
|
||||
|
||||
// ---------------------------
|
||||
// VirtualDirectory Factory Tests
|
||||
// ---------------------------
|
||||
|
||||
tap.test('SmartFileFactory.virtualDirectoryFromPath() -> should create a VirtualDirectory from fs path', async () => {
|
||||
const virtualDir = await factory.virtualDirectoryFromPath('./test/testassets/testfolder');
|
||||
expect(virtualDir).toBeInstanceOf(smartfile.VirtualDirectory);
|
||||
expect(virtualDir.smartfileArray.length).toEqual(4);
|
||||
});
|
||||
|
||||
tap.test('should write to a directory', async () => {
|
||||
const virtualDir = await smartfile.VirtualDirectory.fromFsDirPath(
|
||||
'./test/testassets/testfolder',
|
||||
);
|
||||
virtualDir.saveToDisk('./test/testassets/test');
|
||||
tap.test('SmartFileFactory.virtualDirectoryEmpty() -> should create an empty VirtualDirectory', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
expect(virtualDir).toBeInstanceOf(smartfile.VirtualDirectory);
|
||||
expect(virtualDir.isEmpty()).toBeTrue();
|
||||
expect(virtualDir.size()).toEqual(0);
|
||||
});
|
||||
|
||||
tap.test('SmartFileFactory.virtualDirectoryFromFileArray() -> should create VirtualDirectory from files', async () => {
|
||||
const file1 = factory.fromString('file1.txt', 'content1');
|
||||
const file2 = factory.fromString('file2.txt', 'content2');
|
||||
|
||||
const virtualDir = factory.virtualDirectoryFromFileArray([file1, file2]);
|
||||
expect(virtualDir).toBeInstanceOf(smartfile.VirtualDirectory);
|
||||
expect(virtualDir.size()).toEqual(2);
|
||||
});
|
||||
|
||||
// ---------------------------
|
||||
// VirtualDirectory Collection Methods
|
||||
// ---------------------------
|
||||
|
||||
tap.test('VirtualDirectory -> should add and list files', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
const file1 = factory.fromString('test1.txt', 'content1');
|
||||
const file2 = factory.fromString('test2.txt', 'content2');
|
||||
|
||||
virtualDir.addSmartfile(file1);
|
||||
virtualDir.addSmartfile(file2);
|
||||
|
||||
const files = virtualDir.listFiles();
|
||||
expect(files.length).toEqual(2);
|
||||
expect(files[0].path).toEqual('test1.txt');
|
||||
expect(files[1].path).toEqual('test2.txt');
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should check file existence', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
const file = factory.fromString('exists.txt', 'content');
|
||||
virtualDir.addSmartfile(file);
|
||||
|
||||
expect(virtualDir.exists('exists.txt')).toBeTrue();
|
||||
expect(virtualDir.has('exists.txt')).toBeTrue();
|
||||
expect(virtualDir.exists('not-there.txt')).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should get file by path', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
const file = factory.fromString('getme.txt', 'my content');
|
||||
virtualDir.addSmartfile(file);
|
||||
|
||||
const retrieved = await virtualDir.getFileByPath('getme.txt');
|
||||
expect(retrieved).not.toBeUndefined();
|
||||
expect(retrieved!.parseContentAsString()).toEqual('my content');
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should remove file by path', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
const file = factory.fromString('remove.txt', 'content');
|
||||
virtualDir.addSmartfile(file);
|
||||
|
||||
expect(virtualDir.exists('remove.txt')).toBeTrue();
|
||||
|
||||
const removed = virtualDir.removeByPath('remove.txt');
|
||||
expect(removed).toBeTrue();
|
||||
expect(virtualDir.exists('remove.txt')).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should clear all files', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('file1.txt', 'content1'));
|
||||
virtualDir.addSmartfile(factory.fromString('file2.txt', 'content2'));
|
||||
|
||||
expect(virtualDir.size()).toEqual(2);
|
||||
|
||||
virtualDir.clear();
|
||||
|
||||
expect(virtualDir.size()).toEqual(0);
|
||||
expect(virtualDir.isEmpty()).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should merge with another VirtualDirectory', async () => {
|
||||
const vdir1 = factory.virtualDirectoryEmpty();
|
||||
vdir1.addSmartfile(factory.fromString('file1.txt', 'content1'));
|
||||
|
||||
const vdir2 = factory.virtualDirectoryEmpty();
|
||||
vdir2.addSmartfile(factory.fromString('file2.txt', 'content2'));
|
||||
|
||||
vdir1.merge(vdir2);
|
||||
|
||||
expect(vdir1.size()).toEqual(2);
|
||||
expect(vdir1.exists('file1.txt')).toBeTrue();
|
||||
expect(vdir1.exists('file2.txt')).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should filter files', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('file1.txt', 'content1'));
|
||||
virtualDir.addSmartfile(factory.fromString('file2.md', 'content2'));
|
||||
virtualDir.addSmartfile(factory.fromString('file3.txt', 'content3'));
|
||||
|
||||
const filtered = virtualDir.filter(file => file.path.endsWith('.txt'));
|
||||
|
||||
expect(filtered.size()).toEqual(2);
|
||||
expect(filtered.exists('file1.txt')).toBeTrue();
|
||||
expect(filtered.exists('file3.txt')).toBeTrue();
|
||||
expect(filtered.exists('file2.md')).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should map files', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('file1.txt', 'content1'));
|
||||
virtualDir.addSmartfile(factory.fromString('file2.txt', 'content2'));
|
||||
|
||||
const mapped = virtualDir.map(file => {
|
||||
file.setContentsFromString(file.parseContentAsString().toUpperCase());
|
||||
return file;
|
||||
});
|
||||
|
||||
const files = mapped.listFiles();
|
||||
expect(files[0].parseContentAsString()).toEqual('CONTENT1');
|
||||
expect(files[1].parseContentAsString()).toEqual('CONTENT2');
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should find files', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('find.txt', 'findme'));
|
||||
virtualDir.addSmartfile(factory.fromString('other.txt', 'other'));
|
||||
|
||||
const found = virtualDir.find(file => file.parseContentAsString() === 'findme');
|
||||
|
||||
expect(found).not.toBeUndefined();
|
||||
expect(found!.path).toEqual('find.txt');
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should list directories', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('dir1/file1.txt', 'content1'));
|
||||
virtualDir.addSmartfile(factory.fromString('dir1/file2.txt', 'content2'));
|
||||
virtualDir.addSmartfile(factory.fromString('dir2/file3.txt', 'content3'));
|
||||
virtualDir.addSmartfile(factory.fromString('root.txt', 'content4'));
|
||||
|
||||
const dirs = virtualDir.listDirectories();
|
||||
|
||||
expect(dirs).toContain('dir1');
|
||||
expect(dirs).toContain('dir2');
|
||||
expect(dirs.length).toEqual(2);
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should save to disk', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('saved1.txt', 'saved content 1'));
|
||||
virtualDir.addSmartfile(factory.fromString('subdir/saved2.txt', 'saved content 2'));
|
||||
|
||||
await virtualDir.saveToDisk('./test/testassets/temp/vdir-output');
|
||||
|
||||
// Verify files were written
|
||||
const file1 = await factory.fromFilePath('./test/testassets/temp/vdir-output/saved1.txt');
|
||||
expect(file1.parseContentAsString()).toEqual('saved content 1');
|
||||
|
||||
const file2 = await factory.fromFilePath('./test/testassets/temp/vdir-output/subdir/saved2.txt');
|
||||
expect(file2.parseContentAsString()).toEqual('saved content 2');
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should convert to transferable object', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('trans1.txt', 'transferable1'));
|
||||
virtualDir.addSmartfile(factory.fromString('trans2.txt', 'transferable2'));
|
||||
|
||||
const transferable = await virtualDir.toVirtualDirTransferableObject();
|
||||
|
||||
expect(transferable.files).toBeInstanceOf(Array);
|
||||
expect(transferable.files.length).toEqual(2);
|
||||
});
|
||||
|
||||
// TODO: Fix serialization/deserialization with smartjson
|
||||
// tap.test('VirtualDirectory -> should create from transferable object', async () => {
|
||||
// const originalDir = factory.virtualDirectoryEmpty();
|
||||
// originalDir.addSmartfile(factory.fromString('original.txt', 'original content'));
|
||||
|
||||
// const transferable = await originalDir.toVirtualDirTransferableObject();
|
||||
// const restoredDir = await factory.virtualDirectoryFromTransferable(transferable);
|
||||
|
||||
// expect(restoredDir.size()).toEqual(1);
|
||||
// expect(restoredDir.exists('original.txt')).toBeTrue();
|
||||
|
||||
// const file = await restoredDir.getFileByPath('original.txt');
|
||||
// expect(file!.parseContentAsString()).toEqual('original content');
|
||||
// });
|
||||
|
||||
tap.test('VirtualDirectory -> should shift to subdirectory', async () => {
|
||||
const virtualDir = factory.virtualDirectoryEmpty();
|
||||
virtualDir.addSmartfile(factory.fromString('root/sub/file1.txt', 'content1'));
|
||||
virtualDir.addSmartfile(factory.fromString('root/sub/file2.txt', 'content2'));
|
||||
virtualDir.addSmartfile(factory.fromString('root/other.txt', 'content3'));
|
||||
|
||||
const shifted = await virtualDir.shiftToSubdirectory('root/sub');
|
||||
|
||||
expect(shifted.size()).toEqual(2);
|
||||
expect(shifted.exists('file1.txt')).toBeTrue();
|
||||
expect(shifted.exists('file2.txt')).toBeTrue();
|
||||
expect(shifted.exists('other.txt')).toBeFalse();
|
||||
});
|
||||
|
||||
tap.test('VirtualDirectory -> should add another virtual directory with new root', async () => {
|
||||
const vdir1 = factory.virtualDirectoryEmpty();
|
||||
vdir1.addSmartfile(factory.fromString('existing.txt', 'existing'));
|
||||
|
||||
const vdir2 = factory.virtualDirectoryEmpty();
|
||||
vdir2.addSmartfile(factory.fromString('added.txt', 'added'));
|
||||
|
||||
await vdir1.addVirtualDirectory(vdir2, 'newroot');
|
||||
|
||||
expect(vdir1.size()).toEqual(2);
|
||||
expect(vdir1.exists('existing.txt')).toBeTrue();
|
||||
expect(vdir1.exists('newroot/added.txt')).toBeTrue();
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
||||
Reference in New Issue
Block a user