πPutout plugin helps with tests
npm install @putout/plugin-tape[NPMIMGURL]: https://img.shields.io/npm/v/@putout/plugin-tape.svg?style=flat&longCache=true
[NPMURL]: https://npmjs.org/package/@putout/plugin-tape "npm"
> Tape-inspired TAP-compatible simplest high speed test runner with superpowers.
>
> (c) πΌSupertape
πPutout plugin helps to apply best parctises for tests written with πΌSupertape.
```
npm i @putout/plugin-tape -D
- β
add-args;
- β
add-t-end;
- β
apply-destructuring;
- β
apply-stub;
- β
apply-with-name;
- β
convert-called-with-args;
- β
convert-called-with-no-args-to-called-with;
- β
convert-called-with-to-called-with-no-args;
- β
convert-deep-equal-to-equal;
- β
convert-does-not-throw-to-try-catch;
- β
convert-emitter-to-promise;
- β
convert-equal-to-called-once;
- β
convert-equal-to-deep-equal;
- β
convert-equal-to-not-ok;
- β
convert-equal-to-ok;
- β
convert-equals-to-equal;
- β
convert-match-regexp-to-string;
- β
convert-ok-to-called-with;
- β
convert-ok-to-match;
- β
convert-tape-to-supertape;
- β
convert-throws-to-try-catch;
- β
declare;
- β
jest;
- β
remove-default-messages;
- β
remove-only;
- β
remove-skip;
- β
remove-useless-not-called-args;
- β
remove-useless-t-end;
- β
switch-expected-with-result;
- β
sync-with-name;
`json`
{
"rules": {
"tape/jest": "on",
"tape/apply-stub": "on",
"tape/apply-destructuring": "on",
"tape/apply-with-name": "on",
"tape/add-t-end": "on",
"tape/remove-useless-t-end": "on",
"tape/sync-with-name": "on",
"tape/switch-expected-with-result": "on",
"tape/convert-tape-to-supertape": "on",
"tape/convert-throws-to-try-catch": "on",
"tape/convert-does-not-throw-to-try-catch": "on",
"tape/convert-called-with-args": "on",
"tape/convert-called-with-to-called-with-no-args": "on",
"tape/convert-called-with-no-args-to-called-with": "on",
"tape/convert-equal-to-called-once": "on",
"tape/convert-equal-to-deep-equal": "on",
"tape/convert-equals-to-equal": "on",
"tape/convert-deep-equal-to-equal": "on",
"tape/convert-emitter-to-promise": "on",
"tape/convert-ok-to-match": "on",
"tape/convert-ok-to-called-with": "on",
"tape/convert-match-regexp-to-string": "on",
"tape/add-args": "on",
"tape/declare": "on",
"tape/remove-default-messages": "on",
"tape/remove-useless-not-called-args": "on",
"tape/remove-only": "on",
"tape/remove-skip": "on"
}
}
πPutout gives ability to switch easily from Jest to πΌSupertape. Checkout in πPutout Editor.
`js`
it('should equal', () => {
expect(a).toEqual(b);
});
`js
import {test} from 'supertape';
test('should equal', () => {
t.equal(a, b);
t.end();
});
`
πΌSupertape uses more natural way of
comparing: first you pass result and then expected.
It gives you ability to use value instead of expected andresult
understand code faster: no need to search for a second argument.
While is always a variable, so it most likely much shorter.
`js`
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(expected, result);
t.end();
});
`js`
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(result, expected);
t.end();
});
`js`
const test = require('tape');
`js`
const test = require('supertape');
`js
const test = require('supertape');
test('some message', (t) => {
t.throws(copymitter, /from should be a string!/, 'should throw when no args');
t.end();
});
`
`js
const {tryCatch} = require('try-catch');
const test = require('supertape');
test('some message', (t) => {
const [error] = tryCatch(copymitter);
t.equal(error.message, 'from should be a string!');
t.end();
});
`
`js
const test = require('supertape');
test('some message', (t) => {
t.doesNotThrow(copymitter, 'should throw when no args');
t.end();
});
`
`js
const test = require('supertape');
const {tryCatch} = require('try-catch');
test('some test', (t) => {
const [error] = tryCatch(copymitter);
t.notOk(error, 'should not throw when no args');
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, 'hello');
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, ['hello']);
t.end();
});
`
No need to use equal, supertape supports calledOnce.
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.equal(fn.callCount, 1);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledOnce(fn);
t.end();
});
`
Use equal when comparing with primitives, deepEqual for Objects and Arrays;
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
t.deepEqual(x, 5);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
t.equal(x, 5);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWithNoArgs(fn);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWithNoArgs(fn, [1, 2]);
t.end();
});
`
`js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, [1, 2]);
t.end();
});
`
`js`
test('copymitter', (t) => {
const cp = copymitter(from, to, ['1']);
cp.on('end', (t) => {
t.end();
});
});
`js
const {once} = require('node:events');
test('copymitter', async (t) => {
const cp = copymitter(from, to, ['1']);
await once(cp, 'end');
t.end();
});
`
Check out in πPutout Editor.
`js`
const test = require('supertape');
`js`
const {test} = require('supertape');
Apply stub functions created. Look how it works in πPutout Editor.
`js
const a = async () => true;
const b = async () => {};
const c = async () => throwError('hello');
const d = async () => {
throw Error('hello');
};
`
`js`
const a = stub().resolves(true);
const b = stub().resolves();
const c = stub().rejects(Error('hello'));
const d = stub().rejects(Error('hello'));
`js`
test('should call init before show', (t) => {
const init = stub();
const show = stub();
t.calledInOrder([init, show]);
t.end();
});
`js`
test('should call init before show', (t) => {
const init = stub().withName('init');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});
`js`
test('should call init before show', (t) => {
const init = stub().withName('show');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});
`js`
test('should call init before show', (t) => {
const init = stub().withName('init');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});
`js`
test('xxx', (t) => {
const a = stub();
t.end();
});
`js
import {test, stub} from 'supertape';
test('xxx', (t) => {
const a = stub();
t.end();
});
`
`js`
test('xxx', () => {
t.end();
});
`js`
test('xxx', (t) => {
t.end();
});
`js`
test('xxx', () => {});
`js`
test('xxx', (t) => {
t.end();
});
`js`
test('test: remove me', () => {
t.end();
t.end();
});
`js`
test('test: remove me', () => {
t.end();
});
`js`
t.ok(result.includes('hello'));
`js`
t.match(result, /hello/);
`js`
t.ok(set.calledWith(1, 2));
`js`
t.calledWith(set, [1, 2]);
`js`
t.equal(error, null);
`js`
t.notOk(error);
`js`
t.equal(result, true);
`js`
t.ok(result);
`js
const expected = {
hello: 'world',
};
t.equal(error, expected);
t.end();
`
`js
const expected = {
hello: 'world',
};
t.deepEqual(error, expected);
t.end();
`
Checkout in πPutout Editor.
`js`
t.equals(e.message, 'token should be a string!', 'should throw');
`js`
t.equal(e.message, 'token should be a string!', 'should throw');
`js`
t.match(result, RegExp('hello'));
`js`
t.match(result, 'hello');
πΌSupertape will put this information for you, and it is always the same.
No need to repeat the same information twice on one line, better to avoid it.
`js`
t.equal(result, expected, 'should equal');
`js`
t.equal(result, expected);
`js`
t.notCalled(fn, []);
`js`
t.notCalled(fn);
`js
test.only('some test', (t) => {
t.end();
});
testDeclareBeforeReference.only('some test', (t) => {
t.end();
});
`
`js
test('some test', (t) => {
t.end();
});
testDeclareBeforeReference('some test', (t) => {
t.end();
});
`
`js`
test.skip('some test', (t) => {
t.end();
});
`js``
test('some test', (t) => {
t.end();
});
MIT