@putout/plugin-tape
v20.3.0
Published
๐Putout plugin helps with tests
Maintainers
Readme
@putout/plugin-tape 
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.
Install
npm i @putout/plugin-tape -DRules
- โ 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;
Config
{
"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"
}
}jest
๐Putout gives ability to switch easily from Jest to ๐ผSupertape. Checkout in ๐Putout Editor.
โ Example of incorrect code
it('should equal', () => {
expect(a).toEqual(b);
});โ Example of correct code
import {test} from 'supertape';
test('should equal', () => {
t.equal(a, b);
t.end();
});switch-expected-with-result
๐ผSupertape uses more natural way of
comparing: first you pass result and then expected.
It gives you ability to use value instead of expected and
understand code faster: no need to search for a second argument.
While result is always a variable, so it most likely much shorter.
โ Example of incorrect code
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(expected, result);
t.end();
});โ Example of correct code
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(result, expected);
t.end();
});convert-tape-to-supertape
โ Example of incorrect code
const test = require('tape');โ Example of correct code
const test = require('supertape');convert-throws-to-try-catch
โ Example of incorrect code
const test = require('supertape');
test('some message', (t) => {
t.throws(copymitter, /from should be a string!/, 'should throw when no args');
t.end();
});โ Example of correct code
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();
});convert-does-not-throw-to-try-catch
โ Example of incorrect code
const test = require('supertape');
test('some message', (t) => {
t.doesNotThrow(copymitter, 'should throw when no args');
t.end();
});โ Example of correct code
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();
});convert-called-with-args
โ Example of incorrect code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, 'hello');
t.end();
});โ Example of correct code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, ['hello']);
t.end();
});convert-equal-to-called-once
No need to use equal, supertape supports calledOnce.
โ Example of incorrect code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.equal(fn.callCount, 1);
t.end();
});โ Example of correct code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledOnce(fn);
t.end();
});convert-deep-equal-to-equal
Use equal when comparing with primitives, deepEqual for Objects and Arrays;
โ Example of incorrect code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
t.deepEqual(x, 5);
t.end();
});โ Example of correct code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
t.equal(x, 5);
t.end();
});convert-called-with-to-called-with-no-args
โ Example of incorrect code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn);
t.end();
});โ Example of correct code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWithNoArgs(fn);
t.end();
});convert-called-with-no-args-to-called-with
โ Example of incorrect code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWithNoArgs(fn, [1, 2]);
t.end();
});โ Example of correct code
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn, [1, 2]);
t.end();
});convert-emitter-to-promise
โ Example of incorrect code
test('copymitter', (t) => {
const cp = copymitter(from, to, ['1']);
cp.on('end', (t) => {
t.end();
});
});โ Example of correct code
const {once} = require('node:events');
test('copymitter', async (t) => {
const cp = copymitter(from, to, ['1']);
await once(cp, 'end');
t.end();
});apply-destructuring
Check out in ๐Putout Editor.
โ Example of incorrect code
const test = require('supertape');โ Example of correct code
const {test} = require('supertape');apply-stub
Apply stub functions created. Look how it works in ๐Putout Editor.
โ Example of incorrect code
const a = async () => true;
const b = async () => {};
const c = async () => throwError('hello');
const d = async () => {
throw Error('hello');
};โ Example of correct code
const a = stub().resolves(true);
const b = stub().resolves();
const c = stub().rejects(Error('hello'));
const d = stub().rejects(Error('hello'));apply-with-name
โ Example of incorrect code
test('should call init before show', (t) => {
const init = stub();
const show = stub();
t.calledInOrder([init, show]);
t.end();
});โ Example of correct code
test('should call init before show', (t) => {
const init = stub().withName('init');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});sync-with-name
โ Example of incorrect code
test('should call init before show', (t) => {
const init = stub().withName('show');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});โ Example of correct code
test('should call init before show', (t) => {
const init = stub().withName('init');
const show = stub().withName('show');
t.calledInOrder([init, show]);
t.end();
});declare
โ Example of incorrect code
test('xxx', (t) => {
const a = stub();
t.end();
});โ Example of correct code
import {test, stub} from 'supertape';
test('xxx', (t) => {
const a = stub();
t.end();
});add-args
โ Example of incorrect code
test('xxx', () => {
t.end();
});โ Example of correct code
test('xxx', (t) => {
t.end();
});add-t-end
โ Example of incorrect code
test('xxx', () => {});โ Example of correct code
test('xxx', (t) => {
t.end();
});remove-useless-t-end
โ Example of incorrect code
test('test: remove me', () => {
t.end();
t.end();
});โ Example of correct code
test('test: remove me', () => {
t.end();
});convert-ok-to-match
โ Example of incorrect code
t.ok(result.includes('hello'));โ Example of correct code
t.match(result, /hello/);convert-ok-to-called-with
โ Example of incorrect code
t.ok(set.calledWith(1, 2));โ Example of correct code
t.calledWith(set, [1, 2]);convert-equal-to-not-ok
โ Example of incorrect code
t.equal(error, null);โ Example of correct code
t.notOk(error);convert-equal-to-ok
โ Example of incorrect code
t.equal(result, true);โ Example of correct code
t.ok(result);convert-equal-to-deep-equal
โ Example of incorrect code
const expected = {
hello: 'world',
};
t.equal(error, expected);
t.end();โ Example of correct code
const expected = {
hello: 'world',
};
t.deepEqual(error, expected);
t.end();convert-equals-to-equal
Checkout in ๐Putout Editor.
โ Example of incorrect code
t.equals(e.message, 'token should be a string!', 'should throw');โ Example of correct code
t.equal(e.message, 'token should be a string!', 'should throw');convert-match-regexp-to-string
โ Example of incorrect code
t.match(result, RegExp('hello'));โ Example of correct code
t.match(result, 'hello');remove-default-messages
๐ผ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.
โ Example of incorrect code
t.equal(result, expected, 'should equal');โ Example of correct code
t.equal(result, expected);remove-useless-not-called-args
โ Example of incorrect code
t.notCalled(fn, []);โ Example of correct code
t.notCalled(fn);remove-only
โ Example of incorrect code
test.only('some test', (t) => {
t.end();
});
testDeclareBeforeReference.only('some test', (t) => {
t.end();
});โ Example of correct code
test('some test', (t) => {
t.end();
});
testDeclareBeforeReference('some test', (t) => {
t.end();
});remove-skip
โ Example of incorrect code
test.skip('some test', (t) => {
t.end();
});โ Example of correct code
test('some test', (t) => {
t.end();
});License
MIT
