'tempo@example.invalid']); DB::shouldReceive('connection')->never(); } /** @return array */ private function message(): array { return ['name' => 'Teste QA', 'email' => 'sender@example.invalid', 'subject' => 'Pedido de contacto', 'message' => 'Mensagem de teste do adaptador local.']; } public function test_the_original_fields_are_delivered_through_the_local_mail_transport(): void { Mail::fake(); $this->postJson('/contacto/mensagem', [...$this->message(), 'platform' => 'Other']) ->assertCreated()->assertJson(['success' => true]); Mail::assertSent(ContactMessageReceivedMail::class, fn (ContactMessageReceivedMail $mail) => $mail->hasTo('tempo@example.invalid') && $mail->contactMessage['platform'] === 'InvesteMoz' && $mail->contactMessage['phone'] === null && $mail->envelope()->replyTo[0]->address === 'sender@example.invalid' && $mail->envelope()->subject === 'Pedido de contacto'); Mail::assertSentCount(1); } public function test_invalid_fields_are_rejected_before_sending(): void { Mail::fake(); $this->postJson('/contacto/mensagem', ['name' => 'A', 'email' => 'invalid', 'subject' => 'AB', 'message' => 'short']) ->assertUnprocessable()->assertJsonValidationErrors(['name', 'email', 'subject', 'message']); Mail::assertNothingSent(); } public function test_transport_failure_is_not_reported_as_success(): void { Mail::shouldReceive('to')->once()->with('tempo@example.invalid')->andReturnSelf(); Mail::shouldReceive('send')->once()->andThrow(new RuntimeException('transport unavailable')); $this->postJson('/contacto/mensagem', $this->message()) ->assertStatus(500)->assertJson(['success' => false]); } public function test_the_copied_email_template_escapes_user_content(): void { $mail = new ContactMessageReceivedMail([...$this->message(), 'phone' => null, 'platform' => 'InvesteMoz', 'message' => '']); $html = $mail->render(); $this->assertStringContainsString('<script>', $html); $this->assertStringNotContainsString('