Last active
July 20, 2018 15:01
-
-
Save B-Galati/6796321bf5ca1149d105c6c76d952f7d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Behat\Gherkin\Node\TableNode; | |
use Behat\MinkExtension\Context\RawMinkContext; | |
use Behat\Symfony2Extension\Context\KernelDictionary; | |
use Doctrine\Common\DataFixtures\Executor\ORMExecutor; | |
use Doctrine\Common\DataFixtures\Purger\ORMPurger; | |
use Doctrine\ORM\EntityManager; | |
use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader; | |
class FixtureContext extends RawMinkContext | |
{ | |
use KernelDictionary; | |
private $executor; | |
private $purger; | |
public function __construct(EntityManager $manager) | |
{ | |
$this->executor = new ORMExecutor($manager, $this->purger = new ORMPurger($manager)); | |
} | |
/** | |
* @BeforeScenario | |
*/ | |
public function clearDatabase(): void | |
{ | |
$this->purger->purge(); | |
} | |
/** | |
* @Given the following fixtures are loaded: | |
*/ | |
public function theFollowingFixturesAreLoaded(TableNode $classnames): void | |
{ | |
$loader = new ContainerAwareLoader($this->getContainer()); | |
foreach ($classnames->getRows() as $classname) { | |
$loader->addFixture($this->getContainer()->get("App\\DataFixtures\\${classname[0]}")); | |
} | |
if (!$fixtures = $loader->getFixtures()) { | |
throw new InvalidArgumentException( | |
sprintf('Could not find any fixtures to load called: %s', "\n\n- ".implode("\n- ", $fixtures)) | |
); | |
} | |
$this->executor->execute($fixtures); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Behat\Gherkin\Node\PyStringNode; | |
use Behat\MinkExtension\Context\RawMinkContext; | |
use Fidry\AliceDataFixtures\LoaderInterface; | |
use Symfony\Component\Yaml\Yaml; | |
use Doctrine\ODM\MongoDB\DocumentManager; | |
use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface; | |
use Fidry\AliceDataFixtures\Persistence\PurgeMode; | |
class FixtureContext extends RawMinkContext | |
{ | |
private const FIXTURES_FILE_EXTENSION = '.yaml'; | |
private const FIXTURES_BASE_PATH = __DIR__.'/../../src/DataFixtures/test/'; | |
private $purger; | |
private $loader; | |
private $manager; | |
private $subscribers; | |
private $alreadyLoadedFiles = []; | |
public function __construct( | |
PurgerFactoryInterface $purgerFactory, | |
LoaderInterface $loader, | |
DocumentManager $manager, | |
$subscribers | |
) { | |
$this->purger = $purgerFactory->create(PurgeMode::createTruncateMode()); | |
$this->loader = $loader; | |
$this->manager = $manager; | |
$this->subscribers = $subscribers; | |
} | |
/** | |
* @BeforeScenario | |
* | |
* @Given I reset the database | |
*/ | |
public function resetDatabase(): void | |
{ | |
$this->alreadyLoadedFiles = []; | |
$this->purger->purge(); | |
} | |
/** | |
* @Given the following fixtures are loaded: | |
*/ | |
public function theFollowingFixturesAreLoaded(PyStringNode $data): void | |
{ | |
$this->removeSubscribers($this->subscribers, $this->manager); | |
// Alice v3 don't allow to load fixtures from variable. | |
$filename = tempnam('php://memory', 'beintranet').'.yml'; | |
$files[] = $filename; | |
file_put_contents($filename, Yaml::dump(Yaml::parse($data->getRaw()))); | |
$this->loader->load($files); | |
$this->addSubscribers($this->subscribers, $this->manager); | |
} | |
/** | |
* @Given the fixture file :filename is loaded | |
*/ | |
public function theFixturesFileIsLoaded(string $filename) | |
{ | |
if (in_array($filename, $this->alreadyLoadedFiles, true)) { | |
return; | |
} | |
$this->alreadyLoadedFiles[] = $filename; | |
return $this->loader->load([realpath(self::FIXTURES_BASE_PATH.$filename.self::FIXTURES_FILE_EXTENSION)]); | |
} | |
/** | |
* Remove Doctrine events. | |
* | |
* @param array $subscribers | |
* @param DocumentManager $manager | |
*/ | |
protected function removeSubscribers(array $subscribers, DocumentManager $manager): void | |
{ | |
$evm = $manager->getEventManager(); | |
foreach ($subscribers as $subscriber) { | |
$evm->removeEventSubscriber($subscriber); | |
} | |
} | |
/** | |
* Add Doctrine events. | |
* | |
* @param array $subscribers | |
* @param DocumentManager $manager | |
*/ | |
protected function addSubscribers(array $subscribers, DocumentManager $manager): void | |
{ | |
$evm = $manager->getEventManager(); | |
foreach ($subscribers as $subscriber) { | |
$evm->addEventSubscriber($subscriber); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment