feat(outlet): add factory and create test
This commit is contained in:
parent
ed1a6177e1
commit
340dd867c9
@ -3,6 +3,7 @@
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\OutletStatus;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
@ -11,7 +12,7 @@
|
||||
|
||||
class Outlet extends Model
|
||||
{
|
||||
use HasSlug, SoftDeletes;
|
||||
use HasFactory, HasSlug, SoftDeletes;
|
||||
|
||||
protected $guarded = ['id'];
|
||||
|
||||
|
||||
66
database/factories/OutletFactory.php
Normal file
66
database/factories/OutletFactory.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Enums\OutletStatus;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class OutletFactory extends Factory
|
||||
{
|
||||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
'name' => $this->faker->company(),
|
||||
'phone_number' => sprintf(
|
||||
'%04d %04d %03d',
|
||||
$this->faker->numberBetween(8000, 8999),
|
||||
$this->faker->numberBetween(1000, 9999),
|
||||
$this->faker->numberBetween(100, 999)
|
||||
),
|
||||
'address' => $this->faker->address(),
|
||||
'landmark' => $this->faker->streetName(),
|
||||
'maps_url' => 'https://goo.gl/maps/'.$this->faker->regexify('[A-Za-z0-9]{6,10}'),
|
||||
'opening_hours' => collect(['senin', 'selasa', 'rabu', 'kamis', 'jumat', 'sabtu', 'minggu'])
|
||||
->mapWithKeys(fn ($day) => [
|
||||
$day => [
|
||||
'open' => $this->faker->time('H:i'),
|
||||
'close' => $this->faker->time('H:i'),
|
||||
],
|
||||
])
|
||||
->toArray(),
|
||||
'facilities' => $this->faker->randomElements(
|
||||
['WiFi', 'Parking', 'Toilet', 'Musholla', 'Smoking Area'],
|
||||
$this->faker->numberBetween(1, 3)
|
||||
),
|
||||
'opened_date' => $this->faker->date(),
|
||||
'closed_date' => $this->faker->optional()->date(),
|
||||
];
|
||||
}
|
||||
|
||||
public function operational(): Factory
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'status' => OutletStatus::OPERATIONAL,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function underConstruction(): Factory
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'status' => OutletStatus::UNDER_CONSTRUCTION,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function terminated(): Factory
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'status' => OutletStatus::TERMINATED,
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
37
tests/Feature/Livewire/Studio/Master/Outlet/CreateTest.php
Normal file
37
tests/Feature/Livewire/Studio/Master/Outlet/CreateTest.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Studio\Master\Outlet\Create;
|
||||
use App\Livewire\Studio\Master\Outlet\Index;
|
||||
use App\Models\Outlet;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('renders successfully', function () {
|
||||
Livewire::test(Create::class)
|
||||
->assertViewIs('livewire.studio.master.outlet.form')
|
||||
->assertViewHas('pageTitle', 'Tambah Outlet');
|
||||
});
|
||||
|
||||
it('can create an outlet', function () {
|
||||
$data = Outlet::factory()->operational()->raw();
|
||||
|
||||
Livewire::test(Create::class)
|
||||
->set('form.name', $data['name'])
|
||||
->set('form.phone_number', $data['phone_number'])
|
||||
->set('form.address', $data['address'])
|
||||
->set('form.landmark', $data['landmark'])
|
||||
->set('form.maps_url', $data['maps_url'])
|
||||
->set('form.opening_hours', $data['opening_hours'])
|
||||
->set('form.facilities', $data['facilities'])
|
||||
->set('form.opened_date', $data['opened_date'])
|
||||
->set('form.status', $data['status']->value)
|
||||
->call('save')
|
||||
->assertRedirect(Index::class);
|
||||
|
||||
$this->assertDatabaseHas('outlets', [
|
||||
'name' => $data['name'],
|
||||
'phone_number' => $data['phone_number'],
|
||||
]);
|
||||
});
|
||||
43
tests/Feature/Livewire/Studio/Master/Outlet/EditTest.php
Normal file
43
tests/Feature/Livewire/Studio/Master/Outlet/EditTest.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Studio\Master\Outlet\Edit;
|
||||
use App\Livewire\Studio\Master\Outlet\Index;
|
||||
use App\Models\Outlet;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('renders successfully', function () {
|
||||
$outlet = Outlet::factory()->operational()->create();
|
||||
|
||||
Livewire::test(Edit::class, ['outlet' => $outlet])
|
||||
->assertViewIs('livewire.studio.master.outlet.form')
|
||||
->assertViewHas('pageTitle', 'Ubah Outlet');
|
||||
});
|
||||
|
||||
it('can update an outlet', function () {
|
||||
$outlet = Outlet::factory()->operational()->create();
|
||||
|
||||
$data = Outlet::factory()->operational()->raw();
|
||||
|
||||
Livewire::test(Edit::class, ['outlet' => $outlet])
|
||||
->set('form.name', $data['name'])
|
||||
->set('form.phone_number', $data['phone_number'])
|
||||
->set('form.address', $data['address'])
|
||||
->set('form.landmark', $data['landmark'])
|
||||
->set('form.maps_url', $data['maps_url'])
|
||||
->set('form.opening_hours', $data['opening_hours'])
|
||||
->set('form.facilities', $data['facilities'])
|
||||
->set('form.opened_date', $data['opened_date'])
|
||||
->set('form.status', $data['status']->value)
|
||||
->call('save')
|
||||
->assertDispatched('refreshDatatable')
|
||||
->assertRedirect(Index::class);
|
||||
|
||||
$this->assertDatabaseHas('outlets', [
|
||||
'id' => $outlet->id,
|
||||
'name' => $data['name'],
|
||||
'phone_number' => $data['phone_number'],
|
||||
]);
|
||||
});
|
||||
38
tests/Feature/Livewire/Studio/Master/Outlet/IndexTest.php
Normal file
38
tests/Feature/Livewire/Studio/Master/Outlet/IndexTest.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use App\Enums\OutletStatus;
|
||||
use App\Livewire\Studio\Master\Outlet\Index;
|
||||
use App\Models\Outlet;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('renders successfully', function () {
|
||||
Livewire::test(Index::class)
|
||||
->assertViewIs('livewire.studio.master.outlet.index')
|
||||
->assertViewHas('pageTitle', 'Outlet');
|
||||
});
|
||||
|
||||
it('displays all outlets', function () {
|
||||
Outlet::Factory()
|
||||
->count(10)
|
||||
->state(fn () => [
|
||||
'status' => fake()->randomElement(OutletStatus::cases()),
|
||||
])
|
||||
->create();
|
||||
|
||||
$outlet = Outlet::first();
|
||||
|
||||
Livewire::test(Index::class)->assertSee($outlet->name);
|
||||
});
|
||||
|
||||
it('can delete an outlet', function () {
|
||||
$outlet = Outlet::factory()->operational()->create();
|
||||
|
||||
Livewire::test(Index::class)
|
||||
->call('delete', $outlet)
|
||||
->assertDispatched('refreshDatatable');
|
||||
|
||||
expect(Outlet::count())->toBe(0);
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user