@nestjsforge/pdfme

Testing

Unit and integration testing strategies for @nestjsforge/pdfme.

Unit test with mock

invoice.service.spec.ts
import { Test } from '@nestjs/testing';
import { PdfmeService } from '@nestjsforge/pdfme';
import { InvoiceService } from './invoice.service';

describe('InvoiceService', () => {
  let service: InvoiceService;
  let pdfme: jest.Mocked<PdfmeService>;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      providers: [
        InvoiceService,
        {
          provide: PdfmeService,
          useValue: {
            generate: jest.fn().mockResolvedValue(new Uint8Array([37, 80, 68, 70])),
          },
        },
      ],
    }).compile();

    service = module.get(InvoiceService);
    pdfme = module.get(PdfmeService);
  });

  it('should generate invoice PDF', async () => {
    const pdf = await service.generateInvoice({ number: 'INV-001', total: 100 });
    expect(pdfme.generate).toHaveBeenCalledTimes(1);
    expect(pdf).toBeInstanceOf(Uint8Array);
  });
});

Integration test

import { readFileSync } from 'fs';

describe('PdfmeService (integration)', () => {
  it('should generate a real PDF', async () => {
    const module = await Test.createTestingModule({
      imports: [
        PdfmeModule.forRoot({
          fonts: {
            NotoSans: {
              data: readFileSync('./assets/fonts/NotoSans-Regular.ttf'),
              fallback: true,
            },
          },
        }),
      ],
    }).compile();

    const service = module.get(PdfmeService);
    const pdf = await service.generate({ template: simpleTemplate, inputs: [{}] });

    expect(pdf).toBeInstanceOf(Uint8Array);
    // PDF magic bytes: %PDF
    expect(pdf[0]).toBe(37);
    expect(pdf[1]).toBe(80);
  });
});