feat(menus): separate shopit and onticket admin menus

This commit is contained in:
2026-09-29 09:04:50 -03:00
parent 0fe38df019
commit d42896e956
19 changed files with 657 additions and 93 deletions

View File

@@ -0,0 +1,201 @@
<?php
namespace Tests\Feature\Migrations;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Tests\TestCase;
class SeparateAdminAppMenusByWebsiteTypeTest extends TestCase
{
private const SHOPIT_MENU_CODES = [
'shopit.adminapp.marca',
'shopit.adminapp.contacto',
'shopit.adminapp.productos',
'shopit.adminapp.categorias',
'shopit.adminapp.transacciones',
'shopit.adminapp.reportes',
'shopit.adminapp.usuarios_roles',
];
protected function setUp(): void
{
parent::setUp();
Schema::create('menues', function (Blueprint $table): void {
$table->id();
$table->string('code')->unique();
$table->string('label');
$table->string('parent_menu_code')->nullable();
$table->string('content_type')->default('dynamic');
$table->json('static_content_schema')->nullable();
$table->string('route');
$table->timestamps();
});
Schema::create('tenants', function (Blueprint $table): void {
$table->string('codigo')->primary();
$table->string('admin_website_type_code')->nullable();
});
Schema::create('roles', function (Blueprint $table): void {
$table->string('codigo')->primary();
});
Schema::create('tenants_menues', function (Blueprint $table): void {
$table->id();
$table->string('tenant_code');
$table->string('menu_code');
$table->json('static_content')->nullable();
$table->timestamps();
$table->unique(['tenant_code', 'menu_code']);
});
Schema::create('roles_menues', function (Blueprint $table): void {
$table->id();
$table->string('rol_codigo');
$table->string('menu_codigo');
$table->unique(['rol_codigo', 'menu_codigo']);
});
$now = now();
DB::table('menues')->insert([
[
'code' => 'main.adminapp',
'label' => 'Administración',
'parent_menu_code' => null,
'route' => '/',
'created_at' => $now,
'updated_at' => $now,
],
[
'code' => 'adminapp.inicio',
'label' => 'Inicio',
'parent_menu_code' => 'main.adminapp',
'route' => '/admin/inicio',
'created_at' => $now,
'updated_at' => $now,
],
[
'code' => 'adminapp.tickets',
'label' => 'Tickets',
'parent_menu_code' => 'main.adminapp',
'route' => '/admin/tickets',
'created_at' => $now,
'updated_at' => $now,
],
[
'code' => 'account',
'label' => 'Mi cuenta',
'parent_menu_code' => null,
'route' => '/mi-cuenta',
'created_at' => $now,
'updated_at' => $now,
],
]);
DB::table('tenants')->insert([
['codigo' => 'sonder', 'admin_website_type_code' => 'shopit'],
['codigo' => 'mutual_smep', 'admin_website_type_code' => 'shopit'],
['codigo' => 'fiesta_futbol_infantil', 'admin_website_type_code' => 'onticket'],
]);
DB::table('roles')->insert([
['codigo' => 'admin'],
['codigo' => 'adminapp'],
['codigo' => 'user'],
]);
foreach (['sonder', 'mutual_smep', 'fiesta_futbol_infantil'] as $tenantCode) {
foreach (['main.adminapp', 'adminapp.inicio', 'account'] as $menuCode) {
DB::table('tenants_menues')->insert([
'tenant_code' => $tenantCode,
'menu_code' => $menuCode,
'created_at' => $now,
'updated_at' => $now,
]);
}
}
DB::table('tenants_menues')->insert([
'tenant_code' => 'fiesta_futbol_infantil',
'menu_code' => 'adminapp.tickets',
'created_at' => $now,
'updated_at' => $now,
]);
DB::table('roles_menues')->insert([
['rol_codigo' => 'admin', 'menu_codigo' => 'adminapp.inicio'],
['rol_codigo' => 'adminapp', 'menu_codigo' => 'adminapp.inicio'],
['rol_codigo' => 'adminapp', 'menu_codigo' => 'adminapp.tickets'],
]);
}
protected function tearDown(): void
{
Schema::dropIfExists('roles_menues');
Schema::dropIfExists('tenants_menues');
Schema::dropIfExists('roles');
Schema::dropIfExists('tenants');
Schema::dropIfExists('menues');
parent::tearDown();
}
public function test_it_separates_admin_menus_by_admin_website_type_and_rolls_back(): void
{
$migration = require database_path(
'migrations/2026_09_29_000000_separate_adminapp_menus_by_website_type.php'
);
$migration->up();
$migration->up();
$this->assertDatabaseMissing('menues', ['code' => 'adminapp.inicio']);
$this->assertDatabaseHas('menues', ['code' => 'onticket.adminapp.inicio']);
$this->assertDatabaseHas('tenants_menues', [
'tenant_code' => 'fiesta_futbol_infantil',
'menu_code' => 'onticket.adminapp.tickets',
]);
$this->assertDatabaseHas('tenants_menues', [
'tenant_code' => 'fiesta_futbol_infantil',
'menu_code' => 'onticket.adminapp.inicio',
]);
foreach (['sonder', 'mutual_smep'] as $tenantCode) {
$adminMenuCodes = DB::table('tenants_menues')
->join('menues', 'menues.code', '=', 'tenants_menues.menu_code')
->where('tenants_menues.tenant_code', $tenantCode)
->where(fn ($query) => $query
->where('menues.code', 'main.adminapp')
->orWhere('menues.parent_menu_code', 'main.adminapp'))
->orderBy('menues.code')
->pluck('menues.code')
->all();
$this->assertSame(
collect(['main.adminapp', ...self::SHOPIT_MENU_CODES])->sort()->values()->all(),
$adminMenuCodes,
);
$this->assertDatabaseHas('tenants_menues', [
'tenant_code' => $tenantCode,
'menu_code' => 'account',
]);
}
foreach (self::SHOPIT_MENU_CODES as $menuCode) {
$this->assertDatabaseHas('roles_menues', [
'rol_codigo' => 'adminapp',
'menu_codigo' => $menuCode,
]);
}
$migration->down();
$this->assertDatabaseHas('menues', ['code' => 'adminapp.inicio']);
$this->assertDatabaseMissing('menues', ['code' => 'onticket.adminapp.inicio']);
$this->assertDatabaseMissing('menues', ['code' => 'shopit.adminapp.marca']);
$this->assertDatabaseHas('tenants_menues', [
'tenant_code' => 'sonder',
'menu_code' => 'adminapp.inicio',
]);
$this->assertDatabaseHas('tenants_menues', [
'tenant_code' => 'fiesta_futbol_infantil',
'menu_code' => 'adminapp.tickets',
]);
}
}