binect-chrome/tests/pdf-detector.test.ts

104 lines
2.5 KiB
TypeScript
Raw Normal View History

/**
* Tests for PDF detection
*/
import { getLastPDFDownload, fetchPDFBytes } from '../src/utils/pdf-detector';
// Chrome API is mocked in setup.ts
describe('PDF Detector', () => {
beforeEach(() => {
jest.clearAllMocks();
});
test('should detect PDF by extension', async () => {
const mockItems = [
{
id: 1,
filename: 'document.pdf',
url: 'https://example.com/doc.pdf',
fileSize: 1024,
state: 'complete',
mime: 'application/pdf'
}
];
(chrome.downloads.search as jest.Mock).mockImplementation((query, callback) => {
callback(mockItems);
});
const pdf = await getLastPDFDownload();
expect(pdf).toBeDefined();
expect(pdf?.filename).toBe('document.pdf');
expect(pdf?.sourceDomain).toBe('example.com');
});
test('should return null when no PDF found', async () => {
const mockItems = [
{
id: 1,
filename: 'document.txt',
url: 'https://example.com/doc.txt',
fileSize: 1024,
state: 'complete',
mime: 'text/plain'
}
];
(chrome.downloads.search as jest.Mock).mockImplementation((query, callback) => {
callback(mockItems);
});
const pdf = await getLastPDFDownload();
expect(pdf).toBeNull();
});
test('should detect PDF by MIME type even without .pdf extension', async () => {
const mockItems = [
{
id: 1,
filename: 'document',
url: 'https://example.com/doc',
fileSize: 1024,
state: 'complete',
mime: 'application/pdf'
}
];
(chrome.downloads.search as jest.Mock).mockImplementation((query, callback) => {
callback(mockItems);
});
const pdf = await getLastPDFDownload();
expect(pdf).toBeDefined();
expect(pdf?.filename).toBe('document');
});
});
describe('fetchPDFBytes', () => {
test('should throw error on non-200 response', async () => {
(fetch as jest.Mock).mockResolvedValue({
ok: false,
status: 404,
statusText: 'Not Found'
});
await expect(fetchPDFBytes('https://example.com/doc.pdf')).rejects.toThrow(
'Failed to fetch PDF: 404 Not Found'
);
});
test('should throw error on non-PDF content type', async () => {
(fetch as jest.Mock).mockResolvedValue({
ok: true,
headers: {
get: (name: string) => (name === 'Content-Type' ? 'text/html' : null)
}
});
await expect(fetchPDFBytes('https://example.com/doc.pdf')).rejects.toThrow(
'URL did not return a PDF'
);
});
});