alsatian-test/alsatian

View on GitHub
packages/vscode-extension/src/run.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { TestSet, TestRunner } from "alsatian";
import { ITestCompleteEvent } from "alsatian/dist/core/events";
import { join } from "path";
import { findNearestFile } from "./find-nearest-file";
import { registerTsNode } from "./register-ts-node";
import { IMessage, MessageType } from "./message";

function sendMessage<T extends IMessage | string>(message: T) {
    if (process.send) {
        process.send(message);
    }
}

(async () => {
    try {
        const fileName = process.argv[2];
        const fixtureName = process.argv[3];
        const testName = process.argv[4];
        sendMessage(`start running for ${fileName} ${fixtureName} ${testName}`);

        if (require.cache[require.resolve(fileName)]) {
            delete require.cache[require.resolve(fileName)];
        }

        const alsatianConfigPath = await findNearestFile(".alsatianrc.json", fileName);

        if (alsatianConfigPath) {
            const alsatianConfig = await import(alsatianConfigPath);

            const root = alsatianConfigPath.split(/[\\/]/);
            root.pop();
            const rootPath = root.join("/");

            await registerTsNode(
                alsatianConfig.tsconfig ?
                join(rootPath, alsatianConfig.tsconfig) :
                await findNearestFile("tsconfig.json", fileName)
            );

            const preTestScripts = ((alsatianConfig.preTestScripts || []) as string[]).map(script => join(rootPath, script));

            await Promise.all(preTestScripts.map(script => import(script)));
        }
        else {
            await registerTsNode(await findNearestFile("tsconfig.json", fileName));
        }

        const testSet = TestSet.create();

        testSet.addTestsFromFiles(fileName);

        const fixture = testSet.testFixtures.filter(x => x.fixture.constructor.name === fixtureName)[0];
        fixture.focussed = true;

        if (testName) {
            fixture.tests.filter(x => x.key === testName).forEach(x => x.focussed = true);
        }

        const runner = new TestRunner();
        const results: ITestCompleteEvent[] = [];
        runner.onTestComplete(x => {
            results.push(x);
            sendMessage({
                type: MessageType.TestComplete,
                test: x.test,
                results: [ { outcome: x.outcome, error: x.error ? { message: x.error?.message }: null } ]
            });
        });
        await runner.run(testSet);

        sendMessage(`tests complete for ${fileName} ${fixtureName} ${testName}`);

        sendMessage({
            type: MessageType.RunComplete,
            results: results.map(x => ({ outcome: x.outcome, error: x.error ? { message: x.error?.message }: null }))
        });
    }
    catch (error) {
        sendMessage(`error running test ${error}`);
        sendMessage({
            type: MessageType.RunComplete,
            results: [
                { error: { message: error.message }, stack: error.stack }
            ]
        });
    }

})();