3
votes

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?

2
I think you didn't understand the question. The problem is that I want to assign a fixed value to $this->Auth->User('id') during testing (for instance user_id always 1). In this way, I can test whether the controller actions work like they should be.markvdlaan93

2 Answers

1
votes

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.
            ]
        ]
    ]);
}
1
votes

With thanks to azahar :), this worked for me:

public function controllerSpy($event)
{
    parent::controllerSpy($event);

    if (isset($this->_controller)) {
        $this->_controller->Auth->setUser([
            'id' => 1,
            'username' => 'testtesttesttest',
            'email' => '[email protected]',
            'first_name' => 'John',
            'last_name' => 'Doe',
            'uuid' => 'wepoewoweo-ew-ewewpoeopw',
            'sign_in_count' => 1,
            'current_sign_in_ip' => '127.0.0.1',
            'active' => true
        ]);
    }
}