notificationtest in progress

This commit is contained in:
Daan Meijer 2026-07-06 13:27:31 +02:00
parent 371b75193a
commit ccb3598da0
7 changed files with 132 additions and 13 deletions

View File

@ -30,7 +30,7 @@ class NewActivityNotification extends Notification
*/
public function via(object $notifiable): array
{
return [WebPushChannel::class];
return ['database', WebPushChannel::class];
}
/**
@ -46,15 +46,6 @@ class NewActivityNotification extends Notification
->action('View', 'view')
->data(['url' => $this->activity['url']]);
switch (get_class($this->activity)) {
case Message::class:
/** @var Chat $chat */
$chat = $this->activity->chat;
$result->data(['url' => $chat->subjectUrl]);
break;
}
return $result;
}
@ -66,7 +57,8 @@ class NewActivityNotification extends Notification
public function toArray(object $notifiable): array
{
return [
//
'content' => $this->activity['content'],
'url' => $this->activity['url'],
];
}
}

View File

@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('notifications', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('type');
$table->morphs('notifiable');
$table->text('data');
$table->timestamp('read_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('notifications');
}
};

15
phpunit.dusk.xml Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
beStrictAboutTestsThatDoNotTestAnything="false"
colors="true"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
cacheDirectory=".phpunit.cache"
backupStaticProperties="false">
<testsuites>
<testsuite name="Browser Test Suite">
<directory suffix="Test.php">./tests/Browser</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -23,7 +23,7 @@
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="BROADCAST_CONNECTION" value="null"/>
<env name="CACHE_STORE" value="array"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_CONNECTION" value="sqlite" />
<env name="DB_DATABASE" value=":memory:"/>
<env name="DB_URL" value=""/>
<env name="MAIL_MAILER" value="array"/>

View File

@ -104,6 +104,7 @@ function submit() {
id="amount"
type="number"
class="c-add-mutation-form__input"
data-test="amount-input"
/>
<div
v-if="form.errors.amount"
@ -122,6 +123,7 @@ function submit() {
id="description"
rows="4"
class="c-add-mutation-form__textarea"
data-test="description-input"
></textarea>
<div
v-if="form.errors.description"
@ -171,6 +173,7 @@ function submit() {
type="submit"
:disabled="form.processing"
class="c-add-mutation-form__submit-btn"
data-test="add-mutation-button"
>
Add Mutation
</button>

View File

@ -0,0 +1,78 @@
<?php
namespace Tests\Browser;
use App\Models\Dynamic;
use App\Models\Ledger;
use App\Models\Mutation;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class NotificationTest extends DuskTestCase
{
use DatabaseMigrations;
protected function setUp(): void
{
parent::setUp();
$this->artisan('migrate:fresh', ['--seed' => true]);
}
/**
* A basic browser test example.
*/
public function test_it_shows_notifications_on_mutation_activity(): void
{
$owner = User::factory()->create();
$participant = User::factory()->create();
$dynamic = Dynamic::factory()->create();
$dynamic->chat()->create();
$dynamic->participants()->attach($owner->id, ['role' => 'owner']);
$dynamic->participants()->attach($participant->id, ['role' => 'participant']);
$ledger = Ledger::factory()->create(['dynamic_id' => $dynamic->id]);
$this->browse(function (Browser $ownerBrowser, Browser $participantBrowser) use ($owner, $participant, $dynamic, $ledger) {
$ownerBrowser->loginAs($owner)
->visit(route('dynamics.ledgers.show', [$dynamic, $ledger]))
->waitForText($ledger->name)
->assertSee($ledger->name)
->script([
"window.notifications = [];",
"window.Notification = function(title, options) { window.notifications.push({title, options}); };",
]);
$participantBrowser->loginAs($participant)
->visit(route('dynamics.ledgers.show', [$dynamic, $ledger]))
->waitForText('Add Mutation')
->type('[data-test="description-input"]', 'A new task suggestion')
->type('[data-test="amount-input"]', 10)
->press('[data-test="add-mutation-button"]')
->waitForText('A new task suggestion');
$ownerBrowser->pause(1000);
$lastNotification = $ownerBrowser->script("return window.notifications.pop();")[0] ?? null;
$this->assertNotNull($lastNotification, "Owner did not receive the 'new suggestion' notification.");
$this->assertEquals('New Activity', $lastNotification['title']);
$this->assertStringContainsString('suggested a new entry', $lastNotification['options']['body']);
$mutation = Mutation::where('description', 'A new task suggestion')->first();
$ownerBrowser->press("#mutation-{$mutation->id}-approve")
->waitForText('APPROVED');
$participantBrowser->script([
"window.notifications = [];",
"window.Notification = function(title, options) { window.notifications.push({title, options}); };",
]);
$ownerBrowser->pause(1000);
$participantBrowser->pause(1000);
$lastNotification = $participantBrowser->script("return window.notifications.pop();")[0] ?? null;
$this->assertNotNull($lastNotification, "Participant did not receive the 'approved' notification.");
$this->assertEquals('New Activity', $lastNotification['title']);
$this->assertStringContainsString('APPROVED the suggestion', $lastNotification['options']['body']);
});
}
}

View File

@ -31,7 +31,7 @@ abstract class DuskTestCase extends BaseTestCase
$options = (new ChromeOptions)->addArguments((new Collection([
$this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080',
'--disable-gpu',
'--headless=new',
// '--headless=new',
'--no-sandbox',
'--disable-dev-shm-usage',
]))->unless(static::runningInSail(), function (Collection $arguments) {