feat(menu): update ticket routes to use new menu code; add tests for menu access and route validation
This commit is contained in:
@@ -7,24 +7,24 @@ Route::prefix('v1/adminapp/tenant')
|
|||||||
->middleware(['auth:sanctum', 'adminapp.tenant'])
|
->middleware(['auth:sanctum', 'adminapp.tenant'])
|
||||||
->group(function (): void {
|
->group(function (): void {
|
||||||
Route::get('tickets', [TicketController::class, 'index'])
|
Route::get('tickets', [TicketController::class, 'index'])
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.index');
|
->name('adminapp.tickets.index');
|
||||||
Route::post('tickets/{ticket}/cancel', [TicketController::class, 'cancel'])
|
Route::post('tickets/{ticket}/cancel', [TicketController::class, 'cancel'])
|
||||||
->whereNumber('ticket')
|
->whereNumber('ticket')
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.cancel');
|
->name('adminapp.tickets.cancel');
|
||||||
Route::get('tickets/{ticket}/refund', [TicketController::class, 'calculateRefund'])
|
Route::get('tickets/{ticket}/refund', [TicketController::class, 'calculateRefund'])
|
||||||
->whereNumber('ticket')
|
->whereNumber('ticket')
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.calculate-refund');
|
->name('adminapp.tickets.calculate-refund');
|
||||||
Route::post('tickets/{ticket}/refund', [TicketController::class, 'refund'])
|
Route::post('tickets/{ticket}/refund', [TicketController::class, 'refund'])
|
||||||
->whereNumber('ticket')
|
->whereNumber('ticket')
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.refund');
|
->name('adminapp.tickets.refund');
|
||||||
Route::get('tickets/pdf', [TicketController::class, 'downloadPdf'])
|
Route::get('tickets/pdf', [TicketController::class, 'downloadPdf'])
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.pdf');
|
->name('adminapp.tickets.pdf');
|
||||||
Route::get('tickets/excel', [TicketController::class, 'downloadExcel'])
|
Route::get('tickets/excel', [TicketController::class, 'downloadExcel'])
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.tickets.excel');
|
->name('adminapp.tickets.excel');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Route::prefix('v1/adminapp/forms')
|
|||||||
Route::get('sale', SaleFormController::class);
|
Route::get('sale', SaleFormController::class);
|
||||||
Route::get('staff', StaffFormController::class);
|
Route::get('staff', StaffFormController::class);
|
||||||
Route::get('tickets-filter', TicketFilterFormController::class)
|
Route::get('tickets-filter', TicketFilterFormController::class)
|
||||||
->middleware('tenant.menu:adminapp.tickets')
|
->middleware('tenant.menu:onticket.adminapp.tickets')
|
||||||
->name('adminapp.forms.tickets-filter');
|
->name('adminapp.forms.tickets-filter');
|
||||||
Route::get(
|
Route::get(
|
||||||
'fiesta-futbol-infantil/ticket',
|
'fiesta-futbol-infantil/ticket',
|
||||||
|
|||||||
76
tests/Feature/Menu/TicketMenuAccessTest.php
Normal file
76
tests/Feature/Menu/TicketMenuAccessTest.php
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature\Menu;
|
||||||
|
|
||||||
|
use App\Domains\Core\Auth\Models\User;
|
||||||
|
use App\Http\Middleware\EnsureTenantHasMenu;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use PHPUnit\Framework\Attributes\DataProvider;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class TicketMenuAccessTest extends TestCase
|
||||||
|
{
|
||||||
|
public static function menuAssignments(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'OnTicket' => ['onticket.adminapp.tickets', 'current', true],
|
||||||
|
'old code' => ['adminapp.tickets', 'current', false],
|
||||||
|
'another tenant' => ['onticket.adminapp.tickets', 'other', false],
|
||||||
|
'unrelated menu' => ['adminapp.ventas', 'current', false],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
#[DataProvider('menuAssignments')]
|
||||||
|
public function test_ticket_menu_requires_an_association_with_the_authenticated_tenant(string $menuCode, string $assignedTenant, bool $allowed): void
|
||||||
|
{
|
||||||
|
Schema::create('tenants', function (Blueprint $table): void {
|
||||||
|
$table->id();
|
||||||
|
$table->string('codigo');
|
||||||
|
});
|
||||||
|
Schema::create('menues', function (Blueprint $table): void {
|
||||||
|
$table->id();
|
||||||
|
$table->string('code');
|
||||||
|
});
|
||||||
|
Schema::create('tenants_menues', function (Blueprint $table): void {
|
||||||
|
$table->string('tenant_code');
|
||||||
|
$table->string('menu_code');
|
||||||
|
});
|
||||||
|
DB::table('tenants')->insert(['codigo' => 'current']);
|
||||||
|
DB::table('menues')->insert(['code' => $menuCode]);
|
||||||
|
DB::table('tenants_menues')->insert(['tenant_code' => $assignedTenant, 'menu_code' => $menuCode]);
|
||||||
|
|
||||||
|
$user = new User(['tenant_codigo' => 'current']);
|
||||||
|
$request = Request::create('/api/v1/adminapp/tenant/tickets');
|
||||||
|
$request->setUserResolver(fn () => $user);
|
||||||
|
if (! $allowed) {
|
||||||
|
$this->expectException(HttpException::class);
|
||||||
|
$this->expectExceptionCode(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = (new EnsureTenantHasMenu)->handle($request, fn () => response('allowed'), 'onticket.adminapp.tickets');
|
||||||
|
$this->assertSame('allowed', $response->getContent());
|
||||||
|
} catch (HttpException $exception) {
|
||||||
|
$this->assertSame(404, $exception->getStatusCode());
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_all_ticket_routes_and_filter_form_use_the_updated_menu_codes(): void
|
||||||
|
{
|
||||||
|
foreach ([
|
||||||
|
'adminapp.tickets.index', 'adminapp.tickets.cancel',
|
||||||
|
'adminapp.tickets.calculate-refund', 'adminapp.tickets.refund',
|
||||||
|
'adminapp.tickets.pdf', 'adminapp.tickets.excel', 'adminapp.forms.tickets-filter',
|
||||||
|
] as $name) {
|
||||||
|
$route = Route::getRoutes()->getByName($name);
|
||||||
|
$this->assertNotNull($route);
|
||||||
|
$this->assertContains('tenant.menu:onticket.adminapp.tickets', $route->gatherMiddleware());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user