te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>laravel testing - How to make test for nova action class, which is called from user's view page? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

laravel testing - How to make test for nova action class, which is called from user's view page? - Stack Overflow

programmeradmin3浏览0评论

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...

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论