seed(\Database\Seeders\TemplateSeeder::class); Role::firstOrCreate(['name' => 'Full Administrator', 'guard_name' => 'admin']); $this->admin = User::factory()->create(); $this->admin->assignRole('Full Administrator'); $this->customer = Customer::factory()->create(); $this->soon = Service::create(['customer_id' => $this->customer->id, 'status' => 'active', 'expires_at' => now()->addDays(5)]); $this->later = Service::create(['customer_id' => $this->customer->id, 'status' => 'active', 'expires_at' => now()->addDays(40)]); Service::create(['customer_id' => $this->customer->id, 'status' => 'suspended', 'expires_at' => now()->addDays(3)]); } public function test_lists_active_services_expiring_within_days(): void { $this->actingAs($this->admin, 'admin') ->getJson(self::BASE . '?days=30') ->assertOk() ->assertJsonCount(1, 'data') ->assertJsonPath('data.0.id', $this->soon->id) ->assertJsonPath('data.0.days_left', 5); } public function test_send_queues_reminders_bypassing_auto_disabled_scenario(): void { Mail::fake(); Setting::updateOrCreate(['key' => 'email_settings'], ['value' => json_encode(['auto_disabled' => ['service_renewal_reminder']])]); $this->actingAs($this->admin, 'admin') ->postJson(self::BASE, ['service_ids' => [$this->soon->id, $this->later->id]]) ->assertOk(); Mail::assertQueued(ServiceRenewalReminderMail::class, 2); $this->assertDatabaseCount('mail', 2); $this->assertDatabaseHas('mail', ['customer_id' => $this->soon->customer_id, 'sent_by' => $this->admin->id]); } public function test_send_is_rejected_when_mail_is_disabled(): void { Mail::fake(); Setting::updateOrCreate(['key' => 'email_settings'], ['value' => json_encode(['mail_enabled' => false])]); $this->actingAs($this->admin, 'admin') ->postJson(self::BASE, ['service_ids' => [$this->soon->id]]) ->assertStatus(422); Mail::assertNothingQueued(); } public function test_customer_service_reminder_queues_mail_and_records_log(): void { Mail::fake(); $this->actingAs($this->admin, 'admin') ->postJson("/api/v1/administrator/customers/{$this->customer->uuid}/services/{$this->soon->id}/notify-renew") ->assertOk() ->assertJsonPath('error', false); Mail::assertQueued(ServiceRenewalReminderMail::class, 1); $this->assertDatabaseHas('mail', [ 'customer_id' => $this->customer->id, 'sent_by' => $this->admin->id, 'to' => $this->customer->email, ]); } }