@wordpress/env
Version:
A zero-config, self contained local WordPress environment for development and testing.
150 lines (137 loc) • 5.12 kB
JavaScript
;
/**
* Internal dependencies
*/
const cli = require( '../cli' );
const env = require( '../env' );
/**
* Mocked dependencies
*/
jest.spyOn( process, 'exit' ).mockImplementation( () => {} );
jest.mock( 'ora', () => () => ( {
start() {
return { text: '', succeed: jest.fn(), fail: jest.fn() };
},
} ) );
jest.mock( '../env', () => {
const actual = jest.requireActual( '../env' );
return {
start: jest.fn( Promise.resolve.bind( Promise ) ),
stop: jest.fn( Promise.resolve.bind( Promise ) ),
clean: jest.fn( Promise.resolve.bind( Promise ) ),
run: jest.fn( Promise.resolve.bind( Promise ) ),
ValidationError: actual.ValidationError,
LifecycleScriptError: actual.LifecycleScriptError,
};
} );
describe( 'env cli', () => {
beforeEach( jest.clearAllMocks );
it( 'parses start commands.', () => {
cli().parse( [ 'start' ] );
const { spinner } = env.start.mock.calls[ 0 ][ 0 ];
expect( spinner.text ).toBe( '' );
} );
it( 'parses stop commands.', () => {
cli().parse( [ 'stop' ] );
const { spinner } = env.stop.mock.calls[ 0 ][ 0 ];
expect( spinner.text ).toBe( '' );
} );
it( 'parses clean commands for the default environment.', () => {
cli().parse( [ 'clean' ] );
const { environment, spinner } = env.clean.mock.calls[ 0 ][ 0 ];
expect( environment ).toBe( 'tests' );
expect( spinner.text ).toBe( '' );
} );
it( 'parses clean commands for all environments.', () => {
cli().parse( [ 'clean', 'all' ] );
const { environment, spinner } = env.clean.mock.calls[ 0 ][ 0 ];
expect( environment ).toBe( 'all' );
expect( spinner.text ).toBe( '' );
} );
it( 'parses clean commands for the development environment.', () => {
cli().parse( [ 'clean', 'development' ] );
const { environment, spinner } = env.clean.mock.calls[ 0 ][ 0 ];
expect( environment ).toBe( 'development' );
expect( spinner.text ).toBe( '' );
} );
it( 'parses clean commands for the tests environment.', () => {
cli().parse( [ 'clean', 'tests' ] );
const { environment, spinner } = env.clean.mock.calls[ 0 ][ 0 ];
expect( environment ).toBe( 'tests' );
expect( spinner.text ).toBe( '' );
} );
it( 'parses run commands without arguments.', () => {
cli().parse( [ 'run', 'tests-wordpress', 'test' ] );
const { container, command, spinner } = env.run.mock.calls[ 0 ][ 0 ];
expect( container ).toBe( 'tests-wordpress' );
expect( command ).toStrictEqual( [ 'test' ] );
expect( spinner.text ).toBe( '' );
} );
it( 'parses run commands with variadic arguments.', () => {
cli().parse( [ 'run', 'tests-wordpress', 'test', 'test1', '--test2' ] );
const { container, command, spinner } = env.run.mock.calls[ 0 ][ 0 ];
expect( container ).toBe( 'tests-wordpress' );
expect( command ).toStrictEqual( [ 'test', 'test1', '--test2' ] );
expect( spinner.text ).toBe( '' );
} );
it( 'handles successful commands with messages.', async () => {
env.start.mockResolvedValueOnce( 'success message' );
cli().parse( [ 'start' ] );
const { spinner } = env.start.mock.calls[ 0 ][ 0 ];
await env.start.mock.results[ 0 ].value;
expect( spinner.succeed ).toHaveBeenCalledWith(
expect.stringMatching( /^success message \(in \d+s \d+ms\)$/ )
);
} );
it( 'handles successful commands with spinner text.', async () => {
env.start.mockResolvedValueOnce();
cli().parse( [ 'start' ] );
const { spinner } = env.start.mock.calls[ 0 ][ 0 ];
spinner.text = 'success spinner text';
await env.start.mock.results[ 0 ].value;
expect( spinner.succeed ).toHaveBeenCalledWith(
expect.stringMatching( /^success spinner text \(in \d+s \d+ms\)$/ )
);
} );
it( 'handles failed commands with messages.', async () => {
env.start.mockRejectedValueOnce( {
message: 'failure message',
} );
const consoleError = console.error;
console.error = jest.fn();
const processExit = process.exit;
process.exit = jest.fn();
cli().parse( [ 'start' ] );
const { spinner } = env.start.mock.calls[ 0 ][ 0 ];
await env.start.mock.results[ 0 ].value.catch( () => {} );
expect( spinner.fail ).toHaveBeenCalledWith( 'failure message' );
expect( console.error ).toHaveBeenCalled();
expect( process.exit ).toHaveBeenCalledWith( 1 );
console.error = consoleError;
process.exit = processExit;
} );
it( 'handles failed docker commands with errors.', async () => {
env.start.mockRejectedValueOnce( {
err: 'failure error',
out: 'message',
exitCode: 1,
} );
const consoleError = console.error;
console.error = jest.fn();
const processExit = process.exit;
process.exit = jest.fn();
const stderr = process.stderr.write;
process.stderr.write = jest.fn();
cli().parse( [ 'start' ] );
const { spinner } = env.start.mock.calls[ 0 ][ 0 ];
await env.start.mock.results[ 0 ].value.catch( () => {} );
expect( spinner.fail ).toHaveBeenCalledWith(
'Error while running docker compose command.'
);
expect( process.stderr.write ).toHaveBeenCalledWith( 'failure error' );
expect( process.exit ).toHaveBeenCalledWith( 1 );
console.error = consoleError;
process.exit = processExit;
process.stderr.write = stderr;
} );
} );