Socket
Book a DemoInstallSign in
Socket

@putout/plugin-tape

Package Overview
Dependencies
Maintainers
1
Versions
107
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@putout/plugin-tape

putout plugin helps with tests

Source
npmnpm
Version
7.4.0
Version published
Weekly downloads
19K
-18.87%
Maintainers
1
Weekly downloads
Β 
Created
Source

@putout/plugin-tape NPM version

Putout plugin helps to apply best parctises for tests written with supertape.

Install

npm i @putout/plugin-tape -D

Rules

{
    "rules": {
        "tape/apply-stub-operator": "on",
        "tape/apply-with-name": "on",
        "tape/add-t-end": "on",
        "tape/add-stop-all": "on",
        "tape/add-await-to-re-import": "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-deep-equal-to-equal": "on",
        "tape/expand-try-catch-arguments": "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",
        "tape/remove-stop-all": "on"
    }
}

switch-expected-with-result

❌ Incorrect code example

test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
    t.eqaul(expected, result);
    t.end();
});

βœ… Correct code example

test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
    t.eqaul(result, expected);
    t.end();
});

convert-tape-to-supertape

❌ Incorrect code example

const test = require('tape');

βœ… Correct code example

const test = require('supertape');

convert-throws-to-try-catch

❌ Incorrect code example

const test = require('supertape');

test('some message', (t) => {
    t.throws(copymitter, /from should be a string!/, 'should throw when no args');
    t.end();
});

βœ… Correct code example

const tryCatch = require('try-catch');
const test = require('supertape');

test('some message', (t) => {
    const [error] = tryCatch(copymitter);
    
    t.equal(error.message, 'from shoulde be a string!', 'should throw when no args');
    t.end();
});

convert-does-not-throw-to-try-catch

❌ Incorrect code example

const test = require('supertape');

test('some message', (t) => {
    t.doesNotThrow(copymitter, 'should throw when no args');
    t.end();
});

βœ… Correct code example

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

❌ Incorrect code example

const test = require('supertape');
const {stub} = test;

test('some message', (t) => {
    const fn = stub();
    
    fn();
    
    t.calledWith(fn, 'hello');
    t.end();
});

βœ… Correct code example

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.

❌ Incorrect code example

const test = require('supertape');
const {stub} = test;

test('some message', (t) => {
    const fn = stub();
    
    fn();
    
    t.equal(fn.callCount, 1);
    t.end();
});

βœ… Correct code example

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;

❌ Incorrect code example

const test = require('supertape');
const {stub} = test;

test('some message', (t) => {
    t.deepEqual(x, 5);
    t.end();
});

βœ… Correct code example

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

❌ Incorrect code example

const test = require('supertape');
const {stub} = test;

test('some message', (t) => {
    const fn = stub();
    
    fn();
    
    t.calledWith(fn);
    t.end();
});

βœ… Correct code example

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

❌ Incorrect code example

const test = require('supertape');
const {stub} = test;

test('some message', (t) => {
    const fn = stub();
    
    fn();
    
    t.calledWithNoArgs(fn, [1, 2]);
    t.end();
});

βœ… Correct code example

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

❌ Incorrect code example

test('copymitter', (t) => {
    const cp = copymitter(from, to, ['1']);
    
    cp.on('end', (t) => {
        t.end();
    });
});

βœ… Correct code example

const {once} = require('events');

test('copymitter', async (t) => {
    const cp = copymitter(from, to, ['1']);
    
    await once(cp, 'end');
    t.end();
});

expand-try-catch-arguments

❌ Incorrect code example

import tryCatch from 'try-catch';

test('some message', (t) => {
    const fn = () => copymitter('/hello');
    const [error] = tryCatch(fn);
    
    t.equal(error.message, 'to should be a string!');
    t.end();
});

βœ… Correct code example

import tryCatch from 'try-catch';

test('some message', (t) => {
    const [error] = tryCatch(copymitter, '/hello');
    
    t.equal(error.message, 'to should be a string!');
    t.end();
});

apply-stub-operator

❌ Incorrect code example

test('some message', (t) => {
    t.ok(fn.calledWith(a));
    t.end();
});

βœ… Correct code example

test('some message', (t) => {
    t.calledWith(fn, [a]);
    t.end();
});

