als-path-tree
Version:
A Node.js library for managing a virtual file system structure, offering functionalities for file and directory operations with a shared storage system.
90 lines (70 loc) • 3.26 kB
JavaScript
const { describe, it, beforeEach } = require('node:test');
const assert = require('node:assert');
const Directory = require('../lib/directory');
const File = require('../lib/file');
describe('Directory', () => {
let rootDir;
beforeEach(() => {
rootDir = new Directory('root');
});
it('adds a directory to the root', () => {
const newDir = rootDir.addDir('subdir');
assert.strictEqual(rootDir.subdirectories['subdir'], newDir);
});
it('adds a file to a directory', () => {
const file = rootDir.addFile('subdir/file.txt', { size: 512 }, 'test content');
assert.strictEqual(rootDir.getItem('subdir/file.txt'), file);
});
it('removes an empty directory', () => {
const subdir = rootDir.addDir('subdir');
subdir.removeIfEmpty();
assert.strictEqual(rootDir.subdirectories['subdir'], undefined);
});
it('deletes a directory and its contents', () => {
const subdir = rootDir.addDir('subdir');
rootDir.addFile('subdir/file.txt', { size: 512 }, 'test content');
subdir.delete();
assert.strictEqual(rootDir.subdirectories['subdir'], undefined);
assert.strictEqual(rootDir.getItem('subdir/file.txt'), null);
});
it('copies a directory and its contents to another location', () => {
rootDir.addFile('subdir/file.txt', { size: 512 }, 'test content');
rootDir.addDir('subdir/nested');
assert.ok(rootDir.getItem('subdir/nested'))
assert.ok(rootDir.getItem('subdir/file.txt'))
rootDir.subdirectories['subdir'].copyTo('./copyDir');
assert.ok(rootDir.getItem('./copyDir'))
assert.ok(rootDir.getItem('./copyDir/nested'))
assert.ok(rootDir.getItem('./copyDir/file.txt'))
});
it('moves a directory to another location', () => {
const subdir = rootDir.addDir('subdir');
const file = rootDir.addFile('subdir/file.txt', { size: 512 }, 'test content');
subdir.moveTo('movedDir');
assert.strictEqual(rootDir.getItem('subdir'), null);
assert.notStrictEqual(rootDir.getItem('movedDir/file.txt'), file);
});
});
describe('Directory Path Handling', () => {
let rootDir;
beforeEach(() => {
rootDir = new Directory('root');
});
it('handles relative paths correctly', () => {
const file = rootDir.addFile('./subdir/../file.txt', {}, 'content');
assert.strictEqual(file.content, 'content');
assert.strictEqual(rootDir.getItem('./file.txt'), file);
});
it.only('throws an error for invalid paths', () => {
assert.throws(() => rootDir.addFile(null, {}, 'content'), Error);
assert.throws(() => rootDir.addFile(undefined, {}, 'content'), Error);
const file = rootDir.addFile('////file.txt', {}, 'content')
assert(file.path === '/root/file.txt')
});
it('handles nested directories and files', () => {
rootDir.addFile('dir1/dir2/file.txt', {}, 'content');
const nestedFile = rootDir.getItem('dir1/dir2/file.txt');
assert(nestedFile);
assert.strictEqual(nestedFile.content, 'content');
});
});