68 lines
2.7 KiB
PHP
68 lines
2.7 KiB
PHP
|
|
<?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('незаполненные поля');
|
|||
|
|
});
|