Files
portal/app/tests/Unit/ClientSms/ConsentDocxWriterTest.php
T

68 lines
2.7 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
use App\Services\ClientSms\ConsentDocxWriter;
/**
* Письмо-разрешение рендерится в РЕДАКТИРУЕМЫЙ Word (.docx), а не PDF — клиенту
* нужно дописать паспорт/№ ТЗ/срок перед печатью. Проверяем: на выходе валидный
* docx (ZIP-контейнер OOXML) и внутри — текст письма.
*/
/** Достаёт текст word/document.xml из docx-байтов. */
function docxText(string $bytes): string
{
$tmp = tempnam(sys_get_temp_dir(), 'docx');
file_put_contents($tmp, $bytes);
$zip = new ZipArchive;
$zip->open($tmp);
$xml = $zip->getFromName('word/document.xml');
$zip->close();
@unlink($tmp);
// Убираем XML-теги — остаётся видимый текст.
return strip_tags((string) $xml);
}
it('на выходе валидный docx (ZIP), а не PDF', function () {
$bytes = (new ConsentDocxWriter)->render(
['title_object' => 'доменного имени', 'body' => 'ТЕЛО-ПИСЬМА-МАРКЕР', 'signer' => 'ООО «Ромашка»', 'is_individual' => false],
true,
);
// docx = ZIP: сигнатура «PK». PDF был бы «%PDF».
expect(substr($bytes, 0, 2))->toBe('PK');
expect(substr($bytes, 0, 4))->not->toBe('%PDF');
});
it('внутри docx — тело письма и подписант', function () {
$bytes = (new ConsentDocxWriter)->render(
['title_object' => 'доменного имени', 'body' => 'ТЕЛО-ПИСЬМА-МАРКЕР', 'signer' => 'ООО «Ромашка»', 'is_individual' => false],
true,
);
$text = docxText($bytes);
expect($text)->toContain('ПИСЬМО-РАЗРЕШЕНИЕ');
expect($text)->toContain('ТЕЛО-ПИСЬМА-МАРКЕР');
expect($text)->toContain('ООО «Ромашка»');
});
it('физлицо → внутри есть акцент про паспорт', function () {
$bytes = (new ConsentDocxWriter)->render(
['title_object' => 'доменного имени', 'body' => 'тело', 'signer' => 'Пётр Петров', 'is_individual' => true],
true,
);
expect(docxText($bytes))->toContain('Заполните реквизиты паспорта');
});
it('реквизиты не заполнены → внутри памятка про прочерки', function () {
$bytes = (new ConsentDocxWriter)->render(
['title_object' => 'доменного имени', 'body' => 'тело', 'signer' => 'подпись', 'is_individual' => false],
false,
);
expect(docxText($bytes))->toContain('незаполненные поля');
});