diff --git a/server/notification-providers/line.js b/server/notification-providers/line.js index 327696e..a9c2f58 100644 --- a/server/notification-providers/line.js +++ b/server/notification-providers/line.js @@ -7,7 +7,6 @@ class Line extends NotificationProvider { name = "line"; async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; try { let lineAPIUrl = "https://api.line.me/v2/bot/message/push"; let config = { @@ -25,34 +24,34 @@ class Line extends NotificationProvider { "text": "Test Successful!" } ] - } - await axios.post(lineAPIUrl, testMessage, config) + }; + await axios.post(lineAPIUrl, testMessage, config); } else if (heartbeatJSON["status"] == DOWN) { let downMessage = { "to": notification.lineUserID, "messages": [ { "type": "text", - "text": "UptimeKuma Alert: [🔴 Down]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] + "text": "UptimeKuma Alert: [🔴 Down]\n" + "Name: " + monitorJSON["name"] + "\n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] } ] - } - await axios.post(lineAPIUrl, downMessage, config) + }; + await axios.post(lineAPIUrl, downMessage, config); } else if (heartbeatJSON["status"] == UP) { let upMessage = { "to": notification.lineUserID, "messages": [ { "type": "text", - "text": "UptimeKuma Alert: [✅ Up]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] + "text": "UptimeKuma Alert: [✅ Up]\n" + "Name: " + monitorJSON["name"] + "\n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] } ] - } - await axios.post(lineAPIUrl, upMessage, config) + }; + await axios.post(lineAPIUrl, upMessage, config); } - return okMsg; + return this.sendSuccess; } catch (error) { - this.throwGeneralAxiosError(error) + this.throwGeneralAxiosError(error); } } } diff --git a/server/notification-providers/line.spec.js b/server/notification-providers/line.spec.js index 10aa265..97b8631 100644 --- a/server/notification-providers/line.spec.js +++ b/server/notification-providers/line.spec.js @@ -1,13 +1,15 @@ -// jest.mock("nodemailer", () => ({ -// createTransport: jest.fn(), -// })); +jest.mock("axios", () => ({ + post: jest.fn(), +})); -// const mockNodeMailer = require("nodemailer"); +const axios = require("axios"); +const { UP, DOWN } = require("../../src/util"); +const NotificationSend = require("../notification"); const Line = require("./line"); beforeEach(() => { - // mockNodeMailer.createTransport.mockReset(); + axios.post.mockReset(); }); describe("notification default information", () => { @@ -16,3 +18,215 @@ describe("notification default information", () => { expect(notification.name).toBe("line"); }); }); + +describe("notification to act properly on send", () => { + it("should call axios with the proper default data when UP", async () => { + + let response = { + data: { + Message: "OK" + } + }; + axios.post.mockResolvedValueOnce(response); + + let notif = new Line(); + let notificationConf = { + type: "line", + lineUserID: "1234", + lineChannelAccessToken: "token" + }; + let msg = "PassedInMessage"; + let monitorConf = { + type: "http", + url: "https://www.google.com", + name: "testing", + }; + let heartbeatConf = { + status: UP, + msg: "some message", + time: "example time", + }; + let res = await notif.send(notificationConf, msg, monitorConf, heartbeatConf); + + expect(axios.post).toHaveBeenCalledWith("https://api.line.me/v2/bot/message/push", { + messages: [ + { + text: "UptimeKuma Alert: [✅ Up]\nName: testing\nsome message\nTime (UTC): example time", + type: "text", + }, + ], + to: "1234", + }, { + headers: { + "Authorization": "Bearer token", + "Content-Type": "application/json", + }, + }); + expect(res).toBe("Sent Successfully."); + }); + it("should call axios with the proper default data when DOWN", async () => { + + let response = { + data: { + Message: "OK" + } + }; + axios.post.mockResolvedValueOnce(response); + + let notif = new Line(); + let notificationConf = { + type: "line", + lineUserID: "1234", + lineChannelAccessToken: "token" + }; + let msg = "PassedInMessage"; + let monitorConf = { + type: "http", + url: "https://www.google.com", + name: "testing", + }; + let heartbeatConf = { + status: DOWN, + msg: "some message", + time: "example time", + }; + let res = await notif.send(notificationConf, msg, monitorConf, heartbeatConf); + + expect(axios.post).toHaveBeenCalledWith("https://api.line.me/v2/bot/message/push", { + messages: [ + { + text: "UptimeKuma Alert: [🔴 Down]\nName: testing\nsome message\nTime (UTC): example time", + type: "text", + }, + ], + to: "1234", + }, { + headers: { + "Authorization": "Bearer token", + "Content-Type": "application/json", + }, + }); + expect(res).toBe("Sent Successfully."); + }); + + it("should call axios with the proper data when monitor nil", async () => { + let response = { + data: { + Message: "OK" + } + }; + axios.post.mockResolvedValueOnce(response); + + let notif = new Line(); + let notificationConf = { + type: "line", + lineUserID: "1234", + lineChannelAccessToken: "token" + }; + let msg = "PassedInMessage"; + + let res = await notif.send(notificationConf, msg, null, null); + + expect(axios.post).toHaveBeenCalledWith("https://api.line.me/v2/bot/message/push", { + messages: [ + { + text: "Test Successful!", + type: "text", + }, + ], + to: "1234", + }, { + headers: { + "Authorization": "Bearer token", + "Content-Type": "application/json", + }, + }); + expect(res).toBe("Sent Successfully."); + }); + +}); + +describe("notification to act properly on error", () => { + it("should respond with an axios error on error", async () => { + + axios.post.mockImplementation(() => { + throw new Error("Test Error"); + }); + + let notificationConf = { + type: "line", + lineUserID: "1234", + lineChannelAccessToken: "token" + }; + let msg = "PassedInMessage"; + let notif = new Line(); + + try { + await notif.send(notificationConf, msg, null, null); + expect("Error thrown").toBe(false); + } catch (e) { + expect(e.message).toBe("Error: Error: Test Error "); + } + + expect(axios.post).toHaveBeenCalledWith("https://api.line.me/v2/bot/message/push", { + messages: [ + { + text: "Test Successful!", + type: "text", + }, + ], + to: "1234", + }, { + headers: { + "Authorization": "Bearer token", + "Content-Type": "application/json", + }, + }); + }); + +}); + +describe("notification to get proper data from Notification.send", () => { + it("should call axios with proper data", async () => { + let response = { + data: { + Message: "OK" + } + }; + axios.post.mockResolvedValueOnce(response); + let notificationConf = { + type: "line", + lineUserID: "1234", + lineChannelAccessToken: "token" + }; + let monitorConf = { + type: "http", + url: "https://www.google.com", + name: "testing", + }; + let heartbeatConf = { + status: UP, + msg: "some message", + time: "example time", + }; + + NotificationSend.Notification.init(); + let res = await NotificationSend.Notification.send(notificationConf, "PassedInMessage", monitorConf, heartbeatConf); + expect(axios.post).toHaveBeenCalledWith("https://api.line.me/v2/bot/message/push", { + messages: [ + { + text: "UptimeKuma Alert: [✅ Up]\nName: testing\nsome message\nTime (UTC): example time", + type: "text", + }, + ], + to: "1234", + }, { + headers: { + "Authorization": "Bearer token", + "Content-Type": "application/json", + }, + }); + expect(res).toBe("Sent Successfully."); + }); + +});