On laravel 11 / nova 4 app I use action class, which is called from user's view page :
<?php
namespace App\Nova\Actions\User;
use App\Enums\UserBalanceActionTypeEnum;
use App\Library\Facades\LoggedUserFacade;
use App\Models\UserBalanceAction;
use Illuminate\Bus\Queueable;
use Illuminate\Database\QueryException;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Actions\ActionResponse;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Currency;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Stephenjude\Wallet\Exceptions\InsufficientFundException;
use Stephenjude\Wallet\Exceptions\InvalidAmountException;
class ChangeUserBalance extends Action
{
use InteractsWithQueue, Queueable;
public $confirmText = 'By adding deposit/fine for the user you can change user\'s balance';
/**
* Perform the action on the given models.
*
* @param \Laravel\Nova\Fields\ActionFields $fields
* @param \Illuminate\Support\Collection $models
*
* @return mixed
*/
public function handle(ActionFields $fields, Collection $models)
{
$errorMsg = '';
$exception = null;
try {
$user = $models[0];
DB::beginTransaction();
if(!$fields['negative']) { // Deposit
$newBalance = $user->deposit(floatval($fields['amount'])); // returns the wallet balance: 200.22
}
else { // Withdraw
$newBalance = $user->withdraw(floatval($fields['amount'])); // returns the wallet balance: 200.22
}
/* NSN TODO - Email server*/
$userBalanceAction = UserBalanceAction::create([
'user_id' => LoggedUserFacade::getLoggedUserId(),
'amount' => $fields['amount'],
'negative' => $fields['negative'],
'type' => UserBalanceActionTypeEnum::tryFrom($fields['type']),
'description' => $fields['description'],
]);
DB::commit();
} catch (InsufficientFundException $e) {
DB::rollBack();
\Log::info($e->getMessage());
$exception = $e;
$errorMsg = 'Opened user has no balance for this withdraw ';
} catch (InvalidAmountException $e) {
DB::rollBack();
\Log::info($e->getMessage());
$exception = $e;
$errorMsg = 'Check if entered amount is valid ';
} catch (QueryException|\Exception $e) {
DB::rollBack();
\Log::info($e->getMessage());
$exception = $e;
}
if ($exception) {
return ActionResponse::danger($errorMsg.': '.$exception->getMessage());
}
return ActionResponse::message('User\'s balance changed successfully !');
}
/**
* Get the fields available on the action.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
*
* @return array
*/
public function fields(NovaRequest $request)
{
return [
Currency::make('Amount', 'amount')
->rules('required', 'numeric', 'between:0,99999999')
->textAlign('right')->help('Valid money value')
->currency(\config('app.app_currency'))->required(),
Boolean::make(__('Is negative'), 'negative'),
Select::make(__('Type'), 'type')->required()
->options(UserBalanceActionTypeEnum::getTypeSelectionItems()),
Text::make(__('Description'), 'description')->required(),
];
}
}
This action is set in app/Nova/User.php:
public function actions(NovaRequest $request)
{
return [
...
ChangeUserBalance::make()->sole(),
This resource also has several actions, which are available only one user is selected. I wonder in which case can I to make http feature tests for this action and other actions on this user model,
Usually http feature tests I start from controllers with route in web.php file...
But in this case only action by men click...