Skip to content
This repository was archived by the owner on Oct 20, 2025. It is now read-only.

Commit aac2b14

Browse files
authored
Event Bus + Rehydrate feature (#238)
1 parent 77a45a7 commit aac2b14

40 files changed

+565
-54
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@extends('layout')
2+
3+
@section('content')
4+
5+
FormEmit
6+
7+
<div class="space-y-4">
8+
<p>Static: <span id="static" dusk="static">{{ now() }}</span></p>
9+
10+
<x-splade-rehydrate on="form-submitted">
11+
<x-slot:placeholder> <p> Reloading... </p> </x-slot:placeholder>
12+
13+
<p>Dynamic: <span dusk="dynamic">{{ Str::random() }}</span></p>
14+
</x-splade-rehydrate>
15+
16+
<x-splade-form action="/form/simple" @success="$splade.emit('form-submitted')" stay class="space-y-4">
17+
<x-splade-input autocomplete="off" name="name" />
18+
<x-splade-submit />
19+
</x-splade-form>
20+
21+
<x-splade-script>
22+
$splade.on('form-submitted', () => document.querySelector('#static').classList.add('bg-confetti'))
23+
</x-splade-script>
24+
</div>
25+
26+
@endsection
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
@extends('layout')
2+
3+
@section('content')
4+
5+
ScriptComponent
6+
7+
<div id="hey">Hey</div>
8+
9+
<x-splade-script>
10+
document.querySelector('div#hey').innerText = 'Hello World!';
11+
</x-splade-script>
12+
13+
@endsection

app/routes/web.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484

8585
Route::view('form/simple', 'form.simple')->name('form.simple');
8686
Route::post('form/simple', SimpleFormController::class)->name('form.simple.submit');
87+
Route::view('form/emit', 'form.emit')->name('form.emit');
8788
Route::view('form/get', 'form.get')->name('form.get');
8889
Route::get('form/getData', SimpleFormController::class)->name('form.get.submit');
8990
Route::view('form/put', 'form.put')->name('form.put');
@@ -207,6 +208,8 @@
207208
Route::get('modal/validation', [ModalController::class, 'validation'])->name('modal.validation');
208209
Route::get('modal/size/{size}', [ModalController::class, 'size'])->name('modal.size');
209210

211+
Route::view('script', 'script')->name('script');
212+
210213
Route::post('state', function () {
211214
Splade::share('info', 'This is invalid');
212215

app/tests/Browser.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88

99
class Browser extends BaseBrowser
1010
{
11+
public function getTextIn($selector): string
12+
{
13+
return $this->resolver->findOrFail($selector)->getText();
14+
}
15+
1116
public function assertLinkCanonical($href)
1217
{
1318
$driverHref = $this->driver->executeScript('return document.querySelector("link[rel=\"canonical\"]")?.getAttribute("href")');

app/tests/Browser/DataTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function it_can_remember_the_state_of_the_data()
5050
$this->browse(function (Browser $browser) {
5151
$browser->visit('/data/remember')
5252
->waitForText('DataRemember')
53+
->pause(250)
5354
->check('checkbox')
5455
->click('@binding')
5556
->waitForText('DataBinding')

app/tests/Browser/DialogTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ public function it_hides_the_dialog_on_navigation()
1313
$this->browse(function (Browser $browser) {
1414
$browser->visit('/navigation/one')
1515
->waitForText('NavigationOne')
16+
->pause(250)
1617
->click('@open-dialog')
18+
->pause(250)
1719
->click('@dialog-two')
1820
->waitForText('NavigationTwo')
1921
->assertMissing('@dialog-two')
2022
->back()
23+
->pause(250)
2124
->assertPresent('@dialog-two');
2225
});
2326
}

app/tests/Browser/EventBusTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Tests\Browser;
4+
5+
use Tests\Browser;
6+
use Tests\DuskTestCase;
7+
8+
class EventBusTest extends DuskTestCase
9+
{
10+
/** @test */
11+
public function it_can_subscribe_to_an_event_with_a_custom_script()
12+
{
13+
$this->browse(function (Browser $browser) {
14+
$browser->visit('/form/emit')
15+
->waitForText('FormEmit');
16+
17+
$dynamicContent = $browser->getTextIn('@dynamic');
18+
19+
$browser->type('name', 'test')
20+
->press('Submit')
21+
->waitUntilMissingText($dynamicContent)
22+
->tap(fn (Browser $browser) => $this->assertStringContainsString('bg-confetti', $browser->element('#static')->getAttribute('class')));
23+
});
24+
}
25+
}

app/tests/Browser/EventTest.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,19 @@
33
namespace Tests\Browser;
44

55
use App\Models\User;
6-
use Illuminate\Foundation\Testing\RefreshDatabase;
76
use Illuminate\Support\Facades\Http;
87
use Laravel\Dusk\Browser;
98
use Tests\DuskTestCase;
109

1110
class EventTest extends DuskTestCase
1211
{
13-
use RefreshDatabase;
1412
use UsesWebsocketsServerTrait;
1513

16-
public $seed = true;
17-
1814
/** @test */
1915
public function it_can_redirect_on_an_event()
2016
{
2117
$this->browse(function (Browser $browser) {
22-
$user = User::first();
18+
$user = User::firstOrFail();
2319

2420
$browser->loginAs($user)
2521
->visit('/event')
@@ -42,7 +38,7 @@ public function it_can_redirect_on_an_event()
4238
public function it_can_refresh_on_an_event()
4339
{
4440
$this->browse(function (Browser $browser) {
45-
$user = User::first();
41+
$user = User::firstOrFail();
4642

4743
$browser->loginAs($user)
4844
->visit('/event')
@@ -67,7 +63,7 @@ public function it_can_refresh_on_an_event()
6763
public function it_can_show_the_event()
6864
{
6965
$this->browse(function (Browser $browser) {
70-
$user = User::first();
66+
$user = User::firstOrFail();
7167

7268
$browser->loginAs($user)
7369
->visit('/event')
@@ -91,7 +87,7 @@ public function it_can_show_the_event()
9187
public function it_can_show_a_toast()
9288
{
9389
$this->browse(function (Browser $browser) {
94-
$user = User::first();
90+
$user = User::firstOrFail();
9591

9692
$browser->loginAs($user)
9793
->visit('/event')

app/tests/Browser/Form/FilepondExistingTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public function it_can_add_a_file_to_the_existing_multiple_media_uploads()
125125
->within('@photos', function (Browser $browser) {
126126
$browser->waitForText('1.jpeg')
127127
->waitForText('Drag and drop your files')
128+
->pause(500)
128129
->attachToFilepond(__DIR__ . '/../small.jpeg')
129130
->waitForText('Upload complete', 10)
130131
->press('Submit');

app/tests/Browser/FormLibrariesInModalTest.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
class FormLibrariesInModalTest extends DuskTestCase
1010
{
1111
/** @test */
12-
public function it_can_autosize_the_textarea()
12+
public function it_can_autosize_the_textarea_in_a_modal()
1313
{
1414
$this->browse(function (Browser $browser) {
1515
$browser->visit('modal/base')
1616
->waitForText('ModalComponent')
17+
->pause(250)
1718
->click('@libraries')
1819
->waitForText('FormComponents')
20+
->pause(250)
1921
->type('textarea', Lorem::text(1000))
2022
->assertAttributeContains('textarea', 'style', 'height');
2123
});
@@ -46,9 +48,13 @@ public function it_can_use_the_choices_js_library_for_a_multiple_select_element_
4648
->waitForText('FormComponents')
4749
->pause(500)
4850
->choicesSelect('countries[]', 'NL')
51+
->pause(100)
4952
->assertSee('Selected countries: NL')
53+
->pause(100)
5054
->choicesSelect('countries[]', 'BE')
55+
->pause(100)
5156
->assertSee('Selected countries: NL, BE')
57+
->pause(100)
5258
->choicesRemoveItem('countries[]', 'NL')
5359
->assertSee('Selected countries: BE');
5460
});
@@ -64,7 +70,7 @@ public function it_can_close_the_choices_js_library_without_selecting_an_option(
6470
->waitForText('FormComponents')
6571
->click('@select-choices')
6672
->whenAvailable('div.choices.is-open', function (Browser $browser) {
67-
$coordinates = $browser->script("return document.querySelector('[dusk=\"text\"]').getBoundingClientRect()");
73+
$coordinates = $browser->pause(250)->script("return document.querySelector('[dusk=\"text\"]').getBoundingClientRect()");
6874

6975
$browser->clickAtPoint($coordinates[0]['x'], $coordinates[0]['y'])
7076
->pause(500)

0 commit comments

Comments
 (0)