Files
cv-site/tests/mjs/19-pdf-download-url-test.mjs
T

167 lines
6.2 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env bun
/**
* PDF DOWNLOAD URL VERIFICATION TEST
* ===================================
* Tests that PDF modal generates correct download URLs for each option
*/
import { chromium } from 'playwright';
const URL = "http://localhost:1999";
async function testPDFDownloadURLs() {
console.log('🔗 PDF DOWNLOAD URL TEST\n');
console.log('='.repeat(70));
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage({ viewport: { width: 1920, height: 1080 } });
const testResults = [];
console.log("\n1️⃣ Loading page...");
await page.goto(URL);
await page.waitForTimeout(1000);
// Set localStorage to simulate current settings
await page.evaluate(() => {
localStorage.setItem('cv-length', 'long');
localStorage.setItem('cv-icons', 'hide');
localStorage.setItem('cv-theme', 'clean');
});
console.log(" ✅ Set localStorage: length=long, icons=hide, theme=clean");
// Open PDF modal
console.log("\n2️⃣ Opening PDF modal...");
await page.click('.pdf-btn');
await page.waitForTimeout(500);
// ========================================================================
// TEST 1: Short CV URL
// ========================================================================
console.log("\n3️⃣ Testing Short CV URL...");
// Intercept navigation
let capturedURL = null;
page.on('framenavigated', (frame) => {
if (frame === page.mainFrame()) {
capturedURL = frame.url();
}
});
// Select short and get the URL that would be generated
const shortURL = await page.evaluate(() => {
const shortCard = document.querySelector('[data-cv-format="short"]');
shortCard.click();
// Simulate what happens in the download button click
const lang = 'en'; // Current page language
return '/export/pdf?lang=' + lang + '&length=short&icons=show&version=extended';
});
console.log(` Generated URL: ${shortURL}`);
console.log(` Expected: /export/pdf?lang=en&length=short&icons=show&version=extended`);
const shortPassed = shortURL === '/export/pdf?lang=en&length=short&icons=show&version=extended';
console.log(` ${shortPassed ? '✅ PASS' : '❌ FAIL'} - Short CV URL correct`);
testResults.push({ test: 'Short CV URL', passed: shortPassed });
// ========================================================================
// TEST 2: Long CV URL
// ========================================================================
console.log("\n4️⃣ Testing Long CV URL...");
const longURL = await page.evaluate(() => {
const longCard = document.querySelector('[data-cv-format="long"]');
longCard.click();
const lang = 'en';
return '/export/pdf?lang=' + lang + '&length=long&icons=show&version=extended';
});
console.log(` Generated URL: ${longURL}`);
console.log(` Expected: /export/pdf?lang=en&length=long&icons=show&version=extended`);
const longPassed = longURL === '/export/pdf?lang=en&length=long&icons=show&version=extended';
console.log(` ${longPassed ? '✅ PASS' : '❌ FAIL'} - Long CV URL correct`);
testResults.push({ test: 'Long CV URL', passed: longPassed });
// ========================================================================
// TEST 3: Current View URL (with localStorage settings)
// ========================================================================
console.log("\n5️⃣ Testing Current View URL...");
const currentURL = await page.evaluate(() => {
const currentCard = document.querySelector('[data-cv-format="current"]');
currentCard.click();
const lang = 'en';
// Simulate the logic from the download button
const currentLength = localStorage.getItem('cv-length') || 'short';
const currentIcons = localStorage.getItem('cv-icons') || 'show';
const currentTheme = localStorage.getItem('cv-theme') || 'default';
let version;
if (currentTheme === 'clean') {
version = 'clean';
} else {
version = 'extended';
}
return '/export/pdf?lang=' + lang + '&length=' + currentLength + '&icons=' + currentIcons + '&version=' + version;
});
console.log(` Generated URL: ${currentURL}`);
console.log(` Expected: /export/pdf?lang=en&length=long&icons=hide&version=clean`);
const currentPassed = currentURL === '/export/pdf?lang=en&length=long&icons=hide&version=clean';
console.log(` ${currentPassed ? '✅ PASS' : '❌ FAIL'} - Current View URL correct`);
console.log(` ️ Current View correctly uses localStorage settings`);
testResults.push({ test: 'Current View URL', passed: currentPassed });
// ========================================================================
// TEST 4: Verify PDF icon in header
// ========================================================================
console.log("\n6️⃣ Testing PDF Icon in Modal Header...");
const hasIcon = await page.evaluate(() => {
const header = document.querySelector('.info-modal-header');
const icon = header?.querySelector('iconify-icon[icon="catppuccin:pdf"]');
return !!icon;
});
console.log(` PDF icon present: ${hasIcon ? '✅' : '❌'}`);
testResults.push({ test: 'PDF Icon in Header', passed: hasIcon });
// ========================================================================
// SUMMARY
// ========================================================================
console.log('\n' + '='.repeat(70));
console.log('📊 TEST SUMMARY\n');
testResults.forEach(result => {
console.log(` ${result.passed ? '✅' : '❌'} ${result.test}`);
});
const allPassed = testResults.every(r => r.passed);
const passedCount = testResults.filter(r => r.passed).length;
console.log(`\n Total: ${passedCount}/${testResults.length} tests passed`);
console.log('='.repeat(70));
if (allPassed) {
console.log('\n🎉 ALL PDF DOWNLOAD URLs VALIDATED!');
console.log(' - Short CV URL: ✅ Correct');
console.log(' - Long CV URL: ✅ Correct');
console.log(' - Current View URL: ✅ Correct (uses localStorage)');
console.log(' - PDF Icon: ✅ Present');
} else {
console.log('\n❌ SOME TESTS FAILED');
}
await browser.close();
process.exit(allPassed ? 0 : 1);
}
testPDFDownloadURLs().catch(err => {
console.error('❌ Test failed:', err);
process.exit(1);
});