refactor(membership): mengubah label membership menjadi tier dan menyesuaikan skema db nya
This commit is contained in:
parent
ac44f25001
commit
cde9091f54
@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Livewire\Datatable;
|
||||
|
||||
use App\Models\Membership;
|
||||
use App\Models\Tier;
|
||||
use App\Traits\Datatable\WithAppendColumn;
|
||||
use App\Traits\Datatable\WithConfiguration;
|
||||
use App\Traits\Datatable\WithPrependColumn;
|
||||
@ -10,26 +10,20 @@
|
||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||
|
||||
class MembershipsTable extends DataTableComponent
|
||||
class TiersTable extends DataTableComponent
|
||||
{
|
||||
use WithAppendColumn, WithConfiguration, WithPrependColumn;
|
||||
|
||||
protected $model = Membership::class;
|
||||
protected $model = Tier::class;
|
||||
|
||||
public function columns(): array
|
||||
{
|
||||
return [
|
||||
Column::make('Nama', 'name')->searchable(),
|
||||
|
||||
Column::make('Min. Belanja', 'min_purchase')
|
||||
->format(fn ($value) => currency($value, 'Rp'))
|
||||
->searchable()
|
||||
->sortable(),
|
||||
Column::make('Min. Poin', 'min_points')->searchable()->sortable(),
|
||||
|
||||
Column::make('Diskon', 'discount_percentage')
|
||||
->format(fn ($value) => percentage($value))
|
||||
->searchable()
|
||||
->sortable(),
|
||||
Column::make('Maks. Poin', 'max_points')->searchable()->sortable(),
|
||||
|
||||
Column::make('Aksi')
|
||||
->label(function ($row) {
|
||||
@ -38,12 +32,12 @@ public function columns(): array
|
||||
$actions .= view('components.datatables.edit-modal', [
|
||||
'id' => $row->id,
|
||||
'method' => 'update',
|
||||
'modalTitle' => 'Ubah Membership',
|
||||
'modalTitle' => 'Ubah Tier',
|
||||
])->render();
|
||||
|
||||
$actions .= view('components.datatables.delete', [
|
||||
'id' => $row->id,
|
||||
'deleteRoute' => route('studio.loyalty.membership.delete', $row->id),
|
||||
'deleteRoute' => route('studio.loyalty.tier.delete', $row->id),
|
||||
])->render();
|
||||
|
||||
return $actions;
|
||||
@ -54,6 +48,6 @@ public function columns(): array
|
||||
|
||||
public function builder(): Builder
|
||||
{
|
||||
return Membership::select('id', 'name', 'discount_percentage', 'min_purchase');
|
||||
return Tier::select('id', 'name', 'min_points', 'max_points');
|
||||
}
|
||||
}
|
||||
@ -1,73 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use App\Models\Membership;
|
||||
use Livewire\Form;
|
||||
|
||||
class MembershipForm extends Form
|
||||
{
|
||||
public ?Membership $membership = null;
|
||||
|
||||
public string $name = '';
|
||||
|
||||
public string $min_purchase = '';
|
||||
|
||||
public string $discount_percentage = '';
|
||||
|
||||
public ?string $terms_conditions = null;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => ['required', 'string', 'max:50'],
|
||||
'min_purchase' => ['required', 'regex:/^[0-9.]+$/', 'max:99999999999'],
|
||||
'discount_percentage' => ['required', 'numeric', 'between:0,100'],
|
||||
'terms_conditions' => ['nullable', 'string'],
|
||||
];
|
||||
}
|
||||
|
||||
public function validationAttributes(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'nama',
|
||||
'min_purchase' => 'min. belanja',
|
||||
'discount_percentage' => 'persentase diskon',
|
||||
'terms_conditions' => 'syarat dan ketentuan',
|
||||
];
|
||||
}
|
||||
|
||||
public function setMembership(Membership $membership)
|
||||
{
|
||||
$this->membership = $membership;
|
||||
|
||||
$this->name = $membership->name;
|
||||
$this->min_purchase = currency($membership->min_purchase);
|
||||
$this->terms_conditions = $membership->terms_conditions;
|
||||
$this->discount_percentage = $membership->discount_percentage;
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
Membership::create([
|
||||
'name' => $this->name,
|
||||
'min_purchase' => replaceCurrency($this->min_purchase),
|
||||
'discount_percentage' => $this->discount_percentage,
|
||||
'terms_conditions' => $this->terms_conditions,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
$this->membership->update([
|
||||
'name' => $this->name,
|
||||
'min_purchase' => replaceCurrency($this->min_purchase),
|
||||
'discount_percentage' => $this->discount_percentage,
|
||||
'terms_conditions' => $this->terms_conditions,
|
||||
]);
|
||||
}
|
||||
}
|
||||
58
app/Livewire/Forms/TierForm.php
Normal file
58
app/Livewire/Forms/TierForm.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use App\Models\Tier;
|
||||
use Livewire\Form;
|
||||
|
||||
class TierForm extends Form
|
||||
{
|
||||
public ?Tier $tier = null;
|
||||
|
||||
public string $name = '';
|
||||
|
||||
public string $min_points = '';
|
||||
|
||||
public ?string $max_points = null;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => ['required', 'string', 'max:50'],
|
||||
'min_points' => ['required', 'numeric'],
|
||||
'max_points' => ['nullable', 'numeric'],
|
||||
];
|
||||
}
|
||||
|
||||
public function validationAttributes(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'nama',
|
||||
'min_points' => 'min. poin',
|
||||
'max_points' => 'maks. poin',
|
||||
];
|
||||
}
|
||||
|
||||
public function setTier(Tier $tier)
|
||||
{
|
||||
$this->tier = $tier;
|
||||
|
||||
$this->name = $tier->name;
|
||||
$this->min_points = $tier->min_points;
|
||||
$this->max_points = $tier->max_points;
|
||||
}
|
||||
|
||||
public function store()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
Tier::create($this->pull());
|
||||
}
|
||||
|
||||
public function update()
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
$this->tier->update($this->pull());
|
||||
}
|
||||
}
|
||||
@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Livewire\Studio\Loyalty;
|
||||
|
||||
use App\Livewire\Forms\MembershipForm;
|
||||
use App\Models\Membership as MembershipModel;
|
||||
use App\Livewire\Forms\TierForm;
|
||||
use App\Models\Tier as TierModel;
|
||||
use App\Traits\WithCloseModal;
|
||||
use App\Traits\WithConfirmation;
|
||||
use App\Traits\WithUpdatedData;
|
||||
@ -12,12 +12,12 @@
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Component;
|
||||
|
||||
#[Title('Membership')]
|
||||
class Membership extends Component
|
||||
#[Title('Tier')]
|
||||
class Tier extends Component
|
||||
{
|
||||
use WithCloseModal, WithConfirmation, WithUpdatedData;
|
||||
|
||||
public MembershipForm $form;
|
||||
public TierForm $form;
|
||||
|
||||
public string $method = 'create';
|
||||
|
||||
@ -33,7 +33,7 @@ public function openModal(string $method, string $modalTitle, ?string $id = null
|
||||
$this->modalTitle = $modalTitle;
|
||||
|
||||
if ($id) {
|
||||
$this->form->setMembership(MembershipModel::findOrFail($id));
|
||||
$this->form->setTier(TierModel::findOrFail($id));
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,7 +45,7 @@ public function create()
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Membership berhasil ditambahkan.',
|
||||
text: 'Tier berhasil ditambahkan.',
|
||||
variant: 'success',
|
||||
duration: 3000
|
||||
);
|
||||
@ -61,7 +61,7 @@ public function update()
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Membership berhasil diperbarui.',
|
||||
text: 'Tier berhasil diperbarui.',
|
||||
variant: 'success',
|
||||
duration: 3000
|
||||
);
|
||||
@ -69,15 +69,15 @@ public function update()
|
||||
Flux::modals()->close();
|
||||
}
|
||||
|
||||
public function delete(MembershipModel $membership)
|
||||
public function delete(TierModel $tier)
|
||||
{
|
||||
$membership->delete();
|
||||
$tier->delete();
|
||||
|
||||
$this->dispatch('refreshDatatable');
|
||||
|
||||
Flux::toast(
|
||||
heading: 'Berhasil',
|
||||
text: 'Membership berhasil dihapus.',
|
||||
text: 'Tier berhasil dihapus.',
|
||||
variant: 'success',
|
||||
);
|
||||
|
||||
@ -86,8 +86,8 @@ public function delete(MembershipModel $membership)
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.studio.loyalty.memberships', [
|
||||
'pageTitle' => 'Membership',
|
||||
return view('livewire.studio.loyalty.tiers', [
|
||||
'pageTitle' => 'Tier',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -6,7 +6,7 @@
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class Membership extends Model
|
||||
class Tier extends Model
|
||||
{
|
||||
use HasFactory, SoftDeletes;
|
||||
|
||||
@ -15,8 +15,8 @@ class Membership extends Model
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'min_purchase' => 'int',
|
||||
'discount_percent' => 'decimal:2',
|
||||
'min_points' => 'int',
|
||||
'max_points' => 'int',
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
17
database/factories/TierFactory.php
Normal file
17
database/factories/TierFactory.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class TierFactory extends Factory
|
||||
{
|
||||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
'name' => $this->faker->name(),
|
||||
'min_points' => $this->faker->randomNumber(),
|
||||
'max_points' => $this->faker->optional()->randomNumber(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -11,12 +11,11 @@
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('memberships', function (Blueprint $table) {
|
||||
Schema::create('tiers', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name', 50);
|
||||
$table->unsignedInteger('min_purchase');
|
||||
$table->decimal('discount_percentage', 5, 2);
|
||||
$table->text('terms_conditions')->nullable();
|
||||
$table->unsignedInteger('min_points');
|
||||
$table->unsignedInteger('max_points')->nullable();
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
@ -27,6 +26,6 @@ public function up(): void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('memberships');
|
||||
Schema::dropIfExists('tiers');
|
||||
}
|
||||
};
|
||||
@ -11,7 +11,7 @@ public function run(): void
|
||||
$this->call([
|
||||
OutletSeeder::class,
|
||||
UserSeeder::class,
|
||||
MembershipSeeder::class,
|
||||
TierSeeder::class,
|
||||
VoucherSeeder::class,
|
||||
CategorySeeder::class,
|
||||
BrandSeeder::class,
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
<?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.',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
39
database/seeders/TierSeeder.php
Normal file
39
database/seeders/TierSeeder.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Tier;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class TierSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$tiers = [
|
||||
[
|
||||
'name' => 'Silver',
|
||||
'min_points' => 0,
|
||||
'max_points' => 99,
|
||||
],
|
||||
[
|
||||
'name' => 'Gold',
|
||||
'min_points' => 100,
|
||||
'max_points' => 499,
|
||||
],
|
||||
[
|
||||
'name' => 'Platinum',
|
||||
'min_points' => 500,
|
||||
'max_points' => 1999,
|
||||
],
|
||||
[
|
||||
'name' => 'Diamond',
|
||||
'min_points' => 2000,
|
||||
'max_points' => null,
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($tiers as $tier) {
|
||||
Tier::create($tier);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -24,8 +24,8 @@ class="bg-zinc-50 dark:bg-zinc-900 border-r rtl:border-r-0 rtl:border-l border-z
|
||||
<div class="mt-3 mb-1">
|
||||
<div class="text-zinc-500 dark:text-gray-300 text-sm/6">Loyalty</div>
|
||||
<div class="grid gap-2">
|
||||
<flux:navlist.item icon="star" href="{{ route('studio.loyalty.membership.index') }}"
|
||||
:current="request()->routeIs('studio.loyalty.membership.*')" wire:navigate.hover>Membership
|
||||
<flux:navlist.item icon="star" href="{{ route('studio.loyalty.tier.index') }}"
|
||||
:current="request()->routeIs('studio.loyalty.tier.*')" wire:navigate.hover>Tier
|
||||
</flux:navlist.item>
|
||||
|
||||
<flux:navlist.item icon="ticket" href="{{ route('studio.loyalty.voucher.index') }}"
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
<flux:main>
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
|
||||
</div>
|
||||
<div>
|
||||
<flux:modal.trigger name="form-modal">
|
||||
<flux:button variant="primary" class="text-sm"
|
||||
wire:click="$dispatch('modal:open', {method: 'create', 'modalTitle': 'Tambah Membership'})">Tambah
|
||||
</flux:button>
|
||||
</flux:modal.trigger>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
<livewire:datatable.memberships-table />
|
||||
</div>
|
||||
|
||||
@include('components.confirmation.delete')
|
||||
<flux:modal name="form-modal" class="w-[95%] max-w-sm md:max-w-xl mx-auto" @close="closeModal('form-modal')">
|
||||
<div class="p-4 space-y-6">
|
||||
<flux:heading size="lg">{{ $modalTitle }}</flux:heading>
|
||||
|
||||
<flux:input label="Nama" placeholder="Masukkan nama membership" wire:model.live.debounce.500ms="form.name"
|
||||
autofocus autocomplete="off" clearable />
|
||||
|
||||
<flux:field>
|
||||
<flux:label>Min. Belanja</flux:label>
|
||||
<flux:input.group>
|
||||
<flux:input.group.prefix>Rp</flux:input.group.prefix>
|
||||
|
||||
<flux:input placeholder="Masukkan minimal belanja" x-mask:dynamic="$money($input, ',')"
|
||||
wire:model.live.debounce.500ms="form.min_purchase" autocomplete="off" clearable />
|
||||
</flux:input.group>
|
||||
|
||||
<flux:error name="form.min_purchase" />
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>Persentase Diskon</flux:label>
|
||||
<flux:input.group>
|
||||
<flux:input placeholder="Masukkan persentase diskon"
|
||||
wire:model.live.debounce.500ms="form.discount_percentage" autocomplete="off" clearable />
|
||||
|
||||
<flux:input.group.suffix>%</flux:input.group.suffix>
|
||||
</flux:input.group>
|
||||
|
||||
<flux:error name="form.discount_percentage" />
|
||||
</flux:field>
|
||||
|
||||
<flux:editor label="Syarat dan Ketentuan" wire:model="form.terms_conditions"
|
||||
placeholder="Masukkan syarat dan ketentuan" auotocomplete="off"
|
||||
class="**:data-[slot=content]:min-h-[100px]!" />
|
||||
|
||||
<div class="flex">
|
||||
<flux:spacer />
|
||||
<flux:button variant="primary" class="sm:w-auto cursor-pointer" wire:click="{{ $method }}">
|
||||
Simpan
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
</flux:modal>
|
||||
|
||||
</flux:main>
|
||||
42
resources/views/livewire/studio/loyalty/tiers.blade.php
Normal file
42
resources/views/livewire/studio/loyalty/tiers.blade.php
Normal file
@ -0,0 +1,42 @@
|
||||
<flux:main>
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
|
||||
</div>
|
||||
<div>
|
||||
<flux:modal.trigger name="form-modal">
|
||||
<flux:button variant="primary" class="text-sm"
|
||||
wire:click="$dispatch('modal:open', {method: 'create', 'modalTitle': 'Tambah Tier'})">Tambah
|
||||
</flux:button>
|
||||
</flux:modal.trigger>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
<livewire:datatable.tiers-table />
|
||||
</div>
|
||||
|
||||
@include('components.confirmation.delete')
|
||||
<flux:modal name="form-modal" class="w-[95%] max-w-sm md:max-w-xl mx-auto" @close="closeModal('form-modal')">
|
||||
<div class="p-4 space-y-6">
|
||||
<flux:heading size="lg">{{ $modalTitle }}</flux:heading>
|
||||
|
||||
<flux:input label="Nama" placeholder="Masukkan nama tier" wire:model.live.debounce.500ms="form.name"
|
||||
autofocus autocomplete="off" />
|
||||
|
||||
<flux:input label="Min. Poin" placeholder="Masukkan minimal poin"
|
||||
wire:model.live.debounce.500ms="form.min_points" autocomplete="off" />
|
||||
|
||||
<flux:input label="Maks. Poin" placeholder="Masukkan maksimal poin"
|
||||
wire:model.live.debounce.500ms="form.max_points" autocomplete="off" />
|
||||
|
||||
<div class="flex">
|
||||
<flux:spacer />
|
||||
<flux:button variant="primary" class="sm:w-auto cursor-pointer" wire:click="{{ $method }}">
|
||||
Simpan
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
</flux:modal>
|
||||
|
||||
</flux:main>
|
||||
@ -6,7 +6,7 @@
|
||||
use App\Livewire\Studio\Catalog\Category as CategoryComponent;
|
||||
use App\Livewire\Studio\Dashboard\Overview;
|
||||
use App\Livewire\Studio\Loyalty\Customer as CustomerComponent;
|
||||
use App\Livewire\Studio\Loyalty\Membership as MembershipComponent;
|
||||
use App\Livewire\Studio\Loyalty\Tier as TierComponent;
|
||||
use App\Livewire\Studio\Loyalty\Voucher\Create as VoucherCreate;
|
||||
use App\Livewire\Studio\Loyalty\Voucher\Edit as VoucherEdit;
|
||||
use App\Livewire\Studio\Loyalty\Voucher\Index as VoucherIndex;
|
||||
@ -57,10 +57,10 @@
|
||||
});
|
||||
|
||||
Route::prefix('loyalty')
|
||||
->as('studio.loyalty.membership.')
|
||||
->as('studio.loyalty.tier.')
|
||||
->group(function () {
|
||||
Route::get('memberships', MembershipComponent::class)->name('index');
|
||||
Route::delete('memberships/{membership}/delete', MembershipComponent::class)->name('delete');
|
||||
Route::get('tiers', TierComponent::class)->name('index');
|
||||
Route::delete('tiers/{tier}/delete', TierComponent::class)->name('delete');
|
||||
});
|
||||
|
||||
Route::prefix('loyalty')
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
<?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')
|
||||
->assertHasNoErrors()
|
||||
->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')
|
||||
->assertHasNoErrors()
|
||||
->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)
|
||||
->assertHasNoErrors()
|
||||
->assertDispatched('refreshDatatable');
|
||||
|
||||
expect(MembershipModel::count())->toBe(0);
|
||||
});
|
||||
69
tests/Feature/Livewire/Studio/Loyalty/TierTest.php
Normal file
69
tests/Feature/Livewire/Studio/Loyalty/TierTest.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Studio\Loyalty\Tier;
|
||||
use App\Models\Tier as TierModel;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('renders successfully', function () {
|
||||
Livewire::test(Tier::class)
|
||||
->assertViewIs('livewire.studio.loyalty.tiers')
|
||||
->assertViewHas('pageTitle', 'Tier');
|
||||
});
|
||||
|
||||
it('displays all tiers', function () {
|
||||
TierModel::factory()->count(10)->create();
|
||||
|
||||
$tier = TierModel::first();
|
||||
|
||||
Livewire::test(Tier::class)->assertSee($tier->name);
|
||||
});
|
||||
|
||||
it('can create a tier', function () {
|
||||
$data = TierModel::factory()->raw();
|
||||
|
||||
Livewire::test(Tier::class)
|
||||
->set('form.name', $data['name'])
|
||||
->set('form.min_points', $data['min_points'])
|
||||
->set('form.max_points', $data['max_points'])
|
||||
->call('create')
|
||||
->assertHasNoErrors()
|
||||
->assertDispatched('refreshDatatable');
|
||||
|
||||
expect(TierModel::count())->toBe(1);
|
||||
expect(TierModel::first()->name)->toBe($data['name']);
|
||||
});
|
||||
|
||||
it('can update a tier', function () {
|
||||
$tier = TierModel::factory()->create();
|
||||
|
||||
$data = TierModel::factory()->raw();
|
||||
|
||||
Livewire::test(Tier::class)
|
||||
->call('openModal', 'update', 'Edit Tier', $tier->id)
|
||||
->set('form.name', $data['name'])
|
||||
->set('form.min_points', $data['min_points'])
|
||||
->set('form.max_points', $data['max_points'])
|
||||
->call('update')
|
||||
->assertHasNoErrors()
|
||||
->assertDispatched('refreshDatatable');
|
||||
|
||||
$tier->refresh();
|
||||
|
||||
expect($tier->name)->toBe($data['name']);
|
||||
expect($tier->min_points)->toBe($data['min_points']);
|
||||
expect($tier->max_points)->toBe($data['max_points']);
|
||||
});
|
||||
|
||||
it('can delete an tier', function () {
|
||||
$tier = TierModel::factory()->create();
|
||||
|
||||
Livewire::test(Tier::class)
|
||||
->call('delete', $tier)
|
||||
->assertHasNoErrors()
|
||||
->assertDispatched('refreshDatatable');
|
||||
|
||||
expect(TierModel::count())->toBe(0);
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user