Skip to content

Commit

Permalink
fix: ltr language
Browse files Browse the repository at this point in the history
Not totally fixed here

Signed-off-by: Vitor Mattos <vitor@php.rio>
  • Loading branch information
vitormattos committed Feb 12, 2025
1 parent 86c08b3 commit a4677ef
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 20 deletions.
5 changes: 5 additions & 0 deletions lib/Handler/FooterHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use OCP\IL10N;
use OCP\ITempManager;
use OCP\IURLGenerator;
use OCP\L10N\IFactory;

class FooterHandler {
private QrCode $qrCode;
Expand All @@ -40,6 +41,7 @@ public function __construct(
private PdfParserService $pdfParserService,
private IURLGenerator $urlGenerator,
private IL10N $l10n,
private IFactory $l10nFactory,
private ITempManager $tempManager,
) {
}
Expand Down Expand Up @@ -70,6 +72,7 @@ public function getFooter(File $file, FileEntity $fileEntity): string {
$dimension['h'] * self::POINT_TO_MILIMETER,
],
]);
$pdf->SetDirectionality($this->templateVars['direction']);
}
$pdf->AddPage(
orientation: 'P',
Expand Down Expand Up @@ -110,6 +113,8 @@ public function setTemplateVar(string $name, mixed $value): self {
private function getTemplateVars(): array {
$this->templateVars['signedBy'] = $this->appConfig->getValueString(Application::APP_ID, 'footer_signed_by', $this->l10n->t('Digital signed by LibreSign.'));

$this->templateVars['direction'] = $this->l10nFactory->getLanguageDirection($this->l10n->getLanguageCode());

$this->templateVars['linkToSite'] = $this->appConfig->getValueString(Application::APP_ID, 'footer_link_to_site', 'https://libresign.coop');

$this->templateVars['validationSite'] = $this->appConfig->getValueString(Application::APP_ID, 'validation_site');
Expand Down
82 changes: 62 additions & 20 deletions tests/Unit/Handler/FooterHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@
use OCP\IL10N;
use OCP\ITempManager;
use OCP\IURLGenerator;
use OCP\L10N\IFactory;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\MockObject\MockObject;

final class FooterHandlerTest extends \OCA\Libresign\Tests\Unit\TestCase {
private IAppConfig $appConfig;
private PdfParserService&MockObject $pdfParserService;
private IURLGenerator&MockObject $urlGenerator;
private IL10N&MockObject $l10n;
private IL10N $l10n;
private IFactory $l10nFactory;
private ITempManager $tempManager;
private FooterHandler $footerHandler;
public function setUp(): void {
Expand All @@ -29,10 +31,7 @@ public function setUp(): void {
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->tempManager = \OCP\Server::get(ITempManager::class);

$this->l10n = $this->createMock(IL10N::class);
$this->l10n
->method('t')
->will($this->returnArgument(0));
$this->l10nFactory = \OCP\Server::get(IFactory::class);
}

private function getClass(): FooterHandler {
Expand All @@ -41,6 +40,7 @@ private function getClass(): FooterHandler {
$this->pdfParserService,
$this->urlGenerator,
$this->l10n,
$this->l10nFactory,
$this->tempManager,
);
return $this->footerHandler;
Expand All @@ -50,12 +50,13 @@ public function testGetFooterWithoutValidationSite(): void {
$this->appConfig->setValueBool(Application::APP_ID, 'add_footer', false);
$file = $this->createMock(\OCP\Files\File::class);
$libresignFile = $this->createMock(\OCA\Libresign\Db\File::class);
$this->l10n = $this->l10nFactory->get(Application::APP_ID);
$actual = $this->getClass()->getFooter($file, $libresignFile);
$this->assertEmpty($actual);
}

#[DataProvider('dataGetFooterWithSuccess')]
public function testGetFooterWithSuccess(array $settings, array $expected): void {
public function testGetFooterWithSuccess(string $language, array $settings, array $expected): void {
foreach ($settings as $key => $value) {
switch (gettype($value)) {
case 'boolean':
Expand Down Expand Up @@ -85,10 +86,17 @@ public function testGetFooterWithSuccess(array $settings, array $expected): void
default => '',
};
});

$this->l10n = $this->l10nFactory->get(Application::APP_ID, $language);

$pdf = $this->getClass()
->getFooter($file, $libresignFile);
if ($settings['add_footer']) {
$actual = $this->extractPdfContent($pdf, array_keys($expected));
$actual = $this->extractPdfContent(
$pdf,
array_keys($expected),
$this->l10nFactory->getLanguageDirection($language)
);
if ($settings['write_qrcode_on_footer']) {
$this->assertNotEmpty($actual['qrcode'], 'Invalid qrcode content');
unset($actual['qrcode'], $expected['qrcode']);
Expand All @@ -100,11 +108,13 @@ public function testGetFooterWithSuccess(array $settings, array $expected): void
}

public static function dataGetFooterWithSuccess(): array {
return [
[
$data = [
'without_footer' => [
'en',
['add_footer' => false,], []
],
[
'en_with_more_fields' => [
'en',
[
'add_footer' => true,
'validation_site' => 'http://test.coop',
Expand All @@ -113,7 +123,7 @@ public static function dataGetFooterWithSuccess(): array {
'footer_signed_by' => 'Digital signed by LibreSign.',
'footer_validate_in' => 'Validate in %s.',
'footer_template' => <<<'HTML'
<div style="font-size:8px;">
<div style="font-size:8px;" dir="<?= $direction ?>">
qrcodeSize:<?= $qrcodeSize ?><br />
signedBy:<?= $signedBy ?><br />
validateIn:<?= $validateIn ?><br />
Expand All @@ -128,7 +138,8 @@ public static function dataGetFooterWithSuccess(): array {
'validateIn' => 'Validate in %s.',
]
],
[
'en' => [
'en',
[
'add_footer' => true,
'validation_site' => 'http://test.coop',
Expand All @@ -137,7 +148,7 @@ public static function dataGetFooterWithSuccess(): array {
'footer_signed_by' => 'Digital signed by LibreSign.',
'footer_validate_in' => 'Validate in %s.',
'footer_template' => <<<'HTML'
<div style="font-size:8px;">
<div style="font-size:8px;" dir="<?= $direction ?>">
signedBy:<?= $signedBy ?><br />
validateIn:<?= $validateIn ?><br />
</div>
Expand All @@ -148,7 +159,8 @@ public static function dataGetFooterWithSuccess(): array {
'validateIn' => 'Validate in %s.',
]
],
[
'fr' => [
'fr',
[
'add_footer' => true,
'validation_site' => 'http://test.coop',
Expand All @@ -157,7 +169,7 @@ public static function dataGetFooterWithSuccess(): array {
'footer_signed_by' => 'Signé numériquement avec LibreSign.',
'footer_validate_in' => 'Validate in %s',
'footer_template' => <<<'HTML'
<div style="font-size:8px;">
<div style="font-size:8px;" dir="<?= $direction ?>">
signedBy:<?= $signedBy ?><br />
validateIn:<?= $validateIn ?><br />
</div>
Expand All @@ -168,7 +180,8 @@ public static function dataGetFooterWithSuccess(): array {
'validateIn' => 'Validate in %s',
]
],
[
'el' => [
'el',
[
'add_footer' => true,
'validation_site' => 'http://test.coop',
Expand All @@ -177,7 +190,7 @@ public static function dataGetFooterWithSuccess(): array {
'footer_signed_by' => 'Το αρχείο υπάρχει',
'footer_validate_in' => 'Validate in %s.',
'footer_template' => <<<'HTML'
<div style="font-size:8px;">
<div style="font-size:8px;" dir="<?= $direction ?>">
signedBy:<?= $signedBy ?><br />
validateIn:<?= $validateIn ?><br />
</div>
Expand All @@ -188,10 +201,34 @@ public static function dataGetFooterWithSuccess(): array {
'validateIn' => 'Validate in %s.',
]
],
'he' => [
'he',
[
'add_footer' => true,
'validation_site' => 'http://test.coop',
'write_qrcode_on_footer' => false,
'footer_link_to_site' => 'https://libresign.coop',
'footer_signed_by' => 'אין המלצות. נא להתחיל להקליד.',
'footer_validate_in' => 'אמת ב- %s.',
'footer_template' => <<<'HTML'
<div style="font-size:8px;" dir="<?= $direction ?>">
signedBy:<?= $signedBy ?><br />
validateIn:<?= $validateIn ?><br />
</div>
HTML,
],
[
'signedBy' => 'אין המלצות. נא להתחיל להקליד.',
'validateIn' => 'אמת ב- %s.',
]
],
];

// LTR langages was ignored at CI because the returned text is flipped by MPDF
return array_filter($data, fn ($key) => !in_array($key, ['he']), ARRAY_FILTER_USE_KEY);
}

private function extractPdfContent(string $content, array $keys): array {
private function extractPdfContent(string $content, array $keys, string $direction): array {
$this->assertNotEmpty($content, 'Empty PDF file');
$this->assertNotEmpty($keys, 'Is necessary to send a not empty array of fields to search at PDF file');
$parser = new \Smalot\PdfParser\Parser();
Expand All @@ -201,8 +238,13 @@ private function extractPdfContent(string $content, array $keys): array {
$content = explode("\n", $text);
$this->assertNotEmpty($content, 'PDF without any row');
$content = array_map(fn ($row) => str_getcsv($row, ':'), $content);
$content = array_filter($content, fn ($row) => in_array($row[0], $keys));

// Necessary flip key/value when the language is LTR
$columnKey = $direction === 'rtl' ? 1 : 0;
$columnValue = $direction === 'rtl' ? 0 : 1;

$content = array_filter($content, fn ($row) => in_array($row[$columnKey], $keys));
$this->assertNotEmpty($content, 'Fields not found at PDF file');
return array_column($content, 1, 0);
return array_column($content, $columnValue, $columnKey);
}
}

0 comments on commit a4677ef

Please sign in to comment.