From 7889d747d936ff924e4520d72eeead4e1ebba64a Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 24 Jul 2026 10:07:47 -0300 Subject: [PATCH] feat(menu): add account menu hierarchy and related tests in MenuSeeder and MenuSeederTest --- ...4_000000_create_account_menu_hierarchy.php | 88 +++++++++++++++++++ database/seeders/MenuSeeder.php | 23 ++++- tests/Feature/Seeders/MenuSeederTest.php | 29 ++++++ 3 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2026_07_24_000000_create_account_menu_hierarchy.php diff --git a/database/migrations/2026_07_24_000000_create_account_menu_hierarchy.php b/database/migrations/2026_07_24_000000_create_account_menu_hierarchy.php new file mode 100644 index 0000000..c14be42 --- /dev/null +++ b/database/migrations/2026_07_24_000000_create_account_menu_hierarchy.php @@ -0,0 +1,88 @@ +updateOrInsert( + ['code' => 'account'], + [ + 'parent_menu_code' => null, + 'content_type' => Menu::CONTENT_TYPE_DYNAMIC, + 'static_content_schema' => null, + 'route' => '/mi-cuenta', + 'created_at' => $now, + 'updated_at' => $now, + ] + ); + + $routes = [ + 'profile' => '/mi-cuenta/datos-personales', + 'purchases' => '/mi-cuenta/compras', + 'tickets' => '/mi-cuenta/tickets', + ]; + + foreach ($routes as $code => $route) { + DB::table('menues') + ->where('code', $code) + ->update([ + 'parent_menu_code' => 'account', + 'route' => $route, + 'updated_at' => $now, + ]); + } + + $tenantCodes = DB::table('tenants_menues') + ->whereIn('menu_code', array_keys($routes)) + ->distinct() + ->pluck('tenant_code'); + + foreach ($tenantCodes as $tenantCode) { + $alreadyAssigned = DB::table('tenants_menues') + ->where('tenant_code', $tenantCode) + ->where('menu_code', 'account') + ->exists(); + + if ($alreadyAssigned) { + continue; + } + + DB::table('tenants_menues')->insert([ + 'tenant_code' => $tenantCode, + 'menu_code' => 'account', + 'static_content' => null, + 'created_at' => $now, + 'updated_at' => $now, + ]); + } + } + + public function down(): void + { + $now = now(); + $routes = [ + 'profile' => '/profile', + 'purchases' => '/purchases', + 'tickets' => '/tickets', + ]; + + foreach ($routes as $code => $route) { + DB::table('menues') + ->where('code', $code) + ->update([ + 'parent_menu_code' => null, + 'route' => $route, + 'updated_at' => $now, + ]); + } + + DB::table('tenants_menues')->where('menu_code', 'account')->delete(); + DB::table('menues')->where('code', 'account')->delete(); + } +}; diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php index 056329a..9baf3c9 100644 --- a/database/seeders/MenuSeeder.php +++ b/database/seeders/MenuSeeder.php @@ -17,9 +17,26 @@ class MenuSeeder extends Seeder ['code' => 'index', 'route' => '/'], ['code' => 'product.detail', 'route' => '/product/:id'], ['code' => 'checkout', 'route' => '/checkout'], - ['code' => 'profile', 'route' => '/profile'], - ['code' => 'purchases', 'route' => '/purchases'], - ['code' => 'tickets', 'route' => '/tickets'], + [ + 'code' => 'account', + 'content_type' => Menu::CONTENT_TYPE_DYNAMIC, + 'route' => '/mi-cuenta', + ], + [ + 'code' => 'profile', + 'parent_menu_code' => 'account', + 'route' => '/mi-cuenta/datos-personales', + ], + [ + 'code' => 'purchases', + 'parent_menu_code' => 'account', + 'route' => '/mi-cuenta/compras', + ], + [ + 'code' => 'tickets', + 'parent_menu_code' => 'account', + 'route' => '/mi-cuenta/tickets', + ], [ 'code' => 'help', 'content_type' => Menu::CONTENT_TYPE_DYNAMIC, diff --git a/tests/Feature/Seeders/MenuSeederTest.php b/tests/Feature/Seeders/MenuSeederTest.php index 09bf88e..61b7e97 100644 --- a/tests/Feature/Seeders/MenuSeederTest.php +++ b/tests/Feature/Seeders/MenuSeederTest.php @@ -14,6 +14,35 @@ class MenuSeederTest extends TestCase { use RefreshDatabase; + public function test_it_seeds_the_account_menu_hierarchy(): void + { + $tenant = $this->createTenant('account_tenant'); + + $this->seed(MenuSeeder::class); + + $account = Menu::query() + ->with('children') + ->where('code', 'account') + ->firstOrFail(); + + $this->assertSame(Menu::CONTENT_TYPE_DYNAMIC, $account->content_type); + $this->assertSame('/mi-cuenta', $account->route); + $this->assertSame([ + 'profile', + 'purchases', + 'tickets', + ], $account->children->pluck('code')->sort()->values()->all()); + $this->assertSame([ + 'profile' => '/mi-cuenta/datos-personales', + 'purchases' => '/mi-cuenta/compras', + 'tickets' => '/mi-cuenta/tickets', + ], $account->children->pluck('route', 'code')->sortKeys()->all()); + + $this->assertTrue( + $tenant->menues()->where('menues.code', 'account')->exists() + ); + } + public function test_it_seeds_the_help_menu_hierarchy_and_content_schemas(): void { $this->seed(MenuSeeder::class);