@putout/plugin-tape
Version:
πPutout plugin helps with tests
752 lines (542 loc) β’ 14.8 kB
Markdown
# @putout/plugin-tape [![NPM version][NPMIMGURL]][NPMURL]
[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**](https://github.com/coderaiser/supertape)
π[**Putout**](https://github.com/coderaiser/putout) plugin helps to apply best parctises for tests written with πΌ[**Supertape**](https://github.com/coderaiser/supertape).
## Install
```
npm i @putout/plugin-tape -D
```
## Rules
- β
[add-args](#add-args);
- β
[add-t-end](#add-t-end);
- β
[apply-destructuring](#apply-destructuring);
- β
[apply-stub](#apply-stub);
- β
[apply-with-name](#apply-with-name);
- β
[convert-called-with-args](#convert-called-with-args);
- β
[convert-called-with-no-args-to-called-with](#convert-called-with-no-args-to-called-with);
- β
[convert-called-with-to-called-with-no-args](#convert-called-with-to-called-with-no-args);
- β
[convert-deep-equal-to-equal](#convert-deep-equal-to-equal);
- β
[convert-does-not-throw-to-try-catch](#convert-does-not-throw-to-try-catch);
- β
[convert-emitter-to-promise](#convert-emitter-to-promise);
- β
[convert-equal-to-called-once](#convert-equal-to-called-once);
- β
[convert-equal-to-deep-equal](#convert-equal-to-deep-equal);
- β
[convert-equal-to-not-ok](#convert-equal-to-not-ok);
- β
[convert-equal-to-ok](#convert-equal-to-ok);
- β
[convert-equals-to-equal](#convert-equals-to-equal);
- β
[convert-match-regexp-to-string](#convert-match-regexp-to-string);
- β
[convert-ok-to-called-with](#convert-ok-to-called-with);
- β
[convert-ok-to-match](#convert-ok-to-match);
- β
[convert-tape-to-supertape](#convert-tape-to-supertape);
- β
[convert-throws-to-try-catch](#convert-throws-to-try-catch);
- β
[declare](#declare);
- β
[jest](#jest);
- β
[remove-default-messages](#remove-default-messages);
- β
[remove-only](#remove-only);
- β
[remove-skip](#remove-skip);
- β
[remove-useless-not-called-args](#remove-useless-not-called-args);
- β
[remove-useless-t-end](#remove-useless-t-end);
- β
[switch-expected-with-result](#switch-expected-with-result);
- β
[sync-with-name](#sync-with-name);
## Config
```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", {
"allowed": ["test"]
}],
"tape/remove-skip": ["on", {
"allowed": ["test"]
}]
}
}
```
## jest
π**Putout** gives ability to switch easily from [**Jest**](https://github.com/coderaiser/putout/blob/master/packages/plugin-jest/README.md#putoutplugin-jest-) to πΌ**Supertape**. Checkout in π[**Putout Editor**](https://putout.cloudcmd.io/#/gist/e610ded68d5808c2dbc09a1f84be8a96/c8f515668b5bdf16b58ef85c3ca13d93682f3ccb).
### β Example of incorrect code
```js
it('should equal', () => {
expect(a).toEqual(b);
});
```
### β
Example of correct code
```js
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
```js
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(expected, result);
t.end();
});
```
### β
Example of correct code
```js
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
t.equal(result, expected);
t.end();
});
```
## convert-tape-to-supertape
### β Example of incorrect code
```js
const test = require('tape');
```
### β
Example of correct code
```js
const test = require('supertape');
```
## convert-throws-to-try-catch
### β Example of incorrect code
```js
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
```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();
});
```
## convert-does-not-throw-to-try-catch
### β Example of incorrect code
```js
const test = require('supertape');
test('some message', (t) => {
t.doesNotThrow(copymitter, 'should throw when no args');
t.end();
});
```
### β
Example of correct code
```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();
});
```
## convert-called-with-args
### β Example of incorrect code
```js
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
```js
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`](https://github.com/coderaiser/supertape#tequalactual-expected-msg), [`supertape`](https://github.com/coderaiser/supertape) supports [`calledOnce`](https://github.com/coderaiser/supertape/tree/master/packages/operator-stub#tcalledoncefn--message).
### β Example of incorrect code
```js
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
```js
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`](https://github.com/coderaiser/supertape#tequalactual-expected-msg) when comparing with primitives, [`deepEqual`](https://github.com/coderaiser/supertape#tdeepequalactual-expected-msg) for [`Objects`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) and [`Arrays`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array);
### β Example of incorrect code
```js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
t.deepEqual(x, 5);
t.end();
});
```
### β
Example of correct code
```js
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
```js
const test = require('supertape');
const {stub} = test;
test('some message', (t) => {
const fn = stub();
fn();
t.calledWith(fn);
t.end();
});
```
### β
Example of correct code
```js
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
```js
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
```js
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
```js
test('copymitter', (t) => {
const cp = copymitter(from, to, ['1']);
cp.on('end', (t) => {
t.end();
});
});
```
### β
Example of correct code
```js
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**](https://putout.cloudcmd.io/#/gist/adf238850271c0a4ad917e71bab8757c/4ff416c3d9f3de0930339c7a4929eb4b62461d1a).
### β Example of incorrect code
```js
const test = require('supertape');
```
### β
Example of correct code
```js
const {test} = require('supertape');
```
## apply-stub
Apply [stub](https://github.com/cloudcmd/stub) functions created. Look how it works in π[**Putout Editor**](https://putout.cloudcmd.io/#/gist/d098a8c8d03a072a7f3981e3cfb1d7af/f1542bfa39513ac625b2a9cd9243cc06dee286c0).
### β Example of incorrect code
```js
const a = async () => true;
const b = async () => {};
const c = async () => throwError('hello');
const d = async () => {
throw Error('hello');
};
```
### β
Example of correct code
```js
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
```js
test('should call init before show', (t) => {
const init = stub();
const show = stub();
t.calledInOrder([init, show]);
t.end();
});
```
### β
Example of correct code
```js
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
```js
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
```js
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
```js
test('xxx', (t) => {
const a = stub();
t.end();
});
```
### β
Example of correct code
```js
import {test, stub} from 'supertape';
test('xxx', (t) => {
const a = stub();
t.end();
});
```
## add-args
### β Example of incorrect code
```js
test('xxx', () => {
t.end();
});
```
### β
Example of correct code
```js
test('xxx', (t) => {
t.end();
});
```
## add-t-end
### β Example of incorrect code
```js
test('xxx', () => {});
```
### β
Example of correct code
```js
test('xxx', (t) => {
t.end();
});
```
## remove-useless-t-end
### β Example of incorrect code
```js
test('test: remove me', () => {
t.end();
t.end();
});
```
### β
Example of correct code
```js
test('test: remove me', () => {
t.end();
});
```
## convert-ok-to-match
### β Example of incorrect code
```js
t.ok(result.includes('hello'));
```
### β
Example of correct code
```js
t.match(result, /hello/);
```
## convert-ok-to-called-with
### β Example of incorrect code
```js
t.ok(set.calledWith(1, 2));
```
### β
Example of correct code
```js
t.calledWith(set, [1, 2]);
```
## convert-equal-to-not-ok
### β Example of incorrect code
```js
t.equal(error, null);
```
### β
Example of correct code
```js
t.notOk(error);
```
## convert-equal-to-ok
### β Example of incorrect code
```js
t.equal(result, true);
```
### β
Example of correct code
```js
t.ok(result);
```
## convert-equal-to-deep-equal
### β Example of incorrect code
```js
const expected = {
hello: 'world',
};
t.equal(error, expected);
t.end();
```
### β
Example of correct code
```js
const expected = {
hello: 'world',
};
t.deepEqual(error, expected);
t.end();
```
## convert-equals-to-equal
Checkout in π[**Putout Editor**](https://putout.cloudcmd.io/#/gist/9a428ce99c5ec8966363a7a6da5bbba8/7441cbf7c8429b265259e7d67125fa138d7db19b).
### β Example of incorrect code
```js
t.equals(e.message, 'token should be a string!', 'should throw');
```
### β
Example of correct code
```js
t.equal(e.message, 'token should be a string!', 'should throw');
```
## convert-match-regexp-to-string
### β Example of incorrect code
```js
t.match(result, RegExp('hello'));
```
### β
Example of correct code
```js
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
```js
t.equal(result, expected, 'should equal');
```
### β
Example of correct code
```js
t.equal(result, expected);
```
## remove-useless-not-called-args
### β Example of incorrect code
```js
t.notCalled(fn, []);
```
### β
Example of correct code
```js
t.notCalled(fn);
```
## remove-only
### β Example of incorrect code
```js
test.only('some test', (t) => {
t.end();
});
testDeclareBeforeReference.only('some test', (t) => {
t.end();
});
```
### β
Example of correct code
```js
test('some test', (t) => {
t.end();
});
testDeclareBeforeReference('some test', (t) => {
t.end();
});
```
## remove-skip
### β Example of incorrect code
```js
test.skip('some test', (t) => {
t.end();
});
```
### β
Example of correct code
```js
test('some test', (t) => {
t.end();
});
```
## License
MIT