Skip to content

Commit

Permalink
Add mod group tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jskowronski39 committed Dec 29, 2023
1 parent 338e444 commit b1b5f42
Show file tree
Hide file tree
Showing 11 changed files with 604 additions and 1 deletion.
39 changes: 39 additions & 0 deletions src/DataFixtures/Mod/SteamWorkshop/Required/RhsAfrfModFixture.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace App\DataFixtures\Mod\SteamWorkshop\Required;

use App\Entity\Mod\Enum\ModTypeEnum;
use App\Entity\Mod\SteamWorkshopMod;
use App\Test\Traits\TimeTrait;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Ramsey\Uuid\Uuid;

class RhsAfrfModFixture extends Fixture
{
use TimeTrait;

public const ID = '91e0eaf1-3cf1-4b2c-98a9-a2d74a69fa76';
public const ITEM_ID = 843425103;

public function load(ObjectManager $manager): void
{
$this->withTimeFrozenAt('2020-01-01T00:00:00+00:00', function () use ($manager): void {
$mod = new SteamWorkshopMod(
Uuid::fromString(self::ID),
'RHS AFRF',
null,
null,
ModTypeEnum::REQUIRED,
self::ITEM_ID
);

$manager->persist($mod);
$manager->flush();

$this->addReference(self::ID, $mod);
});
}
}
39 changes: 39 additions & 0 deletions src/DataFixtures/Mod/SteamWorkshop/Required/RhsGrefModFixture.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace App\DataFixtures\Mod\SteamWorkshop\Required;

use App\Entity\Mod\Enum\ModTypeEnum;
use App\Entity\Mod\SteamWorkshopMod;
use App\Test\Traits\TimeTrait;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Ramsey\Uuid\Uuid;

class RhsGrefModFixture extends Fixture
{
use TimeTrait;

public const ID = 'a34b691c-50a2-475e-bd0a-43e707c45db5';
public const ITEM_ID = 843593391;

public function load(ObjectManager $manager): void
{
$this->withTimeFrozenAt('2020-01-01T00:00:00+00:00', function () use ($manager): void {
$mod = new SteamWorkshopMod(
Uuid::fromString(self::ID),
'RHS GREF',
null,
null,
ModTypeEnum::REQUIRED,
self::ITEM_ID
);

$manager->persist($mod);
$manager->flush();

$this->addReference(self::ID, $mod);
});
}
}
39 changes: 39 additions & 0 deletions src/DataFixtures/Mod/SteamWorkshop/Required/RhsUsafModFixture.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace App\DataFixtures\Mod\SteamWorkshop\Required;

use App\Entity\Mod\Enum\ModTypeEnum;
use App\Entity\Mod\SteamWorkshopMod;
use App\Test\Traits\TimeTrait;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Ramsey\Uuid\Uuid;

class RhsUsafModFixture extends Fixture
{
use TimeTrait;

public const ID = 'a37a6a74-3e82-4955-a836-0732d7816cc1';
public const ITEM_ID = 843577117;

public function load(ObjectManager $manager): void
{
$this->withTimeFrozenAt('2020-01-01T00:00:00+00:00', function () use ($manager): void {
$mod = new SteamWorkshopMod(
Uuid::fromString(self::ID),
'RHS USAF',
null,
null,
ModTypeEnum::REQUIRED,
self::ITEM_ID
);

$manager->persist($mod);
$manager->flush();

$this->addReference(self::ID, $mod);
});
}
}
53 changes: 53 additions & 0 deletions src/DataFixtures/ModGroup/RhsModGroupFixture.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

declare(strict_types=1);

namespace App\DataFixtures\ModGroup;

use App\DataFixtures\Mod\SteamWorkshop\Required\RhsAfrfModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\RhsGrefModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\RhsUsafModFixture;
use App\Entity\ModGroup\ModGroup;
use App\Test\Traits\TimeTrait;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Ramsey\Uuid\Uuid;

