Why does this promise code never run?

376 Views Asked by At

As you can see in the .gif below, I call tape.js twice in my integration tests and it works fine. But the second time I run the tests, after I've commented out the code to insert test data into my database, the body of the tape.js function never runs.

Why does this happen?

enter image description here

I've put a breakpoint in my database code and it finishes and calls resolve() before the next tape.js test runs so I don't get it.

Here's my test class, followed by database class:

import tape = require('tape');
const testData = require('../../../helper/data');
import * as db from '../../../helper/integration/database';

helper.setTestEnvironmentVariableOn();
const startedServer : hapi.Server = require('../../../../src/app');

(async function runTests() {
  recreateDatabase();
  await db.runQuery(getInsertGetRolesTestPermissionsSql());
  await test_getRoles_returnsAllRoles();

  recreateDatabase();
  await db.runQuery(getInsertGetUsersRolesTestPermissionsSql());
  await test_getUsersRoles_userCanGetHerOwnRoles();
  await startedServer.stop();
})();

function test_getRoles_returnsAllRoles() {
  return new Promise( (resolve, reject) => {
    tape(testeeName + 'GET /roles returns all, and only, Ekaya roles', async (assert) => {
      await helper.createNewUser();
      superagent
      .get(testData.url + `roles`)
      .set('token', testData.token)
      .end( (error: any , result: superagent.Response) => {
        assert.equals(error, null);           
        assert.end();
        resolve();
      });
    });
  });
}

function test_getUsersRoles_userCanGetHerOwnRoles() {
  return new Promise( (resolve, reject) => {
    tape(testeeName + 'GET /users/id/roles gives a user her own roles', async (assert) => {
      const userid = '635de6dc-0df9-43f4-96dc-922bca541515';
      const token = await helper.getTokenForUser(userid);
        superagent
        .get(testData.url + `users/`+userid+`/roles`)
      .set('token', token)
        .end( (error: any , result: superagent.Response) => {
        assert.equals(error, null);                 
            assert.end();
        resolve();
        });
    });
  });
}

function getInsertGetUsersRolesTestPermissionsSql() : string {
  return `
    INSERT INTO enum.permissions(permissions_id, name,...
  `;
}

function getInsertGetRolesTestPermissionsSql() {
  return `
    delete fr...`;
}

Database class:

import * as pg from "pg";
import 'reflect-metadata';
const Config = require('../../../src/config');
const config = new Config();

export function runQuery(sql: string) : Promise<any> {
    return new Promise<any>(async (resolve, reject) => {
    try {
      const _db = new pg.Client(config.ekaya_local_connection_string);
        await connect(_db);
        _db.query(sql, function(error, result) {
            if (error) {
                console.error('Error running query', error);
          _db.end();
          reject(error);
                return;
            }
        _db.end();
            resolve(result);
        });
    }
    catch (error) {
      reject(error);
    }
    });
}

function connect(_db: pg.Client) : Promise<void> {
    return new Promise<void>(  function(resolve, reject) {
    try {
        _db.connect(function(error) {
            if (error) {
                console.error('Could not connect to postgres in integration test helper', error);
                reject(error);
          return;
            }
            resolve(null);
        });
    }
    catch (error) {
      reject(error);
    }
    });
}

UPDATE - after vitaly-t's suggestion

New database code, no effect on the problem:

import 'reflect-metadata';
const Config = require('../../../src/config');
const config = new Config();
const pgp = require("pg-promise")();

export function runQuery(sql: string) : any {
return new Promise<any>(async (resolve, reject) => {
    try {          
      const _db = pgp(config.ekaya_local_connection_string);
      const result = await _db.query(sql);
      pgp.end();
      resolve({rows: result}); 
    }
    catch (error) {reject(error);}
  });
}
0

There are 0 best solutions below