string('codigo')->primary(); }); Schema::create('categorias', function (Blueprint $table): void { $table->id(); $table->string('tenant_code')->nullable(); $table->unsignedBigInteger('categoria_id')->nullable(); $table->string('nombre'); $table->boolean('is_enabled')->default(true); $table->timestamps(); }); } protected function tearDown(): void { Schema::dropIfExists('categorias'); Schema::dropIfExists('tenants'); parent::tearDown(); } public function test_it_creates_the_mutual_smep_category_hierarchy_idempotently(): void { $this->createTenant('mutual_smep'); $this->seed(MutualSmepCategorySeeder::class); $this->seed(MutualSmepCategorySeeder::class); $parents = Category::query() ->where('tenant_code', 'mutual_smep') ->whereNull('categoria_id') ->with('subCategories') ->get() ->keyBy('nombre'); $this->assertCount(6, $parents); $this->assertCount(37, Category::query()->where('tenant_code', 'mutual_smep')->get()); $this->assertEqualsCanonicalizing([ 'Colchones', 'Bases y Sommiers', 'Acolchados y Edredones', 'Frazadas y Mantas', 'Infantil y Cuna', ], $parents->get('Dormitorio y Blanco')->subCategories->pluck('nombre')->all()); $this->assertEqualsCanonicalizing([ 'Celulares', 'Notebooks', 'Smart TV', 'Audio', 'Accesorios de Computación', 'Soportes para TV', ], $parents->get('Tecnología')->subCategories->pluck('nombre')->all()); } public function test_down_removes_only_the_seeded_mutual_smep_hierarchy(): void { $this->createTenant('mutual_smep'); $this->createTenant('other'); Category::query()->create([ 'tenant_code' => 'other', 'nombre' => 'Tecnología', ]); $seeder = app(MutualSmepCategorySeeder::class); $seeder->run(); $seeder->down(); $this->assertDatabaseMissing('categorias', [ 'tenant_code' => 'mutual_smep', ]); $this->assertDatabaseHas('categorias', [ 'tenant_code' => 'other', 'nombre' => 'Tecnología', ]); } public function test_the_data_migration_runs_and_rolls_back_the_seeder(): void { $this->createTenant('mutual_smep'); $migration = require database_path( 'migrations/2026_09_24_010000_seed_mutual_smep_categories.php' ); $migration->up(); $this->assertCount(37, Category::query()->where('tenant_code', 'mutual_smep')->get()); $migration->down(); $this->assertDatabaseMissing('categorias', [ 'tenant_code' => 'mutual_smep', ]); } private function createTenant(string $code): void { DB::table('tenants')->insert([ 'codigo' => $code, ]); } }