Skip to content

Commit

Permalink
Improve documentation (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
kibertoad authored Dec 28, 2020
1 parent 3c1d7c5 commit dd80129
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 36 deletions.
10 changes: 7 additions & 3 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
{
"plugins": [
"prettier"
],
"extends": ["eslint:recommended", "prettier"],
"plugins": ["prettier"],
"parserOptions": {
"ecmaVersion": 2017
},
"env": {
"node": true,
"mocha": true,
"es6": true
},
"rules": {
"prettier/prettier": "error"
}
Expand Down
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
# knex-tablecleaner

[![npm version](http://img.shields.io/npm/v/knex-tablecleaner.svg)](https://npmjs.org/package/knex-tablecleaner)
[![npm downloads](https://img.shields.io/npm/dm/knex-tablecleaner.svg)](https://npmjs.org/package/knex-tablecleaner)
![](https://github.com/kibertoad/knex-tablecleaner/workflows/CI/badge.svg)
[![Coverage Status](https://coveralls.io/repos/kibertoad/knex-tablecleaner/badge.svg?branch=master)](https://coveralls.io/r/kibertoad/knex-tablecleaner?branch=master)

Simple library for deleting all rows from a given list of DB tables.
Tables are cleaned sequentially in a given order to avoid foreign key constraint violations.
Tables are cleaned sequentially in a given order, to avoid foreign key constraint violations.

Example usage:

```js
const tableCleaner = require('knex-tablecleaner');
const knex = require('../db');
const knex = require('../db'); // pre-initialized instance of knex

const defaultTablesToClean = [
'orders',
Expand All @@ -22,3 +27,11 @@ module.exports = {
cleanDb,
};
```

## Parameters

`function cleanTables(knex, tableNames, verboseLog = false)` accepts following parameters:
* `knex` - pre-initialized knex instance that will be used for accessing the database;
* `tableNames` - either a string with a table name, or an array of strings with table names;
* `verboseLog` - if set to true, will log a list of tables being cleaned and the completion log messages.

2 changes: 1 addition & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ declare const tableCleaner: {
cleanTables: (
knex: Knex,
tableNames: string | string[],
verboseLog: boolean
verboseLog?: boolean
) => Promise<void>;
};

Expand Down
13 changes: 7 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "knex-tablecleaner",
"version": "4.1.0",
"license": "MIT",
"description": "Knex Tablecleaner",
"description": "Library for sequentially deleting all rows from a given list of DB tables.",
"maintainers": [
{
"name": "Igor Savin",
Expand All @@ -16,7 +16,7 @@
"scripts": {
"coveralls": "nyc report --reporter=lcov",
"test": "mocha test/**/*.spec.js",
"test:coverage": "nyc mocha --opts \"./mocha.opts\" test",
"test:coverage": "nyc mocha test",
"prettier": "prettier --write \"{src,test}/**/*.{js,ts}\"",
"lint": "eslint --format codeframe \"src/**/*.js\" \"test/**/*.js\"",
"db:start": "docker-compose -f docker-compose.yml up --build -d mysql postgres mssql; docker-compose -f docker-compose.yml up waitmssql waitmysql waitpostgres",
Expand All @@ -28,6 +28,7 @@
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"eslint": "^7.16.0",
"eslint-config-prettier": "^7.1.0",
"eslint-plugin-prettier": "^3.3.0",
"knex": "^0.19.5",
"mocha": "^6.2.3",
Expand All @@ -53,10 +54,10 @@
"cache": true,
"all": true,
"check-coverage": true,
"lines": 85,
"statements": 85,
"functions": 100,
"branches": 70
"statements": 100,
"branches": 100,
"lines": 100,
"functions": 100
},
"keywords": [
"postgresql",
Expand Down
2 changes: 1 addition & 1 deletion src/tablecleaner.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function cleanTables(knex, tableNames, verboseLog = false) {
}

let commands = [];
for (tableName of tableNames) {
for (const tableName of tableNames) {
commands.push(_makeCleanTableCommand(knex, tableName, verboseLog));
}

Expand Down
31 changes: 25 additions & 6 deletions test/tablecleaner.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const { expect } = chai;
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);

const tableCleaner = require('../src/tablecleaner');
const tableCleaner = require('..');
const dbInitializer = require('./utils/dbInitializer');

const { getAllDbs, getKnexForDb } = require('./utils/knexInstanceProvider');
Expand Down Expand Up @@ -35,7 +35,7 @@ describe('tablecleaner', () => {
await dbInitializer.dropDb(knex);
});

it('supports array of tables', async () => {
it('supports array of tables with single element', async () => {
await knex('models').insert({});
await knex('models').insert({});
const entriesBeforeClean = await knex('models').select();
Expand All @@ -47,6 +47,25 @@ describe('tablecleaner', () => {
expect(entriesAfterClean.length).to.equal(0);
});

it('supports array of tables with several elements', async () => {
await knex('models').insert({});
await knex('models').insert({});
await knex('models2').insert({});
await knex('models2').insert({});
await knex('models2').insert({});
const entriesBeforeClean1 = await knex('models').select();
expect(entriesBeforeClean1.length).to.equal(2);
const entriesBeforeClean2 = await knex('models2').select();
expect(entriesBeforeClean2.length).to.equal(3);

await tableCleaner.cleanTables(knex, ['models', 'models2'], true);

const entriesAfterClean1 = await knex('models').select();
expect(entriesAfterClean1.length).to.equal(0);
const entriesAfterClean2 = await knex('models2').select();
expect(entriesAfterClean2.length).to.equal(0);
});

it('supports single table', async () => {
await knex('models').insert({});
await knex('models').insert({});
Expand All @@ -62,7 +81,7 @@ describe('tablecleaner', () => {
it('handles error correctly', async () => {
let errorRegex = getErrorRegexForDb(knex);
await expect(
tableCleaner.cleanTables(knex, ['models2'])
tableCleaner.cleanTables(knex, ['models3'])
).to.be.rejectedWith(errorRegex);
});
});
Expand All @@ -72,18 +91,18 @@ describe('tablecleaner', () => {

function getErrorRegexForDb(knex) {
if (isSQLite(knex)) {
return /delete from `models2` - SQLITE_ERROR: no such table: models2/;
return /delete from `models3` - SQLITE_ERROR: no such table: models3/;
}

if (isPostgreSQL(knex)) {
return /delete from "models2" - relation "models2" does not exist/;
return /delete from "models3" - relation "models3" does not exist/;
}

if (isMssql(knex)) {
return /Invalid object name/;
}

if (isMysql(knex)) {
return /Table 'knex_test.models2' doesn't exist/;
return /Table 'knex_test.models3' doesn't exist/;
}
}
27 changes: 11 additions & 16 deletions test/utils/dbInitializer.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
const { tableCleaner } = require('../../');

const DEFAULT_TABLES = ['models'];

function dropDb(knex) {
return knex.schema.dropTableIfExists('models');
async function dropDb(knex) {
await knex.schema.dropTable('models');
await knex.schema.dropTable('models2');
}

function createDb(knex) {
return knex.schema.createTableIfNotExists(`models`, function (table) {
async function createDb(knex) {
await knex.schema.createTable(`models`, function (table) {
table.increments('id');
table.string('name');
table.string('surname');
table.string('description');
});
}

function cleanDb(knex) {
return _cleanTables(knex);
}

function _cleanTables(knex, tables = DEFAULT_TABLES) {
return dbCleaner.cleanTables(knex, tables);
await knex.schema.createTable(`models2`, function (table) {
table.increments('id');
table.string('name');
table.string('surname');
table.string('description');
});
}

module.exports = {
cleanDb,
createDb,
dropDb,
};
2 changes: 1 addition & 1 deletion test/utils/knexInstanceProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const Db = {
SQLite: 'sqlite3',
};

const defaultDbs = [Db.PostgresSQL, Db.MySQL, Db.MySQL2, Db.SQLite, Db.MSSQL];
const defaultDbs = [Db.PostgresSQL, Db.MySQL, Db.SQLite, Db.MSSQL];

function getAllDbs() {
return process.env.DB ? process.env.DB.split(' ') : defaultDbs;
Expand Down

0 comments on commit dd80129

Please sign in to comment.