feat(membership): mengurtkan fiield di migrasi

-membuat seeder dan mendaftarkannya di database seeder
-membuat factrory untuk keperluan testing
-membuat feature test
This commit is contained in:
Yoga Pangestu 2025-09-25 19:54:03 +07:00
parent 28c69dbf23
commit b53e873bb8
5 changed files with 127 additions and 5 deletions

View File

@ -0,0 +1,18 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class MembershipFactory extends Factory
{
public function definition(): array
{
return [
'name' => $this->faker->name(),
'min_purchase' => $this->faker->randomNumber(2),
'discount_percentage' => $this->faker->randomFloat(2, 0, 100),
'terms_conditions' => $this->faker->optional()->text(),
];
}
}

View File

@ -14,9 +14,9 @@ public function up(): void
Schema::create('memberships', function (Blueprint $table) {
$table->id();
$table->string('name', 50);
$table->text('terms_conditions')->nullable();
$table->unsignedInteger('min_purchase');
$table->decimal('discount_percentage', 5, 2);
$table->text('terms_conditions')->nullable();
$table->timestamps();
$table->softDeletes();
});

View File

@ -2,18 +2,15 @@
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
MembershipSeeder::class,
]);
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class MembershipSeeder extends Seeder
{
public function run(): void
{
DB::table('memberships')->insert([
[
'name' => 'Silver',
'min_purchase' => 500000,
'discount_percentage' => 5,
'terms_conditions' => 'Minimal belanja Rp500.000 dalam 1 bulan.',
],
[
'name' => 'Gold',
'min_purchase' => 1000000,
'discount_percentage' => 10,
'terms_conditions' => 'Minimal belanja Rp1.000.000 dalam 1 bulan.',
],
[
'name' => 'Platinum',
'min_purchase' => 2500000,
'discount_percentage' => 15,
'terms_conditions' => 'Minimal belanja Rp2.500.000 dalam 1 bulan.',
],
[
'name' => 'Diamond',
'min_purchase' => 5000000,
'discount_percentage' => 20,
'terms_conditions' => 'Minimal belanja Rp5.000.000 dalam 1 bulan.',
],
]);
}
}

View File

@ -0,0 +1,68 @@
<?php
use App\Livewire\Studio\Loyalty\Membership;
use App\Models\Membership as MembershipModel;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
uses(RefreshDatabase::class);
it('renders successfully', function () {
Livewire::test(Membership::class)
->assertViewIs('livewire.studio.loyalty.memberships')
->assertViewHas('pageTitle', 'Membership');
});
it('displays all memberships', function () {
MembershipModel::Factory()->count(10)->create();
$membership = MembershipModel::first();
Livewire::test(Membership::class)->assertSee($membership->name);
});
it('can create a membership', function () {
$data = MembershipModel::factory()->raw();
Livewire::test(Membership::class)
->set('form.name', $data['name'])
->set('form.min_purchase', $data['min_purchase'])
->set('form.discount_percentage', $data['discount_percentage'])
->set('form.terms_conditions', $data['terms_conditions'])
->call('create')
->assertDispatched('refreshDatatable');
expect(MembershipModel::count())->toBe(1);
expect(MembershipModel::first()->name)->toBe($data['name']);
});
it('can update a membership', function () {
$membership = MembershipModel::factory()->create();
$data = MembershipModel::factory()->raw();
Livewire::test(Membership::class)
->call('openModal', 'update', 'Edit Membership', $membership->id)
->set('form.name', $data['name'])
->set('form.min_purchase', $data['min_purchase'])
->set('form.discount_percentage', $data['discount_percentage'])
->set('form.terms_conditions', $data['terms_conditions'])
->call('update')
->assertDispatched('refreshDatatable');
$membership->refresh();
expect($membership->name)->toBe($data['name']);
expect($membership->min_purchase)->toBe($data['min_purchase']);
expect($membership->discount_percentage)->toBe($data['discount_percentage']);
});
it('can delete an membership', function () {
$membership = MembershipModel::factory()->create();
Livewire::test(Membership::class)
->call('delete', $membership)
->assertDispatched('refreshDatatable');
expect(MembershipModel::count())->toBe(0);
});