apply-with-name

❌ Incorrect code example

test('should call init before show', (t) => {
    const init = stub();
    const show = stub();
    
    t.calledInOrder([init, show]);
    t.end();
});

βœ… Correct code example

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

❌ Incorrect code example

test('should call init before show', (t) => {
    const init = stub().withName('show');
    const show = stub().withName('show');
    
    t.calledInOrder([init, show]);
    t.end();
});

βœ… Correct code example

test('should call init before show', (t) => {
    const init = stub().withName('init');
    const show = stub().withName('show');
    
    t.calledInOrder([init, show]);
    t.end();
});

declare

mockImport

❌ Incorrect code example

import {stub} from 'supertape';

mockImport('fs/promises', {
    readFile: stub().resolves(''),
});
βœ… Correct code Example
import {stub} from 'supertape';
import {createMockImport} from 'mock-import';

const {
    mockImport,
    stopAll,
    reImport,
} = createMockImport(import.meta.url);

mockImport('fs/promises', {
    readFile: stub().resolves(''),
});

tape

❌ Incorrect code example

test('xxx', (t) => {
    const a = stub();
    t.end();
});

βœ… Correct code example

import {
    test,
    stub,
} from 'supertape';

test('xxx', (t) => {
    const a = stub();
    t.end();
});

add-args

❌ Incorrect code example

test('xxx', () => {
    t.end();
});

βœ… Correct code example

test('xxx', (t) => {
    t.end();
});

add-t-end

❌ Incorrect code example

test('xxx', () => {
});

βœ… Correct code example

test('xxx', (t) => {
    t.end();
});

add-await-to-re-import

❌ Incorrect code example

test('stop-all: should be called', (t) => {
    const read = reImport('./read');
    t.end();
});

βœ… Correct code example

test('stop-all: should be called', async (t) => {
    const read = await reImport('./read');
    t.end();
});

add-stop-all

When you write test mocking ESM with mockImport() never forget to call stopAll() when you no longer need it. This leads to bugs in tests which are hard to find, each test should be checked with the one which pass when called alone but fail when called with others.

❌ Incorrect code example

test('stop-all: should be called', (t) => {
    mockImport('fs/promises', {
        readFile: stub(),
    });
    t.end();
});

βœ… Correct code example

test('stop-all: should be called', (t) => {
    mockImport('fs/promises', {
        readFile: stub(),
    });
    
    stopAll();
    t.end();
});

remove-useless-t-end

❌ Incorrect code example

test('test: remove me', () => {
    t.end();
    t.end();
});

βœ… Correct code example

test('test: remove me', () => {
    t.end();
});

convert-ok-to-match

❌ Incorrect code example

t.ok(result.includes('hello'));

βœ… Correct code example

t.match(result, /hello/);

convert-ok-to-match

❌ Incorrect code example

t.ok(set.calledWith(1, 2));

βœ… Correct code example

t.calledWith(set, [1, 2]);

convert-equal-to-not-ok

❌ Incorrect code example

t.equal(error, null);

βœ… Correct code example

t.notOk(error);

convert-equal-to-ok

❌ Incorrect code example

t.equal(result, true);

βœ… Correct code example

t.ok(result);

convert-match-regexp-to-string

❌ Incorrect code example

t.match(result, RegExp('hello'));

βœ… Correct code example

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.

❌ Incorrect code example

t.equal(result, expected, 'should equal');

βœ… Correct code example

t.equal(result, expected);

remove-useless-not-called-args

❌ Incorrect code example

t.notCalled(fn, []);

βœ… Correct code example

t.notCalled(fn);

remove-only

❌ Incorrect code example

test.only('some test', (t) => {
    t.end();
});

βœ… Correct code Example

test('some test', (t) => {
    t.end();
});

remove-skip

❌ Incorrect code example

test.skip('some test', (t) => {
    t.end();
});

remove-stop-all

When reImport() or reRequire not called, stopAll() is redundant and should be removed.

❌ Incorrect code example

test('some test', (t) => {
    stopAll();
    t.end();
});

βœ… Correct code Example

test('some test', (t) => {
    t.end();
});

License

MIT

Keywords

putout

FAQs

Package last updated on 20 Dec 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts