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