class RhsModGroupFixture extends Fixture implements DependentFixtureInterface
{
use TimeTrait;

public const ID = '33191331-2a40-4d95-ba18-d4a75b1d43d4';
public const NAME = 'RHS';

public function load(ObjectManager $manager): void
{
$this->withTimeFrozenAt('2020-01-01T00:00:00+00:00', function () use ($manager): void {
$modGroup = new ModGroup(
Uuid::fromString(self::ID),
self::NAME,
null,
[
$this->getReference(RhsAfrfModFixture::ID),
$this->getReference(RhsGrefModFixture::ID),
$this->getReference(RhsUsafModFixture::ID),
]
);

$manager->persist($modGroup);
$manager->flush();

$this->addReference(self::ID, $modGroup);
});
}

public function getDependencies(): array
{
return [
RhsAfrfModFixture::class,
RhsGrefModFixture::class,
RhsUsafModFixture::class,
];
}
}
9 changes: 9 additions & 0 deletions src/DataFixtures/ModList/DefaultModListFixture.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@
use App\DataFixtures\Mod\SteamWorkshop\Required\CupWeaponsModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\Deprecated\LegacyArmaForcesModsModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\Disabled\ArmaForcesJbadBuildingFixModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\RhsAfrfModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\RhsGrefModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\RhsUsafModFixture;
use App\DataFixtures\ModGroup\CupModGroupFixture;
use App\DataFixtures\ModGroup\RhsModGroupFixture;
use App\Entity\ModList\ModList;
use App\Test\Traits\TimeTrait;
use Doctrine\Bundle\FixturesBundle\Fixture;
Expand Down Expand Up @@ -56,9 +60,14 @@ public function load(ObjectManager $manager): void
$this->getReference(CupUnitsModFixture::ID),
$this->getReference(CupVehiclesModFixture::ID),
$this->getReference(CupWeaponsModFixture::ID),

$this->getReference(RhsAfrfModFixture::ID),
$this->getReference(RhsGrefModFixture::ID),
$this->getReference(RhsUsafModFixture::ID),
],
[
$this->getReference(CupModGroupFixture::ID),
$this->getReference(RhsModGroupFixture::ID),
],
[
$this->getReference(CslaIronCurtainDlcFixture::ID),
Expand Down
6 changes: 5 additions & 1 deletion src/Validator/ModGroup/UniqueModGroupNameValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@ public function validate(mixed $value, Constraint $constraint): void
}

$name = $value->getName();
if ('' === $name || null === $name) {
return;
}

$id = $value->getId();
if (!$name || $this->isColumnValueUnique(ModGroup::class, ['name' => $name], $id)) {
if ($this->isColumnValueUnique(ModGroup::class, ['name' => $name], $id)) {
return;
}

Expand Down
29 changes: 29 additions & 0 deletions tests/_support/FunctionalTester.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,33 @@ public function dontSeeActionButton(string $tooltip, string $url = null): void
}
$this->dontSeeElement($selector);
}

public function checkTableRowCheckbox(string $value): void
{
$this->checkOption(sprintf('[value="%s"]', $value));
}

public function uncheckTableRowCheckbox(string $value): void
{
$this->uncheckOption(sprintf('[value="%s"]', $value));
}

public function seeTableRowCheckboxesAreChecked(array $values = []): void
{
$valueSelector = array_map(fn (string $value) => sprintf('[value="%s"]', $value), $values);
$checkboxSelector = implode(', ', $valueSelector);

$this->seeCheckboxIsChecked($checkboxSelector);
}

public function seeTableRowCheckboxesAreUnchecked(string $idPrefix, array $valuesToExclude = []): void
{
$checkboxSelector = sprintf('[id^="%s"]', $idPrefix);
if ($valuesToExclude) {
$valueSelector = array_map(fn (string $value) => sprintf(':not([value^="%s"])', $value), $valuesToExclude);
$checkboxSelector .= implode('', $valueSelector);
}

$this->dontSeeCheckboxIsChecked($checkboxSelector);
}
}
118 changes: 118 additions & 0 deletions tests/functional/Web/ModGroup/CreateModGroupCest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?php

declare(strict_types=1);

namespace App\Tests\Functional\Web\ModGroup;

use App\DataFixtures\Mod\SteamWorkshop\Required\CupTerrainsCoreModFixture;
use App\DataFixtures\Mod\SteamWorkshop\Required\CupTerrainsMapsModFixture;
use App\DataFixtures\User\RegularUserFixture;
use App\Entity\Mod\AbstractMod;
use App\Entity\ModGroup\ModGroup;
use App\Entity\User\User;
use App\Tests\FunctionalTester;
use Symfony\Component\HttpFoundation\Response;

