UNPKG

telegram-badge

Version:

Generate Telegram group member count badges for GitHub README

182 lines (181 loc) 7.65 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const telegram_badge_1 = __importDefault(require("../api/telegram-badge")); const crypto = __importStar(require("crypto")); // Mock fetch globally global.fetch = jest.fn(); // Mock console methods for clean test output console.log = jest.fn(); console.error = jest.fn(); console.warn = jest.fn(); describe('Telegram Badge API', () => { let req; let res; beforeEach(() => { jest.clearAllMocks(); // Mock environment variables process.env.BOT_TOKEN = 'test_token'; process.env.CHAT_ID = '@test_chat'; // Mock request and response objects req = { query: {}, headers: {} }; res = { status: jest.fn().mockReturnThis(), send: jest.fn(), setHeader: jest.fn(), end: jest.fn() }; // Mock successful Telegram API response fetch.mockResolvedValue({ ok: true, json: jest.fn().mockResolvedValue({ ok: true, result: 100 }) }); }); test('должен возвращать SVG бейдж с количеством участников', async () => { await (0, telegram_badge_1.default)(req, res); // Check that fetch was called with correct parameters expect(fetch).toHaveBeenCalledWith(expect.stringContaining('https://api.telegram.org/bottest_token/getChatMemberCount'), expect.any(Object)); // Check that headers were set expect(res.setHeader).toHaveBeenCalledWith('Content-Type', 'image/svg+xml'); expect(res.setHeader).toHaveBeenCalledWith('Cache-Control', expect.any(String)); // Check that response was sent with status 200 expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalled(); }); test('должен обрабатывать отсутствие переменных окружения', async () => { // Remove environment variables delete process.env.BOT_TOKEN; await (0, telegram_badge_1.default)(req, res); // Check that error response was sent expect(res.status).toHaveBeenCalledWith(500); expect(res.send).toHaveBeenCalledWith(expect.any(String)); }); test('должен обрабатывать ошибки Telegram API', async () => { // Mock Telegram API error fetch.mockResolvedValue({ ok: true, json: jest.fn().mockResolvedValue({ ok: false, description: 'Test error' }) }); await (0, telegram_badge_1.default)(req, res); // Check that error response was sent expect(res.status).toHaveBeenCalledWith(500); expect(res.send).toHaveBeenCalledWith(expect.any(String)); }); test('должен обрабатывать сетевые ошибки', async () => { // Mock network error fetch.mockRejectedValue(new Error('Network error')); await (0, telegram_badge_1.default)(req, res); // Check that error response was sent expect(res.status).toHaveBeenCalledWith(500); expect(res.send).toHaveBeenCalledWith(expect.any(String)); }); test('должен применять параметры стилизации', async () => { // Set styling parameters req.query = { style: 'flat-square', label: 'Custom Label', color: 'FF0000', labelColor: '000000' }; await (0, telegram_badge_1.default)(req, res); // Check that response was sent with status 200 expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalled(); }); test('должен возвращать 304 Not Modified при совпадении ETag', async () => { // Set If-None-Match header const testEtag = '\"test-etag\"'; req.headers['if-none-match'] = testEtag; // Mock the specific environment to create a predictable ETag const originalEnv = process.env; process.env = { ...originalEnv, BOT_TOKEN: 'test_token_for_etag', CHAT_ID: '@test_chat_for_etag' }; // We need to create the exact same hash that would be generated const fixedTime = 1234567890000; // Fixed timestamp jest.spyOn(Date, 'now').mockReturnValue(fixedTime); // Create expected ETag based on our known values const expectedHash = crypto .createHash('md5') .update(JSON.stringify({ token: 'test_token_for_etag', channelId: '@test_chat_for_etag', query: {}, time: Math.floor(fixedTime / 300000) })) .digest('hex'); req.headers['if-none-match'] = `"${expectedHash}"`; await (0, telegram_badge_1.default)(req, res); // Restore environment process.env = originalEnv; // Check that response was sent with status 304 expect(res.status).toHaveBeenCalledWith(304); expect(res.end).toHaveBeenCalled(); }); test('должен обрабатывать таймауты запросов', async () => { // Mock timeout error const abortError = new Error('Request timeout'); abortError.name = 'AbortError'; fetch.mockRejectedValue(abortError); await (0, telegram_badge_1.default)(req, res); // Check that error response was sent with service unavailable status expect(res.status).toHaveBeenCalledWith(503); expect(res.send).toHaveBeenCalledWith(expect.any(String)); }); test('должен валидировать стили бейджа', async () => { // Set invalid style req.query = { style: 'invalid-style' }; await (0, telegram_badge_1.default)(req, res); // Should still work with default style expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalled(); }); });