Files
myep-team/tests/Entity/StaffingRuleTest.php

65 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Entity;
use App\Entity\StaffingRule;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Validation;
class StaffingRuleTest extends TestCase
{
public function testTheProductCodeIsNormalized(): void
{
$this->assertSame('DPWAST', (new StaffingRule())->setProductCode(' dpwast ')->getProductCode());
$this->assertNull((new StaffingRule())->setProductCode(' ')->getProductCode());
}
#[DataProvider('combinations')]
public function testTheCombinationIsValidated(StaffingRule $rule, array $expectedPaths): void
{
$violations = Validation::createValidator()->validate($rule, new Callback('validateCombination'));
$paths = [];
foreach ($violations as $violation) {
$paths[] = $violation->getPropertyPath();
}
$this->assertSame($expectedPaths, $paths);
}
public static function combinations(): iterable
{
yield 'guides only' => [self::rule(2), []];
yield 'both levels taken over, a guide each' => [self::rule(2, beginner: true, advanced: true, splitBeginner: true, splitAdvanced: true), []];
yield 'one guide takes over one of two levels' => [self::rule(1, beginner: true, advanced: true, splitAdvanced: true), []];
yield 'more levels taken over than guides' => [self::rule(1, beginner: true, advanced: true, splitBeginner: true, splitAdvanced: true), ['guides']];
yield 'taking over a level that is off' => [self::rule(2, advanced: true, splitBeginner: true), ['splitBeginner']];
yield 'guiding without a guide' => [self::rule(0, beginner: true, guiding: true), ['guiding']];
yield 'courses without guides' => [self::rule(0, beginner: true), []];
}
private static function rule(
int $guides,
bool $beginner = false,
bool $advanced = false,
bool $splitBeginner = false,
bool $splitAdvanced = false,
bool $guiding = false,
): StaffingRule {
return (new StaffingRule())
->setProductCode('DKIMP')
->setGuides($guides)
->setSkiBeginner($beginner)
->setSkiAdvanced($advanced)
->setSplitBeginner($splitBeginner)
->setSplitAdvanced($splitAdvanced)
->setGuiding($guiding)
;
}
}