Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mock auth cakephp 3

Currently I'm trying to test a controller which uses the authentication component to retrieve the user id. Since I'm fairly new to unit/integration testing, I have no idea how to make this working. Moreover, all the content that I could find for this particular problem is written for Cakephp version 2.

Controller function:

 public function favorite(){
    // Particular line where the problem is occurring:
    $userId = $this->Auth->User()['id'];
    // Get all favorite pictures of the user
    $query = $this->UsersPictures->getFavoritePictures($userId);

    $results = $query->all();
    // Replace the link in the result set by a presigned url of Amazon
    foreach($results as $result){
        $result->picture->link = $this->Aws->getTokenizedItem($result->picture->link);
    }
    $this->set([
        'success' => true,
        'data' => [
            'pictures' => $results
        ],
        '_serialize' => ['success', 'data']
    ]);
}

Integration test:

public function testFavoriteShouldPass(){
    $this->configRequest([
        'headers' => [
            'Accept' => 'application/json'
        ]
    ]);
    $this->get('api/pictures/favorite/1.json');

    $expected = [
        'success' => true,
        'data' => [
                [
                'user_id' => 1,
                'picture_id' => 1,
                'created' => '2016-04-03T20:35:40+0000',
                'modified' => '2016-04-03T20:35:40+0000',
                'picture' => [
                    'id' => 1,
                    'album_id' => 1,
                    'description' => 'Lorem ipsum dolor sit amet',
                    'link' => 'test',
                    'favorite' => true,
                    'created' => null,
                    'modified' => null,
                    'cover_photo' => true
                ]
            ]
        ]
    ];
    $this->assertEquals($expected, $response);
}

My question is how can I insert a user with a default id of 1 for $this->Auth->User()['id']. I saw in other questions that I need to use something that looks like this:

   $this->_controller->Auth
        ->staticExpects($this->any())
        ->method('user')
        ->will($this->returnValue([
            'id' => 1,
            'username' => 'admin',
            'created' => '2013-05-08 00:00:00',
            'modified' => '2013-05-08 00:00:00',
            'email' => '[email protected]',
        ]));

However, I read that staticExpects is deprecated from phpunit version 3.8 (I'm using 5.2). How should I mock this?

like image 589
chishiki Avatar asked Mar 06 '26 03:03

chishiki


1 Answers

You can set the session data in your integration tests using $this->session(), for example (taken from cakephp book):

// Set session data
$this->session([
    'Auth' => [
        'User' => [
            'id' => 1,
            'username' => 'testing',
            // other keys.
        ]
    ]
]);

You can actually find it in their docs: http://book.cakephp.org/3.0/en/development/testing.html#controller-integration-testing

You can find it in the section

Testing Actions That Require Authentication

If you want to use the same session data on each test you can use the setUp method of your integration test class, like so:

public function setUp()
{
    parent::setUp();
    // Set session data
    $this->session([
    'Auth' => [
        'User' => [
              'id' => 1,
              'username' => 'testing',
              // other keys.
            ]
        ]
    ]);
}
like image 199
azahar Avatar answered Mar 09 '26 01:03

azahar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!