Search code examples
node.jspostgresqlsequelize.jsintegration-testingkarma-mocha

NodeJS + PostgreSQL integration testing


I would like to include Postgres interaction into my integration tests, i.e. not mock the database part, and I need help on figuring out the best way to do the test cleanup.

My setup is NodeJS, Postgres, Sequelize, Karma+Mocha. Currently, before running the tests a new database is created and migrated, after each test I run a raw query that truncates all the tables, and after all tests cases are finished the test database is dropped. As you probably guessed it, the execution time for running tests like this is pretty slow.

I was wondering if there is a way to speed the process up. Is there an in-memory psql database that I could use for my test cases (I've search for one for a while but couldn't find it), or something like that.

To be more precise, I'm looking for a way to clear the database after a test wrote something to it, in a way that does not require truncating all the tables after every test case.


Solution

  • Incorporated https://stackoverflow.com/a/12082038/2018521 into my cleanup:

    afterEach(async () => {
      await db.sequelize.query(`
        DO
        $func$
        BEGIN
          EXECUTE
          (SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' RESTART IDENTITY CASCADE'
            FROM   pg_class
            WHERE  relkind = 'r'  -- only tables
            AND    relnamespace = 'public'::regnamespace
          );
        END
        $func$;
      `);
    });
    

    Truncate now runs almost instantly.