Skip to content

Commit ef222ab

Browse files
authored
Update tests (#102)
1 parent f160df5 commit ef222ab

23 files changed

+310
-32
lines changed

phpstan.neon

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ parameters:
55
- 'config'
66
- 'src'
77
- 'tests'
8+
excludePaths:
9+
- tests/Builder/DefaultBuilderTraitTest.php
810
ignoreErrors:
911
-
1012
message: "#^Cannot call method generate\\(\\) on Symfony\\\\Component\\\\Routing\\\\Generator\\\\UrlGeneratorInterface\\|null\\.$#"

src/Builder/CookieAwareTrait.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<?php
22

3-
declare(strict_types=1);
4-
53
namespace Sensiolabs\GotenbergBundle\Builder;
64

75
use Psr\Log\LoggerInterface;

src/Builder/DefaultBuilderTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ abstract protected function getEndpoint(): string;
9696
abstract public function setConfigurations(array $configurations): static;
9797

9898
/**
99-
* @param non-empty-list<string> $validExtensions
99+
* @param non-empty-list<string> $validExtensions eg: ['png', 'jpeg']
100100
*/
101101
protected function assertFileExtension(string $path, array $validExtensions): void
102102
{
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
<?php
2+
3+
namespace Sensiolabs\GotenbergBundle\Tests\Builder;
4+
5+
use PHPUnit\Framework\Attributes\CoversClass;
6+
use PHPUnit\Framework\Attributes\DataProvider;
7+
use PHPUnit\Framework\Attributes\UsesClass;
8+
use PHPUnit\Framework\TestCase;
9+
use Sensiolabs\GotenbergBundle\Builder\DefaultBuilderTrait;
10+
use Sensiolabs\GotenbergBundle\Enumeration\PdfFormat;
11+
use Sensiolabs\GotenbergBundle\Exception\JsonEncodingException;
12+
use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter;
13+
use Symfony\Component\Filesystem\Filesystem;
14+
15+
#[CoversClass(DefaultBuilderTrait::class)]
16+
#[UsesClass(AssetBaseDirFormatter::class)]
17+
class DefaultBuilderTraitTest extends TestCase
18+
{
19+
public function testCanEncodeData(): void
20+
{
21+
$builder = $this->getBuilder();
22+
23+
self::assertSame([
24+
'key' => '{"key_v1":"value_v1"}',
25+
], $builder->encodeData('key', ['key_v1' => 'value_v1']));
26+
}
27+
28+
public function testEncodeDataFailIfSomethingWentWrong(): void
29+
{
30+
$builder = $this->getBuilder();
31+
32+
$this->expectException(JsonEncodingException::class);
33+
$this->expectExceptionMessage('Could not encode property "key" into JSON');
34+
35+
$builder->encodeData('key', [\INF]);
36+
}
37+
38+
public static function canConvertToMultiPartProvider(): \Generator
39+
{
40+
yield 'simple boolean (true)' => [true, [['key' => 'true']]];
41+
yield 'simple boolean (false)' => [false, [['key' => 'false']]];
42+
43+
yield 'simple int' => [12, [['key' => '12']]];
44+
45+
yield 'simple float' => [12.2, [['key' => '12.2']]];
46+
yield 'rounded float' => [12.0, [['key' => '12.0']]];
47+
48+
yield 'any BackedEnum' => [PdfFormat::Pdf2b, [['key' => 'PDF/A-2b']]];
49+
50+
yield 'any Stringable' => [new class() implements \Stringable {
51+
public function __toString(): string
52+
{
53+
return __FUNCTION__;
54+
}
55+
}, [['key' => '__toString']]];
56+
57+
yield 'nested array' => [[
58+
'level1' => [
59+
'level2' => [
60+
'level2_rounded_float' => 12.0,
61+
'level2_simple_float' => 12.5,
62+
'level2_boolean' => true,
63+
],
64+
'simple_boolean' => true,
65+
],
66+
], [
67+
['key' => '12.0'],
68+
['key' => '12.5'],
69+
['key' => 'true'],
70+
['key' => 'true'],
71+
]];
72+
73+
yield 'simple string' => ['hello world', [['key' => 'hello world']]];
74+
75+
yield 'with custom normalizer' => ['', [['key' => 'plop']], static function (): array {
76+
return ['key' => 'plop'];
77+
}];
78+
}
79+
80+
#[DataProvider('canConvertToMultiPartProvider')]
81+
public function testCanConvertToMultiPart(mixed $value, array $expectedResult, callable|null $normalizer = null): void
82+
{
83+
$builder = $this->getBuilder();
84+
$builder->addFormField('key', $value);
85+
86+
if (null !== $normalizer) {
87+
$builder->addNormalizer('key', $normalizer);
88+
}
89+
90+
self::assertSame($expectedResult, $builder->getMultipartFormData());
91+
}
92+
93+
public function testCanAssertFileExtensionsAndThrowIfNotValid(): void
94+
{
95+
$this->expectException(\InvalidArgumentException::class);
96+
$this->expectExceptionMessage('The file extension "html" is not valid in this context.');
97+
98+
$builder = $this->getBuilder();
99+
$builder->assertFileExtension('content.html', ['txt']);
100+
}
101+
102+
public function testCanAssertFileExtensions(): void
103+
{
104+
$builder = $this->getBuilder();
105+
$builder->assertFileExtension('content.html', ['html']);
106+
107+
$this->addToAssertionCount(1);
108+
}
109+
110+
private function getBuilder(): object
111+
{
112+
return new class() {
113+
use DefaultBuilderTrait {
114+
addNormalizer as public;
115+
encodeData as public;
116+
assertFileExtension as public;
117+
}
118+
119+
public function __construct()
120+
{
121+
$this->asset = new AssetBaseDirFormatter(
122+
new Filesystem(),
123+
__DIR__.'/../Fixtures',
124+
'files',
125+
);
126+
}
127+
128+
protected function getEndpoint(): string
129+
{
130+
// TODO: Implement getEndpoint() method.
131+
}
132+
133+
public function setConfigurations(array $configurations): static
134+
{
135+
// TODO: Implement setConfigurations() method.
136+
}
137+
138+
public function addFormField(string $key, mixed $value): void
139+
{
140+
$this->formFields[$key] = $value;
141+
}
142+
};
143+
}
144+
}

tests/Builder/Pdf/AbstractChromiumPdfBuilderTest.php

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<?php
22

3-
declare(strict_types=1);
4-
53
namespace Sensiolabs\GotenbergBundle\Tests\Builder\Pdf;
64

75
use PHPUnit\Framework\Attributes\CoversClass;
@@ -13,10 +11,12 @@
1311
use Sensiolabs\GotenbergBundle\Enumeration\PaperSizeInterface;
1412
use Sensiolabs\GotenbergBundle\Enumeration\PdfFormat;
1513
use Sensiolabs\GotenbergBundle\Enumeration\Unit;
14+
use Sensiolabs\GotenbergBundle\Exception\InvalidBuilderConfiguration;
1615
use Sensiolabs\GotenbergBundle\Exception\PdfPartRenderingException;
1716
use Sensiolabs\GotenbergBundle\Formatter\AssetBaseDirFormatter;
1817
use Sensiolabs\GotenbergBundle\Tests\Builder\AbstractBuilderTestCase;
1918
use Sensiolabs\GotenbergBundle\Twig\GotenbergAssetExtension;
19+
use Symfony\Component\HttpFoundation\Request;
2020
use Symfony\Component\HttpFoundation\RequestStack;
2121

2222
#[CoversClass(AbstractChromiumPdfBuilder::class)]
@@ -120,6 +120,17 @@ public function testConfigurationIsCorrectlySet(string $key, mixed $value, array
120120
self::assertEquals($expected, $builder->getMultipartFormData()[0]);
121121
}
122122

123+
public function testConfigurationNotFoundThrowError(): void
124+
{
125+
$builder = $this->getChromiumPdfBuilder();
126+
127+
$this->expectException(InvalidBuilderConfiguration::class);
128+
129+
$builder->setConfigurations([
130+
'fake' => 'value',
131+
]);
132+
}
133+
123134
public function testPaperSizeAppliesWidthAndHeight(): void
124135
{
125136
$builder = $this->getChromiumPdfBuilder();
@@ -338,6 +349,25 @@ public function testCanAddCookies(): void
338349
], $data[0]);
339350
}
340351

