vvlad1973-telegram-framework
Version:
Current version: *7.9.5*
128 lines (109 loc) • 3.48 kB
JavaScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
import fs from 'fs';
import FormData from 'form-data';
import { createFormData } from '../src/helpers/utils.js';
const dummyBuffer = Buffer.from('%PDF-1.4 test content');
const dummyPath = '/fake/path/to/file.pdf';
global.TelegramBotApiMethodsWithMedia = {
SEND_DOCUMENT: 'sendDocument',
SEND_MEDIA_GROUP: 'sendMediaGroup',
};
global.MediaProperties = {
MEDIA: 'media',
DOCUMENT: 'document',
THUMBNAIL: 'thumbnail',
};
vi.mock('fs', async () => {
return {
default: {
readFileSync: vi.fn((filePath) => {
if (filePath === dummyPath) return dummyBuffer;
throw new Error('File not found');
}),
},
};
});
describe('createFormData (JS)', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('создаёт FormData из buffer-объекта', () => {
const data = {
method: 'sendDocument',
document: {
buffer: dummyBuffer,
filename: 'file.pdf',
contentType: 'application/pdf',
},
};
const form = createFormData(data);
expect(form).toBeInstanceOf(FormData);
const content = form._streams.join('');
expect(content).toContain('file.pdf');
expect(content).toContain('%PDF-1.4 test content');
});
it('создаёт FormData из file path', () => {
const data = {
method: 'sendDocument',
document: {
file: dummyPath,
},
};
const form = createFormData(data);
expect(fs.readFileSync).toHaveBeenCalledWith(dummyPath);
const content = form._streams.join('');
expect(content).toContain('%PDF-1.4 test content');
});
it('обрабатывает media[] массив с вложенным buffer', () => {
const data = {
method: 'sendMediaGroup',
media: [
{
type: 'photo',
media: {
buffer: dummyBuffer,
filename: 'image.jpg',
contentType: 'image/jpeg',
},
thumbnail: {
buffer: dummyBuffer,
filename: 'thumb.jpg',
contentType: 'image/jpeg',
},
},
],
};
const form = createFormData(data);
const streams = form._streams.join('');
expect(streams).toContain('image.jpg');
expect(streams).toContain('thumb.jpg');
expect(streams).toContain('%PDF-1.4 test content');
expect(data.media[0].media).toMatch(/^attach:\/\/media\.photo\./);
expect(data.media[0].thumbnail).toMatch(
/^attach:\/\/media\.photo\.thumb\./
);
});
it('сериализует JSON-объект корректно', () => {
const data = {
method: 'sendDocument',
extra: { foo: 'bar', nested: { x: 1 } },
};
const form = createFormData(data);
const streams = form._streams.join('');
expect(streams).toContain('"foo":"bar"');
expect(streams).toContain('"nested":{"x":1}');
});
it('выбрасывает ошибку если файл не найден', () => {
const badPath = '/nonexistent/file.txt';
const data = {
method: 'sendDocument',
document: {
file: badPath,
},
};
fs.readFileSync.mockImplementationOnce(() => {
throw new Error('File not found');
});
expect(() => createFormData(data)).toThrow('File not found');
});
});