105 lines
4.6 KiB
PHP
105 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Http\Admin;
|
|
|
|
use App\Enums\UserEnum;
|
|
use App\Enums\WithdrawRequestStatusEnum;
|
|
use App\Models\User;
|
|
use App\Models\Wallet;
|
|
use App\Models\WithdrawRequest;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Inertia\Testing\AssertableInertia as Assert;
|
|
use Tests\Concerns\InteractsWithAdmin;
|
|
use Tests\TestCase;
|
|
|
|
class WithdrawRequestControllerTest extends TestCase
|
|
{
|
|
use InteractsWithAdmin, RefreshDatabase;
|
|
|
|
public function test_routes_are_protected_from_guests_and_non_admins(): void
|
|
{
|
|
$withdrawRequest = WithdrawRequest::factory()->create();
|
|
|
|
$this->get(route('admin.withdraw-requests.index'))->assertRedirect(route('login'));
|
|
$this->actingAs(User::factory()->create(['level' => UserEnum::Doctor->value]))->post(route('admin.withdraw-requests.approve', $withdrawRequest))->assertNotFound();
|
|
}
|
|
|
|
public function test_index_renders_requests_with_stats_and_filters(): void
|
|
{
|
|
$admin = $this->adminWithoutPermissions();
|
|
Wallet::factory()->system()->create(['balance' => 900]);
|
|
WithdrawRequest::factory()->create(['amount' => 100000]);
|
|
WithdrawRequest::factory()->create(['amount' => 250000]);
|
|
WithdrawRequest::factory()->approved()->create(['amount' => 500000]);
|
|
|
|
$this->actingAs($admin)->get(route('admin.withdraw-requests.index'))
|
|
->assertOk()
|
|
->assertInertia(fn (Assert $page) => $page
|
|
->component('WithdrawRequests/index')
|
|
->has('withdrawRequests.data', 3)
|
|
->where('stats.pending_count', 2)
|
|
->where('stats.pending_amount', 350000)
|
|
->where('stats.system_wallet_balance', 900));
|
|
|
|
$this->actingAs($admin)->get(route('admin.withdraw-requests.index', ['status' => WithdrawRequestStatusEnum::Approved->value]))
|
|
->assertInertia(fn (Assert $page) => $page->has('withdrawRequests.data', 1));
|
|
}
|
|
|
|
public function test_index_searches_by_user_fullname(): void
|
|
{
|
|
$admin = $this->adminWithoutPermissions();
|
|
$user = User::factory()->create(['fullname' => 'کاربر خاص']);
|
|
WithdrawRequest::factory()->create(['user_id' => $user->id]);
|
|
WithdrawRequest::factory()->create();
|
|
|
|
$this->actingAs($admin)->get(route('admin.withdraw-requests.index', ['search' => 'خاص']))
|
|
->assertInertia(fn (Assert $page) => $page->has('withdrawRequests.data', 1));
|
|
}
|
|
|
|
public function test_approve_moves_funds_and_marks_request_approved(): void
|
|
{
|
|
$admin = $this->adminWithoutPermissions();
|
|
$wallet = Wallet::factory()->create(['balance' => 500000]);
|
|
$withdrawRequest = WithdrawRequest::factory()->create(['user_id' => $wallet->user_id, 'amount' => 200000]);
|
|
|
|
$this->actingAs($admin)->post(route('admin.withdraw-requests.approve', $withdrawRequest))->assertOk()->assertSessionHas('success');
|
|
|
|
$withdrawRequest->refresh();
|
|
$this->assertSame(WithdrawRequestStatusEnum::Approved, $withdrawRequest->status);
|
|
$this->assertSame($admin->id, $withdrawRequest->reviewed_by);
|
|
$this->assertSame(300000, $wallet->fresh()->balance);
|
|
$this->assertDatabaseHas('wallets', ['user_id' => null, 'balance' => 200000]);
|
|
}
|
|
|
|
public function test_approve_returns_validation_error_for_reviewed_request(): void
|
|
{
|
|
$withdrawRequest = WithdrawRequest::factory()->rejected()->create();
|
|
|
|
$this->actingAs($this->adminWithoutPermissions())->postJson(route('admin.withdraw-requests.approve', $withdrawRequest))
|
|
->assertUnprocessable()
|
|
->assertJsonValidationErrors('withdraw_request');
|
|
}
|
|
|
|
public function test_reject_marks_request_rejected_with_note(): void
|
|
{
|
|
$admin = $this->adminWithoutPermissions();
|
|
$withdrawRequest = WithdrawRequest::factory()->create();
|
|
|
|
$this->actingAs($admin)->post(route('admin.withdraw-requests.reject', $withdrawRequest), ['note' => 'کارت نامعتبر'])->assertOk();
|
|
|
|
$withdrawRequest->refresh();
|
|
$this->assertSame(WithdrawRequestStatusEnum::Rejected, $withdrawRequest->status);
|
|
$this->assertSame('کارت نامعتبر', $withdrawRequest->admin_note);
|
|
$this->assertSame($admin->id, $withdrawRequest->reviewed_by);
|
|
}
|
|
|
|
public function test_reject_validates_note_length(): void
|
|
{
|
|
$withdrawRequest = WithdrawRequest::factory()->create();
|
|
|
|
$this->actingAs($this->adminWithoutPermissions())->postJson(route('admin.withdraw-requests.reject', $withdrawRequest), ['note' => str_repeat('a', 1001)])
|
|
->assertUnprocessable()
|
|
->assertJsonValidationErrors('note');
|
|
}
|
|
}
|