Reputation: 3
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
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