seattleguy
seattleguy

Reputation: 337

reset a database before each test

I'm using node and supertest for a simple app. I got SQlite3 for the local test database. I did a simple test to get a super inserted into the database. I wanted to reset the database each time a test is run. I'm looking in the docs right now and can't seem to locate it. I figured I would ask here because it seems someone would most likely know the info.

const request = require('supertest');
const server = require('../server');

describe('Authentication', function() {

//database reset here

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: '[email protected]',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});

Upvotes: 4

Views: 11263

Answers (4)

seattleguy
seattleguy

Reputation: 337

I did this in the file and it works fine

const request = require('supertest');
const server = require('../server');
const knex = require('knex');
const dbConfig = require('../knexfile.js')['test'];
const db = knex(dbConfig);

describe('Authentication', () => {
  beforeEach(async () => {
    await db('users').truncate();
  });

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: '[email protected]',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});

Upvotes: 0

Yousaf
Yousaf

Reputation: 29312

If you want to run any piece of code before each test, you can use beforeEach function in jest

describe('my test', () => {
    beforeEach(() => {
       // code to run before each test
    });

    test('test 1', () => {
      // code
    });

   test('test 2', () => {
      // code
   });
});

Upvotes: 3

Sudhakar Ramasamy
Sudhakar Ramasamy

Reputation: 1759

There's no defined way to reset a sqlite db, just delete the db and recreate.

Sqlite: How do I reset all database tables?

Upvotes: 0

Mrk Fldig
Mrk Fldig

Reputation: 4486

So best way to do this is have some logic in your routing functions of your Api

Receive an API request
Check if ['X-MOCK-HEADER'] exists
If it does then route to the mock version of the endpoint

So your mock for create user would always return 201 OK - your mock endpoint would do something like this:

const routes = {
   CREATE_USER_OK:() => { return {....} } // make sure these return proper http responses
   CREATE_USER_BAD_REQUEST: () { return {...} }
}

 return routes[HEADER_VALUE]()

The reason being you're testing the route not the database class in this instance, so you just want to return static data, if you wanna test something else then just change the X-MOCK-HEADER value to whatever you want and add the mock route to return the right http response/code - I'd need to know what the API code looked like to help you on the backend implementation.

If possible stay away from messing with staging databases for testing because down the road you will suffer a LOT of pain as it gradually gets filled with garbage.

Also if you're working with a front end app you can quickly prototype with static data - this is especially useful if you've got a front end team waiting for an API endpoint to say create a login screen.

Upvotes: 0

Related Questions