Skip to content

Commit 1e0b5db

Browse files
committed
[Turbo] Fix mercure auth the wrong hub with turbo_steam_listen
Fix #3128
1 parent 15db9e6 commit 1e0b5db

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

src/Turbo/src/Twig/TurboRuntime.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ public function __construct(
3636
*/
3737
public function renderTurboStreamListen(Environment $env, $topic, ?string $transport = null, array $options = []): string
3838
{
39-
$options['transport'] = $transport ??= $this->defaultTransport;
39+
if (\array_key_exists('hub', $options) && $transport !== $options['hub']) {
40+
throw new \InvalidArgumentException('When passing the "transport" option, the "hub" key in options is not allowed.');
41+
}
42+
43+
$options['hub'] = $transport ??= $this->defaultTransport;
4044

4145
if (!$this->turboStreamListenRenderers->has($transport)) {
4246
throw new \InvalidArgumentException(\sprintf('The Turbo stream transport "%s" does not exist.', $transport));
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Symfony\UX\Turbo\Tests\Twig;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Symfony\Contracts\Service\ServiceLocatorTrait;
9+
use Symfony\Contracts\Service\ServiceProviderInterface;
10+
use Symfony\UX\Turbo\Twig\TurboRuntime;
11+
use Symfony\UX\Turbo\Twig\TurboStreamListenRendererInterface;
12+
use Symfony\UX\Turbo\Twig\TurboStreamListenRendererWithOptionsInterface;
13+
use Twig\Environment;
14+
15+
final class TurboRuntimeTest extends TestCase
16+
{
17+
public function testRenderTurboStreamListen()
18+
{
19+
$twig = $this->createMock(Environment::class);
20+
$renderer = $this->createMock(TurboStreamListenRendererInterface::class);
21+
$renderer->expects($this->once())
22+
->method('renderTurboStreamListen')
23+
->willReturn('rendered-attributes')
24+
;
25+
$container = new class([
26+
'default' => fn () => $renderer,
27+
]) implements ServiceProviderInterface {
28+
use ServiceLocatorTrait;
29+
};
30+
31+
$runtime = new TurboRuntime($container, 'default');
32+
$runtime->renderTurboStreamListen($twig, 'a_topic');
33+
}
34+
35+
public function testRenderTurboStreamListenWithMultipleHubs()
36+
{
37+
$twig = $this->createMock(Environment::class);
38+
$renderer1 = $this->createMock(TurboStreamListenRendererInterface::class);
39+
$renderer2 = $this->createMock(TurboStreamListenRendererWithOptionsInterface::class);
40+
$renderer2->expects($this->once())
41+
->method('renderTurboStreamListen')
42+
->with($twig, 'a_topic', ['hub' => 'hub2'])
43+
->willReturn('rendered-attributes')
44+
;
45+
$container = new class([
46+
'hub1' => fn () => $renderer1,
47+
'hub2' => fn () => $renderer2,
48+
]) implements ServiceProviderInterface {
49+
use ServiceLocatorTrait;
50+
};
51+
52+
$runtime = new TurboRuntime($container, 'hub1');
53+
$runtime->renderTurboStreamListen($twig, 'a_topic', 'hub2');
54+
}
55+
56+
public function testRenderTurboStreamListenWithDifferentsHub()
57+
{
58+
$this->expectException(\InvalidArgumentException::class);
59+
60+
$twig = $this->createMock(Environment::class);
61+
$renderer = $this->createMock(TurboStreamListenRendererInterface::class);
62+
$container = new class([
63+
'default' => fn () => $renderer,
64+
]) implements ServiceProviderInterface {
65+
use ServiceLocatorTrait;
66+
};
67+
68+
$runtime = new TurboRuntime($container, 'default');
69+
$runtime->renderTurboStreamListen($twig, 'a_topic', 'default', ['hub' => 'hub3']);
70+
}
71+
}

0 commit comments

Comments
 (0)