199 lines
5.3 KiB
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();
|
|
});
|