Skip to content

Instantly share code, notes, and snippets.

@B-Galati
Last active July 20, 2018 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save B-Galati/6796321bf5ca1149d105c6c76d952f7d to your computer and use it in GitHub Desktop.
Save B-Galati/6796321bf5ca1149d105c6c76d952f7d to your computer and use it in GitHub Desktop.
<?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);
}
}
<?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