Search code examples
phpyiiyii2codeceptionfixtures

Fixtures not available for subsequent tests


I am using Codeception and fixtures to test my API but it seems the fixtures are only available for the first test. Here is my tests:

class ActionCest extends BaseTestCase
{
    public function _fixtures()
    {
        return [
            'profiles' => [
                'class' => UserFixture::className(),
                // fixture data located in tests/_data/user.php
                'dataFile' => codecept_data_dir() . 'user.php'
            ],
            'actions' => [
                'class' => ActionFixture::className(),
                'dataFile' => codecept_data_dir() . 'action.php'
            ],
        ];
    }

    public function createAction(ApiTester $I)
    {
        $user = $I->grabFixture('profiles', 'user1');

        $I->wantTo('Add action');
        $I->haveHttpHeader('Authorization', 'Bearer '. $user['auth_key']);

        $payload = [
            'action_id' => 123,
            'saved' => true,
            'viewed' => false,
            'complete' => false,
        ];

        $I->sendPOST('/action/save', $payload);
        $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); // 200
        $I->seeResponseContainsJson($this->buildResponsePayload($payload));
    }

    public function getAction(ApiTester $I)
    {
        $user = $I->grabFixture('profiles', 'user1');
        //$action = $I->grabFixture('actions', 'action1');

        $I->wantTo('Retrieve action');
        $I->haveHttpHeader('Authorization', 'Bearer '. $user['auth_key']);

        $I->sendPOST('/action/get-by-id/1');//'. $action['action_id']);
        $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); // 200
        $I->seeResponseContainsJson($this->buildResponsePayload($payload));
    }
}

In the example above, the first test will pass OK. However the second test will fail due the user not being authenticated. I assume that the user has been removed from the database after the first test.

How would I overcome this?


Solution

  • The answer was to replace the _fixtures() method with the following method:

        public function _before(ApiTester $I)
        {
            $I->haveFixtures([
                'users' => [
                    'class' => UserFixture::className(),
                    'dataFile' => codecept_data_dir() . 'user.php',
                ],
                'actions' => [
                    'class' => UserActionFixture::className(),
                    'dataFile' => codecept_data_dir() . 'action.php',
                ],
            ]);
        }