Skip to content

Commit 5c2d2a5

Browse files
authored
Fix Subscription::create when not giving every keys (#163)
1 parent 74bc0ac commit 5c2d2a5

File tree

2 files changed

+101
-19
lines changed

2 files changed

+101
-19
lines changed

src/Subscription.php

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Subscription
2424
/** @var null|string */
2525
private $authToken;
2626

27-
/** @var string */
27+
/** @var null|string */
2828
private $contentEncoding;
2929

3030
/**
@@ -40,17 +40,20 @@ public function __construct(
4040
string $endpoint,
4141
?string $publicKey = null,
4242
?string $authToken = null,
43-
string $contentEncoding = "aesgcm"
43+
?string $contentEncoding = null
4444
) {
45-
$supportedContentEncodings = ['aesgcm', 'aes128gcm'];
46-
if (!in_array($contentEncoding, $supportedContentEncodings)) {
47-
throw new \ErrorException('This content encoding ('.$contentEncoding.') is not supported.');
48-
}
49-
5045
$this->endpoint = $endpoint;
51-
$this->publicKey = $publicKey;
52-
$this->authToken = $authToken;
53-
$this->contentEncoding = $contentEncoding;
46+
47+
if ($publicKey || $authToken || $contentEncoding) {
48+
$supportedContentEncodings = ['aesgcm', 'aes128gcm'];
49+
if ($contentEncoding && !in_array($contentEncoding, $supportedContentEncodings)) {
50+
throw new \ErrorException('This content encoding ('.$contentEncoding.') is not supported.');
51+
}
52+
53+
$this->publicKey = $publicKey;
54+
$this->authToken = $authToken;
55+
$this->contentEncoding = $contentEncoding ?: "aesgcm";
56+
}
5457
}
5558

5659
/**
@@ -61,14 +64,18 @@ public function __construct(
6164
* @throws \ErrorException
6265
*/
6366
public static function create(array $associativeArray): Subscription {
64-
$instance = new self(
65-
$associativeArray['endpoint'],
66-
$associativeArray['publicKey'],
67-
$associativeArray['authToken'],
68-
$associativeArray['contentEncoding']
69-
);
67+
if (array_key_exists('publicKey', $associativeArray) || array_key_exists('authToken', $associativeArray) || array_key_exists('contentEncoding', $associativeArray)) {
68+
return new self(
69+
$associativeArray['endpoint'],
70+
$associativeArray['publicKey'] ?? null,
71+
$associativeArray['authToken'] ?? null,
72+
$associativeArray['contentEncoding'] ?? "aesgcm"
73+
);
74+
}
7075

71-
return $instance;
76+
return new self(
77+
$associativeArray['endpoint']
78+
);
7279
}
7380

7481
/**
@@ -96,9 +103,9 @@ public function getAuthToken(): ?string
96103
}
97104

98105
/**
99-
* @return string
106+
* @return null|string
100107
*/
101-
public function getContentEncoding(): string
108+
public function getContentEncoding(): ?string
102109
{
103110
return $this->contentEncoding;
104111
}

tests/SubscriptionTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
use Minishlink\WebPush\Subscription;
4+
5+
class SubscriptionTest extends PHPUnit\Framework\TestCase
6+
{
7+
8+
public function testCreateMinimal()
9+
{
10+
$subscriptionArray = array(
11+
"endpoint" => "http://toto.com"
12+
);
13+
$subscription = Subscription::create($subscriptionArray);
14+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
15+
$this->assertEquals(null, $subscription->getPublicKey());
16+
$this->assertEquals(null, $subscription->getAuthToken());
17+
$this->assertEquals(null, $subscription->getContentEncoding());
18+
}
19+
20+
public function testConstructMinimal()
21+
{
22+
$subscription = new Subscription("http://toto.com");
23+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
24+
$this->assertEquals(null, $subscription->getPublicKey());
25+
$this->assertEquals(null, $subscription->getAuthToken());
26+
$this->assertEquals(null, $subscription->getContentEncoding());
27+
}
28+
29+
public function testCreatePartial()
30+
{
31+
$subscriptionArray = array(
32+
"endpoint" => "http://toto.com",
33+
"publicKey" => "publicKey",
34+
"authToken" => "authToken",
35+
);
36+
$subscription = Subscription::create($subscriptionArray);
37+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
38+
$this->assertEquals("publicKey", $subscription->getPublicKey());
39+
$this->assertEquals("authToken", $subscription->getAuthToken());
40+
$this->assertEquals("aesgcm", $subscription->getContentEncoding());
41+
}
42+
43+
public function testConstructPartial()
44+
{
45+
$subscription = new Subscription("http://toto.com", "publicKey", "authToken");
46+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
47+
$this->assertEquals("publicKey", $subscription->getPublicKey());
48+
$this->assertEquals("authToken", $subscription->getAuthToken());
49+
$this->assertEquals("aesgcm", $subscription->getContentEncoding());
50+
}
51+
52+
public function testCreateFull()
53+
{
54+
$subscriptionArray = array(
55+
"endpoint" => "http://toto.com",
56+
"publicKey" => "publicKey",
57+
"authToken" => "authToken",
58+
"contentEncoding" => "aes128gcm",
59+
);
60+
$subscription = Subscription::create($subscriptionArray);
61+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
62+
$this->assertEquals("publicKey", $subscription->getPublicKey());
63+
$this->assertEquals("authToken", $subscription->getAuthToken());
64+
$this->assertEquals("aes128gcm", $subscription->getContentEncoding());
65+
}
66+
67+
public function testConstructFull()
68+
{
69+
$subscription = new Subscription("http://toto.com", "publicKey", "authToken", "aes128gcm");
70+
$this->assertEquals("http://toto.com", $subscription->getEndpoint());
71+
$this->assertEquals("publicKey", $subscription->getPublicKey());
72+
$this->assertEquals("authToken", $subscription->getAuthToken());
73+
$this->assertEquals("aes128gcm", $subscription->getContentEncoding());
74+
}
75+
}

0 commit comments

Comments
 (0)