Skip to content

Commit da24d3d

Browse files
committed
Refactor test cases into more granular files
1 parent 853d0b6 commit da24d3d

6 files changed

Lines changed: 222 additions & 199 deletions

File tree

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@
7373
"slash": "~5.1"
7474
},
7575
"devDependencies": {
76-
"@eslint/js": "~9.39",
76+
"@eslint/js": "~10.0",
7777
"@types/fancy-log": "~2.0",
78-
"@types/node": "~25.2",
78+
"@types/node": "~25.3",
7979
"add-dist-header": "~1.6",
8080
"assert-deep-strict-equal": "~1.2",
8181
"copy-file-util": "~1.3",
8282
"csso-cli": "~4.0",
83-
"eslint": "~9.39",
83+
"eslint": "~10.0",
8484
"glob-bin": "~1.1",
8585
"jshint": "~2.13",
8686
"less": "~4.5",
@@ -89,7 +89,7 @@
8989
"rimraf": "~6.1",
9090
"run-scripts-util": "~1.3",
9191
"typescript": "~5.9",
92-
"typescript-eslint": "~8.54",
92+
"typescript-eslint": "~8.56",
9393
"uglify-js": "~3.19"
9494
}
9595
}

spec/cli.spec.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// recursive-exec
2+
// CLI Specification Suite
3+
4+
// Imports
5+
import { assertDeepStrictEqual, fixEolGitDiff } from 'assert-deep-strict-equal';
6+
import { cliArgvUtil } from 'cli-argv-util';
7+
import fs from 'fs';
8+
9+
// Setup
10+
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
11+
const run = (posix) => cliArgvUtil.run(pkg, posix);
12+
13+
////////////////////////////////////////////////////////////////////////////////
14+
describe('Executing the CLI', () => {
15+
16+
it('to compile LESS files to CSS preserves the source folder structure', () => {
17+
run("recursive-exec spec/fixtures --ext=.less 'lessc {{file}} spec/target/css/{{basename}}.css'");
18+
const actual = cliArgvUtil.readFolder('spec/target/css');
19+
const expected = [
20+
'mock-file1.css',
21+
'subfolder',
22+
'subfolder/mock-file2.css',
23+
];
24+
assertDeepStrictEqual(actual, expected);
25+
fixEolGitDiff('spec/target/css/mock-file1.css');
26+
fixEolGitDiff('spec/target/css/subfolder/mock-file2.css');
27+
});
28+
29+
it('to optimize CSS files preserves the source folder structure', () => {
30+
run("recursive-exec spec/fixtures --ext=.js 'make-dir spec/target/css-min/{{path}}' --quiet");
31+
run("recursive-exec spec/target/css 'csso {{file}} --output spec/target/css-min/{{basename}}.min.css'");
32+
const actual = cliArgvUtil.readFolder('spec/target/css-min');
33+
const expected = [
34+
'mock-file1.min.css',
35+
'subfolder',
36+
'subfolder/mock-file2.min.css',
37+
];
38+
assertDeepStrictEqual(actual, expected);
39+
});
40+
41+
it('to minimize JS files preserves the source folder structure', () => {
42+
run("recursive-exec spec/fixtures --ext=.js --quiet 'make-dir spec/target/js/{{path}}'");
43+
run("recursive-exec spec/fixtures --ext=.js 'uglifyjs {{file}} --output spec/target/js/{{basename}}.min.js'");
44+
const actual = cliArgvUtil.readFolder('spec/target/js');
45+
const expected = [
46+
'mock-file1.min.js',
47+
'subfolder',
48+
'subfolder/mock-file2.min.js',
49+
];
50+
assertDeepStrictEqual(actual, expected);
51+
});
52+
53+
it('with a package.json command macro for the previous specification produces the same result', () => {
54+
run("recursive-exec spec/fixtures --ext=.js --quiet {{command:make-dir}}");
55+
run("recursive-exec spec/fixtures --ext=.js {{command:uglifyjs}}");
56+
const actual = cliArgvUtil.readFolder('spec/target/js-macro');
57+
const expected = [
58+
'mock-file1.min.js',
59+
'subfolder',
60+
'subfolder/mock-file2.min.js',
61+
];
62+
assertDeepStrictEqual(actual, expected);
63+
});
64+
65+
it('to rename copies of files with camel case names preserves the source folder structure', () => {
66+
const template = 'copy-file {{file}} spec/target/html/{{path}}/{{name}}.{{nameCamelCase}}.html';
67+
run(`recursive-exec spec/fixtures --ext=.html --echo '${template}'`);
68+
run(`recursive-exec spec/fixtures --ext=.html '${template}'`);
69+
const actual = cliArgvUtil.readFolder('spec/target/html');
70+
const expected = [
71+
'mock-file1.mockFile1.html',
72+
'subfolder',
73+
'subfolder/mock-file2.mockFile2.html',
74+
];
75+
assertDeepStrictEqual(actual, expected);
76+
});
77+
78+
it('with the --exclude flag skips over the excluded files', () => {
79+
const template = 'copy-file {{file}} spec/target/exclude/{{filename}}';
80+
run(`recursive-exec spec/fixtures --exclude=file1,html '${template}'`);
81+
const actual = cliArgvUtil.readFolder('spec/target/exclude');
82+
const expected = [
83+
'subfolder',
84+
'subfolder/mock-file2.js',
85+
'subfolder/mock-file2.less',
86+
];
87+
assertDeepStrictEqual(actual, expected);
88+
});
89+
90+
});

