Phelipe Lima
Phelipe Lima

Reputation: 3

MongoError: Topology is closed, please connect - when running unit tests with Jest

I'm trying to run unit tests of a Node project with Jest and mongodb in memory.

The project has some migrations to insert in the memory database.

To start the process we run the npm test with the script below:

package.json

"scripts": {
    "test": "./node_modules/.bin/jest --verbose=true --coverage ./__test__/unit/",
  }

This is the error:

 (node:23353) [MONGODB DRIVER] DeprecationWarning: The option
 `autoReconnect` is incompatible with the unified topology, please read
 more by visiting...  PASS 
 __ test__/unit/util/stringUtil.test.js  PASS  __ test__/unit/validadores/validaPrazo.test.js  PASS  __ test__/unit/Services/alta-plataforma/realizarAnalise.test.js  Console

console.log src/persistencia/migrations/migration.js:40
  Não foram inseridas as collections: MongoError: Topology is closed, please connect
      at processWaitQueue (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:1011:42)
      at NativeTopology.selectServer (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:449:5)
      at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:937:12)
      at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:609:5)
      at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/topologies/native_topology.js:64:11)
      at OrderedBulkOperation.finalOptionsHandler (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1211:25)
      at executeCommands (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:527:17)
      at executeLegacyOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:389:24)
      at OrderedBulkOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1147:12)
      at BulkWriteOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/bulk_write.js:67:10)
      at InsertManyOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/insert_many.js:41:24)
      at /home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:72:19
      at maybePromise (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:685:3)
      at executeOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:34:10)
      at Collection.Object.<anonymous>.Collection.insertMany (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/collection.js:550:10)
      at NativeCollection.<computed> [as insertMany] (/home/ph/dev/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:218:28)
 {
    insertedDocs: [
      {
        grupos: [Array],
        _id: 605851b9cd5c445b3947c25f,
        beneficio: 'ALCADA NAO OBRIGATORIA',
        descricao: 'Não exige alçada para autorização',
        descricaoAltaPlataforma: 'Não exige alçada mínima',
        ativo: false,
        emergencial: true,
        categoria: 'ALCADA',
        prioridadeCategoria: 0,
        tipoRetorno: 'BENEFICIO',...

We also face this error:

MongoError: server is closed
              at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/server.js:461:14)
              at Server.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/server.js:382:5)
              at Object.callback (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:969:15)
              at processWaitQueue (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:1049:21)
              at NativeTopology.selectServer (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:449:5)
              at executeWriteOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:937:12)
              at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:609:5)
              at NativeTopology.insert (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/topologies/native_topology.js:64:11)
              at OrderedBulkOperation.finalOptionsHandler (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1211:25)
              at executeCommands (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:527:17)
              at executeLegacyOperation (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:389:24)
              at OrderedBulkOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/bulk/common.js:1147:12)
              at BulkWriteOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/bulk_write.js:67:10)
              at InsertManyOperation.execute (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/insert_many.js:41:24)
              at /home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:72:19
              at maybePromise (/home/ph/dev/node_modules/mongoose/node_modules/mongodb/lib/utils.js:685:3) {
            insertedDocs: [
              {
                monitoracaoPlataforma: [],
                beneficiosRecebidos: [Array],

Some configs:

package.json

  "dependencies": {
    "@promster/express": "^4.0.0",
    "axios": "^0.21.1",
    "body-parser": "1.18.3",
    "bunyan": "file:bunyan-1.8.12.tgz",
    "consign": "0.1.6",
    "cors": "^2.8.5",
    "dotenv": "^7.0.0",
    "express": "4.16.3",
    "express-react-views": "^0.11.0",
    "express-validator": "^6.2.0",
    "jshint": "^2.11.0-rc1",
    "lodash": "^4.17.15",
    "moment": "^2.24.0",
    "mongoose": "^5.12.1",
    "morgan-body": "^2.4.8",
    "mysql": "2.16.0",
    "pg": "^7.11.0",
    "prom-client": "^11.5.3",
    "react": "^16.13.0",
    "react-dom": "^16.12.0",
    "react-tooltip": "^3.11.1",
    "request": "2.88.0",
    "swagger-jsdoc": "^3.4.0",
    "swagger-ui-express": "^4.1.2",
    "typings": "^2.1.1",
    "xml2js": "^0.4.22"
  },
  "devDependencies": {
    "@shelf/jest-mongodb": "^1.1.3",
    "eslint": "^5.14.1",
    "eslint-config-airbnb-base": "^13.1.0",
    "eslint-plugin-import": "^2.16.0",
    "jest": "^24.9.0",
    "jest-sonar-reporter": "^2.0.0",
    "mongodb-memory-server": "^6.0.1",
    "nock": "^11.7.0",
    "nodemon": "^1.19.4",
    "supertest": "3.3.0"
  }
}

jest.config.js

module.exports = {
  clearMocks: true,
  preset: '@shelf/jest-mongodb',
  testEnvironment: 'node',
  moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node']
};

jest-mongodb-config.js

module.exports = {
  mongodbMemoryServerOptions: {
    instance: {
      dbName: 'jest'
    },
    binary: {
      version: '4.0.3',
      skipMD5: true
    },
    autoStart: false
  }
};

globalConfig.json

{"mongoUri":"mongodb://127.0.0.1:34885/jest?","mongoDBName":"jest"}

Method to connect:

/src/config/database.js

const mongoose = require('mongoose');
const logger = require('../util/logger');

exports.conectDb = function () {
  const senhaBD = process.env.MONGO_PASSWORD;
  const userBD = process.env.MONGO_USER;
  const hostBD = process.env.MONGO_HOST;
  const dataBaseBD = process.env.MONGO_DATABASE;
  const urlConexao = `mongodb://${userBD}:${senhaBD}@${hostBD}:27017/${dataBaseBD}`;
  const opcoesConexao = { autoReconnect: true, useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false };
  mongoose.connect(urlConexao, opcoesConexao);
};

exports.monitorarDb = function () {
  mongoose.connection.on('connected', () => {
    logger.logger.info('server mongodb conected');
  });
  mongoose.connection.on('error', (error) => {
    logger.logger.info(`Error to conecte ${error}`);
  });
  mongoose.connection.on('disconnected', () => {
    logger.logger.info('disconnected from mongodb');
  });
  mongoose.connection.on('reconnected', () => {
    logger.logger.info('Mongodb reconnected');
  });

  process.on('SIGINT', () => {
    mongoose.connection.close(() => {
      logger.logger.info('conection to mongoose finished');
      process.exit(0);
    });
  });
};

How the test is called:

analise.test.js

const { MongoMemoryServer } = require('mongodb-memory-server');
const mongoose = require('mongoose');
const request = require('supertest');
const app = require('../../src/config/custom-express')();

const Migrations = require('../../src/persist/migrations/migration');

const mongoServer = new MongoMemoryServer();
const url = '/analise/analiseTemp';

describe(url, () => {

  beforeAll(async (done) => {
    const opcoesConexao = {
      autoReconnect: true, useNewUrlParser: true,
      useUnifiedTopology: true, useCreateIndex: true,
      useFindAndModify: false
    };
    mongoServer
      .getConnectionString()
      .then((mongoUri) => {
        return mongoose.connect(mongoUri, opcoesConexao, async (err) => {
          if (err) done(err);
          await Migrations(mongoose);
        });
      })
      .then(() => done());
  });

  afterAll(async (done) => {
    await mongoose.disconnect();
    await mongoServer.stop();
    done();
  });

  it('Deve responder 204 quando o endpoint for registrado', async (done) => {
    request(app)
      .options(url)
      .expect(204, done);
  });
});

So I humbly ask for help from the community, I don't know how to make it work

thanks in advance!

Upvotes: 0

Views: 1039

Answers (1)

Kevyn Klava
Kevyn Klava

Reputation: 316

The method getConnectionString() is deprecated, use instead getUri().

Try this way instead

describe(url, () => {

  beforeAll(async () => {
    const opcoesConexao = {
      autoReconnect: true, useNewUrlParser: true,
      useUnifiedTopology: true, useCreateIndex: true,
      useFindAndModify: false
    };

    const uri = await new MongoMemoryServer().getUri();
    await connect(uri, opcoesConexao, (err) => {
        if (!err) return;
        console.error(err);
        process.exit(1);
    });
    
    await Migrations(mongoose);
  });  
  
});

Upvotes: 1

Related Questions