create(); $this->actingAs($user); // Create required related models (using the same approach as NotificationsUnreadFilterTest) $action = \App\Models\Action::factory()->create(); $decision = \App\Models\Decision::factory()->create(); $clientCase = \App\Models\ClientCase::factory()->create(); // Create an activity $activity = Activity::query()->create([ 'due_date' => now()->toDateString(), 'amount' => 100, 'action_id' => $action->id, 'decision_id' => $decision->id, 'client_case_id' => $clientCase->id, ]); // Ensure no read record exists initially $this->assertDatabaseMissing('activity_notification_reads', [ 'user_id' => $user->id, 'activity_id' => $activity->id, ]); // Send PATCH request to mark as read $response = $this->patch(route('notifications.activity.read'), [ 'activity_id' => $activity->id, ]); $response->assertRedirect(); // Verify the read record was created $this->assertDatabaseHas('activity_notification_reads', [ 'user_id' => $user->id, 'activity_id' => $activity->id, ]); }); it('requires authentication', function () { // Create required related models $action = \App\Models\Action::factory()->create(); $decision = \App\Models\Decision::factory()->create(); $clientCase = \App\Models\ClientCase::factory()->create(); $activity = Activity::query()->create([ 'due_date' => now()->toDateString(), 'amount' => 100, 'action_id' => $action->id, 'decision_id' => $decision->id, 'client_case_id' => $clientCase->id, ]); $response = $this->patch(route('notifications.activity.read'), [ 'activity_id' => $activity->id, ]); $response->assertStatus(302); // Redirect to login }); it('validates activity_id parameter', function () { $user = User::factory()->create(); $this->actingAs($user); // Test missing activity_id $response = $this->patch(route('notifications.activity.read'), []); $response->assertSessionHasErrors(['activity_id']); // Test invalid activity_id $response = $this->patch(route('notifications.activity.read'), [ 'activity_id' => 99999, // Non-existent ID ]); $response->assertSessionHasErrors(['activity_id']); }); it('excludes read activities from unread notifications page', function () { $user = User::factory()->create(); $this->actingAs($user); // Create required related models $action = \App\Models\Action::factory()->create(); $decision = \App\Models\Decision::factory()->create(); $clientCase = \App\Models\ClientCase::factory()->create(); // Create two activities due today $activity1 = Activity::query()->create([ 'due_date' => now()->toDateString(), 'amount' => 100, 'action_id' => $action->id, 'decision_id' => $decision->id, 'client_case_id' => $clientCase->id, ]); $activity2 = Activity::query()->create([ 'due_date' => now()->toDateString(), 'amount' => 200, 'action_id' => $action->id, 'decision_id' => $decision->id, 'client_case_id' => $clientCase->id, ]); // Initially, both activities should appear in unread notifications $response = $this->get(route('notifications.unread')); $response->assertInertia(function (Assert $page) { $page->where('activities.total', 2); }); // Mark first activity as read $this->patch(route('notifications.activity.read'), ['activity_id' => $activity1->id]); // Now only one activity should appear in unread notifications $response = $this->get(route('notifications.unread')); $response->assertInertia(function (Assert $page) { $page->where('activities.total', 1); }); // Mark second activity as read $this->patch(route('notifications.activity.read'), ['activity_id' => $activity2->id]); // Now no activities should appear in unread notifications $response = $this->get(route('notifications.unread')); $response->assertInertia(function (Assert $page) { $page->where('activities.total', 0); }); });