create(); $event = Event::factory()->for($tenant)->create(['status' => 'published']); GuestNotification::factory()->create([ 'tenant_id' => $tenant->id, 'event_id' => $event->id, 'title' => 'Broadcast', ]); GuestNotification::factory()->create([ 'tenant_id' => $tenant->id, 'event_id' => $event->id, 'title' => 'Target', 'audience_scope' => GuestNotificationAudience::GUEST, 'target_identifier' => 'device-123', ]); $token = app(EventJoinTokenService::class)->createToken($event)->plain_token; $response = $this->withHeaders([ 'X-Device-Id' => 'device-123', ])->getJson("/api/v1/events/{$token}/notifications"); $response->assertOk(); $response->assertJsonPath('meta.unread_count', 2); $response->assertJsonCount(2, 'data'); $response->assertJsonFragment(['title' => 'Target']); } public function test_guest_can_mark_notification_read(): void { $tenant = Tenant::factory()->create(); $event = Event::factory()->for($tenant)->create(['status' => 'published']); $notification = GuestNotification::factory()->create([ 'tenant_id' => $tenant->id, 'event_id' => $event->id, ]); $token = app(EventJoinTokenService::class)->createToken($event)->plain_token; $response = $this->withHeaders([ 'X-Device-Id' => 'device-abc', ])->postJson("/api/v1/events/{$token}/notifications/{$notification->id}/read"); $response->assertOk(); $response->assertJsonPath('status', 'read'); $this->assertDatabaseHas('guest_notification_receipts', [ 'guest_notification_id' => $notification->id, 'guest_identifier' => 'device-abc', 'status' => 'read', ]); } public function test_guest_cannot_access_notification_from_other_event(): void { $tenant = Tenant::factory()->create(); $event = Event::factory()->for($tenant)->create(['status' => 'published']); $otherEvent = Event::factory()->for($tenant)->create(['status' => 'published']); $notification = GuestNotification::factory()->create([ 'tenant_id' => $tenant->id, 'event_id' => $otherEvent->id, ]); $token = app(EventJoinTokenService::class)->createToken($event)->plain_token; $response = $this->withHeaders([ 'X-Device-Id' => 'device-999', ])->postJson("/api/v1/events/{$token}/notifications/{$notification->id}/read"); $response->assertStatus(404); } }