Skip to content

jest unit test : mongodb connection fails on docker (CI) pipeline, works well on local #437

Closed
@sagargadekar601

Description

@sagargadekar601

Versions

  • NodeJS: 12.20.1
  • mongodb-memory-server-*: 6.9.3
  • mongodb: 3.6.2
  • mongoose: 5.11.13
  • system: Windows 10

package: mongo-memory-server

What is your question?

"mongodb" connection fails on docker (CI) pipeline, however it works well on local. Below is the error it shows when pipeline fails. It should create in-memory mongodb server and execute the unit tests on that. I tried searching similar issue, but I didn't find anything apart from this. I did the suggestions provided in that issue but it didn't help. Can someone please shed some light on this? I am baddly stuck due to this.

vue-cli-service test:unit --expand --no-cache --coverage
  console.warn node_modules/mongodb-memory-server-core/lib/MongoMemoryServer.js:143
    Starting the instance failed, please enable debug for more infomation
  console.error __tests__/routes/ser-data.spec.js:40
    MongoDB connection FAIL
2021-02-14T18:06:15.049Z bff-ser:ser-data:error Insert ser info MongooseError: Operation `ser_collection.insertOne()` buffering timed out after 10000ms
2021-02-14T18:06:15.056Z bff-ser:ser-data:error Get SER data MongooseError: Operation `ser_collection.find()` buffering timed out after 10000ms
  ●  Cannot log after tests are done. Did you forget to wait for something async in your test?
    Attempted to log "response.statusCode : 500".
      45 |     var bodyData = mockData.ser_test_SingleData;
      46 |     var response = await request.post(`/ser/ser-data/`).send(bodyData);
    > 47 |     console.log("response.statusCode : " + response.statusCode);
         |             ^
      48 |     expect(response.statusCode).toBe(200);
      49 |     expect(response.body.name).toBe("SERProject1");
      50 |   });
      at console.log (node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/console/build/CustomConsole.js:183:10)
      at Object.<anonymous> (__tests__/routes/ser-data.spec.js:47:13)
FAIL __tests__/routes/ser-data.spec.js (12.462s)
  bff-ser
    ✕ bff-ser /ser/ser-data/ POST query (11ms)
    ✕ get SERs (10052ms)
  ● bff-ser › bff-ser /ser/ser-data/ POST query
    spawn /builds/mainstream-eng-cloud/bff-ser/node_modules/.cache/mongodb-memory-server/mongodb-binaries/4.0.14/mongod ENOENT
  ● bff-ser › get SERs
    expected "Content-Type" matching /json/, got "text/plain; charset=utf-8"
      at Test.Object.<anonymous>.Test._assertHeader (node_modules/supertest/lib/test.js:245:14)

Ran all test suites.
  console.warn node_modules/@sentry/node/dist/integrations/onunhandledrejection.js:63
    This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
  console.error node_modules/@sentry/node/dist/integrations/onunhandledrejection.js:64
    Error: Caught error after test environment was torn down
    
    expect(received).toBe(expected) // Object.is equality
    
    Expected: 200
    Received: 500

Below is my Code :

process.env.NODE_ENV = "test";
const app = require("../../app"); // Link to your server file
const supertest = require("supertest");
const request = supertest(app);
const mongoose = require("mongoose");
const mockData = require("../helpers/data.json");
const { MongoMemoryServer } = require("mongodb-memory-server");

const mongod = new MongoMemoryServer();
//jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;

describe("cff-ser", () => {
  beforeAll(async () => {
    try {
      jest.setTimeout(30 * 1000);
      const uri = await mongod.getUri();

      const mongooseOpts = {
        useNewUrlParser: true,
        useUnifiedTopology: true
      };

      if (mongoose.connection.name != "") await mongoose.connection.close();

      mongoose.connect(uri, mongooseOpts);

      mongoose.Promise = global.Promise;
      var db = mongoose.connection;

      db.on(
        "error",
        console.error.bind(console, "DocumentDB connection error:")
      );

      db.once("open", function () {
        // we're connected!
        console.log("db object" + db);
      });
    } catch (error) {
      console.error("MongoDB connection FAIL");
    }
  });

  it("cff-ser /ser/ser-data/ POST query", async () => {
    var bodyData = mockData.ser_test_SingleData;
    var response = await request.post(`/ser/ser-data/`).send(bodyData);
    console.log("response.statusCode : " + response.statusCode);
    expect(response.statusCode).toBe(200);
    expect(response.body.name).toBe("serProject1");
  });

  
  afterAll(async () => {
    await mongoose.connection.dropDatabase();
    await mongoose.connection.close();
    await mongoose.disconnect();
    await mongod.stop();
  });
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions