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 public function via(object $notifiable): array
{ {
return [WebPushChannel::class]; return ['database', WebPushChannel::class];
} }
/** /**
@ -46,15 +46,6 @@ class NewActivityNotification extends Notification
->action('View', 'view') ->action('View', 'view')
->data(['url' => $this->activity['url']]); ->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; return $result;
} }
@ -66,7 +57,8 @@ class NewActivityNotification extends Notification
public function toArray(object $notifiable): array public function toArray(object $notifiable): array
{ {
return [ 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

@ -104,6 +104,7 @@ function submit() {
id="amount" id="amount"
type="number" type="number"
class="c-add-mutation-form__input" class="c-add-mutation-form__input"
data-test="amount-input"
/> />
<div <div
v-if="form.errors.amount" v-if="form.errors.amount"
@ -122,6 +123,7 @@ function submit() {
id="description" id="description"
rows="4" rows="4"
class="c-add-mutation-form__textarea" class="c-add-mutation-form__textarea"
data-test="description-input"
></textarea> ></textarea>
<div <div
v-if="form.errors.description" v-if="form.errors.description"
@ -171,6 +173,7 @@ function submit() {
type="submit" type="submit"
:disabled="form.processing" :disabled="form.processing"
class="c-add-mutation-form__submit-btn" class="c-add-mutation-form__submit-btn"
data-test="add-mutation-button"
> >
Add Mutation Add Mutation
</button> </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([ $options = (new ChromeOptions)->addArguments((new Collection([
$this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080', $this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080',
'--disable-gpu', '--disable-gpu',
'--headless=new', // '--headless=new',
'--no-sandbox', '--no-sandbox',
'--disable-dev-shm-usage', '--disable-dev-shm-usage',
]))->unless(static::runningInSail(), function (Collection $arguments) { ]))->unless(static::runningInSail(), function (Collection $arguments) {