Skip to content

saurabhdaware/cli-testing-tool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

b0955fb · Dec 3, 2021

History

59 Commits
Oct 16, 2021
Oct 16, 2021
Dec 3, 2021
Dec 3, 2021
Oct 16, 2021
Oct 16, 2021
Dec 3, 2021
Dec 3, 2021
Oct 16, 2021
Oct 16, 2021
Dec 3, 2021
Dec 3, 2021
Dec 3, 2021

Repository files navigation

CLI Testing Tool

A testing library that allows you to test input and outputs of your CLI command.

Note: This is WIP but it should be ready enough for most common CLI use-cases I can think of

Installation

With NPM:

npm install --save-dev cli-testing-tool 

With Yarn:

yarn add --dev cli-testing-tool

Examples

Check out Interactive Examples on Stackblitz

Testing Colored Terminal Text

Check out this example of StackBlitz

// colored-greeting.test.js
const { createCommandInterface } = require('cli-testing-tool');

test('should print colored greetings', async () => {
  const commandInterface = createCommandInterface('node ./graphic-print.js', {
    cwd: __dirname, // considering, the test file is in the same directory as the cli file
  });
  await commandInterface.type('Saurabh\n');
  const terminal = await commandInterface.getOutput();

  // ANSI Escape codes are tokenized into readable text token in tokenizedOutput
  // Helpful when libraries like inquirer or prompts add ansi-escape codes.
  expect(terminal.tokenizedOutput).toBe(
    "What's your name?Hi, [BOLD_START][RED_START]Saurabh[COLOR_END][BOLD_END]!"
  );

  // ANSI Escape codes are not tokenized.
  expect(terminal.rawOutput).toBe(
    `What's your name?Hi, \x1B[1m\x1B[31mSaurabh\x1B[39m\x1B[22m!`
  );

  // ANSI Escape codes are removed
  expect(terminal.stringOutput).toBe(`What's your name?Hi, Saurabh!`);
});
Code of the CLI that we're testing in above snippet
// colored-greeting.js
const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

const bold = (str) => `\x1b[1m${str}\x1b[22m`;
const red = (str) => `\x1b[31m${str}\x1b[39m`;

readline.question(`What's your name?`, (name) => {
  console.log(`Hi, ${bold(red('Saurabh'))}!`);
  readline.close();
});

Options

You can pass options as 2nd param to createCommandInterface.

The default options are:

const defaultOptions = {
  typeDelay: 100, // number. delay between each `.type()` call
  logData: false, // boolean. if true, logs the command data on terminal
  logError: true, // boolean. if false, won't add command errors on terminal
  cwd: process.cwd(), // string. working directory from where your simulated command is executed
  env: undefined // object | undefined. environment variables object if there are any
};

Terminal Text Parsing Support Checklist

Refer to Full List of Ansi Escape Codes that need to be handled.

  • Normal text without ansi escape codes
  • Colored text
  • Cursor movement (Basic Support. Not tested)
  • Erase Line/Screen Clear (Basic Support. Not tested)
  • Screen Modes (No Support)
  • Private Modes (No Support)
  • Multiple Arguments (No Support. Difficult to support this)

Big Shoutout to