'create formula']); Permission::create(['name' => 'update formula']); Permission::create(['name' => 'delete formula']); }); function createAuthorizedUser() { $user = User::factory()->create(); $user->givePermissionTo(['create formula', 'update formula', 'delete formula']); return $user; } it('renders successfully', function () { $user = createAuthorizedUser(); $this->actingAs($user); Bottle::factory()->create(['size' => 100]); Livewire::test(Formula::class) ->assertStatus(200); }); it('validates required fields', function () { $user = createAuthorizedUser(); $this->actingAs($user); Livewire::test(Formula::class) ->set('form.quality', '') ->set('form.size', '') ->set('form.volume', '') ->call('create') ->assertHasErrors(['form.quality', 'form.size', 'form.volume']); }); it('validates quality max length', function () { $user = createAuthorizedUser(); $this->actingAs($user); Livewire::test(Formula::class) ->set('form.quality', str_repeat('a', 21)) ->call('create') ->assertHasErrors(['form.quality']); }); it('validates size numeric and min', function () { $user = createAuthorizedUser(); $this->actingAs($user); Livewire::test(Formula::class) ->set('form.size', 'abc') ->call('create') ->assertHasErrors(['form.size']); Livewire::test(Formula::class) ->set('form.size', 0) ->call('create') ->assertHasErrors(['form.size']); }); it('can create a formula', function () { $user = createAuthorizedUser(); $this->actingAs($user); Bottle::factory()->create(['size' => 100]); Livewire::test(Formula::class) ->set('form.quality', 'Premium') ->set('form.size', '100') ->set('form.volume', '50') ->call('create'); $this->assertDatabaseHas('formulas', [ 'quality' => 'Premium', 'size' => 100, 'volume' => 50, ]); }); it('prevents duplicate formula creation', function () { $user = createAuthorizedUser(); $this->actingAs($user); FormulaModel::create([ 'quality' => 'Premium', 'size' => 100, 'volume' => 50, ]); Livewire::test(Formula::class) ->set('form.quality', 'Premium') ->set('form.size', '100') ->set('form.volume', '60') ->call('create'); expect(FormulaModel::count())->toBe(1); }); it('can update a formula', function () { $user = createAuthorizedUser(); $this->actingAs($user); $formula = FormulaModel::create([ 'quality' => 'Premium', 'size' => 100, 'volume' => 50, ]); Livewire::test(Formula::class) ->call('openModal', 'update', 'Edit Formula', $formula->hash) ->assertSet('form.quality', 'Premium') ->assertSet('form.size', 100) ->set('form.quality', 'Super Premium') ->set('form.volume', '55') ->call('update'); $this->assertDatabaseHas('formulas', [ 'id' => $formula->id, 'quality' => 'Super Premium', 'size' => 100, 'volume' => 55, ]); }); it('prevents duplicate formula on update', function () { $user = createAuthorizedUser(); $this->actingAs($user); $formula1 = FormulaModel::create(['quality' => 'Premium', 'size' => 100, 'volume' => 50]); $formula2 = FormulaModel::create(['quality' => 'Super Premium', 'size' => 100, 'volume' => 60]); Livewire::test(Formula::class) ->call('openModal', 'update', 'Edit Formula', $formula1->hash) ->set('form.quality', 'Super Premium') ->set('form.size', '100') ->call('update'); $formula1->refresh(); expect($formula1->quality)->toBe('Premium'); }); it('can delete a formula', function () { $user = createAuthorizedUser(); $this->actingAs($user); $formula = FormulaModel::create(['quality' => 'Premium', 'size' => 100, 'volume' => 50]); Livewire::test(Formula::class) ->call('delete', $formula->hash); $this->assertSoftDeleted('formulas', ['id' => $formula->id]); }); it('checks authorization for create', function () { $user = User::factory()->create(); $this->actingAs($user); Livewire::test(Formula::class) ->call('create') ->assertForbidden(); }); it('checks authorization for update', function () { $user = User::factory()->create(); $this->actingAs($user); $formula = FormulaModel::create(['quality' => 'Premium', 'size' => 100, 'volume' => 50]); Livewire::test(Formula::class) ->call('openModal', 'update', 'Edit', $formula->hash) ->call('update') ->assertForbidden(); }); it('checks authorization for delete', function () { $user = User::factory()->create(); $this->actingAs($user); $formula = FormulaModel::create(['quality' => 'Premium', 'size' => 100, 'volume' => 50]); Livewire::test(Formula::class) ->call('delete', $formula->hash) ->assertForbidden(); });