Files
kimai2/tests/Event/WizardEventTest.php
2026-06-05 19:05:10 +02:00

163 lines
5.1 KiB
PHP

<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Event;
use App\Entity\User;
use App\Event\WizardEvent;
use App\Wizard\WizardStep;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
#[CoversClass(WizardEvent::class)]
class WizardEventTest extends TestCase
{
public function testGetUserReturnsConstructorArgument(): void
{
$user = new User();
$sut = new WizardEvent($user);
self::assertSame($user, $sut->getUser());
}
public function testInitiallyEmpty(): void
{
$sut = new WizardEvent(new User());
self::assertSame([], $sut->getSteps());
self::assertSame([], $sut->getWizards());
self::assertFalse($sut->hasStep('intro'));
self::assertNull($sut->getStep('intro'));
}
public function testAddStepAndAccessors(): void
{
$sut = new WizardEvent(new User());
$step = new WizardStep('intro', 'wizard_intro', 100);
$sut->addStep($step);
self::assertTrue($sut->hasStep('intro'));
self::assertSame($step, $sut->getStep('intro'));
self::assertSame([$step], $sut->getSteps());
}
public function testAddStepReplacesStepWithSameId(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
$replacement = new WizardStep('intro', 'wizard_intro_v2', 100);
$sut->addStep($replacement);
self::assertSame($replacement, $sut->getStep('intro'));
self::assertCount(1, $sut->getSteps());
}
public function testGetStepsIsSortedByOrderAscending(): void
{
$sut = new WizardEvent(new User());
$intro = new WizardStep('intro', 'wizard_intro', 100);
$profile = new WizardStep('profile', 'wizard_profile', 200);
$plugin = new WizardStep('plugin', 'plugin_step', 150);
// intentionally added out of order
$sut->addStep($profile);
$sut->addStep($intro);
$sut->addStep($plugin);
self::assertSame([$intro, $plugin, $profile], $sut->getSteps());
}
public function testRemoveStep(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
$sut->addStep(new WizardStep('profile', 'wizard_profile', 200));
$sut->removeStep('intro');
self::assertFalse($sut->hasStep('intro'));
self::assertTrue($sut->hasStep('profile'));
self::assertCount(1, $sut->getSteps());
}
public function testRemoveUnknownStepIsNoop(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
$sut->removeStep('does-not-exist');
self::assertCount(1, $sut->getSteps());
}
public function testAddWizardCreatesStepsInInsertionOrder(): void
{
$sut = new WizardEvent(new User());
$sut->addWizard('intro', 'wizard_intro');
$sut->addWizard('profile', 'wizard_profile');
$steps = $sut->getSteps();
self::assertCount(2, $steps);
self::assertSame('intro', $steps[0]->id);
self::assertSame('wizard_intro', $steps[0]->route);
self::assertSame('profile', $steps[1]->id);
self::assertSame('wizard_profile', $steps[1]->route);
// addWizard must assign ascending order values so insertion order is preserved
self::assertLessThan($steps[1]->order, $steps[0]->order);
}
public function testGetWizardsReturnsIdToRouteMapInOrder(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('profile', 'wizard_profile', 200));
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
self::assertSame(
['intro' => 'wizard_intro', 'profile' => 'wizard_profile'],
$sut->getWizards()
);
}
public function testGetNextWizardReturnsRouteOfFollowingStep(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
$sut->addStep(new WizardStep('profile', 'wizard_profile', 200));
self::assertSame('wizard_profile', $sut->getNextWizard('intro'));
}
public function testGetNextWizardReturnsFinishForLastStep(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
$sut->addStep(new WizardStep('profile', 'wizard_profile', 200));
self::assertSame('wizard_finish', $sut->getNextWizard('profile'));
}
public function testGetNextWizardReturnsFinishForUnknownStep(): void
{
$sut = new WizardEvent(new User());
$sut->addStep(new WizardStep('intro', 'wizard_intro', 100));
self::assertSame('wizard_finish', $sut->getNextWizard('does-not-exist'));
}
public function testGetNextWizardOnEmptyEventReturnsFinish(): void
{
$sut = new WizardEvent(new User());
self::assertSame('wizard_finish', $sut->getNextWizard('anything'));
}
}