Fix tenant photo moderation and guest updates
This commit is contained in:
26
tests/Feature/Tenant/PhotoModerationControllerTest.php
Normal file
26
tests/Feature/Tenant/PhotoModerationControllerTest.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Tenant;
|
||||
|
||||
use App\Models\Event;
|
||||
use App\Models\Photo;
|
||||
|
||||
class PhotoModerationControllerTest extends TenantTestCase
|
||||
{
|
||||
public function test_tenant_admin_can_approve_photo(): void
|
||||
{
|
||||
$event = Event::factory()->for($this->tenant)->create([
|
||||
'slug' => 'moderation-event',
|
||||
]);
|
||||
$photo = Photo::factory()->for($event)->create([
|
||||
'status' => 'pending',
|
||||
]);
|
||||
|
||||
$response = $this->authenticatedRequest('PATCH', "/api/v1/tenant/events/{$event->slug}/photos/{$photo->id}", [
|
||||
'status' => 'approved',
|
||||
]);
|
||||
|
||||
$response->assertOk();
|
||||
$this->assertSame('approved', $photo->refresh()->status);
|
||||
}
|
||||
}
|
||||
144
tests/Unit/SendPhotoUploadedNotificationTest.php
Normal file
144
tests/Unit/SendPhotoUploadedNotificationTest.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Enums\GuestNotificationType;
|
||||
use App\Events\GuestPhotoUploaded;
|
||||
use App\Listeners\GuestNotifications\SendPhotoUploadedNotification;
|
||||
use App\Models\Event;
|
||||
use App\Models\GuestNotification;
|
||||
use App\Models\GuestNotificationReceipt;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Tests\TestCase;
|
||||
|
||||
class SendPhotoUploadedNotificationTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_it_dedupes_recent_photo_activity_notifications(): void
|
||||
{
|
||||
Carbon::setTestNow('2026-01-12 13:48:01');
|
||||
|
||||
$event = Event::factory()->create();
|
||||
$listener = $this->app->make(SendPhotoUploadedNotification::class);
|
||||
|
||||
GuestNotification::factory()->create([
|
||||
'tenant_id' => $event->tenant_id,
|
||||
'event_id' => $event->id,
|
||||
'type' => GuestNotificationType::PHOTO_ACTIVITY,
|
||||
'title' => 'Fotospiel-Test hat gerade ein Foto gemacht 🎉',
|
||||
'payload' => [
|
||||
'photo_id' => 123,
|
||||
'photo_ids' => [123],
|
||||
'count' => 1,
|
||||
],
|
||||
'created_at' => now()->subSeconds(5),
|
||||
'updated_at' => now()->subSeconds(5),
|
||||
]);
|
||||
|
||||
$listener->handle(new GuestPhotoUploaded(
|
||||
$event,
|
||||
123,
|
||||
'device-123',
|
||||
'Fotospiel-Test'
|
||||
));
|
||||
|
||||
$notification = GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', GuestNotificationType::PHOTO_ACTIVITY)
|
||||
->first();
|
||||
|
||||
$this->assertSame(1, GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', GuestNotificationType::PHOTO_ACTIVITY)
|
||||
->count());
|
||||
$this->assertSame(1, (int) ($notification?->payload['count'] ?? 0));
|
||||
}
|
||||
|
||||
public function test_it_groups_recent_photo_activity_notifications(): void
|
||||
{
|
||||
Carbon::setTestNow('2026-01-12 13:48:01');
|
||||
|
||||
$event = Event::factory()->create();
|
||||
$listener = $this->app->make(SendPhotoUploadedNotification::class);
|
||||
|
||||
GuestNotification::factory()->create([
|
||||
'tenant_id' => $event->tenant_id,
|
||||
'event_id' => $event->id,
|
||||
'type' => GuestNotificationType::PHOTO_ACTIVITY,
|
||||
'title' => 'Fotospiel-Test hat gerade ein Foto gemacht 🎉',
|
||||
'payload' => [
|
||||
'photo_id' => 122,
|
||||
'photo_ids' => [122],
|
||||
'count' => 1,
|
||||
],
|
||||
'created_at' => now()->subMinutes(5),
|
||||
'updated_at' => now()->subMinutes(5),
|
||||
]);
|
||||
|
||||
$listener->handle(new GuestPhotoUploaded(
|
||||
$event,
|
||||
123,
|
||||
'device-123',
|
||||
'Fotospiel-Test'
|
||||
));
|
||||
|
||||
$this->assertSame(1, GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', GuestNotificationType::PHOTO_ACTIVITY)
|
||||
->count());
|
||||
|
||||
$notification = GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', GuestNotificationType::PHOTO_ACTIVITY)
|
||||
->first();
|
||||
|
||||
$this->assertSame('Es gibt 2 neue Fotos!', $notification?->title);
|
||||
$this->assertSame(2, (int) ($notification?->payload['count'] ?? 0));
|
||||
|
||||
$this->assertSame(1, GuestNotificationReceipt::query()
|
||||
->where('guest_identifier', 'device-123')
|
||||
->where('status', 'read')
|
||||
->count());
|
||||
}
|
||||
|
||||
public function test_it_creates_notification_outside_group_window(): void
|
||||
{
|
||||
Carbon::setTestNow('2026-01-12 13:48:01');
|
||||
|
||||
$event = Event::factory()->create();
|
||||
$listener = $this->app->make(SendPhotoUploadedNotification::class);
|
||||
|
||||
GuestNotification::factory()->create([
|
||||
'tenant_id' => $event->tenant_id,
|
||||
'event_id' => $event->id,
|
||||
'type' => GuestNotificationType::PHOTO_ACTIVITY,
|
||||
'title' => 'Fotospiel-Test hat gerade ein Foto gemacht 🎉',
|
||||
'payload' => [
|
||||
'photo_id' => 122,
|
||||
'photo_ids' => [122],
|
||||
'count' => 1,
|
||||
],
|
||||
'created_at' => now()->subMinutes(20),
|
||||
'updated_at' => now()->subMinutes(20),
|
||||
]);
|
||||
|
||||
$listener->handle(new GuestPhotoUploaded(
|
||||
$event,
|
||||
123,
|
||||
'device-123',
|
||||
'Fotospiel-Test'
|
||||
));
|
||||
|
||||
$this->assertSame(2, GuestNotification::query()
|
||||
->where('event_id', $event->id)
|
||||
->where('type', GuestNotificationType::PHOTO_ACTIVITY)
|
||||
->count());
|
||||
|
||||
$this->assertSame(1, GuestNotificationReceipt::query()
|
||||
->where('guest_identifier', 'device-123')
|
||||
->where('status', 'read')
|
||||
->count());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user