83 lines
2.8 KiB
PHP
83 lines
2.8 KiB
PHP
<?php
|
|
|
|
use App\Mail\InvoiceMail;
|
|
use App\Mail\ResetPasswordMail;
|
|
use App\Models\Customer;
|
|
use App\Models\Invoice;
|
|
use App\Models\Order;
|
|
use App\Models\User;
|
|
use App\Services\Billing\IssueInvoice;
|
|
use App\Services\Mail\MailLane;
|
|
use App\Support\CompanyProfile;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Illuminate\Support\Facades\Queue;
|
|
|
|
/**
|
|
* Die Spur entsteht beim Einreihen, nicht beim Senden.
|
|
*
|
|
* Der Arbeiter liest die Schlangen in der Reihenfolge ihrer Dringlichkeit —
|
|
* deshalb steht ein Kennwort-Zurücksetzen nie hinter zweihundert Rechnungen.
|
|
* Das trägt nur, wenn die Rechnung wirklich in einer anderen Schlange liegt.
|
|
*
|
|
* Werkzeug: Queue::fake() statt Mail::fake(). Mail::fake() ersetzt den
|
|
* ganzen Mailer — der Aufruf, der onQueue() setzt (Mailer::queue(), der
|
|
* dann Mailable::queue() aufruft), fände dann nie statt, und der Test würde
|
|
* grün, ohne die Spur je berechnet zu haben. Queue::fake() lässt genau
|
|
* diesen Aufruf laufen und fängt erst dahinter ab, an der Queue-Fabrik —
|
|
* die Stelle, an der pushOn() tatsächlich ankommt.
|
|
*/
|
|
function invoiceForTest(): Invoice
|
|
{
|
|
CompanyProfile::put([
|
|
'name' => 'CluPilot Cloud e.U.',
|
|
'address' => 'Dreherstraße 66/1/8',
|
|
'postcode' => '1110',
|
|
'city' => 'Wien',
|
|
'vat_id' => 'ATU00000000',
|
|
]);
|
|
|
|
$customer = Customer::factory()->create(['name' => 'Muster GmbH']);
|
|
$orders = collect([Order::factory()->create([
|
|
'customer_id' => $customer->id, 'amount_cents' => 1900, 'currency' => 'EUR', 'status' => 'paid',
|
|
])]);
|
|
|
|
return app(IssueInvoice::class)->forOrders($customer, $orders);
|
|
}
|
|
|
|
it('reiht jede Mail in die Schlange ihrer Spur ein', function () {
|
|
Queue::fake();
|
|
|
|
Mail::to('kunde@example.test')->queue(new InvoiceMail(invoiceForTest(), 'Muster'));
|
|
|
|
Queue::assertPushedOn(MailLane::CALM, Illuminate\Mail\SendQueuedMailable::class);
|
|
});
|
|
|
|
it('reiht eine Direkt-Mail in die Direkt-Spur ein', function () {
|
|
Queue::fake();
|
|
|
|
$user = User::factory()->create();
|
|
|
|
Mail::to('kunde@example.test')->queue(new ResetPasswordMail($user, 'https://example.test/reset', 60));
|
|
|
|
Queue::assertPushedOn(MailLane::DIRECT, Illuminate\Mail\SendQueuedMailable::class);
|
|
});
|
|
|
|
it('folgt einer verschobenen Zuordnung', function () {
|
|
Queue::fake();
|
|
MailLane::assign(InvoiceMail::class, MailLane::URGENT);
|
|
|
|
Mail::to('kunde@example.test')->queue(new InvoiceMail(invoiceForTest(), 'Muster'));
|
|
|
|
Queue::assertPushedOn(MailLane::URGENT, Illuminate\Mail\SendQueuedMailable::class);
|
|
});
|
|
|
|
it('lässt keine Mailklasse ohne Spur', function () {
|
|
$missing = collect(glob(app_path('Mail/*.php')))
|
|
->map(fn (string $path) => 'App\\Mail\\'.basename($path, '.php'))
|
|
->reject(fn (string $class) => in_array(App\Mail\Concerns\RidesALane::class, class_uses_recursive($class), true))
|
|
->values()
|
|
->all();
|
|
|
|
expect($missing)->toBe([]);
|
|
});
|