Skip to content

Commit

Permalink
Introduce Initializable Fixtures (#11)
Browse files Browse the repository at this point in the history
* Bump kununu/data-fixtures to v5.0

* Introduce Initializable Fixtures to allow initialization of Fixtures instances in FixturesAwareTestCase

* Add coverage in tests

* Update README.md
  • Loading branch information
hugo-goncalves-kununu authored Mar 18, 2020
1 parent 13dd17b commit e257014
Show file tree
Hide file tree
Showing 8 changed files with 204 additions and 17 deletions.
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,69 @@ final class IntegrationTest extends FixturesAwareTestCase
}
```

## Initializable Fixtures

Since this bundle is using the [KununuDataFixtures](https://github.com/kununu/data-fixtures) package, it also has support for initializable features, allowing you to inject arguments into your feature classes (see documentation at the KununuDataFixtures package).

In order to do that your Fixtures class must implement the `InitializableFixtureInterface`, and according to your fixture type you need to register the initialization arguments before loading the fixtures.

### CachePool Fixtures

```
$this->registerInitializableFixtureForCachePool(
'app.cache.first',
YourCachePoolFixtureClass::class,
$yourArg1,
...,
$yourArgN
);
$this->loadCachePoolFixtures(
'app.cache.first',
[
YourCachePoolFixtureClass::class
]
);
```
### Connection Fixtures

```
$this->registerInitializableFixtureForDb(
'default',
YourConnectionFixtureClass::class,
yourArg1,
...,
$yourArgN
);
$this->loadDbFixtures(
'default',
[
YourConnectionFixtureClass::class
]
);
```

### Elasticsearch Fixtures

```
$this->registerInitializableFixtureForElasticSearch(
'my_index_alias',
YourElasticsearchFixtureClass::class,
$yourArg1,
...,
$yourArgN
);
$this->loadElasticSearchFixtures(
'my_index_alias',
[
YourElasticsearchFixtureClass::class
]
);
```

## Making a Request

The class `WebTestCase` exposes two methods that help you testing your controllers:
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"require": {
"php": "^7.2",
"symfony/framework-bundle": "^4.3",
"kununu/data-fixtures": "^4.0",
"kununu/data-fixtures": "^5.0",
"symfony/config": "^4.3",
"symfony/dependency-injection": "^4.3",
"symfony/http-kernel": "^4.3"
Expand Down
5 changes: 5 additions & 0 deletions src/Service/Orchestrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,9 @@ public function execute(array $fixturesClassNames, bool $append): void

$this->executor->execute($this->loader->getFixtures(), $append);
}

public function registerInitializableFixture(string $className, ...$args): void
{
$this->loader->registerInitializableFixture($className, ...$args);
}
}
52 changes: 39 additions & 13 deletions src/Test/FixturesAwareTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,47 @@ abstract class FixturesAwareTestCase extends BaseWebTestCase
{
final protected function loadDbFixtures(string $connectionName, array $classNames = [], bool $append = false): void
{
/** @var Orchestrator $orchestrator */
$orchestrator = $this->getContainer()->get(sprintf('kununu_testing.orchestrator.connections.%s', $connectionName));
$this->getOrchestrator('connections', $connectionName)->execute($classNames, $append);
}

$orchestrator->execute($classNames, $append);
final protected function loadCachePoolFixtures(
string $cachePoolServiceId,
array $classNames = [],
bool $append = false
): void {
$this->getOrchestrator('cache_pools', $cachePoolServiceId)->execute($classNames, $append);
}

final protected function loadCachePoolFixtures(string $cachePoolServiceId, array $classNames = [], bool $append = false): void
{
/** @var Orchestrator $orchestrator */
$orchestrator = $this->getContainer()->get(sprintf('kununu_testing.orchestrator.cache_pools.%s', $cachePoolServiceId));
final protected function loadElasticSearchFixtures(
string $alias,
array $classNames = [],
bool $append = false
): void {
$this->getOrchestrator('elastic_search', $alias)->execute($classNames, $append);
}

$orchestrator->execute($classNames, $append);
final protected function registerInitializableFixtureForDb(
string $connectionName,
string $className,
...$args
): void {
$this->getOrchestrator('connections', $connectionName)->registerInitializableFixture($className, ...$args);
}

final protected function loadElasticSearchFixtures(string $alias, array $classNames = [], bool $append = false): void
{
/** @var Orchestrator $orchestrator */
$orchestrator = $this->getContainer()->get(sprintf('kununu_testing.orchestrator.elastic_search.%s', $alias));
final protected function registerInitializableFixtureForCachePool(
string $cachePoolServiceId,
string $className,
...$args
): void {
$this->getOrchestrator('cache_pools', $cachePoolServiceId)->registerInitializableFixture($className, ...$args);
}

$orchestrator->execute($classNames, $append);
final protected function registerInitializableFixtureForElasticSearch(
string $alias,
string $className,
...$args
): void {
$this->getOrchestrator('elastic_search', $alias)->registerInitializableFixture($className, ...$args);
}

final protected function getContainer(): ContainerInterface
Expand All @@ -40,4 +61,9 @@ final protected function getContainer(): ContainerInterface

return static::$container;
}

private function getOrchestrator(string $type, string $key): Orchestrator
{
return $this->getContainer()->get(sprintf('kununu_testing.orchestrator.%s.%s', $type, $key));
}
}
17 changes: 16 additions & 1 deletion tests/App/Fixtures/CachePool/CachePoolFixture1.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
namespace Kununu\TestingBundle\Tests\App\Fixtures\CachePool;

use Kununu\DataFixtures\Adapter\CachePoolFixtureInterface;
use Kununu\DataFixtures\InitializableFixtureInterface;
use Psr\Cache\CacheItemPoolInterface;

final class CachePoolFixture1 implements CachePoolFixtureInterface
final class CachePoolFixture1 implements CachePoolFixtureInterface, InitializableFixtureInterface
{
private $arg1;

public function load(CacheItemPoolInterface $cachePool): void
{
$item1 = $cachePool->getItem('key_1');
Expand All @@ -17,4 +20,16 @@ public function load(CacheItemPoolInterface $cachePool): void
$item1->set('value_2');
$cachePool->save($item1);
}

public function initializeFixture(...$args): void
{
if (count($args)) {
$this->arg1 = $args[0];
}
}

public function arg1()
{
return $this->arg1;
}
}
29 changes: 28 additions & 1 deletion tests/App/Fixtures/Connection/ConnectionFixture1.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,39 @@

use Doctrine\DBAL\Connection;
use Kununu\DataFixtures\Adapter\ConnectionFixtureInterface;
use Kununu\DataFixtures\InitializableFixtureInterface;

final class ConnectionFixture1 implements ConnectionFixtureInterface
final class ConnectionFixture1 implements ConnectionFixtureInterface, InitializableFixtureInterface
{
private $arg1;
private $arg2 = false;

public function load(Connection $connection): void
{
$connection->exec('INSERT INTO `table_1` (`name`, `description`) VALUES (\'name\', \'description\');');
$connection->exec('INSERT INTO `table_2` (`name`, `description`) VALUES (\'name\', \'description\');');
}

public function initializeFixture(...$args): void
{
foreach ($args as $index => $arg) {
if (0 === $index && is_string($arg)) {
$this->arg1 = $arg;
}

if (1 === $index && is_bool($arg)) {
$this->arg2 = $arg;
}
}
}

public function arg1(): ?string
{
return $this->arg1;
}

public function arg2(): bool
{
return $this->arg2;
}
}
29 changes: 28 additions & 1 deletion tests/App/Fixtures/ElasticSearch/ElasticSearchFixture1.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@

use Elasticsearch\Client;
use Kununu\DataFixtures\Adapter\ElasticSearchFixtureInterface;
use Kununu\DataFixtures\InitializableFixtureInterface;

final class ElasticSearchFixture1 implements ElasticSearchFixtureInterface
final class ElasticSearchFixture1 implements ElasticSearchFixtureInterface, InitializableFixtureInterface
{
private $arg1;
private $arg2;

public function load(Client $elasticSearch, string $indexName): void
{
$elasticSearch->index(
Expand All @@ -17,4 +21,27 @@ public function load(Client $elasticSearch, string $indexName): void
]
);
}

public function initializeFixture(...$args): void
{
foreach ($args as $index => $arg) {
if (0 === $index && is_int($arg)) {
$this->arg1 = $arg;
}

if (1 === $index && is_array($arg)) {
$this->arg2 = $arg;
}
}
}

public function arg1(): ?int
{
return $this->arg1;
}

public function arg2(): ?array
{
return $this->arg2;
}
}
24 changes: 24 additions & 0 deletions tests/Test/FixturesAwareTestCaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ public function testLoadElasticSearchFixturesWithoutAppend(): void

$this->elasticSearch->get(['index' => 'my_index', 'id' => 'document_to_purge']);

$this->registerInitializableFixtureForElasticSearch(
'my_index_alias',
ElasticSearchFixture1::class,
1,
['a' => 'name']
);
$this->loadElasticSearchFixtures(
'my_index_alias',
[ElasticSearchFixture1::class, ElasticSearchFixture2::class]
Expand Down Expand Up @@ -102,6 +108,11 @@ public function testLoadCachePoolFixturesWithoutAppend(): void
$cachePool1ItemToPurge1->set('value_to_purge_1');
$this->cachePool->save($cachePool1ItemToPurge1);

$this->registerInitializableFixtureForCachePool(
'app.cache.first',
CachePoolFixture1::class,
$this->monolithicConnection
);
$this->loadCachePoolFixtures(
'app.cache.first',
[CachePoolFixture1::class, CachePoolFixture2::class]
Expand Down Expand Up @@ -143,6 +154,19 @@ public function testLoadCachePoolFixturesWithAppend(): void

public function testLoadDbFixturesWithAppend(): void
{
$this->registerInitializableFixtureForDb(
'default',
ConnectionFixture1::class,
'default_connection',
true
);
$this->registerInitializableFixtureForDb(
'monolithic',
ConnectionFixture1::class,
'monolithic_connection',
false
);

$this->loadDbFixtures(
'default',
[ConnectionFixture1::class, ConnectionFixture1::class, ConnectionSqlFixture1::class],
Expand Down

0 comments on commit e257014

Please sign in to comment.