79 lines
2.3 KiB
PHP
79 lines
2.3 KiB
PHP
<?php
|
|
|
|
use App\Jobs\ProcessIncomingEmail;
|
|
use Illuminate\Support\Facades\Config;
|
|
use Illuminate\Support\Facades\Queue;
|
|
|
|
beforeEach(function () {
|
|
Config::set('services.mailops.webhook_secret', 'test-secret');
|
|
});
|
|
|
|
it('rejects webhooks without a secret token', function () {
|
|
$response = $this->postJson('/api/webhooks/incoming_email', [
|
|
'hash' => 'dummy-hash',
|
|
]);
|
|
|
|
$response->assertStatus(401)
|
|
->assertJson(['error' => 'Unauthorized']);
|
|
});
|
|
|
|
it('rejects webhooks with an invalid secret token', function () {
|
|
$response = $this->postJson('/api/webhooks/incoming_email', [
|
|
'hash' => 'dummy-hash',
|
|
], [
|
|
'Authorization' => 'Bearer wrong-secret',
|
|
]);
|
|
|
|
$response->assertStatus(401);
|
|
});
|
|
|
|
it('accepts valid webhooks and dispatches the processing job', function () {
|
|
Queue::fake();
|
|
|
|
$payload = [
|
|
'hash' => 'test-unique-hash-12345',
|
|
'metadata' => [
|
|
'recipientEmail' => 'test@imail.app',
|
|
'recipientName' => 'Test User',
|
|
'senderEmail' => 'sender@example.com',
|
|
'senderName' => 'Sender Name',
|
|
'domain' => 'imail.app',
|
|
'subject' => 'Test Subject',
|
|
'received_at' => now()->toIso8601String(),
|
|
'attachmentSize' => 0,
|
|
'attachments' => [],
|
|
],
|
|
'bodyText' => 'This is a test email body.',
|
|
'bodyHtml' => '<p>This is a test email body.</p>',
|
|
];
|
|
|
|
$response = $this->postJson('/api/webhooks/incoming_email', $payload, [
|
|
'Authorization' => 'Bearer test-secret',
|
|
]);
|
|
|
|
$response->assertStatus(200)
|
|
->assertJson(['status' => 'queued']);
|
|
|
|
Queue::assertPushed(ProcessIncomingEmail::class, function ($job) use ($payload) {
|
|
return $job->payload['hash'] === $payload['hash'];
|
|
});
|
|
});
|
|
|
|
it('validates required payload fields', function () {
|
|
Queue::fake();
|
|
|
|
$response = $this->postJson('/api/webhooks/incoming_email', [
|
|
// Missing hash and other required fields
|
|
'metadata' => [
|
|
'recipientEmail' => 'test@imail.app',
|
|
],
|
|
], [
|
|
'Authorization' => 'Bearer test-secret',
|
|
]);
|
|
|
|
$response->assertStatus(422)
|
|
->assertJsonValidationErrors(['hash', 'metadata.senderEmail', 'metadata.domain', 'metadata.received_at']);
|
|
|
|
Queue::assertNothingPushed();
|
|
});
|