UNPKG

actionhero

Version:

The reusable, scalable, and quick node.js API server for stateless and stateful applications

214 lines (181 loc) 6.37 kB
import * as path from "path"; import * as ChildProcess from "child_process"; import { api, Process, specHelper } from "./../../src/index"; const actionhero = new Process(); let configChanges; async function exec( command, args ): Promise<{ error?: Error; stdout?: string; stderr?: string; }> { return new Promise((resolve, reject) => { ChildProcess.exec(command, args, (error, stdout, stderr) => { if (error) { return reject(error); } return resolve({ stdout: stdout.toString(), stderr: stderr.toString() }); }); }); } describe("Core: Plugins", () => { describe("with plugin", () => { beforeAll(async () => { configChanges = { plugins: { testPlugin: { path: path.join(__dirname, "..", "testPlugin") }, }, }; await actionhero.start({ configChanges }); }); afterAll(async () => { await actionhero.stop(); }); test("can load an action from a plugin", async () => { const response = await specHelper.runAction("pluginAction"); expect(response.error).toBeUndefined(); expect(response.cool).toEqual(true); }); test("can load a task from a plugin", () => { expect(api.tasks.tasks.pluginTask).toBeTruthy(); expect(api.tasks.jobs.pluginTask).toBeTruthy(); }); test("can load an initializer from a plugin", () => { expect(api.pluginInitializer.here).toEqual(true); }); // test('can load a server from a plugin') test("can serve static files from a plugin", async () => { const file = await specHelper.getStaticFile("plugin.html"); expect(file.content).toEqual("<h1>PLUGIN!<h1>\n"); expect(file.mime).toEqual("text/html"); }); test( "can load CLI command from a plugin", async () => { const env = Object.assign({}, process.env); env.configChanges = JSON.stringify(configChanges); const { stdout: helpResponse, stderr: error1 } = await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts help", { env } ); expect(error1).toEqual(""); expect(helpResponse).toContain("hello"); const { stdout: helloResponse, stderr: error2 } = await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts hello", { env } ); expect(error2).toEqual(""); expect(helloResponse).toContain("Hello, Actionhero"); }, 30 * 1000 ); }); describe("with plugin sections ignored", () => { beforeAll(async () => { configChanges = { plugins: { testPlugin: { path: path.join(__dirname, "..", "testPlugin"), actions: false, tasks: false, servers: false, initializers: false, public: false, cli: false, }, }, }; await actionhero.start(); }); afterAll(async () => { await actionhero.stop(); }); test("will not load an action from an un-loaded plugin", async () => { const response = await specHelper.runAction("pluginAction"); expect(response.error).toMatch(/unknown action or invalid apiVersion/); }); test("will not load a task from an un-loaded plugin", () => { expect(api.tasks.tasks.pluginTask).not.toBeTruthy(); expect(api.tasks.jobs.pluginTask).not.toBeTruthy(); }); test("will not load an initializer from an un-loaded plugin", () => { expect(api.pluginInitializer).not.toBeTruthy(); }); // test('will not load a server from an un-loaded plugin') test("will not serve static files from an un-loaded plugin", async () => { const file = await specHelper.getStaticFile("plugin.html"); expect(file.error).toMatch(/file is not found/); }); test( "will not load CLI command from an un-loaded plugin", async () => { const env = Object.assign({}, process.env); env.configChanges = JSON.stringify(configChanges); const { stdout: helpResponse, stderr: error1 } = await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts help", { env } ); expect(error1).toEqual(""); expect(helpResponse).not.toContain("hello"); try { await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts hello", { env } ); throw new Error("should not get here"); } catch (error) { expect(error.toString()).toMatch(/unknown command 'hello'/); } }, 30 * 1000 ); }); describe("without plugin", () => { beforeAll(async () => { await actionhero.start(); }); afterAll(async () => { await actionhero.stop(); }); test("will not load an action from an un-loaded plugin", async () => { const response = await specHelper.runAction("pluginAction"); expect(response.error).toMatch(/unknown action or invalid apiVersion/); }); test("will not load a task from an un-loaded plugin", () => { expect(api.tasks.tasks.pluginTask).not.toBeTruthy(); expect(api.tasks.jobs.pluginTask).not.toBeTruthy(); }); test("will not load an initializer from an un-loaded plugin", () => { expect(api.pluginInitializer).not.toBeTruthy(); }); // test('will not load a server from an un-loaded plugin') test("will not serve static files from an un-loaded plugin", async () => { const file = await specHelper.getStaticFile("plugin.html"); expect(file.error).toMatch(/file is not found/); }); test( "will not load CLI command from an un-loaded plugin", async () => { const env = Object.assign({}, process.env); const { stdout: helpResponse, stderr: error1 } = await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts help", { env } ); expect(error1).toEqual(""); expect(helpResponse).not.toContain("hello"); try { await exec( "./node_modules/.bin/ts-node ./src/bin/actionhero.ts hello", { env } ); throw new Error("should not get here"); } catch (error) { expect(error.toString()).toMatch(/unknown command 'hello'/); } }, 30 * 1000 ); }); });