From dd173044127117976eb8955691df0b6f15c377e8 Mon Sep 17 00:00:00 2001 From: Steven Renaux Date: Tue, 27 Feb 2024 18:18:11 +0100 Subject: [PATCH] Update tests + add formatter tests --- src/Builder/AbstractChromiumPdfBuilder.php | 6 ++- src/Formatter/AssetBaseDirFormatter.php | 4 +- tests/Builder/AbstractBuilderTestCase.php | 4 +- tests/Builder/HtmlPdfBuilderTest.php | 39 ++++++++++++------- tests/Builder/LibreOfficePdfBuilderTest.php | 9 +++-- tests/Builder/MarkdownPdfBuilderTest.php | 9 +++-- tests/Builder/UrlPdfBuilderTest.php | 8 ++-- tests/Formatter/AssetBaseDirFormatterTest.php | 33 ++++++++++++++++ tests/Pdf/GotenbergTest.php | 32 ++++++++------- 9 files changed, 98 insertions(+), 46 deletions(-) create mode 100644 tests/Formatter/AssetBaseDirFormatterTest.php diff --git a/src/Builder/AbstractChromiumPdfBuilder.php b/src/Builder/AbstractChromiumPdfBuilder.php index 3f9310a..707d24f 100644 --- a/src/Builder/AbstractChromiumPdfBuilder.php +++ b/src/Builder/AbstractChromiumPdfBuilder.php @@ -233,9 +233,11 @@ public function assets(string ...$paths): static */ public function addAsset(string $path): static { - $dataPart = new DataPart(new DataPartFile($this->asset->resolve($path))); + $resolvedPath = $this->asset->resolve($path); - $this->formFields['assets'][$this->asset->resolve($path)] = $dataPart; + $dataPart = new DataPart(new DataPartFile($resolvedPath)); + + $this->formFields['assets'][$resolvedPath] = $dataPart; return $this; } diff --git a/src/Formatter/AssetBaseDirFormatter.php b/src/Formatter/AssetBaseDirFormatter.php index 4ae2ae6..88f19cd 100644 --- a/src/Formatter/AssetBaseDirFormatter.php +++ b/src/Formatter/AssetBaseDirFormatter.php @@ -4,11 +4,11 @@ use Symfony\Component\Filesystem\Filesystem; -final readonly class AssetBaseDirFormatter +class AssetBaseDirFormatter { private string $baseDir; - public function __construct(private Filesystem $filesystem, private string $projectDir, string $baseDir) + public function __construct(private readonly Filesystem $filesystem, private readonly string $projectDir, string $baseDir) { $this->baseDir = rtrim($baseDir, '/'); } diff --git a/tests/Builder/AbstractBuilderTestCase.php b/tests/Builder/AbstractBuilderTestCase.php index 6ffa8aa..5d68f97 100644 --- a/tests/Builder/AbstractBuilderTestCase.php +++ b/tests/Builder/AbstractBuilderTestCase.php @@ -8,12 +8,12 @@ abstract class AbstractBuilderTestCase extends TestCase { - protected const FIXTURE_DIR = '/../Fixtures'; + protected const FIXTURE_DIR = __DIR__.'/../Fixtures'; protected static Environment $twig; public static function setUpBeforeClass(): void { - self::$twig = new Environment(new FilesystemLoader(__DIR__.'/../Fixtures/templates')); + self::$twig = new Environment(new FilesystemLoader(self::FIXTURE_DIR.'/templates')); } } diff --git a/tests/Builder/HtmlPdfBuilderTest.php b/tests/Builder/HtmlPdfBuilderTest.php index 20a7c07..f29a406 100644 --- a/tests/Builder/HtmlPdfBuilderTest.php +++ b/tests/Builder/HtmlPdfBuilderTest.php @@ -17,9 +17,11 @@ final class HtmlPdfBuilderTest extends AbstractBuilderTestCase public function testWithConfigurations(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturn(self::FIXTURE_DIR.'/templates/content.html') + ; $builder = new HtmlPdfBuilder($client, $assetBaseDirFormatter); $builder->contentFile('content.html'); @@ -60,9 +62,11 @@ public function testWithConfigurations(): void public function testWithTemplate(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturn(self::FIXTURE_DIR.'/templates/content.html') + ; $builder = new HtmlPdfBuilder($client, $assetBaseDirFormatter, self::$twig); $builder->content('content.html.twig'); @@ -80,9 +84,11 @@ public function testWithTemplate(): void public function testWithAssets(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->exactly(2)) + ->method('resolve') + ->willReturnOnConsecutiveCalls(self::FIXTURE_DIR.'/templates/content.html', self::FIXTURE_DIR.'/assets/logo.png') + ; $builder = new HtmlPdfBuilder($client, $assetBaseDirFormatter); $builder->contentFile('content.html'); @@ -102,9 +108,11 @@ public function testWithAssets(): void public function testWithHeader(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->exactly(2)) + ->method('resolve') + ->willReturnOnConsecutiveCalls(self::FIXTURE_DIR.'/templates/header.html', self::FIXTURE_DIR.'/templates/content.html') + ; $builder = new HtmlPdfBuilder($client, $assetBaseDirFormatter); $builder->headerFile('header.html'); @@ -127,9 +135,10 @@ public function testInvalidTwigTemplate(): void $this->expectExceptionMessage('Could not render template "invalid.html.twig" into PDF part "index.html".'); $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->never()) + ->method('resolve') + ; $builder = new HtmlPdfBuilder($client, $assetBaseDirFormatter, self::$twig); diff --git a/tests/Builder/LibreOfficePdfBuilderTest.php b/tests/Builder/LibreOfficePdfBuilderTest.php index 791bc38..00df934 100644 --- a/tests/Builder/LibreOfficePdfBuilderTest.php +++ b/tests/Builder/LibreOfficePdfBuilderTest.php @@ -7,7 +7,6 @@ use Sensiolabs\GotenbergBundle\Builder\LibreOfficePdfBuilder; use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Mime\Part\DataPart; #[CoversClass(LibreOfficePdfBuilder::class)] @@ -31,9 +30,11 @@ public static function provideValidOfficeFiles(): iterable public function testOfficeFiles(string $filePath, string $contentType): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturn(self::FIXTURE_DIR.'/'.$filePath) + ; $builder = new LibreOfficePdfBuilder($client, $assetBaseDirFormatter); $builder->files($filePath); diff --git a/tests/Builder/MarkdownPdfBuilderTest.php b/tests/Builder/MarkdownPdfBuilderTest.php index 14225db..8d5ea5b 100644 --- a/tests/Builder/MarkdownPdfBuilderTest.php +++ b/tests/Builder/MarkdownPdfBuilderTest.php @@ -6,7 +6,6 @@ use Sensiolabs\GotenbergBundle\Builder\MarkdownPdfBuilder; use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Mime\Part\DataPart; #[CoversClass(MarkdownPdfBuilder::class)] @@ -15,9 +14,11 @@ final class MarkdownPdfBuilderTest extends AbstractBuilderTestCase public function testMarkdownFile(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturnOnConsecutiveCalls(self::FIXTURE_DIR.'/templates/template.html', self::FIXTURE_DIR.'/assets/file.md', self::FIXTURE_DIR.'/assets/file.md') + ; $builder = new MarkdownPdfBuilder($client, $assetBaseDirFormatter); $builder diff --git a/tests/Builder/UrlPdfBuilderTest.php b/tests/Builder/UrlPdfBuilderTest.php index cc430d4..c2ec353 100644 --- a/tests/Builder/UrlPdfBuilderTest.php +++ b/tests/Builder/UrlPdfBuilderTest.php @@ -7,7 +7,6 @@ use Sensiolabs\GotenbergBundle\Builder\UrlPdfBuilder; use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter; -use Symfony\Component\Filesystem\Filesystem; #[CoversClass(HtmlPdfBuilder::class)] final class UrlPdfBuilderTest extends AbstractBuilderTestCase @@ -15,9 +14,10 @@ final class UrlPdfBuilderTest extends AbstractBuilderTestCase public function testUrl(): void { $client = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, self::FIXTURE_DIR, self::FIXTURE_DIR); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->never()) + ->method('resolve') + ; $builder = new UrlPdfBuilder($client, $assetBaseDirFormatter); $builder->url('https://google.com'); diff --git a/tests/Formatter/AssetBaseDirFormatterTest.php b/tests/Formatter/AssetBaseDirFormatterTest.php new file mode 100644 index 0000000..f71cf95 --- /dev/null +++ b/tests/Formatter/AssetBaseDirFormatterTest.php @@ -0,0 +1,33 @@ +> + */ + public static function generateBaseDirectoryAndPath(): iterable + { + yield 'absolute path and relative base dir' => [__DIR__.'/../Fixtures/assets/logo.png', '/assets']; + yield 'relative path and absolute base dir' => ['logo.png', __DIR__.'/../Fixtures/assets']; + yield 'relative path and relative base dir' => ['logo.png', 'assets']; + yield 'relative path and relative base dir with end slash' => ['logo.png', 'assets/']; + } + + #[DataProvider('generateBaseDirectoryAndPath')] + public function testResolveWithAbsolutePath(string $path, string $baseDirectory): void + { + $filesystem = new Filesystem(); + $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.'/../Fixtures', $baseDirectory); + $resolvedPath = $assetBaseDirFormatter->resolve($path); + self::assertSame(__DIR__.'/../Fixtures/assets/logo.png', $resolvedPath); + } +} diff --git a/tests/Pdf/GotenbergTest.php b/tests/Pdf/GotenbergTest.php index 4ab15bc..2a7b9ed 100644 --- a/tests/Pdf/GotenbergTest.php +++ b/tests/Pdf/GotenbergTest.php @@ -7,7 +7,6 @@ use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter; use Sensiolabs\GotenbergBundle\Pdf\Gotenberg; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Mime\Part\DataPart; use Twig\Environment; @@ -17,9 +16,10 @@ final class GotenbergTest extends TestCase public function testUrlBuilderFactory(): void { $gotenbergClient = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.'/../Fixtures', '/../Fixtures'); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->never()) + ->method('resolve') + ; $gotenberg = new Gotenberg( $gotenbergClient, @@ -35,10 +35,12 @@ public function testUrlBuilderFactory(): void public function testHtmlBuilderFactory(): void { $gotenbergClient = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); $twig = $this->createMock(Environment::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.'/../Fixtures', '/../Fixtures'); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->exactly(1)) + ->method('resolve') + ->willReturn(__DIR__.'/..Fixtures/templates/content.html') + ; $gotenberg = new Gotenberg( $gotenbergClient, @@ -69,10 +71,12 @@ public function testHtmlBuilderFactory(): void public function testMarkdownBuilderFactory(): void { $gotenbergClient = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); $twig = $this->createMock(Environment::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.'/../Fixtures', '/../Fixtures'); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturnOnConsecutiveCalls(__DIR__.'/../Fixtures/assets/file.md', __DIR__.'/../Fixtures/assets/file.md', __DIR__.'/../Fixtures/templates/wrapper.html') + ; $gotenberg = new Gotenberg( $gotenbergClient, @@ -103,10 +107,12 @@ public function testMarkdownBuilderFactory(): void public function testOfficeBuilderFactory(): void { $gotenbergClient = $this->createMock(GotenbergClientInterface::class); - $filesystem = $this->createMock(Filesystem::class); $twig = $this->createMock(Environment::class); - - $assetBaseDirFormatter = new AssetBaseDirFormatter($filesystem, __DIR__.'/../Fixtures', '/../Fixtures'); + $assetBaseDirFormatter = $this->createMock(AssetBaseDirFormatter::class); + $assetBaseDirFormatter->expects($this->any()) + ->method('resolve') + ->willReturn(__DIR__.'/../Fixtures/assets/office/document.odt') + ; $gotenberg = new Gotenberg( $gotenbergClient,