parfum/tests/Feature/Livewire/Studio/Master/FormulaTest.php

199 lines
5.3 KiB
PHP

<?php
use App\Livewire\Studio\Master\Formula;
use App\Models\Bottle;
use App\Models\Formula as FormulaModel;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Spatie\Permission\Models\Permission;
uses(RefreshDatabase::class);
beforeEach(function () {
// Setup Permissions
Permission::create(['name' => '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();
});