class CreateModGroupCest
{
public function _before(FunctionalTester $I): void
{
$I->stopFollowingRedirects();
$I->freezeTime('2020-01-01T00:00:00+00:00');
}

public function createModGroupAsUnauthenticatedUser(FunctionalTester $I): void
{
$I->amOnPage('/mod-group/create');
$I->seeResponseRedirectsToDiscordAuth();
}

public function createModGroupAsUnauthorizedUser(FunctionalTester $I): void
{
$I->amDiscordAuthenticatedAs(RegularUserFixture::ID);

$I->amOnPage('/mod-group/create');
$I->seeResponseCodeIs(Response::HTTP_FORBIDDEN);
}

public function createModGroupAsAuthorizedUser(FunctionalTester $I): void
{
$user = $I->amDiscordAuthenticatedAs(RegularUserFixture::ID, function (User $user): void {
$user->getPermissions()->modGroupCreate = true;
});

$I->amOnPage('/mod-group/create');

// Default form values
$I->seeInField('Mod group name', '');
$I->seeInField('Mod group description', '');
$I->seeTableRowCheckboxesAreUnchecked('mod_group_form_mods_'); // All checkboxes are unchecked

// Fill form
$I->fillField('Mod group name', 'CUP Terrains');
$I->fillField('Mod group description', 'Terrains for CUP');
$I->checkTableRowCheckbox(CupTerrainsCoreModFixture::ID);
$I->checkTableRowCheckbox(CupTerrainsMapsModFixture::ID);
$I->click('Create mod group');

$I->seeResponseRedirectsTo('/mod-group/list');

/** @var ModGroup $modGroup */
$modGroup = $I->grabEntityFromRepository(ModGroup::class, ['name' => 'CUP Terrains']);
$I->assertSame('CUP Terrains', $modGroup->getName());
$I->assertSame('Terrains for CUP', $modGroup->getDescription());
$I->assertSame([
CupTerrainsCoreModFixture::ID,
CupTerrainsMapsModFixture::ID,
], array_map(fn (AbstractMod $mod) => $mod->getId()->toString(), $modGroup->getMods()));

$I->assertSame('2020-01-01T00:00:00+00:00', $modGroup->getCreatedAt()->format(DATE_ATOM));
// $I->assertSame($user, $modGroup->getCreatedBy()); // FIXME
$I->assertSame(null, $modGroup->getLastUpdatedAt());
$I->assertSame(null, $modGroup->getLastUpdatedBy());
}

public function createModGroupAsAuthorizedUserWhenModGroupAlreadyExists(FunctionalTester $I): void
{
$I->amDiscordAuthenticatedAs(RegularUserFixture::ID, function (User $user): void {
$user->getPermissions()->modGroupCreate = true;
});

$I->amOnPage('/mod-group/create');

$I->fillField('Mod group name', 'CUP');
$I->click('Create mod group');

$I->canSeeFormErrorMessage('name', 'Mod group with the same name "CUP" already exist.');
}

public function createModGroupAsAuthorizedUserWithoutRequiredData(FunctionalTester $I): void
{
$I->amDiscordAuthenticatedAs(RegularUserFixture::ID, function (User $user): void {
$user->getPermissions()->modGroupCreate = true;
});

$I->amOnPage('/mod-group/create');

$I->fillField('Mod group name', '');
$I->click('Create mod group');

$I->canSeeFormErrorMessage('name', 'This value should not be blank.');
}

public function createModGroupAsAuthorizedUserWithDataTooLong(FunctionalTester $I): void
{
$I->amDiscordAuthenticatedAs(RegularUserFixture::ID, function (User $user): void {
$user->getPermissions()->modGroupCreate = true;
});

$I->amOnPage('/mod-group/create');

$I->fillField('Mod group name', str_repeat('a', 256));
$I->fillField('Mod group description', str_repeat('a', 256));
$I->click('Create mod group');

$I->canSeeFormErrorMessage('name', 'This value is too long. It should have 255 characters or less.');
$I->canSeeFormErrorMessage('description', 'This value is too long. It should have 255 characters or less.');
}
}
Loading

0 comments on commit b1b5f42

Please sign in to comment.