Skip to content

Commit eda1465

Browse files
committed
Add tests + fix
1 parent 113d6c2 commit eda1465

File tree

8 files changed

+806
-10
lines changed

8 files changed

+806
-10
lines changed

src/Domain/Configuration/Service/Provider/ConfigProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function isEnabled(ConfigOption $key): bool
3535
$config = $this->configRepository->findOneBy(['item' => $key->value]);
3636

3737
if ($config !== null) {
38-
$config->getValue() === '1';
38+
return $config->getValue() === '1';
3939
}
4040

4141
return $this->defaultConfigs->has($key->value) && $this->defaultConfigs->get($key->value)['value'] === '1';

src/Domain/Configuration/Service/Provider/DefaultConfigProvider.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class DefaultConfigProvider
1616
*/
1717
private array $defaults = [];
1818

19-
public function __construct(private readonly TranslatorInterface $translator)
19+
public function __construct(private TranslatorInterface $translator)
2020
{
2121
}
2222

@@ -570,9 +570,7 @@ private function init(): void
570570
*/
571571
public function get(string $key, mixed $default = null): mixed
572572
{
573-
if (empty($this->defaults)) {
574-
$this->init();
575-
}
573+
$this->init();
576574

577575
return $this->defaults[$key] ?? $default;
578576
}
@@ -582,9 +580,7 @@ public function get(string $key, mixed $default = null): mixed
582580
*/
583581
public function has(string $key): bool
584582
{
585-
if (empty($this->defaults)) {
586-
$this->init();
587-
}
583+
$this->init();
588584

589585
return isset($this->defaults[$key]);
590586
}

tests/Integration/Domain/Subscription/Service/SubscriberCsvImportManagerTest.php

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

55
namespace PhpList\Core\Tests\Integration\Domain\Subscription\Service;
66

