Files
radicall/tests/Feature/Http/Admin/WithdrawRequestControllerTest.php
T

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');
}
}