'email_settings']); $current = $setting->value ? json_decode($setting->value, true) : []; $setting->value = json_encode(array_merge($current, ['mail_enabled' => $enabled])); $setting->save(); } private function disableAuto(array $scenarios): void { $setting = Setting::firstOrNew(['key' => 'email_settings']); $current = $setting->value ? json_decode($setting->value, true) : []; $setting->value = json_encode(array_merge($current, ['mail_enabled' => true, 'auto_disabled' => $scenarios])); $setting->save(); } private function send(?string $scenario = null): mixed { return Mail::to('user@example.com')->send(new GenericTemplateMail('Subject', '
Body
', [], $scenario)); } public function test_mail_is_blocked_when_disabled(): void { $this->setMailEnabled(false); $this->assertNull($this->send()); $this->assertCount(0, Mail::mailer()->getSymfonyTransport()->messages()); } public function test_mail_is_sent_when_enabled(): void { $this->setMailEnabled(true); $this->assertNotNull($this->send()); $this->assertCount(1, Mail::mailer()->getSymfonyTransport()->messages()); } public function test_disabled_scenario_is_blocked_but_others_are_sent(): void { $this->disableAuto(['invoice_payment_reminder']); $this->assertNull($this->send('invoice_payment_reminder')); $this->assertNotNull($this->send('order_created')); $this->assertNotNull($this->send()); } public function test_manual_send_bypasses_disabled_scenario(): void { $this->disableAuto(['invoice_payment_reminder']); AutoEmailGate::markManual(); $this->assertNotNull($this->send('invoice_payment_reminder')); } public function test_template_mailable_exposes_its_scenario(): void { $this->assertSame('service_expiry', (new ExpiryService(0, []))->buildViewData()[AutoEmailGate::SCENARIO_DATA_KEY]); } public function test_template_service_does_not_queue_when_mail_disabled_or_scenario_off(): void { Queue::fake(); $service = app(EmailTemplateService::class); $this->setMailEnabled(false); $service->send('order_created', 'user@example.com'); $this->disableAuto(['order_created']); $service->send('order_created', 'user@example.com'); Queue::assertNothingPushed(); $service->send('domain_order_approved', 'user@example.com'); Queue::assertPushed(SendTemplateEmailJob::class, 1); } }