Propojení Mango tester s Doctrine Fixtures (Nettrine)

Petr Parolek
Člen | 455
+
0
-

Ahoj,

navazuji na kod z tématu na foru https://forum.nette.org/…ons-nettrine .

<?php
declare(strict_types=1);

namespace AppTests;

use Doctrine\Migrations\Version\Direction;
use Doctrine\Migrations\Migrator;
use Mangoweb\Tester\DatabaseCreator\CannotContinueMigrationException;
use Mangoweb\Tester\DatabaseCreator\IMigrationsDriver;
use Nettrine\Migrations\ContainerAwareConfiguration;

class NettrineMigrationsDriver implements IMigrationsDriver
{

	/** @var \Nette\DI\Container */
	private $container;

	public function __construct(\Nette\DI\Container $container)
	{
		$this->container = $container;
	}

	public function continue(): void
	{
		dump('continue');
	}

	public function getMigrationsHash(): string
	{
		return '';
	}

	public function reset(): void
	{
		/** @var ContainerAwareConfiguration $migrationsConfig */
		$migrationsConfig = $this->container->getByType(\Nettrine\Migrations\ContainerAwareConfiguration::class);

		$migrationsConfig->__construct($migrationsConfig->getConnection());
		$migrationsConfig->registerMigrationsFromDirectory($migrationsConfig->getMigrationsDirectory());
		$dependencyFactory = new \Doctrine\Migrations\DependencyFactory($migrationsConfig);
		$migration = $dependencyFactory->getMigrator();
		$migration->migrate($migrationsConfig->getLatestVersion());

		if (class_exists(\Nettrine\Fixtures\DI\FixturesExtension::class)) {
			/** @var \Nettrine\Fixtures\Loader\FixturesLoader $loader */
			$loader = new \Nettrine\Fixtures\Loader\FixturesLoader([__DIR__ . '/../app/Model/Fixtures'], $this->container);

			$loader->load();
		}
	}
}

Jak můžu prosím přidat testovací data z fixtures prosím? Do DB se žádná data neukládají.

Editoval ppar (11. 10. 2019 13:31)

Petr Parolek
Člen | 455
+
+1
-

Opět si odpovím sám:

<?php
declare(strict_types=1);

namespace AppTests;

use App\Model\EntityManagerDecorator;
use Doctrine\Migrations\DependencyFactory;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Mangoweb\Tester\DatabaseCreator\IMigrationsDriver;
use Nettrine\Migrations\ContainerAwareConfiguration;
use Nettrine\Fixtures\DI\FixturesExtension;
use Nettrine\Fixtures\Loader\FixturesLoader;
use Nette;
use Nettrine\ORM\ManagerRegistry;

class NettrineMigrationsDriver implements IMigrationsDriver
{

	/** @var Nette\DI\Container */
	private $container;

	/** @var FixturesLoader */
	private $loader;

	/** @var ManagerRegistry */
	private $managerRegistry;

	public function __construct(Nette\DI\Container $container, FixturesLoader $loader, ManagerRegistry $managerRegistry)
	{
		$this->container = $container;
		$this->loader = $loader;
		$this->managerRegistry = $managerRegistry;
	}

	public function continue(): void
	{
		dump('continue');
	}

	public function getMigrationsHash(): string
	{
		return '';
	}

	public function reset(): void
	{
		/** @var ContainerAwareConfiguration $migrationsConfig */
		$migrationsConfig = $this->container->getByType(ContainerAwareConfiguration::class);

		$migrationsConfig->__construct($migrationsConfig->getConnection());
		$migrationsConfig->registerMigrationsFromDirectory($migrationsConfig->getMigrationsDirectory());
		$dependencyFactory = new DependencyFactory($migrationsConfig);
		$migration = $dependencyFactory->getMigrator();
		$migration->migrate($migrationsConfig->getLatestVersion());

		$this->loader->load();
		$paths = $this->loader->getPaths();

		$fixtures = $this->loader->getFixtures();
		if (!$fixtures) {
			throw new \InvalidArgumentException(
				sprintf(
					'Could not find any fixtures to load in: %s',
					"\n\n- " . implode("\n- ", $paths)
				)
			);
		}

		/** @var EntityManagerDecorator $em */
		$em = $this->managerRegistry->getManager();

		$purger = new ORMPurger($em);
		$purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);

		$executor = new ORMExecutor($em, $purger);
		$executor->execute($fixtures);
	}
}
Felix
Nette Core | 1183
+
+1
-

@ppar Ahoj Petre. Jenom ti pisu, aby jsi nebyl smutny nebo otraveny. Tvoje dotazy si cas od casu prectu, ale abych byl uprimny, jsou tak konkretni, ze by vyzadovaly spoustu casu, ktery bohuzel nemam a nebo nemuzu investovat.

Tak jen aby jsi vedel, ze bych ti rad poradil, ale nejde to. :-)

PS: Navic kombinace mango testeru a nettrine je fakt dost specificka. Ja mango tester nepouzivam a nevim jestli @DavidMatějka nebo @JanTvrdík, kteri mango tester pouziva, tak pouzivaji nettrine.

Petr Parolek
Člen | 455
+
+2
-

Ahoj @Felix , však v pohodě, moje dotazy jsou velmi specifické a nikdo nemá půl dne čas zkoumat moje inovace v testech. Výhodou je, když na to přijde sám, tak se i něco naučím a zdokonalím. Investice do vzdělávání je nutná.

Až vychytám všechny mouchy a přetvořím své myšlenky do kodu, tak se chystám někam vypustit ucelený článek o Mango testech, protože se mi moc líbí a všem bych ho doporučil nasadit všem.

OT: před časem se tu hejtoval testbech od @mrtnzlml , ale nikdo už nemá chuť napsat hezký článek o jiném řešení. Nadávat umí každý, přiložit ruku do komunity je horší. Sepsání článku se ujmu já dobrovolně.

EDIT:
Byla zmíněmá myšlenka o spuštění migrací a nahrávání testovacích dat přímo přes symfony commandy, namísto vykopírování a úpravy kusů kodů z commandů, což je čištější řešení. Vrhnu se na to!

Editoval ppar (12. 10. 2019 11:55)