Search code examples
javascriptnode.jsmocha.jsamazon-dynamodbsupertest

supertest and checking DynamoDB before and after using await


I'd like to test my koa API routes using supertest and check what's in DynamoDB before and after to make sure that the end point did what was intended.

// app related
const pool = require('../../src/common/pool');
const app = require('../../server');
// for testing
const uuid = require('uuid');
const supertest = require('supertest');
// listen on port 40002
const request = supertest.agent(app.listen(4002));
describe('test', () => {
  it.only('should', async (done) => {
    debugger;
    const id = uuid.v4().replace(/-/g, '');
    await pool.add(id, 'data', 30);
    return request
      .get('/api/1')
      .expect(204)
      // .then(async (res) => {
      // .then((res) => {
      .end((res) => {
        // still returns 'data' instead of 'dataNew' after the route is hit
        const record = await pool.get(id);
        debugger;
        done();
      });
  });
});

In the code above, I'm creating a record in the db, then I hit the end point, and I tried a then() and an end() chained function to check the db once again. The end point will just data to dataNew and in the then() function, it still returns the original data.

Any ideas on how I can verify the new record in the db ?

References:


Solution

  • The above was fixed by chaining the pool.add() which returns a promise, to the supertest request and then awaiting the record to verify it. Sometimes it still gets the record too quickly because the pool.update() method is not awaited within the end point that request is hitting.

    describe('test', () => {
      it.only('should', async () => {
        const id = uuid.v4().replace(/-/g, '');
        await pool.add(id, 'data', 30).then(() => {
          return request
            .get('/api/1')
            .expect(204)
            // check custom headers
            //.expect('pool-before', 'data')
            //.expect('pool-after', 'dataModified')
            .then(async (res) => {
              const record = await pool.get(id);
              debugger;
              expect('dataModified').to.equal(record.fields.S);
            });
        });
      });
    });
    

    The only other way I can think of is to check the value via a custom header, a delay, or use a mock.

    Let me know if anyone has a better solution.