From d1e65f53ba723c5b7ac58f89c2a39b9b3dc8dd14 Mon Sep 17 00:00:00 2001 From: om-3004 Date: Wed, 16 Oct 2024 18:28:04 +0530 Subject: [PATCH] Add test cases for checking monitor endpoint resolution --- Server/controllers/monitorController.js | 9 ++-- .../controllers/monitorController.test.js | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index e6a924863..0586d650e 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -274,7 +274,6 @@ const createMonitor = async (req, res, next) => { * @returns {Object} The response object with a success status, a message, and the resolution result. * @throws {Error} If there is an error during the process, especially if there is a validation error (422). */ - const checkEndpointResolution = async (req, res, next) => { try { let { monitorURL } = req.query; @@ -284,12 +283,12 @@ const checkEndpointResolution = async (req, res, next) => { // Remove the trailing slash if it exists monitorURL = monitorURL.endsWith('/') ? monitorURL.slice(0, -1) : monitorURL; - dns.setServers(['8.8.8.8', '1.1.1.1']);// Google, Cloudfare dns.resolve(monitorURL, (error) => { - console.log("Inside .resolve"); if (error) { - next(handleError(error, SERVICE_NAME, "checkEndpointResolution")); - return ; + return res.status(400).json({ + success: false, + msg: `DNS resolution failed`, + }); } return res.status(200).json({ success: true, diff --git a/Server/tests/controllers/monitorController.test.js b/Server/tests/controllers/monitorController.test.js index e2855e81b..730deb327 100644 --- a/Server/tests/controllers/monitorController.test.js +++ b/Server/tests/controllers/monitorController.test.js @@ -6,6 +6,7 @@ const { getMonitorsAndSummaryByTeamId, getMonitorsByTeamId, createMonitor, + checkEndpointResolution, deleteMonitor, deleteAllMonitors, editMonitor, @@ -21,6 +22,7 @@ const monitorController = proxyquire("../../controllers/monitorController", { "ssl-checker": sslCheckerStub, }); const logger = require("../../utils/logger"); +const dns = require("dns"); const SERVICE_NAME = "monitorController"; describe("Monitor Controller - getAllMonitors", () => { @@ -473,6 +475,58 @@ describe("Monitor Controller - createMonitor", () => { }); }); +describe('checkEndpointResolution', () => { + let dnsResolveStub; + beforeEach(() => { + req = { query: { monitorURL: 'example.com' } }; + res = { status: sinon.stub().returnsThis(), json: sinon.stub() }; + next = sinon.stub(); + dnsResolveStub = sinon.stub(dns, 'resolve'); + }); + afterEach(() => { + dnsResolveStub.restore(); + }); + it('should resolve the URL successfully', async () => { + dnsResolveStub.callsFake((monitorURL, callback) => callback(null)); + await checkEndpointResolution(req, res, next); + expect(res.status.calledWith(200)).to.be.true; + expect(res.json.calledWith({ + success: true, + msg: 'URL resolved successfully', + })).to.be.true; + expect(next.called).to.be.false; + }); + it("should return a 400 error message if DNS resolution fails", async () => { + const dnsError = new Error("DNS resolution failed"); + dnsResolveStub.callsFake((monitorURL, callback) => callback(dnsError)); + await checkEndpointResolution(req, res, next); + expect(res.status.calledOnceWith(400)).to.be.true; + expect(res.json.calledOnceWith({ + success: false, + msg: "DNS resolution failed", + })).to.be.true; + expect(next.notCalled).to.be.true; + }); + it("should remove the trailing slash and resolve the URL successfully", async () => { + req.query.monitorURL = 'http://example.com/'; // URL with a trailing slash + dnsResolveStub.callsFake((monitorURL, callback) => callback(null)); + await checkEndpointResolution(req, res, next); + expect(res.status.calledWith(200)).to.be.true; + expect(res.json.calledWith({ + success: true, + msg: 'URL resolved successfully', + })).to.be.true; + expect(next.called).to.be.false; + }); + it("should call next with an error if an exception is thrown", async () => { + req.query = {}; // Missing monitorURL will cause an error + await checkEndpointResolution(req, res, next); + expect(next.calledOnce).to.be.true; + const error = next.getCall(0).args[0]; + expect(error).to.be.an.instanceOf(Error); + }); +}); + describe("Monitor Controller - deleteMonitor", () => { beforeEach(() => { req = {