1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
<?php
/*
* This file is part of the Mercure Component project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Symfony\Component\Mercure\Tests;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpClient\Exception\TransportException;
use Symfony\Component\HttpClient\MockHttpClient;
use Symfony\Component\HttpClient\Response\MockResponse;
use Symfony\Component\Mercure\Exception\InvalidArgumentException;
use Symfony\Component\Mercure\Exception\RuntimeException;
use Symfony\Component\Mercure\Hub;
use Symfony\Component\Mercure\Jwt\StaticTokenProvider;
use Symfony\Component\Mercure\Update;
use Symfony\Contracts\HttpClient\ResponseInterface;
/**
* @author Kévin Dunglas <dunglas@gmail.com>
*/
class HubTest extends TestCase
{
public const URL = 'https://demo.mercure.rocks/.well-known/mercure';
public const JWT = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjdXJlIjp7InN1YnNjcmliZSI6WyIqIl0sInB1Ymxpc2giOlsiKiJdfX0.M1yJUov4a6oLrigTqBZQO_ohWUsg3Uz1bnLD4MIyWLo';
public const AUTH_HEADER = 'Authorization: Bearer '.self::JWT;
public function testPublish()
{
$httpClient = new MockHttpClient(function (string $method, string $url, array $options = []): ResponseInterface {
$this->assertSame('POST', $method);
$this->assertSame(self::URL, $url);
$this->assertSame(self::AUTH_HEADER, $options['normalized_headers']['authorization'][0]);
$this->assertSame('topic=https%3A%2F%2Fdemo.mercure.rocks%2Fdemo%2Fbooks%2F1.jsonld&data=Hi+from+Symfony%21&private=on&id=id&retry=3', $options['body']);
$this->assertSame('Content-Type: application/x-www-form-urlencoded', $options['normalized_headers']['content-type'][0]);
return new MockResponse('id');
});
if (method_exists($httpClient, 'withOptions')) {
$httpClient = $httpClient->withOptions([
'headers' => [
'Content-Type' => 'application/json',
],
]);
}
$provider = new StaticTokenProvider(self::JWT);
$hub = new Hub(self::URL, $provider, null, null, $httpClient);
$id = $hub->publish(new Update(
'https://demo.mercure.rocks/demo/books/1.jsonld',
'Hi from Symfony!',
true,
'id',
null,
3
));
$this->assertSame('id', $id);
}
public function testNetworkIssue()
{
$httpClient = new MockHttpClient(function (string $method, string $url, array $options = []): ResponseInterface {
$this->assertSame('POST', $method);
$this->assertSame(self::URL, $url);
$this->assertSame(self::AUTH_HEADER, $options['normalized_headers']['authorization'][0]);
$this->assertSame('topic=https%3A%2F%2Fdemo.mercure.rocks%2Fdemo%2Fbooks%2F1.jsonld&data=Hi+from+Symfony%21&private=on&id=id&retry=3', $options['body']);
throw new TransportException('Ops.');
});
$provider = new StaticTokenProvider(self::JWT);
$hub = new Hub(self::URL, $provider, null, null, $httpClient);
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Failed to send an update.');
$hub->publish(new Update(
'https://demo.mercure.rocks/demo/books/1.jsonld',
'Hi from Symfony!',
true,
'id',
null,
3
));
}
public function testInvalidJwt()
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The provided JWT is not valid');
$provider = new StaticTokenProvider("invalid\r\njwt");
$hub = new Hub(self::URL, $provider, null, null);
$hub->publish(new Update('https://demo.mercure.rocks/demo/books/1.jsonld', 'Hi from Symfony!'));
}
}
|