spec/errors.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// recursive-exec
2+
// Error Handling Specification Suite
3+
4+
// Imports
5+
import assert from 'assert';
6+
7+
// Setup
8+
import { recursiveExec } from '../dist/recursive-exec.js';
9+
10+
////////////////////////////////////////////////////////////////////////////////
11+
describe('Correct error is thrown', () => {
12+
13+
it('when the "source" folder is missing', () => {
14+
const makeBogusCall = () => recursiveExec.find();
15+
const exception = { message: '[recursive-exec] Must specify the folder path.' };
16+
assert.throws(makeBogusCall, exception);
17+
});
18+
19+
it('when the "command" template is missing', () => {
20+
const makeBogusCall = () => recursiveExec.find('spec');
21+
const exception = { message: '[recursive-exec] Command template missing.' };
22+
assert.throws(makeBogusCall, exception);
23+
});
24+
25+
});

spec/find.spec.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// recursive-exec
2+
// Function find() Specification Suite
3+
4+
// Imports
5+
import { assertDeepStrictEqual } from 'assert-deep-strict-equal';
6+
7+
// Setup
8+
import { recursiveExec } from '../dist/recursive-exec.js';
9+
10+
////////////////////////////////////////////////////////////////////////////////
11+
describe('Calling recursiveExec.find()', () => {
12+
13+
it('for HTML and LESS files returns an array listing the correct files', () => {
14+
const folder = 'spec/fixtures';
15+
const command = 'glob {{file}}';
16+
const actual = recursiveExec.find(folder, command, { extensions: ['.html', '.less'] });
17+
const expected = [
18+
{
19+
basename: 'mock-file1',
20+
command: 'glob spec/fixtures/mock-file1.html',
21+
file: 'spec/fixtures/mock-file1.html',
22+
filename: 'mock-file1.html',
23+
folder: 'spec/fixtures',
24+
name: 'mock-file1',
25+
path: '',
26+
},
27+
{
28+
basename: 'mock-file1',
29+
command: 'glob spec/fixtures/mock-file1.less',
30+
file: 'spec/fixtures/mock-file1.less',
31+
filename: 'mock-file1.less',
32+
folder: 'spec/fixtures',
33+
name: 'mock-file1',
34+
path: '',
35+
},
36+
{
37+
basename: 'subfolder/mock-file2',
38+
command: 'glob spec/fixtures/subfolder/mock-file2.html',
39+
file: 'spec/fixtures/subfolder/mock-file2.html',
40+
filename: 'subfolder/mock-file2.html',
41+
folder: 'spec/fixtures',
42+
name: 'mock-file2',
43+
path: 'subfolder',
44+
},
45+
{
46+
basename: 'subfolder/mock-file2',
47+
command: 'glob spec/fixtures/subfolder/mock-file2.less',
48+
file: 'spec/fixtures/subfolder/mock-file2.less',
49+
filename: 'subfolder/mock-file2.less',
50+
folder: 'spec/fixtures',
51+
name: 'mock-file2',
52+
path: 'subfolder',
53+
},
54+
];
55+
assertDeepStrictEqual(actual, expected);
56+
});
57+
58+
});

spec/mocha.spec.js

Lines changed: 0 additions & 195 deletions
This file was deleted.

0 commit comments

Comments
 (0)