mirror of https://github.com/allinssl/allinssl
165 lines
5.1 KiB
TypeScript
165 lines
5.1 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
import { createRenameTask, renameHelpers, batchRename } from '../src/modules/rename.js';
|
|
import { RenameConfig } from '../src/types.js';
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import { rimraf } from 'rimraf';
|
|
|
|
describe('rename module', () => {
|
|
const testDir = './test-temp/rename';
|
|
const srcDir = path.join(testDir, 'src');
|
|
const destDir = path.join(testDir, 'dest');
|
|
|
|
beforeEach(async () => {
|
|
// 创建测试目录和文件
|
|
await fs.promises.mkdir(srcDir, { recursive: true });
|
|
await fs.promises.mkdir(destDir, { recursive: true });
|
|
|
|
// 创建测试文件
|
|
await fs.promises.writeFile(path.join(srcDir, 'test1.js'), 'console.log("test1");');
|
|
await fs.promises.writeFile(path.join(srcDir, 'test2.js'), 'console.log("test2");');
|
|
await fs.promises.writeFile(path.join(srcDir, 'style.css'), '.test { color: red; }');
|
|
});
|
|
|
|
afterEach(async () => {
|
|
// 清理测试目录
|
|
await rimraf(testDir);
|
|
});
|
|
|
|
describe('createRenameTask', () => {
|
|
it('should rename files with string', async () => {
|
|
const config: RenameConfig = {
|
|
src: path.join(srcDir, '*.js'),
|
|
rename: 'bundle.js',
|
|
dest: destDir
|
|
};
|
|
|
|
const task = createRenameTask(config);
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
task((error?: Error) => {
|
|
if (error) reject(error);
|
|
else resolve();
|
|
});
|
|
});
|
|
|
|
// 检查文件是否被重命名
|
|
const files = await fs.promises.readdir(destDir);
|
|
expect(files).toContain('bundle.js');
|
|
});
|
|
|
|
it('should rename files with function', async () => {
|
|
const config: RenameConfig = {
|
|
src: path.join(srcDir, '*.js'),
|
|
rename: (path) => {
|
|
path.basename = path.basename + '.min';
|
|
},
|
|
dest: destDir
|
|
};
|
|
|
|
const task = createRenameTask(config);
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
task((error?: Error) => {
|
|
if (error) reject(error);
|
|
else resolve();
|
|
});
|
|
});
|
|
|
|
// 检查文件是否被重命名
|
|
const files = await fs.promises.readdir(destDir);
|
|
expect(files).toContain('test1.min.js');
|
|
expect(files).toContain('test2.min.js');
|
|
});
|
|
});
|
|
|
|
describe('renameHelpers', () => {
|
|
it('should add prefix correctly', () => {
|
|
const mockPath = { basename: 'test', extname: '.js' };
|
|
renameHelpers.addPrefix('prefix-')(mockPath);
|
|
expect(mockPath.basename).toBe('prefix-test');
|
|
});
|
|
|
|
it('should add suffix correctly', () => {
|
|
const mockPath = { basename: 'test', extname: '.js' };
|
|
renameHelpers.addSuffix('-suffix')(mockPath);
|
|
expect(mockPath.basename).toBe('test-suffix');
|
|
});
|
|
|
|
it('should change extension correctly', () => {
|
|
const mockPath = { basename: 'test', extname: '.js' };
|
|
renameHelpers.changeExtension('.min.js')(mockPath);
|
|
expect(mockPath.extname).toBe('.min.js');
|
|
});
|
|
|
|
it('should convert to lowercase', () => {
|
|
const mockPath = { basename: 'TEST', extname: '.js' };
|
|
renameHelpers.toLowerCase()(mockPath);
|
|
expect(mockPath.basename).toBe('test');
|
|
});
|
|
|
|
it('should convert to uppercase', () => {
|
|
const mockPath = { basename: 'test', extname: '.js' };
|
|
renameHelpers.toUpperCase()(mockPath);
|
|
expect(mockPath.basename).toBe('TEST');
|
|
});
|
|
|
|
it('should replace characters in name', () => {
|
|
const mockPath = { basename: 'old-name', extname: '.js' };
|
|
renameHelpers.replaceInName('old', 'new')(mockPath);
|
|
expect(mockPath.basename).toBe('new-name');
|
|
});
|
|
|
|
it('should add timestamp', () => {
|
|
const mockPath = { basename: 'test', extname: '.js' };
|
|
const originalBasename = mockPath.basename;
|
|
renameHelpers.addTimestamp()(mockPath);
|
|
|
|
expect(mockPath.basename).toMatch(new RegExp(`^${originalBasename}-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}`));
|
|
});
|
|
});
|
|
|
|
describe('batchRename', () => {
|
|
it('should handle multiple rename operations', async () => {
|
|
const configs: RenameConfig[] = [
|
|
{
|
|
src: path.join(srcDir, '*.js'),
|
|
rename: renameHelpers.addPrefix('js-'),
|
|
dest: destDir
|
|
},
|
|
{
|
|
src: path.join(srcDir, '*.css'),
|
|
rename: renameHelpers.addPrefix('css-'),
|
|
dest: destDir
|
|
}
|
|
];
|
|
|
|
const results = await batchRename(configs);
|
|
|
|
expect(results).toHaveLength(2);
|
|
expect(results[0].success).toBe(true);
|
|
expect(results[1].success).toBe(true);
|
|
|
|
const files = await fs.promises.readdir(destDir);
|
|
expect(files).toContain('js-test1.js');
|
|
expect(files).toContain('js-test2.js');
|
|
expect(files).toContain('css-style.css');
|
|
});
|
|
|
|
it('should handle errors gracefully', async () => {
|
|
const configs: RenameConfig[] = [
|
|
{
|
|
src: 'non-existent/**/*.js',
|
|
rename: 'test.js',
|
|
dest: '/invalid/path'
|
|
}
|
|
];
|
|
|
|
const results = await batchRename(configs);
|
|
|
|
expect(results).toHaveLength(1);
|
|
expect(results[0].success).toBe(false);
|
|
expect(results[0].error).toBeDefined();
|
|
});
|
|
});
|
|
}); |