From 6bd241b60637ed0a8670a4499a2092beb968eff0 Mon Sep 17 00:00:00 2001 From: Jhon Date: Fri, 21 Jun 2024 15:33:15 +0300 Subject: [PATCH 1/3] add keywords, bugs, homepage --- package-lock.json | 6 +++--- package.json | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 40f94fb..1586412 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "pino-telegram-webhook", - "version": "0.0.0", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pino-telegram-webhook", - "version": "0.0.0", + "version": "0.0.1", "license": "MIT", "dependencies": { "pino-abstract-transport": "^1.2.0" }, "engines": { - "node": "^18.0.0", + "node": ">=18.0.0", "npm": ">=7.24.2" } }, diff --git a/package.json b/package.json index 73638c3..310d9d5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,13 @@ { "name": "pino-telegram-webhook", - "version": "0.0.0", + "version": "0.0.1", "description": "A [Pino v7+ transport](https://getpino.io/#/docs/transports?id=v7-transports) to send message to [Telegram](https://telegram.org/)", + "keywords": [ + "pino", + "telegram", + "webhook", + "telegram webhook" + ], "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -10,13 +16,18 @@ "node": ">=18.0.0", "npm": ">=7.24.2" }, + "dependencies": { + "pino-abstract-transport": "^1.2.0" + }, + "repository": "https://github.com/Jhon-Mosk/pino-telegram-webhook", + "bugs": { + "url": "https://github.com/Jhon-Mosk/pino-telegram-webhook/issues" + }, + "homepage": "https://github.com/Jhon-Mosk/pino-telegram-webhook", "author": { "name": "Evgeniy Politiko", "email": "Jhon-mosk@yandex.ru", "url": "https://jhon-mosk.ru/" }, - "license": "MIT", - "dependencies": { - "pino-abstract-transport": "^1.2.0" - } + "license": "MIT" } From 0eb61a888df27e7d578d96c5426a9b98b3dd2404 Mon Sep 17 00:00:00 2001 From: Jhon Date: Fri, 28 Jun 2024 20:55:37 +0300 Subject: [PATCH 2/3] docs error correction --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7cac6c..c31578e 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ const logger = pino({ chatId: -1234567890, botToken: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11", extra: { - parse_mode: "HTML", - }, + parse_mode: "HTML", + }, }, }, }) From 6f5aa25a4f7ad3632b0d7073b625a2df389e880d Mon Sep 17 00:00:00 2001 From: Jhon Date: Fri, 28 Jun 2024 20:58:12 +0300 Subject: [PATCH 3/3] feature: add test --- index.js | 22 ++++--- package-lock.json | 12 ++++ package.json | 16 +++-- test/transport.test.js | 132 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 16 deletions(-) create mode 100644 test/transport.test.js diff --git a/index.js b/index.js index b2d5db7..d7ab6fd 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,8 @@ -"use strict"; - -const build = require("pino-abstract-transport"); +import build from "pino-abstract-transport"; const API_URL = "https://api.telegram.org/bot"; -const sendMsgToTg = async (chatId, botToken, text, extra = {}) => { +export async function sendMsgToTg(chatId, botToken, text, extra = {}) { const method = "sendMessage"; const url = `${API_URL}${botToken}/${method}`; const response = await fetch(url, { @@ -30,18 +28,18 @@ const sendMsgToTg = async (chatId, botToken, text, extra = {}) => { const { status, statusText } = response; throw new Error(`${status}: ${statusText}`); -}; +} /** * - * @param {object} params - параметры для создания транспорта - * @param {number} params.chatId - идентификатор чата - * @param {string} params.botToken - токен бота - * @param {boolean} params.verbose - отправить отладочную информацию - * @param {object} params.extra - дополнительные параметры для отправки сообщения https://core.telegram.org/bots/api#sendmessage + * @param {object} params - parameters for creating a transport + * @param {number} params.chatId - chat ID + * @param {string} params.botToken - bot token + * @param {boolean} params.verbose - send debugging information + * @param {object} params.extra - additional parameters for sending a message https://core.telegram.org/bots/api#sendmessage * @returns {Promise} */ -module.exports = function ({ chatId, botToken, verbose = false, extra = {} }) { +export default function ({ chatId, botToken, verbose = false, extra = {} }) { return build(async function (source) { for await (const obj of source) { const text = verbose ? JSON.stringify(obj) : obj.msg; @@ -52,4 +50,4 @@ module.exports = function ({ chatId, botToken, verbose = false, extra = {} }) { } } }); -}; +} diff --git a/package-lock.json b/package-lock.json index 1586412..6c3ab09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,9 @@ "dependencies": { "pino-abstract-transport": "^1.2.0" }, + "devDependencies": { + "undici": "^6.19.2" + }, "engines": { "node": ">=18.0.0", "npm": ">=7.24.2" @@ -170,6 +173,15 @@ "dependencies": { "safe-buffer": "~5.2.0" } + }, + "node_modules/undici": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", + "dev": true, + "engines": { + "node": ">=18.17" + } } } } diff --git a/package.json b/package.json index 310d9d5..698fec7 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,18 @@ { "name": "pino-telegram-webhook", - "version": "0.0.1", + "version": "0.1.0", + "type": "module", "description": "A [Pino v7+ transport](https://getpino.io/#/docs/transports?id=v7-transports) to send message to [Telegram](https://telegram.org/)", "keywords": [ "pino", "telegram", "webhook", - "telegram webhook" + "telegram webhook", + "transport" ], "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "node test/transport.test.js" }, "engines": { "node": ">=18.0.0", @@ -19,7 +21,13 @@ "dependencies": { "pino-abstract-transport": "^1.2.0" }, - "repository": "https://github.com/Jhon-Mosk/pino-telegram-webhook", + "devDependencies": { + "undici": "^6.19.2" + }, + "repository": { + "type": "git", + "url": "https://github.com/Jhon-Mosk/pino-telegram-webhook" + }, "bugs": { "url": "https://github.com/Jhon-Mosk/pino-telegram-webhook/issues" }, diff --git a/test/transport.test.js b/test/transport.test.js new file mode 100644 index 0000000..051f70c --- /dev/null +++ b/test/transport.test.js @@ -0,0 +1,132 @@ +import assert from "node:assert/strict"; +import { after, describe, it } from "node:test"; +import { Transform } from "stream"; +import { MockAgent, setGlobalDispatcher } from "undici"; +import createTransport, { sendMsgToTg } from "../index.js"; + +const API_URL = "https://api.telegram.org"; +const chatId = -1234567890; +const incorrectChatId = -9876543210; +const botToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"; +const incorrectBotToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew12"; +const text = "Test message"; +const incorrectText = "?/:,*~@#$%^&()-+=_<.>|"; +const extra = { + parse_mode: "HTML", +}; +const incorrectExtra = { + parse_mode: "hHtml", +}; + +const mockAgent = new MockAgent({ connections: 1 }); +setGlobalDispatcher(mockAgent); + +const mockClient = mockAgent.get(API_URL); + +mockClient + .intercept({ + path: `/bot${botToken}/sendMessage`, + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chat_id: chatId, + text: text, + ...extra, + }), + }) + .reply(200, JSON.stringify({ ok: true, result: text })); + +mockClient + .intercept({ + path: `/bot${botToken}/sendMessage`, + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chat_id: incorrectChatId, + text: text, + ...extra, + }), + }) + .reply(400, "Bad Request"); + +mockClient + .intercept({ + path: `/bot${incorrectBotToken}/sendMessage`, + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chat_id: chatId, + text: text, + ...extra, + }), + }) + .reply(401, "Unauthorized"); + +mockClient + .intercept({ + path: `/bot${botToken}/sendMessage`, + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chat_id: chatId, + text: incorrectText, + ...extra, + }), + }) + .reply(400, "Bad Request"); + +mockClient + .intercept({ + path: `/bot${botToken}/sendMessage`, + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + chat_id: chatId, + text: text, + ...incorrectExtra, + }), + }) + .reply(400, "Bad Request"); + +describe("pino-telegram-webhook", () => { + it("build transport", async () => { + const transport = await createTransport({ chatId, botToken, extra }); + assert.ok(transport instanceof Transform, "Failed to build transport."); + }); + + describe("send message to telegram", () => { + after(async () => await mockClient.close()); + + it("wrong chat ID", () => { + assert.rejects( + async () => await sendMsgToTg(incorrectChatId, botToken, text, extra), + new Error("400: Bad Request") + ); + }); + + it("wrong bot token", () => { + assert.rejects( + async () => await sendMsgToTg(chatId, incorrectBotToken, text, extra), + new Error("401: Unauthorized") + ); + }); + + it("wrong text", () => { + assert.rejects( + async () => await sendMsgToTg(chatId, botToken, incorrectText, extra), + new Error("400: Bad Request") + ); + }); + + it("wrong extra", () => { + assert.rejects( + async () => await sendMsgToTg(chatId, botToken, text, incorrectExtra), + new Error("400: Bad Request") + ); + }); + + it("success sent", async () => { + await sendMsgToTg(chatId, botToken, text, extra); + }); + }); +});