Paul Gschwendtner ac055e1ff3 build: migrate @angular-devkit/schematics-cli tests to rules_js
Migrates the schematics-cli tests to `rules_js`.

Notably a little extra logic was needed here as the tests were relying
on the built npm package at runtime, resolvable via it's "package name".
To address this, we manually link the package for the test at runtime.

The spec file is moved into a separate folder for this reason, so that
we don't accidentally expose the schematics CLI package for unexpected
reasons.
2025-01-21 18:19:11 +01:00

75 lines
2.5 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import { main } from '../bin/schematics';
// We only care about the write method in these mocks of NodeJS.WriteStream.
class MockWriteStream {
lines: string[] = [];
write(str: string) {
// Strip color control characters.
this.lines.push(str.replace(/[^\x20-\x7F]\[\d+m/g, ''));
return true;
}
}
describe('schematics-cli binary', () => {
let stdout: MockWriteStream, stderr: MockWriteStream;
beforeEach(() => {
stdout = new MockWriteStream();
stderr = new MockWriteStream();
});
it('list-schematics works', async () => {
const args = ['--list-schematics'];
const res = await main({ args, stdout, stderr });
expect(stdout.lines).toMatch(/blank/);
expect(stdout.lines).toMatch(/schematic/);
expect(res).toEqual(0);
});
it('errors when using camel case listSchematics', async () => {
const args = ['--listSchematics'];
await expectAsync(main({ args, stdout, stderr })).toBeRejectedWithError(
'Unknown argument listSchematics. Did you mean list-schematics?',
);
});
it('dry-run works', async () => {
const args = ['blank', 'foo', '--dry-run'];
const res = await main({ args, stdout, stderr });
expect(stdout.lines).toMatch(/CREATE foo\/README.md/);
expect(stdout.lines).toMatch(/CREATE foo\/.gitignore/);
expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index.ts/);
expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/);
expect(stdout.lines).toMatch(/Dry run enabled./);
expect(res).toEqual(0);
});
it('dry-run is default when debug mode', async () => {
const args = ['blank', 'foo', '--debug'];
const res = await main({ args, stdout, stderr });
expect(stdout.lines).toMatch(/Debug mode enabled./);
expect(stdout.lines).toMatch(/CREATE foo\/README.md/);
expect(stdout.lines).toMatch(/CREATE foo\/.gitignore/);
expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index.ts/);
expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/);
expect(stdout.lines).toMatch(/Dry run enabled by default in debug mode./);
expect(res).toEqual(0);
});
it('error when no name is provided', async () => {
const args = ['blank'];
const res = await main({ args, stdout, stderr });
expect(stderr.lines).toMatch(/Error: name option is required/);
expect(res).toEqual(1);
});
});