Skip to content

Commit 29d2a6d

Browse files
committed
test(cli): add coverage for remaining migration tasks
1 parent 0e84af0 commit 29d2a6d

12 files changed

+258
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { GitIgnoreAddRuleTask } from '../src/migrate/runner/tasks/common/GitIgnoreAddRuleTask';
6+
7+
describe('GitIgnoreAddRuleTask', () => {
8+
it('adds rule to .gitignore', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const cwd = process.cwd();
11+
process.chdir(tmpDir);
12+
13+
const task = GitIgnoreAddRuleTask.getInstance('dist', '^1');
14+
task.run();
15+
16+
process.chdir(cwd);
17+
const content = fs.readFileSync(path.join(tmpDir, '.gitignore'), 'utf8');
18+
assert.ok(content.includes('dist'));
19+
});
20+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import assert from 'node:assert';
2+
import { HandleDependencyTask } from '../src/migrate/runner/tasks/common/HandleDependencyTask';
3+
4+
5+
describe('HandleDependencyTask', () => {
6+
it('calls package manager with dependencies', async () => {
7+
const childProc = require('child_process');
8+
const original = childProc.execSync;
9+
let commands: string[] = [];
10+
childProc.execSync = (cmd: string) => { commands.push(cmd); return Buffer.from(''); };
11+
12+
const task = HandleDependencyTask.getInstance('add', { lodash: '1.0.0' }, { mocha: '2.0.0' }, '^1');
13+
task.run();
14+
15+
childProc.execSync = original;
16+
assert.ok(commands[0].includes('add')); // first call
17+
assert.ok(commands[1].includes('-D'));
18+
});
19+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { JsonTask } from '../src/migrate/runner/tasks/common/JsonTask';
6+
7+
describe('JsonTask', () => {
8+
it('merges config into package.json', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const cwd = process.cwd();
11+
process.chdir(tmpDir);
12+
fs.writeFileSync('package.json', '{"name":"test"}');
13+
14+
const task = JsonTask.getInstance('scripts', { test: 'mocha' }, '^1');
15+
task.run();
16+
17+
process.chdir(cwd);
18+
const pkg = JSON.parse(fs.readFileSync(path.join(tmpDir, 'package.json'), 'utf8'));
19+
assert.equal(pkg.test, 'mocha');
20+
});
21+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { LabelExpertSlot } from '../src/migrate/runner/tasks/common/LabelExpertSlot';
6+
7+
describe('LabelExpertSlot', () => {
8+
it('moves inner text to _label property', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const htmlPath = path.join(tmpDir, 'sample.html');
11+
fs.writeFileSync(htmlPath, '<kol-input-text>My Label</kol-input-text>');
12+
13+
const task = LabelExpertSlot.getInstance('kol-input-text', '_label', '^1');
14+
task.run(tmpDir);
15+
16+
const content = fs.readFileSync(htmlPath, 'utf8');
17+
assert.ok(content.includes('_label="My Label"'));
18+
});
19+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { MarkRemovedSlotTask } from '../src/migrate/runner/tasks/common/MarkRemovedSlotTask';
6+
7+
describe('MarkRemovedSlotTask', () => {
8+
it('marks removed slot with attribute in components', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const tsxPath = path.join(tmpDir, 'component.tsx');
11+
fs.writeFileSync(tsxPath, '<KolCard slot="footer"></KolCard>');
12+
13+
const task = MarkRemovedSlotTask.getInstance('kol-card', 'footer', '^1');
14+
task.run(tmpDir);
15+
16+
const content = fs.readFileSync(tsxPath, 'utf8');
17+
assert.ok(content.includes('data-removed-slot="footer"'));
18+
});
19+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { MergeHtmlTask } from '../src/migrate/runner/tasks/common/MergeHtmlTask';
6+
7+
describe('MergeHtmlTask', () => {
8+
it('injects html snippet into file', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const filePath = path.join(tmpDir, 'index.html');
11+
fs.writeFileSync(filePath, '<head>\n</head>');
12+
13+
const snippet = '<meta name="test" />';
14+
const task = MergeHtmlTask.getInstance('test', filePath, 'index.html', snippet, '^1');
15+
task.run();
16+
17+
const content = fs.readFileSync(filePath, 'utf8');
18+
assert.ok(content.includes(snippet));
19+
});
20+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { NpmRcAddRuleTask } from '../src/migrate/runner/tasks/common/NpmRcAddRuleTask';
6+
7+
describe('NpmRcAddRuleTask', () => {
8+
it('adds rule to .npmrc', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const cwd = process.cwd();
11+
process.chdir(tmpDir);
12+
13+
const task = NpmRcAddRuleTask.getInstance('prefer-offline=true', '^1');
14+
task.run();
15+
16+
process.chdir(cwd);
17+
const content = fs.readFileSync(path.join(tmpDir, '.npmrc'), 'utf8');
18+
assert.ok(content.includes('prefer-offline=true'));
19+
});
20+
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
6+
const { createRequire } = require('module');
7+
8+
describe('RemoveTask', () => {
9+
it('executes rimraf command', async () => {
10+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
11+
const filePath = path.join(tmpDir, 'to-remove.txt');
12+
fs.writeFileSync(filePath, 'data');
13+
14+
const require = createRequire(__filename);
15+
const childProc = require('child_process');
16+
const original = childProc.execSync;
17+
let executed = '';
18+
childProc.execSync = (cmd: string) => {
19+
executed = cmd;
20+
fs.rmSync(filePath, { force: true });
21+
return Buffer.from('');
22+
};
23+
24+
// @ts-ignore importing compiled file
25+
const { RemoveTask } = await import('../dist/migrate/runner/tasks/common/RemoveTask.js');
26+
const task = RemoveTask.getInstance(filePath, '^1');
27+
task.run();
28+
childProc.execSync = original;
29+
30+
assert.ok(!fs.existsSync(filePath));
31+
assert.ok(executed.includes('rimraf'));
32+
});
33+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { RenameSlotNameTask } from '../src/migrate/runner/tasks/common/RenameSlotNameTask';
6+
7+
describe('RenameSlotNameTask', () => {
8+
it('renames slot attribute in component files', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const tsxPath = path.join(tmpDir, 'component.tsx');
11+
fs.writeFileSync(tsxPath, '<KolCard slot="header"></KolCard>');
12+
const htmlPath = path.join(tmpDir, 'sample.html');
13+
fs.writeFileSync(htmlPath, '<kol-card slot="header"></kol-card>');
14+
15+
const task = RenameSlotNameTask.getInstance('kol-card', 'header', 'header-right', '^1');
16+
task.run(tmpDir);
17+
18+
const tsxContent = fs.readFileSync(tsxPath, 'utf8');
19+
const htmlContent = fs.readFileSync(htmlPath, 'utf8');
20+
assert.ok(tsxContent.includes('slot="header-right"'));
21+
assert.ok(htmlContent.includes('slot="header"'));
22+
});
23+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import assert from 'node:assert';
2+
import fs from 'fs';
3+
import os from 'os';
4+
import path from 'path';
5+
import { TsConfigReconfigureTask } from '../src/migrate/runner/tasks/common/TsConfigReconfigureTask';
6+
7+
describe('TsConfigReconfigureTask', () => {
8+
it('writes values into tsconfig.json', () => {
9+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kolibri-cli-'));
10+
const cwd = process.cwd();
11+
process.chdir(tmpDir);
12+
fs.writeFileSync('tsconfig.json', '{}');
13+
14+
const task = TsConfigReconfigureTask.getInstance('compilerOptions', { target: 'ESNext' }, '^1');
15+
task.run();
16+
17+
process.chdir(cwd);
18+
const config = JSON.parse(fs.readFileSync(path.join(tmpDir, 'tsconfig.json'), 'utf8'));
19+
assert.equal(config.target, 'ESNext');
20+
});
21+
});

0 commit comments

Comments
 (0)