file-parser.test.js 2.53 KB
/**
 * Unit Tests — file-parser.js
 */
import { describe, it, expect } from 'vitest';
import fs from 'fs';
import path from 'path';

const { parseFileContent } = require('../../services/file-parser');

describe('file-parser', () => {
  const TMP = '/tmp/test-file-parser';

  beforeAll(() => fs.mkdirSync(TMP, { recursive: true }));
  afterAll(() => { try { fs.rmSync(TMP, { recursive: true }); } catch {} });

  it('should parse a .txt file', async () => {
    const f = path.join(TMP, 'hello.txt');
    fs.writeFileSync(f, 'Hello World');
    const result = await parseFileContent(f);
    expect(result.text).toBe('Hello World');
    expect(result.mimeType).toBe('text/plain');
    expect(result.truncated).toBe(false);
  });

  it('should parse a .json file', async () => {
    const f = path.join(TMP, 'data.json');
    fs.writeFileSync(f, '{"key":"value"}');
    const result = await parseFileContent(f);
    expect(result.text).toContain('"key"');
    expect(result.mimeType).toBe('application/json');
  });

  it('should parse a .md file', async () => {
    const f = path.join(TMP, 'readme.md');
    fs.writeFileSync(f, '# Title\nContent here');
    const result = await parseFileContent(f);
    expect(result.text).toContain('# Title');
    expect(result.mimeType).toBe('text/markdown');
  });

  it('should truncate large files', async () => {
    const f = path.join(TMP, 'large.txt');
    fs.writeFileSync(f, 'x'.repeat(60000));
    const result = await parseFileContent(f);
    expect(result.truncated).toBe(true);
    expect(result.text.length).toBeLessThan(60000);
  });

  it('should handle image files', async () => {
    const f = path.join(TMP, 'photo.png');
    fs.writeFileSync(f, Buffer.from([0x89, 0x50, 0x4e, 0x47])); // PNG header
    const result = await parseFileContent(f);
    expect(result.text).toContain('photo.png');
    expect(result.mimeType).toBe('image/png');
    expect(result.truncated).toBe(false);
  });

  it('should fallback for unknown extensions', async () => {
    const f = path.join(TMP, 'data.xyz');
    fs.writeFileSync(f, 'some text content');
    const result = await parseFileContent(f);
    expect(result.text).toContain('some text content');
    expect(result.mimeType).toBe('application/octet-stream');
  });

  it('should handle binary file gracefully', async () => {
    const f = path.join(TMP, 'binary.bin');
    fs.writeFileSync(f, Buffer.from([0x00, 0x01, 0x02, 0xff]));
    const result = await parseFileContent(f);
    expect(result).toBeDefined();
    expect(result.mimeType).toBe('application/octet-stream');
  });
});