352+
public function testCanForwardCookies(): void
353+
{
354+
$request = new Request();
355+
$request->headers->set('Host', 'sensiolabs.com');
356+
$request->cookies->set('MyCookie', 'Chocolate');
357+
358+
$requestStack = new RequestStack();
359+
$requestStack->push($request);
360+
361+
$builder = $this->getChromiumPdfBuilder(requestStack: $requestStack);
362+
$builder->forwardCookie('MyCookie');
363+
364+
$data = $builder->getMultipartFormData();
365+
366+
self::assertEquals([
367+
'cookies' => '[{"name":"MyCookie","value":"Chocolate","domain":"sensiolabs.com"}]',
368+
], $data[0]);
369+
}
370+
341371
public function testCanAddExtraHttpHeaders(): void
342372
{
343373
$builder = $this->getChromiumPdfBuilder();
@@ -355,6 +385,34 @@ public function testCanAddExtraHttpHeaders(): void
355385
], $data[0]);
356386
}
357387

388+
public function testAddExtraHttpHeadersDoesNothingIfEmpty(): void
389+
{
390+
$builder = $this->getChromiumPdfBuilder();
391+
392+
$data = $builder->getMultipartFormData();
393+
$dataCount = \count($data);
394+
395+
$builder->addExtraHttpHeaders([]);
396+
self::assertCount(max($dataCount - 1, 0), $builder->getMultipartFormData());
397+
}
398+
399+
public function testCanResetExtraHttpHeaders(): void
400+
{
401+
$builder = $this->getChromiumPdfBuilder();
402+
$builder->addExtraHttpHeaders([
403+
'MyHeader' => 'SomeValue',
404+
]);
405+
406+
$data = $builder->getMultipartFormData();
407+
408+
$dataCount = \count($data);
409+
410+
$builder->extraHttpHeaders([]);
411+
412+
$data = $builder->getMultipartFormData();
413+
self::assertCount($dataCount - 1, $data);
414+
}
415+
358416
public function testCanAddMetadata(): void
359417
{
360418
$builder = $this->getChromiumPdfBuilder();
@@ -386,9 +444,9 @@ public function testThrowIfTwigTemplateIsInvalid(): void
386444
$builder->header('templates/invalid.html.twig');
387445
}
388446

