mivita/tests/Feature/PaymentDashboard/PaymentDashboardAccessTest.php
2026-04-14 18:07:45 +02:00

183 lines
5.5 KiB
PHP

<?php
use App\Http\Controllers\Admin\PaymentDashboardController;
use App\Http\Middleware\Admin;
use App\Models\PaymentIncident;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
uses(RefreshDatabase::class);
function makeAdminUser(): User
{
return User::forceCreate([
'email' => 'admin-'.uniqid().'@test.com',
'password' => Hash::make('secret'),
'admin' => 2,
'lang' => 'de',
]);
}
function makeRegularUser(): User
{
return User::forceCreate([
'email' => 'user-'.uniqid().'@test.com',
'password' => Hash::make('secret'),
'admin' => 0,
'lang' => 'de',
]);
}
function makeVipUser(): User
{
return User::forceCreate([
'email' => 'vip-'.uniqid().'@test.com',
'password' => Hash::make('secret'),
'admin' => 1,
'lang' => 'de',
]);
}
// ─── Admin Middleware Tests ───────────────────────────────────────────────────
it('Admin-Middleware lässt Admins (admin >= 2) durch', function () {
$admin = makeAdminUser();
Auth::setUser($admin);
$request = Request::create('/admin/payment-dashboard');
$middleware = new Admin;
$passed = false;
$middleware->handle($request, function () use (&$passed) {
$passed = true;
});
expect($passed)->toBeTrue();
});
it('Admin-Middleware blockiert normale Benutzer (admin = 0)', function () {
$user = makeRegularUser();
$request = Request::create('/admin/payment-dashboard');
$request->setUserResolver(fn () => $user);
$middleware = new Admin;
$response = $middleware->handle($request, fn () => null);
expect($response)->not->toBeNull();
expect($response->getStatusCode())->toBe(302);
});
it('Admin-Middleware blockiert VIP-Benutzer (admin = 1)', function () {
$vip = makeVipUser();
$request = Request::create('/admin/payment-dashboard');
$request->setUserResolver(fn () => $vip);
$middleware = new Admin;
$response = $middleware->handle($request, fn () => null);
expect($response)->not->toBeNull();
expect($response->getStatusCode())->toBe(302);
});
// ─── Controller Auth Tests ────────────────────────────────────────────────────
it('Entwickler-Ansicht gibt View zurück für Admins', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
$response = $controller->index();
expect($response->getName())->toBe('admin.payment-dashboard.index');
});
it('GF-Ansicht gibt View zurück für Super-Admins (admin >= 3)', function () {
$superAdmin = User::forceCreate([
'email' => 'superadmin-'.uniqid().'@test.com',
'password' => Hash::make('secret'),
'admin' => 3,
'lang' => 'de',
]);
$this->actingAs($superAdmin);
$controller = new PaymentDashboardController;
$response = $controller->management();
expect($response->getName())->toBe('admin.payment-dashboard.management');
});
it('GF-Ansicht liefert 403 für normale Admins (admin = 2)', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
expect(fn () => $controller->management())->toThrow(\Symfony\Component\HttpKernel\Exception\HttpException::class);
});
it('Incident-Detail gibt korrekten View zurück', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$incident = PaymentIncident::create([
'title' => 'Test Incident Detail',
'provider' => 'payone',
'type' => 'payment_failure',
'severity' => 'high',
'detected_at' => now(),
]);
$controller = new PaymentDashboardController;
$response = $controller->show($incident);
expect($response->getName())->toBe('admin.payment-dashboard.show');
expect($response->getData()['incident']->id)->toBe($incident->id);
});
it('Log-Ansicht gibt View zurück', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
$response = $controller->logs();
expect($response->getName())->toBe('admin.payment-dashboard.logs');
});
it('Transaktions-Ansicht gibt View zurück', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
$response = $controller->transactions();
expect($response->getName())->toBe('admin.payment-dashboard.transactions');
});
it('Abbruch-Analyse gibt View zurück', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
$response = $controller->abandoned();
expect($response->getName())->toBe('admin.payment-dashboard.abandoned');
});
it('Abbruch-Analyse enthält die 3 erwarteten Datensätze', function () {
$admin = makeAdminUser();
$this->actingAs($admin);
$controller = new PaymentDashboardController;
$response = $controller->abandoned();
$data = $response->getData();
expect($data)->toHaveKey('ordersWithoutPayment');
expect($data)->toHaveKey('cancelledPayments');
expect($data)->toHaveKey('pendingPayments');
expect($data)->toHaveKey('abandonedStats');
expect($data['abandonedStats'])->toHaveKeys(['no_payment', 'cancelled', 'no_callback']);
});