import assert from 'assert';
import { generateResumePDFBuffer, type ResumeSchema } from '../../../../src/lib/resume-pdf-generator.ts';
import type { Logger } from '../../../../src/types.ts';
// Silent logger for tests
const silentLogger: Logger = {
debug: () => {},
info: () => {},
warn: () => {},
error: () => {},
};
describe('Emoji Integration in PDFs', () => {
it('renders resume with emoji in name', async () => {
const resume: ResumeSchema = {
basics: {
name: 'John Doe đ¨âđģ',
label: 'Software Engineer',
email: 'john@example.com',
},
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
});
it('renders resume with emoji in skills', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Jane Developer',
},
skills: [
{
name: 'JavaScript đ',
keywords: ['React âī¸', 'Node.js đĸ'],
},
{
name: 'Python đ',
keywords: ['Django', 'FastAPI âĄ'],
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
});
it('renders resume with emoji in job highlights', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Alex Engineer',
},
work: [
{
name: 'Tech Corp',
position: 'Senior Developer',
highlights: ['Built scalable systems đ', 'Improved performance by 50% âĄ', 'Led team of 5 developers đĨ'],
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
});
it('renders resume with various emoji types', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Emoji Test đ¯',
label: 'Full Stack Developer',
summary: 'Passionate developer đģ with love for clean code â¨',
},
work: [
{
name: 'Startup Inc',
position: 'Lead Developer đ¨âđŧ',
summary: 'Leading development team đ',
highlights: ['Shipped 10+ features đĸ', 'Zero bugs in production â
', 'Happy customers đ'],
},
],
skills: [
{
name: 'Languages',
keywords: ['TypeScript đˇ', 'Go đš', 'Rust đĻ'],
},
],
awards: [
{
title: 'Best Developer đ
',
awarder: 'Tech Awards',
summary: 'Recognized for excellence đ',
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
});
it('handles resume without emoji gracefully', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Plain Name',
label: 'Regular Job',
},
skills: [
{
name: 'Regular Skills',
keywords: ['TypeScript', 'Node.js'],
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
});
it('renders standard Unicode symbols correctly (Greek, geometric, symbols)', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Symbol Test Resume',
label: 'Director of Operations',
},
work: [
{
name: 'Example Company',
position: 'Director of Operations',
highlights: ['Î Platform Growth: Scaled private photo SaaS from 5 to 40+ schools', 'âŗ OKR-Driven Roadmap: Partnered with sales to define outcomes', 'â B2C Revenue System: Launched photo products pipeline', 'â Microservices Architecture: Built 8+ Node.js REST services'],
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
console.log(' âšī¸ Greek letters (Î), geometric shapes (âŗ â), and symbols (â) should render correctly');
});
it('correctly distinguishes between symbols and true emoji', async () => {
const resume: ResumeSchema = {
basics: {
name: 'Mixed Content Test',
summary: 'This resume tests both standard symbols (Î âŗ â â) and true emoji (đ đ đ)',
},
work: [
{
name: 'Symbol Company',
position: 'Developer',
highlights: ['Standard symbols: Î âŗ â â â â
â (should render as black glyphs)', 'True emoji: đ đ đ đ (need special rendering)'],
},
],
};
const pdfBuffer = await generateResumePDFBuffer(resume, {}, silentLogger);
assert.ok(pdfBuffer instanceof Buffer, 'Should return a Buffer');
assert.ok(pdfBuffer.length > 0, 'PDF should have content');
console.log(` đ Created: (${pdfBuffer.length} bytes)`);
console.log(' âšī¸ Standard symbols should render, true emoji should be handled specially');
});
});