@mdfriday/foundry 25.8.8 → 25.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/application/incremental-build-coordinator.d.ts +2 -0
- package/dist/internal/application/incremental-build-coordinator.d.ts.map +1 -1
- package/dist/internal/application/incremental-build-coordinator.js +2 -2
- package/dist/internal/application/incremental-build-coordinator.js.map +1 -1
- package/dist/internal/application/ssg.d.ts +6 -5
- package/dist/internal/application/ssg.d.ts.map +1 -1
- package/dist/internal/application/ssg.js +12 -11
- package/dist/internal/application/ssg.js.map +1 -1
- package/dist/internal/domain/config/tests/entity-config.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/entity-config.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/entity-config.test.js +199 -0
- package/dist/internal/domain/config/tests/entity-config.test.js.map +1 -0
- package/dist/internal/domain/config/tests/entity-root.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/entity-root.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/entity-root.test.js +235 -0
- package/dist/internal/domain/config/tests/entity-root.test.js.map +1 -0
- package/dist/internal/domain/config/tests/factory-config.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/factory-config.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/factory-config.test.js +84 -0
- package/dist/internal/domain/config/tests/factory-config.test.js.map +1 -0
- package/dist/internal/domain/config/tests/index.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/index.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/index.test.js +197 -0
- package/dist/internal/domain/config/tests/index.test.js.map +1 -0
- package/dist/internal/domain/config/tests/mock-fs.d.ts +26 -0
- package/dist/internal/domain/config/tests/mock-fs.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/mock-fs.js +281 -0
- package/dist/internal/domain/config/tests/mock-fs.js.map +1 -0
- package/dist/internal/domain/config/tests/type.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/type.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/type.test.js +272 -0
- package/dist/internal/domain/config/tests/type.test.js.map +1 -0
- package/dist/internal/domain/config/tests/vo-module.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/vo-module.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/vo-module.test.js +267 -0
- package/dist/internal/domain/config/tests/vo-module.test.js.map +1 -0
- package/dist/internal/domain/config/tests/vo-root.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/vo-root.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/vo-root.test.js +165 -0
- package/dist/internal/domain/config/tests/vo-root.test.js.map +1 -0
- package/dist/internal/domain/config/tests/vo-service.test.d.ts +2 -0
- package/dist/internal/domain/config/tests/vo-service.test.d.ts.map +1 -0
- package/dist/internal/domain/config/tests/vo-service.test.js +266 -0
- package/dist/internal/domain/config/tests/vo-service.test.js.map +1 -0
- package/dist/internal/domain/content/factory/hub.js +1 -1
- package/dist/internal/domain/content/factory/hub.js.map +1 -1
- package/dist/internal/domain/content/type.d.ts +2 -1
- package/dist/internal/domain/content/type.d.ts.map +1 -1
- package/dist/internal/domain/content/type.js.map +1 -1
- package/dist/internal/domain/fs/entity/overlayfs.js +1 -1
- package/dist/internal/domain/fs/entity/overlayfs.js.map +1 -1
- package/dist/internal/domain/fs/tests/entity-basefs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-basefs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-basefs.test.js +279 -0
- package/dist/internal/domain/fs/tests/entity-basefs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/entity-fs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-fs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-fs.test.js +230 -0
- package/dist/internal/domain/fs/tests/entity-fs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/entity-originfs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-originfs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-originfs.test.js +47 -0
- package/dist/internal/domain/fs/tests/entity-originfs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/entity-overlaydir.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-overlaydir.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-overlaydir.test.js +293 -0
- package/dist/internal/domain/fs/tests/entity-overlaydir.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/entity-overlayfs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-overlayfs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-overlayfs.test.js +281 -0
- package/dist/internal/domain/fs/tests/entity-overlayfs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/entity-service.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/entity-service.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/entity-service.test.js +43 -0
- package/dist/internal/domain/fs/tests/entity-service.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/factory-fs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/factory-fs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/factory-fs.test.js +105 -0
- package/dist/internal/domain/fs/tests/factory-fs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/type.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/type.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/type.test.js +113 -0
- package/dist/internal/domain/fs/tests/type.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-dir.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-dir.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-dir.test.js +211 -0
- package/dist/internal/domain/fs/tests/vo-dir.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-file.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-file.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-file.test.js +256 -0
- package/dist/internal/domain/fs/tests/vo-file.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-fileinfo.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-fileinfo.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-fileinfo.test.js +165 -0
- package/dist/internal/domain/fs/tests/vo-fileinfo.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filemeta.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-filemeta.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filemeta.test.js +171 -0
- package/dist/internal/domain/fs/tests/vo-filemeta.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filesystemscollector.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-filesystemscollector.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filesystemscollector.test.js +298 -0
- package/dist/internal/domain/fs/tests/vo-filesystemscollector.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filevitural.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-filevitural.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-filevitural.test.js +167 -0
- package/dist/internal/domain/fs/tests/vo-filevitural.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-incremental-file-collector.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-incremental-file-collector.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-incremental-file-collector.test.js +396 -0
- package/dist/internal/domain/fs/tests/vo-incremental-file-collector.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-osfs.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-osfs.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-osfs.test.js +363 -0
- package/dist/internal/domain/fs/tests/vo-osfs.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-overlayfs-factory.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-overlayfs-factory.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-overlayfs-factory.test.js +430 -0
- package/dist/internal/domain/fs/tests/vo-overlayfs-factory.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-overlayoptions.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-overlayoptions.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-overlayoptions.test.js +402 -0
- package/dist/internal/domain/fs/tests/vo-overlayoptions.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-static-copier.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-static-copier.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-static-copier.test.js +320 -0
- package/dist/internal/domain/fs/tests/vo-static-copier.test.js.map +1 -0
- package/dist/internal/domain/fs/tests/vo-walkway.test.d.ts +2 -0
- package/dist/internal/domain/fs/tests/vo-walkway.test.d.ts.map +1 -0
- package/dist/internal/domain/fs/tests/vo-walkway.test.js +295 -0
- package/dist/internal/domain/fs/tests/vo-walkway.test.js.map +1 -0
- package/dist/internal/domain/markdown/entity/markdown.d.ts +0 -21
- package/dist/internal/domain/markdown/entity/markdown.d.ts.map +1 -1
- package/dist/internal/domain/markdown/entity/markdown.js +2 -35
- package/dist/internal/domain/markdown/entity/markdown.js.map +1 -1
- package/dist/internal/domain/markdown/factory/markdown.d.ts +2 -38
- package/dist/internal/domain/markdown/factory/markdown.d.ts.map +1 -1
- package/dist/internal/domain/markdown/factory/markdown.js +2 -70
- package/dist/internal/domain/markdown/factory/markdown.js.map +1 -1
- package/dist/internal/domain/markdown/index.d.ts +0 -3
- package/dist/internal/domain/markdown/index.d.ts.map +1 -1
- package/dist/internal/domain/markdown/index.js +0 -3
- package/dist/internal/domain/markdown/index.js.map +1 -1
- package/dist/internal/domain/markdown/type.d.ts +1 -16
- package/dist/internal/domain/markdown/type.d.ts.map +1 -1
- package/dist/internal/domain/markdown/type.js.map +1 -1
- package/dist/internal/domain/markdown/vo/parserresult.d.ts +1 -60
- package/dist/internal/domain/markdown/vo/parserresult.d.ts.map +1 -1
- package/dist/internal/domain/markdown/vo/parserresult.js +1 -174
- package/dist/internal/domain/markdown/vo/parserresult.js.map +1 -1
- package/dist/internal/domain/paths/test/pathoperations.test.js +1 -1
- package/dist/internal/domain/paths/test/pathoperations.test.js.map +1 -1
- package/dist/internal/domain/template/vo/registry.d.ts.map +1 -1
- package/dist/internal/domain/template/vo/registry.js +33 -0
- package/dist/internal/domain/template/vo/registry.js.map +1 -1
- package/dist/pkg/log/manager.js +1 -1
- package/package.json +2 -25
- package/dist/internal/application/test-incremental-ssg.d.ts +0 -9
- package/dist/internal/application/test-incremental-ssg.d.ts.map +0 -1
- package/dist/internal/application/test-incremental-ssg.js +0 -83
- package/dist/internal/application/test-incremental-ssg.js.map +0 -1
- package/dist/internal/application/test-ssg.d.ts +0 -8
- package/dist/internal/application/test-ssg.d.ts.map +0 -1
- package/dist/internal/application/test-ssg.js +0 -30
- package/dist/internal/application/test-ssg.js.map +0 -1
- package/dist/internal/domain/markdown/test/external-adapter.test.d.ts +0 -2
- package/dist/internal/domain/markdown/test/external-adapter.test.d.ts.map +0 -1
- package/dist/internal/domain/markdown/test/external-adapter.test.js +0 -150
- package/dist/internal/domain/markdown/test/external-adapter.test.js.map +0 -1
- package/dist/internal/domain/markdown/test/markdown.test.d.ts +0 -2
- package/dist/internal/domain/markdown/test/markdown.test.d.ts.map +0 -1
- package/dist/internal/domain/markdown/test/markdown.test.js +0 -88
- package/dist/internal/domain/markdown/test/markdown.test.js.map +0 -1
- package/dist/internal/domain/markdown/vo/externaladapter.d.ts +0 -63
- package/dist/internal/domain/markdown/vo/externaladapter.d.ts.map +0 -1
- package/dist/internal/domain/markdown/vo/externaladapter.js +0 -194
- package/dist/internal/domain/markdown/vo/externaladapter.js.map +0 -1
- package/dist/internal/domain/markdown/vo/markdownit.d.ts +0 -33
- package/dist/internal/domain/markdown/vo/markdownit.d.ts.map +0 -1
- package/dist/internal/domain/markdown/vo/markdownit.js +0 -175
- package/dist/internal/domain/markdown/vo/markdownit.js.map +0 -1
- package/dist/pkg/web/server/example.d.ts +0 -2
- package/dist/pkg/web/server/example.d.ts.map +0 -1
- package/dist/pkg/web/server/example.js +0 -43
- package/dist/pkg/web/server/example.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const file_1 = require("../vo/file");
|
|
4
|
+
// Mock dependencies
|
|
5
|
+
jest.mock('../vo/filemeta');
|
|
6
|
+
jest.mock('../vo/fileinfo');
|
|
7
|
+
// Mock the factory functions
|
|
8
|
+
jest.mock('../vo/fileinfo', () => ({
|
|
9
|
+
...jest.requireActual('../vo/fileinfo'),
|
|
10
|
+
newFileInfo: jest.fn(),
|
|
11
|
+
}));
|
|
12
|
+
jest.mock('../vo/filemeta', () => ({
|
|
13
|
+
...jest.requireActual('../vo/filemeta'),
|
|
14
|
+
newFileMeta: jest.fn(),
|
|
15
|
+
}));
|
|
16
|
+
describe('File Value Object', () => {
|
|
17
|
+
let mockFile;
|
|
18
|
+
let mockFileMeta;
|
|
19
|
+
let mockFs;
|
|
20
|
+
let file;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
mockFile = {
|
|
23
|
+
close: jest.fn(),
|
|
24
|
+
read: jest.fn(),
|
|
25
|
+
readAt: jest.fn(),
|
|
26
|
+
seek: jest.fn(),
|
|
27
|
+
write: jest.fn(),
|
|
28
|
+
writeAt: jest.fn(),
|
|
29
|
+
name: jest.fn().mockReturnValue('/test/file.txt'),
|
|
30
|
+
readdir: jest.fn(),
|
|
31
|
+
readdirnames: jest.fn(),
|
|
32
|
+
stat: jest.fn(),
|
|
33
|
+
sync: jest.fn(),
|
|
34
|
+
truncate: jest.fn(),
|
|
35
|
+
writeString: jest.fn(),
|
|
36
|
+
};
|
|
37
|
+
mockFileMeta = {
|
|
38
|
+
fileName: jest.fn().mockReturnValue('/test/file.txt'),
|
|
39
|
+
relativeFilename: jest.fn().mockReturnValue('/file.txt'),
|
|
40
|
+
component: jest.fn().mockReturnValue('content'),
|
|
41
|
+
root: jest.fn().mockReturnValue('/test'),
|
|
42
|
+
};
|
|
43
|
+
mockFs = {
|
|
44
|
+
name: jest.fn().mockReturnValue('MockFs'),
|
|
45
|
+
stat: jest.fn(),
|
|
46
|
+
};
|
|
47
|
+
file = new file_1.File(mockFile, mockFileMeta, mockFs);
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
jest.clearAllMocks();
|
|
51
|
+
});
|
|
52
|
+
describe('constructor', () => {
|
|
53
|
+
it('should initialize with file, metadata, and filesystem', () => {
|
|
54
|
+
expect(file.file).toBe(mockFile);
|
|
55
|
+
expect(file.fileMeta).toBe(mockFileMeta);
|
|
56
|
+
expect(file.fs).toBe(mockFs);
|
|
57
|
+
expect(file._isDir).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
it('should initialize as directory when specified', () => {
|
|
60
|
+
const dirFile = new file_1.File(mockFile, mockFileMeta, mockFs, true);
|
|
61
|
+
expect(dirFile._isDir).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('should handle null file (no-op file)', () => {
|
|
64
|
+
const nopFile = new file_1.File(null, mockFileMeta, mockFs);
|
|
65
|
+
expect(nopFile.file).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('isNop', () => {
|
|
69
|
+
it('should return false for regular file', () => {
|
|
70
|
+
expect(file.isNop()).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('should return true for null file', () => {
|
|
73
|
+
const nopFile = new file_1.File(null, mockFileMeta, mockFs);
|
|
74
|
+
expect(nopFile.isNop()).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('meta', () => {
|
|
78
|
+
it('should return file metadata', () => {
|
|
79
|
+
const result = file.meta();
|
|
80
|
+
expect(result).toBe(mockFileMeta);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('close', () => {
|
|
84
|
+
it('should close underlying file', async () => {
|
|
85
|
+
await file.close();
|
|
86
|
+
expect(mockFile.close).toHaveBeenCalledTimes(1);
|
|
87
|
+
});
|
|
88
|
+
it('should handle no-op file close', async () => {
|
|
89
|
+
const nopFile = new file_1.File(null, mockFileMeta, mockFs);
|
|
90
|
+
await expect(nopFile.close()).resolves.toBeUndefined();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('readDir', () => {
|
|
94
|
+
it('should read directory entries when file is directory', async () => {
|
|
95
|
+
const dirFile = new file_1.File(mockFile, mockFileMeta, mockFs, true);
|
|
96
|
+
const mockFileInfos = [
|
|
97
|
+
{ name: () => 'file1.txt', isDir: () => false },
|
|
98
|
+
{ name: () => 'file2.txt', isDir: () => false },
|
|
99
|
+
];
|
|
100
|
+
const mockWrappedFileInfos = [
|
|
101
|
+
{ fileName: () => 'file1.txt', setMeta: jest.fn() },
|
|
102
|
+
{ fileName: () => 'file2.txt', setMeta: jest.fn() },
|
|
103
|
+
];
|
|
104
|
+
const mockNewFileMeta = {
|
|
105
|
+
merge: jest.fn(),
|
|
106
|
+
};
|
|
107
|
+
mockFile.readdir.mockResolvedValue(mockFileInfos);
|
|
108
|
+
const { newFileInfo } = require('../vo/fileinfo');
|
|
109
|
+
const { newFileMeta } = require('../vo/filemeta');
|
|
110
|
+
newFileMeta.mockReturnValue(mockNewFileMeta);
|
|
111
|
+
newFileInfo
|
|
112
|
+
.mockReturnValueOnce(mockWrappedFileInfos[0])
|
|
113
|
+
.mockReturnValueOnce(mockWrappedFileInfos[1]);
|
|
114
|
+
const result = await dirFile.readDir(2);
|
|
115
|
+
expect(mockFile.readdir).toHaveBeenCalledWith(2);
|
|
116
|
+
expect(newFileInfo).toHaveBeenCalledTimes(2);
|
|
117
|
+
expect(mockNewFileMeta.merge).toHaveBeenCalledTimes(2);
|
|
118
|
+
expect(result).toEqual(mockWrappedFileInfos);
|
|
119
|
+
});
|
|
120
|
+
it('should return empty array when not a directory', async () => {
|
|
121
|
+
const result = await file.readDir(2);
|
|
122
|
+
expect(result).toEqual([]);
|
|
123
|
+
});
|
|
124
|
+
it('should return empty array for no-op file', async () => {
|
|
125
|
+
const nopFile = new file_1.File(null, mockFileMeta, mockFs, true);
|
|
126
|
+
const result = await nopFile.readDir(2);
|
|
127
|
+
expect(result).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('File interface delegation', () => {
|
|
131
|
+
it('should delegate read to underlying file', async () => {
|
|
132
|
+
const buffer = new Uint8Array(10);
|
|
133
|
+
const expectedResult = { bytesRead: 5, buffer };
|
|
134
|
+
mockFile.read.mockResolvedValue(expectedResult);
|
|
135
|
+
const result = await file.read(buffer);
|
|
136
|
+
expect(mockFile.read).toHaveBeenCalledWith(buffer);
|
|
137
|
+
expect(result).toEqual(expectedResult);
|
|
138
|
+
});
|
|
139
|
+
it('should delegate readAt to underlying file', async () => {
|
|
140
|
+
const buffer = new Uint8Array(10);
|
|
141
|
+
const expectedResult = { bytesRead: 5, buffer };
|
|
142
|
+
mockFile.readAt.mockResolvedValue(expectedResult);
|
|
143
|
+
const result = await file.readAt(buffer, 100);
|
|
144
|
+
expect(mockFile.readAt).toHaveBeenCalledWith(buffer, 100);
|
|
145
|
+
expect(result).toEqual(expectedResult);
|
|
146
|
+
});
|
|
147
|
+
it('should delegate seek to underlying file', async () => {
|
|
148
|
+
mockFile.seek.mockResolvedValue(200);
|
|
149
|
+
const result = await file.seek(100, 1);
|
|
150
|
+
expect(mockFile.seek).toHaveBeenCalledWith(100, 1);
|
|
151
|
+
expect(result).toBe(200);
|
|
152
|
+
});
|
|
153
|
+
it('should delegate write to underlying file', async () => {
|
|
154
|
+
const buffer = new Uint8Array([1, 2, 3]);
|
|
155
|
+
const expectedResult = { bytesWritten: 3, buffer };
|
|
156
|
+
mockFile.write.mockResolvedValue(expectedResult);
|
|
157
|
+
const result = await file.write(buffer);
|
|
158
|
+
expect(mockFile.write).toHaveBeenCalledWith(buffer);
|
|
159
|
+
expect(result).toEqual(expectedResult);
|
|
160
|
+
});
|
|
161
|
+
it('should delegate writeAt to underlying file', async () => {
|
|
162
|
+
const buffer = new Uint8Array([1, 2, 3]);
|
|
163
|
+
const expectedResult = { bytesWritten: 3, buffer };
|
|
164
|
+
mockFile.writeAt.mockResolvedValue(expectedResult);
|
|
165
|
+
const result = await file.writeAt(buffer, 100);
|
|
166
|
+
expect(mockFile.writeAt).toHaveBeenCalledWith(buffer, 100);
|
|
167
|
+
expect(result).toEqual(expectedResult);
|
|
168
|
+
});
|
|
169
|
+
it('should get name from file metadata', () => {
|
|
170
|
+
const result = file.name();
|
|
171
|
+
expect(mockFileMeta.fileName).toHaveBeenCalled();
|
|
172
|
+
expect(result).toBe('file.txt'); // basename of '/test/file.txt'
|
|
173
|
+
});
|
|
174
|
+
it('should delegate readdir to readDir method', async () => {
|
|
175
|
+
const mockFileInfos = [{ name: () => 'test.txt' }];
|
|
176
|
+
// Mock the readDir method instead
|
|
177
|
+
const readDirSpy = jest.spyOn(file, 'readDir').mockResolvedValue([]);
|
|
178
|
+
const result = await file.readdir(10);
|
|
179
|
+
expect(readDirSpy).toHaveBeenCalledWith(10);
|
|
180
|
+
readDirSpy.mockRestore();
|
|
181
|
+
});
|
|
182
|
+
it('should delegate readdirnames to underlying file', async () => {
|
|
183
|
+
const expectedNames = ['file1.txt', 'file2.txt'];
|
|
184
|
+
mockFile.readdirnames.mockResolvedValue(expectedNames);
|
|
185
|
+
const result = await file.readdirnames(10);
|
|
186
|
+
expect(mockFile.readdirnames).toHaveBeenCalledWith(10);
|
|
187
|
+
expect(result).toEqual(expectedNames);
|
|
188
|
+
});
|
|
189
|
+
it('should delegate stat to underlying file', async () => {
|
|
190
|
+
const mockFileInfo = { name: () => 'test.txt' };
|
|
191
|
+
mockFile.stat.mockResolvedValue(mockFileInfo);
|
|
192
|
+
const result = await file.stat();
|
|
193
|
+
expect(mockFile.stat).toHaveBeenCalledTimes(1);
|
|
194
|
+
expect(result).toEqual(mockFileInfo);
|
|
195
|
+
});
|
|
196
|
+
it('should delegate sync to underlying file', async () => {
|
|
197
|
+
await file.sync();
|
|
198
|
+
expect(mockFile.sync).toHaveBeenCalledTimes(1);
|
|
199
|
+
});
|
|
200
|
+
it('should delegate truncate to underlying file', async () => {
|
|
201
|
+
await file.truncate(100);
|
|
202
|
+
expect(mockFile.truncate).toHaveBeenCalledWith(100);
|
|
203
|
+
});
|
|
204
|
+
it('should delegate writeString to underlying file', async () => {
|
|
205
|
+
const expectedResult = { bytesWritten: 11 };
|
|
206
|
+
mockFile.writeString.mockResolvedValue(expectedResult);
|
|
207
|
+
const result = await file.writeString('Hello World');
|
|
208
|
+
expect(mockFile.writeString).toHaveBeenCalledWith('Hello World');
|
|
209
|
+
expect(result).toEqual(expectedResult);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('no-op file behavior', () => {
|
|
213
|
+
let nopFile;
|
|
214
|
+
beforeEach(() => {
|
|
215
|
+
nopFile = new file_1.File(null, mockFileMeta, mockFs);
|
|
216
|
+
});
|
|
217
|
+
it('should throw error for read on no-op file', async () => {
|
|
218
|
+
const buffer = new Uint8Array(10);
|
|
219
|
+
await expect(nopFile.read(buffer)).rejects.toThrow('File is null');
|
|
220
|
+
});
|
|
221
|
+
it('should throw error for write on no-op file', async () => {
|
|
222
|
+
const buffer = new Uint8Array([1, 2, 3]);
|
|
223
|
+
await expect(nopFile.write(buffer)).rejects.toThrow('File is null');
|
|
224
|
+
});
|
|
225
|
+
it('should handle name for no-op file', () => {
|
|
226
|
+
const result = nopFile.name();
|
|
227
|
+
expect(result).toBe('file.txt'); // From mockFileMeta.fileName()
|
|
228
|
+
expect(mockFileMeta.fileName).toHaveBeenCalled();
|
|
229
|
+
});
|
|
230
|
+
it('should throw error for stat on no-op file', async () => {
|
|
231
|
+
await expect(nopFile.stat()).rejects.toThrow('File is null');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('factory functions', () => {
|
|
235
|
+
it('should create File with newFile', () => {
|
|
236
|
+
const result = (0, file_1.newFile)(mockFile, '/test/file.txt', mockFs);
|
|
237
|
+
expect(result).toBeInstanceOf(file_1.File);
|
|
238
|
+
});
|
|
239
|
+
it('should create File with newFileWithMeta', () => {
|
|
240
|
+
const result = (0, file_1.newFileWithMeta)(mockFile, mockFileMeta, mockFs);
|
|
241
|
+
expect(result).toBeInstanceOf(file_1.File);
|
|
242
|
+
expect(result.meta()).toBe(mockFileMeta);
|
|
243
|
+
});
|
|
244
|
+
it('should create directory File with newDirFileWithMeta', () => {
|
|
245
|
+
const result = (0, file_1.newDirFileWithMeta)(mockFile, mockFileMeta, mockFs);
|
|
246
|
+
expect(result).toBeInstanceOf(file_1.File);
|
|
247
|
+
expect(result._isDir).toBe(true);
|
|
248
|
+
});
|
|
249
|
+
it('should handle null file in factory functions', () => {
|
|
250
|
+
const result = (0, file_1.newFileWithMeta)(null, mockFileMeta, mockFs);
|
|
251
|
+
expect(result).toBeInstanceOf(file_1.File);
|
|
252
|
+
expect(result.isNop()).toBe(true);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=vo-file.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vo-file.test.js","sourceRoot":"","sources":["../../../../../internal/domain/fs/tests/vo-file.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vo-fileinfo.test.d.ts","sourceRoot":"","sources":["../../../../../internal/domain/fs/tests/vo-fileinfo.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fileinfo_1 = require("../vo/fileinfo");
|
|
4
|
+
// Mock dependencies
|
|
5
|
+
jest.mock('../vo/filemeta');
|
|
6
|
+
describe('FileInfo Value Object', () => {
|
|
7
|
+
let mockFileInfo;
|
|
8
|
+
let mockFileMeta;
|
|
9
|
+
let fileInfo;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
mockFileInfo = {
|
|
12
|
+
name: jest.fn().mockReturnValue('test.txt'),
|
|
13
|
+
size: jest.fn().mockReturnValue(100),
|
|
14
|
+
mode: jest.fn().mockReturnValue(0o644),
|
|
15
|
+
modTime: jest.fn().mockReturnValue(new Date('2023-01-01')),
|
|
16
|
+
isDir: jest.fn().mockReturnValue(false),
|
|
17
|
+
sys: jest.fn().mockReturnValue(null),
|
|
18
|
+
};
|
|
19
|
+
mockFileMeta = {
|
|
20
|
+
fileName: jest.fn().mockReturnValue('test.txt'),
|
|
21
|
+
relativeFilename: jest.fn().mockReturnValue('/test.txt'),
|
|
22
|
+
component: jest.fn().mockReturnValue('content'),
|
|
23
|
+
root: jest.fn().mockReturnValue('/root'),
|
|
24
|
+
open: jest.fn().mockResolvedValue({}),
|
|
25
|
+
merge: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
fileInfo = new fileinfo_1.FileInfo(mockFileInfo, mockFileMeta);
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
jest.clearAllMocks();
|
|
31
|
+
});
|
|
32
|
+
describe('constructor', () => {
|
|
33
|
+
it('should initialize with FileInfo and FileMeta', () => {
|
|
34
|
+
expect(fileInfo.fileInfo).toBe(mockFileInfo);
|
|
35
|
+
expect(fileInfo._fileMeta).toBe(mockFileMeta);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('meta', () => {
|
|
39
|
+
it('should return the FileMeta instance', () => {
|
|
40
|
+
const result = fileInfo.meta();
|
|
41
|
+
expect(result).toBe(mockFileMeta);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('type', () => {
|
|
45
|
+
it('should return the file mode from underlying FileInfo', () => {
|
|
46
|
+
const result = fileInfo.type();
|
|
47
|
+
expect(result).toBe(0o644);
|
|
48
|
+
expect(mockFileInfo.mode).toHaveBeenCalledTimes(1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('info', () => {
|
|
52
|
+
it('should return the underlying FileInfo', () => {
|
|
53
|
+
const result = fileInfo.info();
|
|
54
|
+
expect(result).toBe(mockFileInfo);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('setMeta', () => {
|
|
58
|
+
it('should set the FileMeta instance', () => {
|
|
59
|
+
const newMeta = {};
|
|
60
|
+
fileInfo.setMeta(newMeta);
|
|
61
|
+
expect(fileInfo.meta()).toBe(newMeta);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('FileInfo interface methods', () => {
|
|
65
|
+
it('should delegate name to underlying FileInfo', () => {
|
|
66
|
+
const result = fileInfo.name();
|
|
67
|
+
expect(result).toBe('test.txt');
|
|
68
|
+
expect(mockFileInfo.name).toHaveBeenCalledTimes(1);
|
|
69
|
+
});
|
|
70
|
+
it('should delegate size to underlying FileInfo', () => {
|
|
71
|
+
const result = fileInfo.size();
|
|
72
|
+
expect(result).toBe(100);
|
|
73
|
+
expect(mockFileInfo.size).toHaveBeenCalledTimes(1);
|
|
74
|
+
});
|
|
75
|
+
it('should delegate mode to underlying FileInfo', () => {
|
|
76
|
+
const result = fileInfo.mode();
|
|
77
|
+
expect(result).toBe(0o644);
|
|
78
|
+
expect(mockFileInfo.mode).toHaveBeenCalledTimes(1);
|
|
79
|
+
});
|
|
80
|
+
it('should delegate modTime to underlying FileInfo', () => {
|
|
81
|
+
const result = fileInfo.modTime();
|
|
82
|
+
expect(result).toEqual(new Date('2023-01-01'));
|
|
83
|
+
expect(mockFileInfo.modTime).toHaveBeenCalledTimes(1);
|
|
84
|
+
});
|
|
85
|
+
it('should delegate isDir to underlying FileInfo', () => {
|
|
86
|
+
const result = fileInfo.isDir();
|
|
87
|
+
expect(result).toBe(false);
|
|
88
|
+
expect(mockFileInfo.isDir).toHaveBeenCalledTimes(1);
|
|
89
|
+
});
|
|
90
|
+
it('should delegate sys to underlying FileInfo', () => {
|
|
91
|
+
const result = fileInfo.sys();
|
|
92
|
+
expect(result).toBeNull();
|
|
93
|
+
expect(mockFileInfo.sys).toHaveBeenCalledTimes(1);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('FileMetaInfo interface methods', () => {
|
|
97
|
+
it('should delegate fileName to FileMeta', () => {
|
|
98
|
+
const result = fileInfo.fileName();
|
|
99
|
+
expect(result).toBe('test.txt');
|
|
100
|
+
expect(mockFileMeta.fileName).toHaveBeenCalledTimes(1);
|
|
101
|
+
});
|
|
102
|
+
it('should delegate relativeFilename to FileMeta', () => {
|
|
103
|
+
const result = fileInfo.relativeFilename();
|
|
104
|
+
expect(result).toBe('/test.txt');
|
|
105
|
+
expect(mockFileMeta.relativeFilename).toHaveBeenCalledTimes(1);
|
|
106
|
+
});
|
|
107
|
+
it('should delegate component to FileMeta', () => {
|
|
108
|
+
const result = fileInfo.component();
|
|
109
|
+
expect(result).toBe('content');
|
|
110
|
+
expect(mockFileMeta.component).toHaveBeenCalledTimes(1);
|
|
111
|
+
});
|
|
112
|
+
it('should delegate root to FileMeta', () => {
|
|
113
|
+
const result = fileInfo.root();
|
|
114
|
+
expect(result).toBe('/root');
|
|
115
|
+
expect(mockFileMeta.root).toHaveBeenCalledTimes(1);
|
|
116
|
+
});
|
|
117
|
+
it('should delegate open to FileMeta', async () => {
|
|
118
|
+
const mockFile = {};
|
|
119
|
+
mockFileMeta.open.mockResolvedValue(mockFile);
|
|
120
|
+
const result = await fileInfo.open();
|
|
121
|
+
expect(result).toBe(mockFile);
|
|
122
|
+
expect(mockFileMeta.open).toHaveBeenCalledTimes(1);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('newFileInfo factory function', () => {
|
|
126
|
+
it('should create FileInfo with new FileMeta', () => {
|
|
127
|
+
const mockNewFileMeta = {};
|
|
128
|
+
const { newFileMeta } = require('../vo/filemeta');
|
|
129
|
+
newFileMeta.mockReturnValue(mockNewFileMeta);
|
|
130
|
+
const result = (0, fileinfo_1.newFileInfo)(mockFileInfo, 'test.txt');
|
|
131
|
+
expect(newFileMeta).toHaveBeenCalledWith('test.txt');
|
|
132
|
+
expect(result).toBeInstanceOf(fileinfo_1.FileInfo);
|
|
133
|
+
expect(result.fileInfo).toBe(mockFileInfo);
|
|
134
|
+
expect(result.meta()).toBe(mockNewFileMeta);
|
|
135
|
+
});
|
|
136
|
+
it('should merge meta when FileInfo implements MetaProvider', () => {
|
|
137
|
+
const mockNewFileMeta = { merge: jest.fn() };
|
|
138
|
+
const mockMetaProvider = {
|
|
139
|
+
...mockFileInfo,
|
|
140
|
+
meta: jest.fn().mockReturnValue({ test: 'meta' }),
|
|
141
|
+
};
|
|
142
|
+
const { newFileMeta } = require('../vo/filemeta');
|
|
143
|
+
newFileMeta.mockReturnValue(mockNewFileMeta);
|
|
144
|
+
const result = (0, fileinfo_1.newFileInfo)(mockMetaProvider, 'test.txt');
|
|
145
|
+
expect(mockNewFileMeta.merge).toHaveBeenCalledWith({ test: 'meta' });
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('newFileInfoWithMeta factory function', () => {
|
|
149
|
+
it('should create FileInfo with provided FileMeta', () => {
|
|
150
|
+
const result = (0, fileinfo_1.newFileInfoWithMeta)(mockFileInfo, mockFileMeta);
|
|
151
|
+
expect(result).toBeInstanceOf(fileinfo_1.FileInfo);
|
|
152
|
+
expect(result.fileInfo).toBe(mockFileInfo);
|
|
153
|
+
expect(result.meta()).toBe(mockFileMeta);
|
|
154
|
+
});
|
|
155
|
+
it('should merge meta when FileInfo implements MetaProvider', () => {
|
|
156
|
+
const mockMetaProvider = {
|
|
157
|
+
...mockFileInfo,
|
|
158
|
+
meta: jest.fn().mockReturnValue({ test: 'meta' }),
|
|
159
|
+
};
|
|
160
|
+
const result = (0, fileinfo_1.newFileInfoWithMeta)(mockMetaProvider, mockFileMeta);
|
|
161
|
+
expect(mockFileMeta.merge).toHaveBeenCalledWith({ test: 'meta' });
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=vo-fileinfo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vo-fileinfo.test.js","sourceRoot":"","sources":["../../../../../internal/domain/fs/tests/vo-fileinfo.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vo-filemeta.test.d.ts","sourceRoot":"","sources":["../../../../../internal/domain/fs/tests/vo-filemeta.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const filemeta_1 = require("../vo/filemeta");
|
|
4
|
+
// Mock dependencies
|
|
5
|
+
jest.mock('@internal/domain/paths', () => ({
|
|
6
|
+
PATH_CONSTANTS: {
|
|
7
|
+
SYSTEM_PATH_SEPARATOR: '/',
|
|
8
|
+
},
|
|
9
|
+
}));
|
|
10
|
+
describe('FileMeta Value Object', () => {
|
|
11
|
+
let fileMeta;
|
|
12
|
+
let mockFileOpener;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
mockFileOpener = jest.fn().mockResolvedValue({});
|
|
15
|
+
fileMeta = new filemeta_1.FileMeta('/path/to/file.txt', mockFileOpener);
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
jest.clearAllMocks();
|
|
19
|
+
});
|
|
20
|
+
describe('constructor', () => {
|
|
21
|
+
it('should initialize with filename and openFunc', () => {
|
|
22
|
+
expect(fileMeta.fileName()).toBe('/path/to/file.txt');
|
|
23
|
+
expect(fileMeta.openFunc).toBe(mockFileOpener);
|
|
24
|
+
});
|
|
25
|
+
it('should initialize with default values when no parameters provided', () => {
|
|
26
|
+
const emptyMeta = new filemeta_1.FileMeta();
|
|
27
|
+
expect(emptyMeta.fileName()).toBe('');
|
|
28
|
+
expect(emptyMeta.component()).toBe('');
|
|
29
|
+
expect(emptyMeta.root()).toBe('');
|
|
30
|
+
expect(emptyMeta.openFunc).toBeNull();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('fileName', () => {
|
|
34
|
+
it('should return the filename', () => {
|
|
35
|
+
expect(fileMeta.fileName()).toBe('/path/to/file.txt');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('relativeFilename', () => {
|
|
39
|
+
it('should return filename when no component root is set', () => {
|
|
40
|
+
const result = fileMeta.relativeFilename();
|
|
41
|
+
expect(result).toBe('/path/to/file.txt');
|
|
42
|
+
});
|
|
43
|
+
it('should return relative path when component root is set', () => {
|
|
44
|
+
fileMeta.setComponentRoot('/path');
|
|
45
|
+
const result = fileMeta.relativeFilename();
|
|
46
|
+
expect(result).toBe('/to/file.txt');
|
|
47
|
+
});
|
|
48
|
+
it('should add leading separator when relative path does not start with separator', () => {
|
|
49
|
+
fileMeta.setFileName('/path/file.txt');
|
|
50
|
+
fileMeta.setComponentRoot('/path');
|
|
51
|
+
const result = fileMeta.relativeFilename();
|
|
52
|
+
expect(result).toBe('/file.txt');
|
|
53
|
+
});
|
|
54
|
+
it('should throw error when filename has no root', () => {
|
|
55
|
+
fileMeta.setComponentRoot('/different/root');
|
|
56
|
+
expect(() => fileMeta.relativeFilename()).toThrow('filename /path/to/file.txt has no root /different/root');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('component', () => {
|
|
60
|
+
it('should return the component directory', () => {
|
|
61
|
+
fileMeta.setComponentDir('content');
|
|
62
|
+
expect(fileMeta.component()).toBe('content');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('root', () => {
|
|
66
|
+
it('should return the component root', () => {
|
|
67
|
+
fileMeta.setComponentRoot('/root');
|
|
68
|
+
expect(fileMeta.root()).toBe('/root');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('open', () => {
|
|
72
|
+
it('should call openFunc when set', async () => {
|
|
73
|
+
const mockFile = {};
|
|
74
|
+
mockFileOpener.mockResolvedValue(mockFile);
|
|
75
|
+
const result = await fileMeta.open();
|
|
76
|
+
expect(mockFileOpener).toHaveBeenCalledTimes(1);
|
|
77
|
+
expect(result).toBe(mockFile);
|
|
78
|
+
});
|
|
79
|
+
it('should throw error when openFunc is not set', async () => {
|
|
80
|
+
const metaWithoutOpener = new filemeta_1.FileMeta('/test.txt', null);
|
|
81
|
+
await expect(metaWithoutOpener.open()).rejects.toThrow('OpenFunc not set');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('setter methods', () => {
|
|
85
|
+
it('should set filename', () => {
|
|
86
|
+
fileMeta.setFileName('/new/file.txt');
|
|
87
|
+
expect(fileMeta.fileName()).toBe('/new/file.txt');
|
|
88
|
+
});
|
|
89
|
+
it('should set component root', () => {
|
|
90
|
+
fileMeta.setComponentRoot('/new/root');
|
|
91
|
+
expect(fileMeta.root()).toBe('/new/root');
|
|
92
|
+
});
|
|
93
|
+
it('should set component directory', () => {
|
|
94
|
+
fileMeta.setComponentDir('layouts');
|
|
95
|
+
expect(fileMeta.component()).toBe('layouts');
|
|
96
|
+
});
|
|
97
|
+
it('should set open function', async () => {
|
|
98
|
+
const newOpener = jest.fn().mockResolvedValue({});
|
|
99
|
+
fileMeta.setOpenFunc(newOpener);
|
|
100
|
+
await fileMeta.open();
|
|
101
|
+
expect(newOpener).toHaveBeenCalledTimes(1);
|
|
102
|
+
expect(mockFileOpener).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('merge', () => {
|
|
106
|
+
let targetMeta;
|
|
107
|
+
let sourceMeta;
|
|
108
|
+
beforeEach(() => {
|
|
109
|
+
targetMeta = new filemeta_1.FileMeta();
|
|
110
|
+
sourceMeta = new filemeta_1.FileMeta('/source/file.txt');
|
|
111
|
+
sourceMeta.setComponentRoot('/source');
|
|
112
|
+
sourceMeta.setComponentDir('content');
|
|
113
|
+
sourceMeta.setOpenFunc(mockFileOpener);
|
|
114
|
+
});
|
|
115
|
+
it('should merge non-empty values from source to empty target', () => {
|
|
116
|
+
targetMeta.merge(sourceMeta);
|
|
117
|
+
expect(targetMeta.fileName()).toBe('/source/file.txt');
|
|
118
|
+
expect(targetMeta.root()).toBe('/source');
|
|
119
|
+
expect(targetMeta.component()).toBe('content');
|
|
120
|
+
expect(targetMeta.openFunc).toBe(mockFileOpener);
|
|
121
|
+
});
|
|
122
|
+
it('should not overwrite existing values in target', () => {
|
|
123
|
+
targetMeta.setFileName('/target/file.txt');
|
|
124
|
+
targetMeta.setComponentRoot('/target');
|
|
125
|
+
targetMeta.setComponentDir('layouts');
|
|
126
|
+
const targetOpener = jest.fn();
|
|
127
|
+
targetMeta.setOpenFunc(targetOpener);
|
|
128
|
+
targetMeta.merge(sourceMeta);
|
|
129
|
+
expect(targetMeta.fileName()).toBe('/target/file.txt');
|
|
130
|
+
expect(targetMeta.root()).toBe('/target');
|
|
131
|
+
expect(targetMeta.component()).toBe('layouts');
|
|
132
|
+
expect(targetMeta.openFunc).toBe(targetOpener);
|
|
133
|
+
});
|
|
134
|
+
it('should handle null/undefined source gracefully', () => {
|
|
135
|
+
const originalFilename = targetMeta.fileName();
|
|
136
|
+
targetMeta.merge(null);
|
|
137
|
+
targetMeta.merge(undefined);
|
|
138
|
+
expect(targetMeta.fileName()).toBe(originalFilename);
|
|
139
|
+
});
|
|
140
|
+
it('should merge only empty fields from source', () => {
|
|
141
|
+
targetMeta.setFileName('/target/file.txt');
|
|
142
|
+
// Leave other fields empty
|
|
143
|
+
targetMeta.merge(sourceMeta);
|
|
144
|
+
expect(targetMeta.fileName()).toBe('/target/file.txt'); // Not overwritten
|
|
145
|
+
expect(targetMeta.root()).toBe('/source'); // Merged
|
|
146
|
+
expect(targetMeta.component()).toBe('content'); // Merged
|
|
147
|
+
expect(targetMeta.openFunc).toBe(mockFileOpener); // Merged
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('newFileMeta factory function', () => {
|
|
151
|
+
it('should create FileMeta with filename and opener', () => {
|
|
152
|
+
const result = (0, filemeta_1.newFileMeta)('/test.txt', mockFileOpener);
|
|
153
|
+
expect(result).toBeInstanceOf(filemeta_1.FileMeta);
|
|
154
|
+
expect(result.fileName()).toBe('/test.txt');
|
|
155
|
+
expect(result.openFunc).toBe(mockFileOpener);
|
|
156
|
+
});
|
|
157
|
+
it('should create FileMeta with only filename', () => {
|
|
158
|
+
const result = (0, filemeta_1.newFileMeta)('/test.txt');
|
|
159
|
+
expect(result).toBeInstanceOf(filemeta_1.FileMeta);
|
|
160
|
+
expect(result.fileName()).toBe('/test.txt');
|
|
161
|
+
expect(result.openFunc).toBeNull();
|
|
162
|
+
});
|
|
163
|
+
it('should create empty FileMeta when no parameters provided', () => {
|
|
164
|
+
const result = (0, filemeta_1.newFileMeta)();
|
|
165
|
+
expect(result).toBeInstanceOf(filemeta_1.FileMeta);
|
|
166
|
+
expect(result.fileName()).toBe('');
|
|
167
|
+
expect(result.openFunc).toBeNull();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=vo-filemeta.test.js.map
|