11// eslint-disable-next-line import/no-extraneous-dependencies
22import { jest } from '@jest/globals' ;
33
4- await jest . unstable_mockModule ( 'node-telegram-bot-api' , ( ) => ( {
5- default : jest . fn ( ) . mockImplementation ( ( ) => ( {
6- sendMessage : jest . fn ( ) . mockResolvedValue ( { } ) ,
7- } ) ) ,
8- } ) ) ;
9-
10- const TelegramBot = ( await import ( 'node-telegram-bot-api' ) ) . default ;
4+ // Mock fetch globally
5+ global . fetch = jest . fn ( ) ;
116
127const sendTelegram = ( await import ( '../../src/telegramService' ) ) . default ;
138
@@ -22,10 +17,11 @@ describe('sendTelegram', () => {
2217 } ) ;
2318
2419 it ( 'sends a Telegram message successfully' , async ( ) => {
25- const mockSendMessage = jest . fn ( ) . mockResolvedValue ( { } ) ;
26- TelegramBot . mockImplementation ( ( ) => ( {
27- sendMessage : mockSendMessage ,
28- } ) ) ;
20+ const mockResponse = {
21+ ok : true ,
22+ json : jest . fn ( ) . mockResolvedValue ( { ok : true , result : { } } ) ,
23+ } ;
24+ global . fetch . mockResolvedValue ( mockResponse ) ;
2925
3026 const response = await sendTelegram ( {
3127 chatId,
@@ -34,29 +30,38 @@ describe('sendTelegram', () => {
3430 senderName,
3531 } ) ;
3632
37- expect ( TelegramBot ) . toHaveBeenCalledWith ( botToken ) ;
38-
39- expect ( mockSendMessage ) . toHaveBeenCalledWith (
40- chatId ,
41- `Message from: ${ senderName } \n${ message } `
33+ expect ( global . fetch ) . toHaveBeenCalledWith (
34+ `https://api.telegram.org/bot${ botToken } /sendMessage` ,
35+ {
36+ method : 'POST' ,
37+ headers : {
38+ 'Content-Type' : 'application/json' ,
39+ } ,
40+ body : JSON . stringify ( {
41+ chat_id : chatId ,
42+ text : `Message from: ${ senderName } \n${ message } ` ,
43+ parse_mode : 'HTML'
44+ } )
45+ }
4246 ) ;
4347
4448 expect ( response ) . toEqual ( {
4549 message : 'Your telegram message has been sent successfully.' ,
4650 status : 200 ,
51+ result : { ok : true , result : { } }
4752 } ) ;
4853 } ) ;
4954
5055 it ( 'handles errors when sending a Telegram message' , async ( ) => {
51- const mockSendMessage = jest
52- . fn ( )
53- . mockRejectedValue ( new Error ( 'Network error' ) ) ;
54-
55- TelegramBot . mockImplementation ( ( ) => ( {
56- sendMessage : mockSendMessage ,
57- } ) ) ;
58-
59- console . error = jest . fn ( ) ;
56+ const mockResponse = {
57+ ok : false ,
58+ status : 400 ,
59+ json : jest . fn ( ) . mockResolvedValue ( {
60+ ok : false ,
61+ description : 'Bad Request'
62+ } ) ,
63+ } ;
64+ global . fetch . mockResolvedValue ( mockResponse ) ;
6065
6166 const response = await sendTelegram ( {
6267 chatId,
@@ -65,21 +70,27 @@ describe('sendTelegram', () => {
6570 senderName,
6671 } ) ;
6772
68- // ✅ Fix: Only check `botToken` in the expectation
69- expect ( TelegramBot ) . toHaveBeenCalledWith ( botToken ) ;
73+ expect ( response ) . toEqual ( {
74+ message : 'Failed to send Telegram message.' ,
75+ status : 400 ,
76+ error : 'Bad Request'
77+ } ) ;
78+ } ) ;
7079
71- expect ( mockSendMessage ) . toHaveBeenCalledWith (
72- chatId ,
73- `Message from: ${ senderName } \n${ message } `
74- ) ;
80+ it ( 'handles network errors' , async ( ) => {
81+ global . fetch . mockRejectedValue ( new Error ( 'Network error' ) ) ;
7582
76- expect ( console . error ) . toHaveBeenCalledWith (
77- 'Failed to send Telegram message.'
78- ) ;
83+ const response = await sendTelegram ( {
84+ chatId,
85+ message,
86+ botToken,
87+ senderName,
88+ } ) ;
7989
8090 expect ( response ) . toEqual ( {
8191 message : 'Failed to send Telegram message.' ,
8292 status : 500 ,
93+ error : 'Network error'
8394 } ) ;
8495 } ) ;
8596
@@ -102,24 +113,14 @@ describe('sendTelegram', () => {
102113 } ) ;
103114
104115 it ( 'should not throw an error when sender name is undefined' , async ( ) => {
105- const mockSendMessage = jest . fn ( ) . mockResolvedValue ( { } ) ;
106- TelegramBot . mockImplementation ( ( ) => ( {
107- sendMessage : mockSendMessage ,
108- } ) ) ;
116+ const mockResponse = {
117+ ok : true ,
118+ json : jest . fn ( ) . mockResolvedValue ( { ok : true , result : { } } ) ,
119+ } ;
120+ global . fetch . mockResolvedValue ( mockResponse ) ;
109121
110122 await expect (
111123 sendTelegram ( { chatId, message, botToken } )
112124 ) . resolves . not . toThrow ( ) ;
113125 } ) ;
114-
115- it ( 'should not throw an error when sender name is undefined' , async ( ) => {
116- const mockSendMessage = jest . fn ( ) . mockResolvedValue ( { } ) ;
117- TelegramBot . mockImplementation ( ( ) => ( {
118- sendMessage : mockSendMessage ,
119- } ) ) ;
120-
121- await expect (
122- sendTelegram ( { chatId, message, botToken, senderName : undefined } )
123- ) . resolves . not . toThrow ( ) ;
124- } ) ;
125126} ) ;
0 commit comments