389-
private function getChromiumPdfBuilder(bool $twig = true): AbstractChromiumPdfBuilder
447+
private function getChromiumPdfBuilder(bool $twig = true, RequestStack $requestStack = new RequestStack()): AbstractChromiumPdfBuilder
390448
{
391-
return new class($this->gotenbergClient, self::$assetBaseDirFormatter, new RequestStack(), true === $twig ? self::$twig : null) extends AbstractChromiumPdfBuilder {
449+
return new class($this->gotenbergClient, self::$assetBaseDirFormatter, $requestStack, true === $twig ? self::$twig : null) extends AbstractChromiumPdfBuilder {
392450
protected function getEndpoint(): string
393451
{
394452
return '/fake/endpoint';

tests/Builder/Pdf/AbstractPdfBuilderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
<?php
22

3-
declare(strict_types=1);
4-
53
namespace Sensiolabs\GotenbergBundle\Tests\Builder\Pdf;
64

75
use PHPUnit\Framework\Attributes\CoversClass;
86
use PHPUnit\Framework\Attributes\DataProvider;
97
use PHPUnit\Framework\Attributes\TestDox;
108
use PHPUnit\Framework\Attributes\UsesClass;
9+
use Sensiolabs\GotenbergBundle\Builder\GotenbergFileResult;
1110
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractPdfBuilder;
1211
use Sensiolabs\GotenbergBundle\Client\GotenbergClient;
1312
use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface;
@@ -23,6 +22,7 @@
2322
#[CoversClass(AbstractPdfBuilder::class)]
2423
#[UsesClass(GotenbergClient::class)]
2524
#[UsesClass(GotenbergResponse::class)]
25+
#[UsesClass(GotenbergFileResult::class)]
2626
final class AbstractPdfBuilderTest extends AbstractBuilderTestCase
2727
{
2828
public function testFilenameIsCorrectlySetOnResponse(): void

tests/Builder/Pdf/ConvertPdfBuilderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPUnit\Framework\Attributes\CoversClass;
66
use PHPUnit\Framework\Attributes\DataProvider;
77
use PHPUnit\Framework\Attributes\UsesClass;
8+
use Sensiolabs\GotenbergBundle\Builder\GotenbergFileResult;
89
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractPdfBuilder;
910
use Sensiolabs\GotenbergBundle\Builder\Pdf\ConvertPdfBuilder;
1011
use Sensiolabs\GotenbergBundle\Exception\MissingRequiredFieldException;
@@ -15,6 +16,7 @@
1516
#[CoversClass(ConvertPdfBuilder::class)]
1617
#[UsesClass(AbstractPdfBuilder::class)]
1718
#[UsesClass(AssetBaseDirFormatter::class)]
19+
#[UsesClass(GotenbergFileResult::class)]
1820
final class ConvertPdfBuilderTest extends AbstractBuilderTestCase
1921
{
2022
private const PDF_DOCUMENTS_DIR = 'assets/pdf';

tests/Builder/Pdf/HtmlPdfBuilderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPUnit\Framework\Attributes\CoversClass;
66
use PHPUnit\Framework\Attributes\DataProvider;
77
use PHPUnit\Framework\Attributes\UsesClass;
8+
use Sensiolabs\GotenbergBundle\Builder\GotenbergFileResult;
89
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractChromiumPdfBuilder;
910
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractPdfBuilder;
1011
use Sensiolabs\GotenbergBundle\Builder\Pdf\HtmlPdfBuilder;
@@ -20,6 +21,7 @@
2021
#[UsesClass(AbstractPdfBuilder::class)]
2122
#[UsesClass(AssetBaseDirFormatter::class)]
2223
#[UsesClass(GotenbergAssetExtension::class)]
24+
#[UsesClass(GotenbergFileResult::class)]
2325
final class HtmlPdfBuilderTest extends AbstractBuilderTestCase
2426
{
2527
public function testEndpointIsCorrect(): void

tests/Builder/Pdf/LibreOfficePdfBuilderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPUnit\Framework\Attributes\CoversClass;
66
use PHPUnit\Framework\Attributes\DataProvider;
77
use PHPUnit\Framework\Attributes\UsesClass;
8+
use Sensiolabs\GotenbergBundle\Builder\GotenbergFileResult;
89
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractPdfBuilder;
910
use Sensiolabs\GotenbergBundle\Builder\Pdf\LibreOfficePdfBuilder;
1011
use Sensiolabs\GotenbergBundle\Exception\MissingRequiredFieldException;
@@ -15,6 +16,7 @@
1516
#[CoversClass(LibreOfficePdfBuilder::class)]
1617
#[UsesClass(AbstractPdfBuilder::class)]
1718
#[UsesClass(AssetBaseDirFormatter::class)]
19+
#[UsesClass(GotenbergFileResult::class)]
1820
final class LibreOfficePdfBuilderTest extends AbstractBuilderTestCase
1921
{
2022
private const OFFICE_DOCUMENTS_DIR = 'assets/office';

tests/Builder/Pdf/MarkdownPdfBuilderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHPUnit\Framework\Attributes\CoversClass;
66
use PHPUnit\Framework\Attributes\UsesClass;
7+
use Sensiolabs\GotenbergBundle\Builder\GotenbergFileResult;
78
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractChromiumPdfBuilder;
89
use Sensiolabs\GotenbergBundle\Builder\Pdf\AbstractPdfBuilder;
910
use Sensiolabs\GotenbergBundle\Builder\Pdf\MarkdownPdfBuilder;
@@ -17,6 +18,7 @@
1718
#[UsesClass(AbstractChromiumPdfBuilder::class)]
1819
#[UsesClass(AbstractPdfBuilder::class)]
1920
#[UsesClass(AssetBaseDirFormatter::class)]
21+
#[UsesClass(GotenbergFileResult::class)]
2022
final class MarkdownPdfBuilderTest extends AbstractBuilderTestCase
2123
{
2224
public function testEndpointIsCorrect(): void

0 commit comments

Comments
 (0)