Skip to content
This repository has been archived by the owner on May 22, 2024. It is now read-only.

Commit

Permalink
feat: added options to stdout/stderr
Browse files Browse the repository at this point in the history
  • Loading branch information
jdx committed Jan 25, 2018
1 parent aeab9ea commit c94e36f
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 12 deletions.
88 changes: 87 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
fancy-mocha
===========

extends mocha with helpful extensions
extends mocha with helpful, chainable extensions

[![Version](https://img.shields.io/npm/v/fancy-mocha.svg)](https://npmjs.org/package/fancy-mocha)
[![CircleCI](https://circleci.com/gh/jdxcode/fancy-mocha/tree/master.svg?style=svg)](https://circleci.com/gh/jdxcode/fancy-mocha/tree/master)
Expand All @@ -11,3 +11,89 @@ extends mocha with helpful extensions
[![Known Vulnerabilities](https://snyk.io/test/npm/fancy-mocha/badge.svg)](https://snyk.io/test/npm/fancy-mocha)
[![Downloads/week](https://img.shields.io/npm/dw/fancy-mocha.svg)](https://npmjs.org/package/fancy-mocha)
[![License](https://img.shields.io/npm/l/fancy-mocha.svg)](https://github.com/jdxcode/fancy-mocha/blob/master/package.json)

stdout/stderr mocking
---------------------

This is used for tests that ensure that certain stdout/stderr messages are made.
By default this also trims the output from the screen.

```js
import {expect} from 'chai'
import fancy from 'fancy-mocha'
import chalk from 'chalk'

describe('stdmock tests', () => {
fancy()
.stdout()
.it('mocks stdout', output => {
console.log('foobar')
expect(output.stdout).to.equal('foobar\n')
})

fancy()
.stderr()
.it('mocks stderr', output => {
console.error('foobar')
expect(output.stderr).to.equal('foobar\n')
})

fancy()
.stdout()
.stderr()
.it('mocks stdout and stderr', output => {
console.log('foo')
console.error('bar')
expect(output.stdout).to.equal('foo\n')
expect(output.stderr).to.equal('bar\n')
})
})
```

environment variables
---------------------

```js
import {expect} from 'chai'
import fancy from 'fancy-mocha'

describe('stdmock tests', () => {
fancy()
.stdout()
.it('mocks stdout', output => {
console.log('foobar')
expect(output.stdout).to.equal('foobar\n')
})

fancy()
.stdout({print: true})
.it('mocks stdout but also prints to screen', output => {
console.log('foobar')
expect(output.stdout).to.equal('foobar\n')
})

fancy()
.stderr()
.it('mocks stderr', output => {
console.error('foobar')
expect(output.stderr).to.equal('foobar\n')
})

fancy()
.stdout()
.stderr()
.it('mocks stdout and stderr', output => {
console.log('foo')
console.error('bar')
expect(output.stdout).to.equal('foo\n')
expect(output.stderr).to.equal('bar\n')
})

fancy()
.stdout({stripColor: false})
.it('mocks stdout but does not strip the color codes', output => {
console.log(chalk.red('foobar'))
expect(output.stdout).to.contain(chalk.red('foobar'))
})
})
```
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
"@dxcli/dev-tslint": "^0.0.15",
"@types/chai": "^4.1.2",
"@types/chai-as-promised": "^7.1.0",
"@types/chalk": "^2.2.0",
"@types/lodash": "^4.14.96",
"@types/mocha": "^2.2.47",
"@types/node": "^9.3.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chalk": "^2.3.0",
"eslint": "^4.16.0",
"eslint-config-dxcli": "^1.1.4",
"husky": "^0.14.3",
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import base, {Base, Fancy, Next, Plugin} from './base'
import _catch from './catch'
import env from './env'
import mock from './mock'
import {stderr, stdout} from './stdmock'
import {stderr, StdmockOptions, stdout} from './stdmock'

export const fancy = base
.register('stdout', stdout)
Expand All @@ -16,6 +16,7 @@ export {
Fancy,
Plugin,
Next,
StdmockOptions,
}
export default fancy
export * from './chai'
11 changes: 9 additions & 2 deletions src/stdmock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,23 @@ export type Return<T extends 'stdout' | 'stderr'> = {
readonly [P in T]: string
}

const create = <T extends 'stdout' | 'stderr'>(std: T) => (async next => {
export interface StdmockOptions {
print?: boolean
stripColor?: boolean
}

const create = <T extends 'stdout' | 'stderr'>(std: T) => (async (next, _, opts: StdmockOptions = {}) => {
mock[std].start()
mock[std].print = opts.print === true
mock[std].stripColor = opts.stripColor !== false
try {
await next({
get [std]() { return mock[std].output }
} as Return<T>)
} finally {
mock[std].stop()
}
}) as Plugin<Return<T>>
}) as Plugin<Return<T>, StdmockOptions>

export const stdout = create('stdout')
export const stderr = create('stderr')
48 changes: 48 additions & 0 deletions test/stdmock.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// tslint:disable no-console

import chalk from 'chalk'

import {expect, fancy} from '../src'

describe('stdout', () => {
Expand Down Expand Up @@ -37,4 +39,50 @@ describe('stdout', () => {
expect(output.stderr).to.equal('foo\n')
expect(output.stdout).to.equal('bar\n')
})

fancy()
.stdout()
.it('strips colors by default', output => {
console.log(chalk.red('foobar'))
expect(output.stdout).to.equal('foobar\n')
})

// from readme
fancy()
.stdout()
.it('mocks stdout', output => {
console.log('foobar')
expect(output.stdout).to.equal('foobar\n')
})

fancy()
.stdout({print: true})
.it('mocks stdout but also prints to screen', output => {
console.log('foobar')
expect(output.stdout).to.equal('foobar\n')
})

fancy()
.stderr()
.it('mocks stderr', output => {
console.error('foobar')
expect(output.stderr).to.equal('foobar\n')
})

fancy()
.stdout()
.stderr()
.it('mocks stdout and stderr', output => {
console.log('foo')
console.error('bar')
expect(output.stdout).to.equal('foo\n')
expect(output.stderr).to.equal('bar\n')
})

fancy()
.stdout({stripColor: false})
.it('mocks stdout but does not strip the color codes', output => {
console.log(chalk.red('foobar'))
expect(output.stdout).to.contain(chalk.red('foobar'))
})
})
22 changes: 14 additions & 8 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,12 @@
version "4.1.2"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.2.tgz#f1af664769cfb50af805431c407425ed619daa21"

"@types/chalk@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@types/chalk/-/chalk-2.2.0.tgz#b7f6e446f4511029ee8e3f43075fb5b73fbaa0ba"
dependencies:
chalk "*"

"@types/lodash@^4.14.96":
version "4.14.96"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.96.tgz#49a402bb6984af7dd9a48cea3781744a3774bff1"
Expand Down Expand Up @@ -728,6 +734,14 @@ chai@^4.1.2:
pathval "^1.0.0"
type-detect "^4.0.0"

chalk@*, chalk@2.3.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
dependencies:
ansi-styles "^3.1.0"
escape-string-regexp "^1.0.5"
supports-color "^4.0.0"

chalk@0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174"
Expand All @@ -748,14 +762,6 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"

chalk@2.3.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
dependencies:
ansi-styles "^3.1.0"
escape-string-regexp "^1.0.5"
supports-color "^4.0.0"

chardet@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
Expand Down

0 comments on commit c94e36f

Please sign in to comment.