_fixtureBaseDir = realpath($fixtureBaseDir); } /** * Handler for 'startTest' event * * @param \PHPUnit_Framework_TestCase $test */ public function startTest(\PHPUnit_Framework_TestCase $test) { /** Apply method level fixtures if thy are available, apply class level fixtures otherwise */ $this->_applyFixtures($this->_getFixtures('method', $test) ?: $this->_getFixtures('class', $test)); } /** * Handler for 'endTest' event */ public function endTest() { $this->_revertFixtures(); } /** * Retrieve fixtures from annotation * * @param string $scope 'class' or 'method' * @param \PHPUnit_Framework_TestCase $test * @return array * @throws \Magento\Framework\Exception\LocalizedException */ protected function _getFixtures($scope, \PHPUnit_Framework_TestCase $test) { $annotations = $test->getAnnotations(); $result = []; if (!empty($annotations[$scope]['magentoApiDataFixture'])) { foreach ($annotations[$scope]['magentoApiDataFixture'] as $fixture) { if (strpos($fixture, '\\') !== false) { // usage of a single directory separator symbol streamlines search across the source code throw new \Magento\Framework\Exception\LocalizedException( __('Directory separator "\\" is prohibited in fixture declaration.') ); } $fixtureMethod = [get_class($test), $fixture]; if (is_callable($fixtureMethod)) { $result[] = $fixtureMethod; } else { $result[] = $this->_fixtureBaseDir . '/' . $fixture; } } } return $result; } /** * Execute single fixture script * * @param string|array $fixture */ protected function _applyOneFixture($fixture) { try { if (is_callable($fixture)) { call_user_func($fixture); } else { require $fixture; } } catch (\Exception $e) { echo 'Exception occurred when running the ' . (is_array($fixture) || is_scalar($fixture) ? json_encode($fixture) : 'callback') . ' fixture: ', PHP_EOL, $e; } $this->_appliedFixtures[] = $fixture; } /** * Execute fixture scripts if any * * @param array $fixtures * @throws \Magento\Framework\Exception\LocalizedException */ protected function _applyFixtures(array $fixtures) { /* Execute fixture scripts */ foreach ($fixtures as $oneFixture) { /* Skip already applied fixtures */ if (!in_array($oneFixture, $this->_appliedFixtures, true)) { $this->_applyOneFixture($oneFixture); } } } /** * Revert changes done by fixtures */ protected function _revertFixtures() { foreach ($this->_appliedFixtures as $fixture) { if (is_callable($fixture)) { $fixture[1] .= 'Rollback'; if (is_callable($fixture)) { $this->_applyOneFixture($fixture); } } else { $fileInfo = pathinfo($fixture); $extension = ''; if (isset($fileInfo['extension'])) { $extension = '.' . $fileInfo['extension']; } $rollbackScript = $fileInfo['dirname'] . '/' . $fileInfo['filename'] . '_rollback' . $extension; if (file_exists($rollbackScript)) { $this->_applyOneFixture($rollbackScript); } } } $this->_appliedFixtures = []; } }