Skip to content

Latest commit

 

History

History
83 lines (64 loc) · 2.48 KB

scenarios.md

File metadata and controls

83 lines (64 loc) · 2.48 KB

Scenarios

You can create scenarios that will persist a multitude of test fixtures. This can be useful to seed your test database with a reusable set of data.

Use the CakephpFixtureFactories\Scenario\ScenarioAwareTrait in your test and load your scenario with the loadFixtureScenario() method. You can either provide the fully qualified name of the scenario class, or place your scenarios under the App\Test\Scenario namespace.

Example:

$authors = $this->loadFixtureScenario('NAustralianAuthors', 3);

will persist 3 authors associated to the country Australia, as defined here:

use CakephpFixtureFactories\Scenario\FixtureScenarioInterface;
use CakephpFixtureFactories\Test\Factory\AuthorFactory;
use TestApp\Model\Entity\Author;

class NAustralianAuthorsScenario implements FixtureScenarioInterface
{
    const COUNTRY_NAME = 'Australia';

    /**
     * @param int $n the number of authors
     * @return Author|Author[]
     */
    public function load($n = 1, ...$args)
    {
        return AuthorFactory::make($n)->fromCountry(self::COUNTRY_NAME)->persist();
    }
}

Scenarios should implement the CakephpFixtureFactories\Scenario\FixtureScenarioInterface class. This test provides an example on how to use scenarios:

namespace CakephpFixtureFactories\Test\TestCase\Scenario;

use Cake\ORM\Query;
use Cake\TestSuite\TestCase;
use CakephpFixtureFactories\Scenario\ScenarioAwareTrait;
use CakephpFixtureFactories\Test\Factory\AuthorFactory;
use CakephpFixtureFactories\Test\Scenario\NAustralianAuthorsScenario;
use TestApp\Model\Entity\Author;

class FixtureScenarioTest extends TestCase
{
    use ScenarioAwareTrait;

    public function testLoadScenario()
    {
        /** @var Author[] $authors */
        $authors = $this->loadFixtureScenario(NAustralianAuthorsScenario::class, 3) ?? [];
        
        $this->assertSame(3, $this->countAustralianAuthors());
        
        foreach ($authors as $author) {
            $this->assertInstanceOf(Author::class, $author);
            $this->assertSame(
                NAustralianAuthorsScenario::COUNTRY_NAME,
                $author->address->city->country->name
            );
        }
    }

    private function countAustralianAuthors(): int
    {
        return AuthorFactory::find()
            ->innerJoinWith('Address.City.Country', function (Query $q) {
                return $q->where(['Country.name' => NAustralianAuthorsScenario::COUNTRY_NAME]);
            })
            ->count();
    }
}