7+
use Doctrine\ORM\Tools\SchemaTool;
78
use PhpList\Core\Domain\Subscription\Model\Dto\SubscriberImportOptions;
89
use PhpList\Core\Domain\Subscription\Model\Subscriber;
910
use PhpList\Core\Domain\Subscription\Model\SubscriberAttributeDefinition;
@@ -28,6 +29,10 @@ class SubscriberCsvImportManagerTest extends KernelTestCase
2829
protected function setUp(): void
2930
{
3031
parent::setUp();
32+
$this->setUpDatabaseTest();
33+
$schemaTool = new SchemaTool($this->entityManager);
34+
$metadata = $this->entityManager->getMetadataFactory()->getAllMetadata();
35+
$schemaTool->dropSchema($metadata);
3136
$this->loadSchema();
3237

3338
$this->subscriberCsvImportManager = self::getContainer()->get(SubscriberCsvImporter::class);
@@ -42,8 +47,8 @@ public function testImportFromCsvCreatesNewSubscribers(): void
4247
$this->entityManager->flush();
4348

4449
$csvContent = "email,confirmed,html_email,blacklisted,disabled,extra_data,first_name\n";
45-
$csvContent .= "test1@example.com,1,1,0,0,\"Some extra data\",John\n";
46-
$csvContent .= "another1@example.com,0,0,1,1,\"More data\",Jane\n";
50+
$csvContent .= "test@example.com,1,1,0,0,\"Some extra data\",John\n";
51+
$csvContent .= "another@example.com,0,0,1,1,\"More data\",Jane\n";
4752

4853
$tempFile = tempnam(sys_get_temp_dir(), 'csv_test');
4954
file_put_contents($tempFile, $csvContent);
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Tests\Unit\Domain\Configuration\Service;
6+
7+
use PhpList\Core\Domain\Configuration\Service\LegacyUrlBuilder;
8+
use PHPUnit\Framework\TestCase;
9+
10+
/**
11+
* @covers \PhpList\Core\Domain\Configuration\Service\LegacyUrlBuilder
12+
*/
13+
final class LegacyUrlBuilderTest extends TestCase
14+
{
15+
/**
16+
* @dataProvider provideWithUidCases
17+
*/
18+
public function testWithUid(string $baseUrl, string $uid, string $expected): void
19+
{
20+
$builder = new LegacyUrlBuilder();
21+
22+
$actual = $builder->withUid($baseUrl, $uid);
23+
24+
$this->assertSame($expected, $actual);
25+
}
26+
27+
public static function provideWithUidCases(): array
28+
{
29+
return [
30+
'no query -> add uid' => [
31+
'https://example.com/page',
32+
'ABC123',
33+
'https://example.com/page?uid=ABC123',
34+
],
35+
'existing query -> append uid' => [
36+
'https://example.com/page?foo=bar',
37+
'ABC123',
38+
'https://example.com/page?foo=bar&uid=ABC123',
39+
],
40+
'existing uid -> override (uid replaced)' => [
41+
'https://example.com/page?uid=OLD&x=1',
42+
'ABC123',
43+
'https://example.com/page?uid=ABC123&x=1',
44+
],
45+
'port and fragment preserved' => [
46+
'http://example.com:8080/path?x=1#frag',
47+
'ABC123',
48+
'http://example.com:8080/path?x=1&uid=ABC123#frag',
49+
],
50+
'relative url -> defaults to https with empty host' => [
51+
'/relative/path',
52+
'ABC123',
53+
// scheme defaults to https; empty host -> "https:///" + path
54+
'https:///relative/path?uid=ABC123',
55+
],
56+
'no query/fragment/port/host only' => [
57+
'http://example.com',
58+
'ZZZ',
59+
'http://example.com?uid=ZZZ',
60+
],
61+
];
62+
}
63+
64+
public function testQueryEncodingIsUrlEncoded(): void
65+
{
66+
$builder = new LegacyUrlBuilder();
67+
68+
$url = 'https://example.com/path?name=John+Doe&city=New+York';
69+
$result = $builder->withUid($url, 'üñíčødé space');
70+
71+
// Ensure it is a valid URL and uid is url-encoded inside query
72+
$parts = parse_url($result);
73+
parse_str($parts['query'] ?? '', $query);
74+
75+
$this->assertSame('John Doe', $query['name']);
76+
$this->assertSame('New York', $query['city']);
77+
$this->assertSame('üñíčødé space', $query['uid']);
78+
}
79+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Tests\Unit\Domain\Configuration\Service;
6+
7+
use PhpList\Core\Domain\Configuration\Service\PlaceholderResolver;
8+
use PHPUnit\Framework\TestCase;
9+
10+
/**
11+
* @covers \PhpList\Core\Domain\Configuration\Service\PlaceholderResolver
12+
*/
13+
final class PlaceholderResolverTest extends TestCase
14+
{
15+
public function testNullAndEmptyAreReturnedAsIs(): void
16+
{
17+
$resolver = new PlaceholderResolver();
18+
19+
$this->assertNull($resolver->resolve(null));
20+
$this->assertSame('', $resolver->resolve(''));
21+
}
22+
23+
public function testUnregisteredTokensRemainUnchanged(): void
24+
{
25+
$resolver = new PlaceholderResolver();
26+
27+
$input = 'Hello [NAME], click [UNSUBSCRIBEURL] to opt out.';
28+
$this->assertSame($input, $resolver->resolve($input));
29+
}
30+
31+
public function testCaseInsensitiveTokenResolution(): void
32+
{
33+
$resolver = new PlaceholderResolver();
34+
$resolver->register('unsubscribeurl', fn () => 'https://u.example/u/123');
35+
36+
$input = 'Click [UnSubscribeUrl]';
37+
$expect = 'Click https://u.example/u/123';
38+
39+
$this->assertSame($expect, $resolver->resolve($input));
40+
}
41+
42+
public function testMultipleDifferentTokensAreResolved(): void
43+
{
44+
$resolver = new PlaceholderResolver();
45+
$resolver->register('NAME', fn () => 'Ada');
46+
$resolver->register('EMAIL', fn () => '[email protected]');
47+
48+
$input = 'Hi [NAME] <[email]>';
49+
$expect = 'Hi Ada <[email protected]>';
50+
51+
$this->assertSame($expect, $resolver->resolve($input));
52+
}
53+
54+
public function testAdjacentAndRepeatedTokens(): void
55+
{
56+
$resolver = new PlaceholderResolver();
57+
58+
$count = 0;
59+
$resolver->register('X', function () use (&$count) {
60+
$count++;
61+
return 'V';
62+
});
63+
64+
$input = 'Start [x][X]-[x] End';
65+
$expect = 'Start VV-V End';
66+
67+
$this->assertSame($expect, $resolver->resolve($input));
68+
$this->assertSame(3, $count);
69+
}
70+
71+
public function testDigitsAndUnderscoresInToken(): void
72+
{
73+
$resolver = new PlaceholderResolver();
74+
$resolver->register('USER_2', fn () => 'Bob#2');
75+
76+
$input = 'Hello [user_2]!';
77+
$expect = 'Hello Bob#2!';
78+
79+
$this->assertSame($expect, $resolver->resolve($input));
80+
}
81+
82+
public function testUnknownTokensArePreservedVerbatim(): void
83+
{
84+
$resolver = new PlaceholderResolver();
85+
$resolver->register('KNOWN', fn () => 'K');
86+
87+
$input = 'A[UNKNOWN]B[KNOWN]C';
88+
$expect = 'A[UNKNOWN]BKC';
89+
90+
$this->assertSame($expect, $resolver->resolve($input));
91+
}
92+
}

0 commit comments

Comments
 (0)