createTenant(); $response = $this->postJson('/api/acme/mail-test/send', [ 'to' => 'recipient@example.com', 'subject' => 'SMTP test', 'message' => 'Test message', ]); $response->assertOk() ->assertJsonPath('message', 'Correo de prueba enviado correctamente.') ->assertJsonPath('recipient', 'recipient@example.com') ->assertJsonPath('tenant_code', 'acme') ->assertJsonPath('mailer', 'tenant-smtp') ->assertJsonStructure(['sent_at']); Mail::assertSent(Mailable::class, function (Mailable $mail) use ($tenant): bool { return $mail->hasTo('recipient@example.com') && $mail->subject === 'SMTP test' && str_contains($mail->render(), 'Test message') && str_contains($mail->render(), $tenant->nombre); }); } public function test_it_uses_default_content_when_optional_fields_are_omitted(): void { Mail::fake(); $this->createTenant(); $this->postJson('/api/acme/mail-test/send', [ 'to' => 'recipient@example.com', ])->assertOk(); Mail::assertSent(Mailable::class, function (Mailable $mail): bool { return $mail->subject === 'Prueba de correo de Shopit' && str_contains($mail->render(), 'Este es un correo de prueba enviado desde Shopit.'); }); } public function test_it_validates_the_recipient(): void { Mail::fake(); $this->createTenant(); $this->postJson('/api/acme/mail-test/send', [ 'to' => 'invalid-email', ])->assertUnprocessable() ->assertJsonValidationErrors(['to']); Mail::assertNothingSent(); } public function test_the_mail_template_uses_the_tenant_branding(): void { $tenant = new Tenant([ 'codigo' => 'tenant-store', 'nombre' => 'Tenant Store', 'primary_color' => '#778899', 'header_bg_color' => '#112233', 'footer_bg_color' => '#445566', ]); $tenant->setRelation('headerLogo', new class extends Attachment { public function getTemporaryUrl(int $expiresInMinutes = 10): string { return 'https://example.com/header-logo.png'; } }); $tenant->setRelation('footerLogo', new class extends Attachment { public function getTemporaryUrl(int $expiresInMinutes = 10): string { return 'https://example.com/footer-logo.png'; } }); $mail = new TestMail( 'Branded email', 'Tenant message', $tenant, ); $html = $mail->render(); $this->assertStringContainsString('https://example.com/header-logo.png', $html); $this->assertStringContainsString('https://example.com/footer-logo.png', $html); $this->assertStringContainsString('background-color: #112233', $html); $this->assertStringContainsString('background-color: #445566', $html); $this->assertStringContainsString('color: #778899', $html); $this->assertStringContainsString('Tenant Store', $html); $this->assertStringContainsString('Tenant message', $html); } public function test_it_returns_not_found_for_an_unknown_tenant(): void { Mail::fake(); $this->postJson('/api/unknown/mail-test/send', [ 'to' => 'recipient@example.com', ])->assertNotFound(); Mail::assertNothingSent(); } public function test_it_does_not_resolve_the_tenant_by_id(): void { Mail::fake(); $tenant = $this->createTenant(); $this->postJson("/api/{$tenant->id}/mail-test/send", [ 'to' => 'recipient@example.com', ])->assertNotFound(); Mail::assertNothingSent(); } private function createTenant(): Tenant { $headerLogo = Attachment::create([ 'path' => 'tenants/header.png', 'filename' => 'header.png', 'type' => AttachmentType::Image, 'mime_type' => 'image/png', 'extension' => 'png', ]); $footerLogo = Attachment::create([ 'path' => 'tenants/footer.png', 'filename' => 'footer.png', 'type' => AttachmentType::Image, 'mime_type' => 'image/png', 'extension' => 'png', ]); $tenant = Tenant::create([ 'codigo' => 'acme', 'nombre' => 'Acme Store', 'dominio' => 'acme.example.com', 'primary_color' => '#778899', 'secondary_color' => '#64748b', 'danger_color' => '#dc2626', 'success_color' => '#16a34a', 'header_bg_color' => '#112233', 'footer_bg_color' => '#445566', 'header_logo_id' => $headerLogo->id, 'footer_logo_id' => $footerLogo->id, ]); Integration::create([ 'integration_code' => 'email', 'name' => 'Email', ]); TenantIntegration::create([ 'tenant_code' => $tenant->codigo, 'integration_code' => 'email', 'integration_data' => [ 'MAIL_SCHEME' => 'smtp', 'MAIL_HOST' => 'smtp.example.com', 'MAIL_PORT' => 587, 'MAIL_USERNAME' => 'mailer@example.com', 'MAIL_PASSWORD' => 'secret', 'MAIL_FROM_ADDRESS' => 'store@example.com', ], ]); return $tenant; } }