68 lines
3.5 KiB
JavaScript
68 lines
3.5 KiB
JavaScript
const fs = require('fs');
|
||
const path = require('path');
|
||
const { execFileSync } = require('child_process');
|
||
const JSZip = require('jszip');
|
||
|
||
const base = __dirname;
|
||
const pptxPath = path.join(base, 'prezentaciya-vampiricheskoe-tenevoe-pravitelstvo.pptx');
|
||
const pdfPath = path.join(base, 'prezentaciya-vampiricheskoe-tenevoe-pravitelstvo.pdf');
|
||
const reportPath = path.join(base, 'doklad.md');
|
||
const handoutPath = path.join(base, 'razdatochnyj-material.md');
|
||
|
||
function assert(cond, msg) {
|
||
if (!cond) throw new Error(msg);
|
||
}
|
||
|
||
async function main() {
|
||
execFileSync('node', ['generate_presentation.js'], { cwd: base, stdio: 'inherit' });
|
||
|
||
assert(fs.existsSync(reportPath), 'Доклад не найден');
|
||
assert(fs.existsSync(handoutPath), 'Раздаточный материал не найден');
|
||
assert(fs.existsSync(pptxPath), 'PPTX не найден');
|
||
|
||
const report = fs.readFileSync(reportPath, 'utf8');
|
||
const handout = fs.readFileSync(handoutPath, 'utf8');
|
||
assert(report.includes('Sanguis Noctis Virus'), 'В докладе отсутствует ключевой термин');
|
||
assert(report.includes('Экономика качественной крови'), 'В докладе нет раздела о качественной крови');
|
||
assert(report.includes('Почему искусственная кровь им не подходит'), 'В докладе нет раздела про искусственную кровь');
|
||
assert(handout.includes('Тайный рынок доноров'), 'В раздатке нет блока про тайный рынок доноров');
|
||
|
||
const pptxBuf = fs.readFileSync(pptxPath);
|
||
const zip = await JSZip.loadAsync(pptxBuf);
|
||
const slideFiles = Object.keys(zip.files)
|
||
.filter((n) => /^ppt\/slides\/slide\d+\.xml$/.test(n))
|
||
.sort((a, b) => Number(a.match(/slide(\d+)/)[1]) - Number(b.match(/slide(\d+)/)[1]));
|
||
assert(slideFiles.length === 15, `Ожидалось 15 слайдов, получено ${slideFiles.length}`);
|
||
|
||
const firstSlide = await zip.files[slideFiles[0]].async('string');
|
||
const middleSlide = await zip.files[slideFiles[7]].async('string');
|
||
const lastSlide = await zip.files[slideFiles[slideFiles.length - 1]].async('string');
|
||
assert(firstSlide.includes('Пищевая цепочка:'), 'На первом слайде нет заголовка');
|
||
assert(middleSlide.includes('Экономика качественной крови'), 'Нет слайда про экономику качественной крови');
|
||
assert(lastSlide.includes('Вывод'), 'На последнем слайде нет слайда с выводом');
|
||
|
||
try {
|
||
execFileSync('soffice', ['--headless', '--convert-to', 'pdf', '--outdir', base, pptxPath], {
|
||
cwd: base,
|
||
stdio: 'pipe'
|
||
});
|
||
} catch (err) {
|
||
throw new Error(`Не удалось сконвертировать PPTX в PDF: ${err.message}`);
|
||
}
|
||
|
||
assert(fs.existsSync(pdfPath), 'PDF не был создан');
|
||
assert(fs.statSync(pdfPath).size > 20000, 'PDF подозрительно мал');
|
||
|
||
console.log('Verification OK');
|
||
console.log(`- report bytes: ${fs.statSync(reportPath).size}`);
|
||
console.log(`- handout bytes: ${fs.statSync(handoutPath).size}`);
|
||
console.log(`- pptx bytes: ${fs.statSync(pptxPath).size}`);
|
||
console.log(`- pdf bytes: ${fs.statSync(pdfPath).size}`);
|
||
console.log(`- slides: ${slideFiles.length}`);
|
||
}
|
||
|
||
main().catch((err) => {
|
||
console.error(err.stack || err.message || String(err));
|
||
process.exit(1);
|
||
});
|