feat: Add feature tests for member membership, overview, redeem points, and vouchers, and enable factory for the Membership model.
This commit is contained in:
parent
ca01d8a8ed
commit
0795f8b0d7
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
@ -9,7 +10,7 @@
|
||||
|
||||
class Membership extends Model
|
||||
{
|
||||
use HashableId, SoftDeletes;
|
||||
use HasFactory, HashableId, SoftDeletes;
|
||||
|
||||
protected $guarded = ['id'];
|
||||
|
||||
|
||||
57
tests/Feature/Member/MembershipTest.php
Normal file
57
tests/Feature/Member/MembershipTest.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Member\Membership;
|
||||
use App\Models\Membership as MembershipModel;
|
||||
use App\Models\Tier;
|
||||
use Livewire\Livewire;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->setupUser();
|
||||
});
|
||||
|
||||
it('renders the membership page', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$tier = Tier::factory()->create(['min_spending' => 0, 'name' => 'Bronze']);
|
||||
MembershipModel::factory()->for($this->user)->create([
|
||||
'tier_id' => $tier->id,
|
||||
'reward_points' => 100,
|
||||
'total_spending' => 50000,
|
||||
]);
|
||||
|
||||
Livewire::test(Membership::class)
|
||||
->assertStatus(200)
|
||||
->assertSee('Membership')
|
||||
->assertSee('Bronze')
|
||||
->assertSee('100');
|
||||
});
|
||||
|
||||
it('shows max tier if already at highest tier', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$tier = Tier::factory()->create(['min_spending' => 0, 'name' => 'Bronze']);
|
||||
MembershipModel::factory()->for($this->user)->create([
|
||||
'tier_id' => $tier->id,
|
||||
'total_spending' => 1000000,
|
||||
]);
|
||||
|
||||
Livewire::test(Membership::class)
|
||||
->assertSet('nextTierName', 'Maksimal')
|
||||
->assertSet('progress', '100');
|
||||
});
|
||||
|
||||
it('calculates progress to next tier correctly', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$bronze = Tier::factory()->create(['min_spending' => 0, 'name' => 'Bronze']);
|
||||
$silver = Tier::factory()->create(['min_spending' => 100000, 'name' => 'Silver']);
|
||||
|
||||
MembershipModel::factory()->for($this->user)->create([
|
||||
'tier_id' => $bronze->id,
|
||||
'total_spending' => 50000,
|
||||
]);
|
||||
|
||||
Livewire::test(Membership::class)
|
||||
->assertSet('nextTierName', 'Silver')
|
||||
->assertSet('progress', 50);
|
||||
});
|
||||
64
tests/Feature/Member/OverviewTest.php
Normal file
64
tests/Feature/Member/OverviewTest.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
use App\Enums\Gender;
|
||||
use App\Livewire\Member\Overview;
|
||||
use App\Models\Customer;
|
||||
use App\Models\Tier;
|
||||
use Livewire\Livewire;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->setupUser();
|
||||
});
|
||||
|
||||
it('renders the member overview page', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(Overview::class)
|
||||
->assertStatus(200)
|
||||
->assertSee('Selamat datang');
|
||||
});
|
||||
|
||||
it('shows registration form if user is not a member', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(Overview::class)
|
||||
->assertSet('hasMemberData', false)
|
||||
->assertSee('Anda belum terdaftar menjadi member');
|
||||
});
|
||||
|
||||
it('can register as a member', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
// We need at least one tier for membership creation
|
||||
Tier::factory()->create(['min_spending' => 0]);
|
||||
|
||||
Livewire::test(Overview::class)
|
||||
->set('form.user_id', $this->user->id)
|
||||
->set('form.name', 'Test Member')
|
||||
->set('form.phone_number', '0812 3456 7890')
|
||||
->set('form.gender', Gender::MALE->value)
|
||||
->call('save')
|
||||
->assertHasNoErrors()
|
||||
->assertSet('hasMemberData', true);
|
||||
|
||||
$this->assertDatabaseHas('customers', [
|
||||
'user_id' => $this->user->id,
|
||||
'name' => 'Test Member',
|
||||
'phone_number' => '0812 3456 7890',
|
||||
'gender' => Gender::MALE->value,
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('memberships', [
|
||||
'user_id' => $this->user->id,
|
||||
]);
|
||||
});
|
||||
|
||||
it('shows member data if user is already a member', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Customer::factory()->for($this->user)->create();
|
||||
|
||||
Livewire::test(Overview::class)
|
||||
->assertSet('hasMemberData', true)
|
||||
->assertDontSee('Daftar Member');
|
||||
});
|
||||
104
tests/Feature/Member/RedeemPointTest.php
Normal file
104
tests/Feature/Member/RedeemPointTest.php
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
use App\Enums\IsShow;
|
||||
use App\Enums\RewardCategory;
|
||||
use App\Livewire\Member\RedeemPoint;
|
||||
use App\Models\Membership;
|
||||
use App\Models\Reward;
|
||||
use App\Models\Tier;
|
||||
use Livewire\Livewire;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->setupUser();
|
||||
$this->tier = Tier::factory()->create(['min_spending' => 0]);
|
||||
$this->membership = Membership::factory()->for($this->user)->create([
|
||||
'tier_id' => $this->tier->id,
|
||||
'reward_points' => 1000,
|
||||
]);
|
||||
});
|
||||
|
||||
it('renders the redeem point page', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(RedeemPoint::class)
|
||||
->assertStatus(200)
|
||||
->assertSee('Hadiah');
|
||||
});
|
||||
|
||||
it('shows rewards available for user tier', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$reward = Reward::factory()->create([
|
||||
'name' => 'Free Perfume',
|
||||
'points' => 100,
|
||||
'is_show' => IsShow::SHOW,
|
||||
'start_date' => now()->subDay(),
|
||||
'end_date' => now()->addDay(),
|
||||
'category' => RewardCategory::REGULAR,
|
||||
]);
|
||||
$reward->tiers()->attach($this->tier->id);
|
||||
|
||||
Livewire::test(RedeemPoint::class)
|
||||
->assertSee('Free Perfume');
|
||||
});
|
||||
|
||||
it('can redeem a reward', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$reward = Reward::factory()->create([
|
||||
'name' => 'Free Perfume',
|
||||
'points' => 100,
|
||||
'stock' => 10,
|
||||
'is_show' => IsShow::SHOW,
|
||||
'start_date' => now()->subDay(),
|
||||
'category' => RewardCategory::REGULAR,
|
||||
]);
|
||||
$reward->tiers()->attach($this->tier->id);
|
||||
|
||||
Livewire::test(RedeemPoint::class)
|
||||
->call('redeem', $reward)
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertDatabaseHas('redemptions', [
|
||||
'user_id' => $this->user->id,
|
||||
'reward_id' => $reward->id,
|
||||
'points_spent' => 100,
|
||||
]);
|
||||
|
||||
$this->assertEquals(900, $this->user->refresh()->membership->reward_points);
|
||||
$this->assertEquals(9, $reward->refresh()->stock);
|
||||
});
|
||||
|
||||
it('cannot redeem reward if points are insufficient', function () {
|
||||
$this->actingAs($this->user);
|
||||
$this->membership->update(['reward_points' => 50]);
|
||||
|
||||
$reward = Reward::factory()->create([
|
||||
'points' => 100,
|
||||
'is_show' => IsShow::SHOW,
|
||||
'start_date' => now()->subDay(),
|
||||
]);
|
||||
$reward->tiers()->attach($this->tier->id);
|
||||
|
||||
Livewire::test(RedeemPoint::class)
|
||||
->call('redeem', $reward);
|
||||
|
||||
$this->assertEquals(50, $this->user->refresh()->membership->reward_points);
|
||||
});
|
||||
|
||||
it('cannot redeem reward if stock is empty', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$reward = Reward::factory()->create([
|
||||
'points' => 100,
|
||||
'stock' => 0,
|
||||
'is_show' => IsShow::SHOW,
|
||||
'start_date' => now()->subDay(),
|
||||
]);
|
||||
$reward->tiers()->attach($this->tier->id);
|
||||
|
||||
Livewire::test(RedeemPoint::class)
|
||||
->call('redeem', $reward);
|
||||
|
||||
$this->assertEquals(1000, $this->user->refresh()->membership->reward_points);
|
||||
});
|
||||
36
tests/Feature/Member/VoucherTest.php
Normal file
36
tests/Feature/Member/VoucherTest.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use App\Enums\VoucherType;
|
||||
use App\Livewire\Member\Voucher;
|
||||
use App\Models\Voucher as VoucherModel;
|
||||
use Livewire\Livewire;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->setupUser();
|
||||
});
|
||||
|
||||
it('renders the voucher page', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(Voucher::class)
|
||||
->assertStatus(200)
|
||||
->assertSee('Voucher');
|
||||
});
|
||||
|
||||
it('shows vouchers owned by the user', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$voucher = VoucherModel::factory()->create([
|
||||
'name' => 'Diskon Awal Tahun',
|
||||
'code' => 'NEWYEAR2024',
|
||||
'type' => VoucherType::FIXED,
|
||||
'discount_amount' => 10000,
|
||||
]);
|
||||
|
||||
$this->user->vouchers()->attach($voucher->id);
|
||||
|
||||
Livewire::test(Voucher::class)
|
||||
->assertSee('Diskon Awal Tahun')
|
||||
->assertSee('NEWYEAR2024')
|
||||
->assertSee('10.000');
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user