55 lines
1.8 KiB
PHP
55 lines
1.8 KiB
PHP
<?php
|
|
|
|
use App\Http\Middleware\EnsureUserIsApproved;
|
|
use App\Models\User;
|
|
use App\Support\Enum\UserStatus;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
$this->artisan('db:seed');
|
|
});
|
|
|
|
test('guest passes through', function () {
|
|
$response = (new EnsureUserIsApproved)->handle(Request::create('/'), fn () => 'ok');
|
|
|
|
$this->assertSame('ok', $response);
|
|
});
|
|
|
|
test('active user passes through', function () {
|
|
$user = User::factory()->create(['status' => UserStatus::ACTIVE]);
|
|
$request = Request::create('/');
|
|
$request->setUserResolver(fn () => $user);
|
|
|
|
$response = (new EnsureUserIsApproved)->handle($request, fn () => 'ok');
|
|
|
|
$this->assertSame('ok', $response);
|
|
});
|
|
|
|
test('waiting user redirects to approval notice for web', function () {
|
|
Route::get('/approval-notice', fn () => 'notice')->name('approval.notice');
|
|
|
|
$user = User::factory()->create(['status' => UserStatus::WAITING_APPROVAL]);
|
|
$request = Request::create('/');
|
|
$request->setUserResolver(fn () => $user);
|
|
|
|
$response = (new EnsureUserIsApproved)->handle($request, fn () => 'ok');
|
|
|
|
$this->assertSame(302, $response->getStatusCode());
|
|
$this->assertStringContainsString('/approval-notice', $response->headers->get('Location'));
|
|
});
|
|
|
|
test('waiting user aborts for json request', function () {
|
|
$user = User::factory()->create(['status' => UserStatus::WAITING_APPROVAL]);
|
|
$request = Request::create('/');
|
|
$request->headers->set('Accept', 'application/json');
|
|
$request->setUserResolver(fn () => $user);
|
|
|
|
$this->expectException(HttpException::class);
|
|
|
|
(new EnsureUserIsApproved)->handle($request, fn () => 'ok');
|
|
});
|