Search code examples
phplaraveltestingphpunitlaravel-testing

Laravel header null on test


I'm building a multitenancy api with Laravel based on Account Model, i determine the tennant in use by the request reader "Account" by using a trait (AccountScoped) on all tenant models, everything is working on postman, but whyle testing the header is not acessible in trait.

AccountScopped (Trait)

trait AccountScoped
{
protected static function bootAccountScoped()
{
    $account_id = request()->header('Account');
    dd($account_id);
    if (empty($account_id)) {
        return;
    }

    static::creating(function (Model $model) use ($account_id) {
        $model->account_id = $account_id;
    });

    static::addGlobalScope('byAccount', function (Builder $builder) use ($account_id) {
        $builder->where('account_id', '=', $account_id);
    });
}
}

The test method:

public function testActionIndexInController()
{
    $categories = Category::where('account_id',$this->account->id)->get()->toJSON();
    $response = $this->actingAs($this->user, 'api')
                    ->withHeader('Account',$this->account->id)
                    ->get(route('categories.index'));

    $response->assertStatus(200)->assertSee($categories);
}

* $this->user is a User instance model with Accounts, $this->account is a Account instance related to the selected user

But when i run the test i get null value on $account_id Test return

And when i make the same request by postaman the value is there Postman Return


Solution

  • If you are using jwt you can use this code to set the request while you are in testing mode

    if (env('APP_ENV') === 'testing') {
         JWTAuth::setRequest($request);
    }
    

    otherwise, you need to set the request using Illuminate\Http\Request; Also, you can try this code to get the header

    \Illuminate\Support\Facades\Request::instance()->headers->get('Account')