Files
readest/apps/readest-app/src/__tests__/services/node-app-service.test.ts
T

95 lines
3.4 KiB
TypeScript

import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
import * as fsp from 'node:fs/promises';
import * as path from 'node:path';
import { NodeAppService } from '@/services/nodeAppService';
import { fsTests } from './suites/fs-tests';
import { libraryTests } from './suites/library-tests';
import { bookTests } from './suites/book-tests';
const FIXTURES_DIR = path.join(process.cwd(), 'src/__tests__/fixtures/data');
async function getBookFile(name: string): Promise<File> {
const buf = await fsp.readFile(path.join(FIXTURES_DIR, name));
return new File([buf], name);
}
const SANDBOX_DIR = path.join(process.cwd(), '.test-sandbox-node');
describe('NodeAppService', () => {
let tmpDir: string;
let service: NodeAppService;
beforeAll(async () => {
await fsp.mkdir(SANDBOX_DIR, { recursive: true });
});
afterAll(async () => {
await fsp.rm(SANDBOX_DIR, { recursive: true, force: true });
});
beforeEach(async () => {
tmpDir = await fsp.mkdtemp(path.join(SANDBOX_DIR, 'node-'));
service = new NodeAppService(tmpDir);
await service.init();
});
afterEach(async () => {
await fsp.rm(tmpDir, { recursive: true, force: true });
});
it('should copy files from absolute path', async () => {
const srcPath = path.join(tmpDir, 'source.txt');
await fsp.writeFile(srcPath, 'copy me');
await service.copyFile(srcPath, 'copied.txt', 'Data');
const content = await service.readFile('copied.txt', 'Data', 'text');
expect(content).toBe('copy me');
});
it('should save files via saveFile', async () => {
const filepath = path.join(tmpDir, 'saved.txt');
const result = await service.saveFile('saved.txt', 'saved content', filepath);
expect(result).toBe(true);
const content = await fsp.readFile(filepath, 'utf-8');
expect(content).toBe('saved content');
});
it('should set localBooksDir after init', () => {
expect(service.localBooksDir).toBe(path.join(tmpDir, 'Readest', 'Books'));
});
it('should resolve file paths correctly', async () => {
const resolved = await service.resolveFilePath('test.json', 'Books');
expect(resolved).toBe(path.join(tmpDir, 'Readest', 'Books', 'test.json'));
});
it('should resolve empty path to prefix', async () => {
const resolved = await service.resolveFilePath('', 'Data');
expect(resolved).toBe(path.join(tmpDir, 'Readest'));
});
it('should switch to new root via setCustomRootDir', async () => {
const newRoot = await fsp.mkdtemp(path.join(SANDBOX_DIR, 'custom-'));
try {
await service.setCustomRootDir(newRoot);
expect(service.localBooksDir).toBe(path.join(newRoot, 'Readest', 'Books'));
await service.writeFile('test.txt', 'Settings', 'settings data');
const content = await service.readFile('test.txt', 'Settings', 'text');
expect(content).toBe('settings data');
} finally {
await fsp.rm(newRoot, { recursive: true, force: true });
}
});
it('should use system dirs when no customRootDir', async () => {
const defaultService = new NodeAppService();
const settingsPrefix = await defaultService.resolveFilePath('', 'Settings');
expect(settingsPrefix).toBeTruthy();
expect(path.isAbsolute(settingsPrefix)).toBe(true);
expect(settingsPrefix.toLowerCase()).toContain('readest');
});
fsTests(() => service);
libraryTests(() => service);
bookTests(() => service, getBookFile);
});