Skip to content

Commit 436bcbb

Browse files
committed
Add unit tests for multi-delete.
1 parent 1fed90f commit 436bcbb

File tree

5 files changed

+361
-0
lines changed

5 files changed

+361
-0
lines changed

webapp/tests/Unit/Controller/Jury/ProblemControllerTest.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Entity\Contest;
77
use App\Entity\Problem;
88
use App\Entity\ProblemAttachment;
9+
use App\Entity\ContestProblem;
910
use Doctrine\ORM\EntityManagerInterface;
1011
use Symfony\Component\DomCrawler\Crawler;
1112

@@ -114,4 +115,84 @@ public function testLockedContest(): void
114115
];
115116
self::assertTrue(array_intersect($titles, $unexpectedTitles) == []);
116117
}
118+
119+
public function testMultiDeleteProblems(): void
120+
{
121+
$this->roles = ['admin'];
122+
$this->logOut();
123+
$this->logIn();
124+
125+
/** @var EntityManagerInterface $em */
126+
$em = static::getContainer()->get(EntityManagerInterface::class);
127+
128+
// Get a contest to associate problems with
129+
$contest = $em->getRepository(Contest::class)->findOneBy(['shortname' => 'demo']);
130+
self::assertNotNull($contest, 'Demo contest not found.');
131+
132+
// Create some problems to delete
133+
$problemsData = [
134+
['name' => 'Problem 1 for multi-delete', 'externalid' => 'prob1md', 'shortname' => 'MDA'],
135+
['name' => 'Problem 2 for multi-delete', 'externalid' => 'prob2md', 'shortname' => 'MDB'],
136+
['name' => 'Problem 3 for multi-delete', 'externalid' => 'prob3md', 'shortname' => 'MDC'],
137+
];
138+
139+
$problemIds = [];
140+
$createdProblems = [];
141+
142+
foreach ($problemsData as $index => $data) {
143+
$problem = new Problem();
144+
$problem->setName($data['name']);
145+
$problem->setExternalid($data['externalid']);
146+
$em->persist($problem);
147+
148+
$contestProblem = new ContestProblem();
149+
$contestProblem->setProblem($problem);
150+
$contestProblem->setContest($contest);
151+
$contestProblem->setShortname($data['shortname']);
152+
$em->persist($contestProblem);
153+
154+
$createdProblems[] = $problem;
155+
}
156+
157+
$em->flush();
158+
159+
// Get the IDs of the newly created problems
160+
foreach ($createdProblems as $problem) {
161+
$problemIds[] = $problem->getProbid();
162+
}
163+
164+
$problem1Id = $problemIds[0];
165+
$problem2Id = $problemIds[1];
166+
$problem3Id = $problemIds[2];
167+
168+
// Verify problems exist before deletion
169+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
170+
foreach ([1, 2, 3] as $i) {
171+
self::assertSelectorExists('body:contains("Problem ' . $i . ' for multi-delete")');
172+
}
173+
174+
// Simulate multi-delete POST request
175+
$this->client->request(
176+
'POST',
177+
static::getContainer()->get('router')->generate('jury_problem_delete_multiple', ['ids' => [$problem1Id, $problem2Id]]),
178+
[
179+
'submit' => 'delete' // Assuming a submit button with name 'submit' and value 'delete'
180+
]
181+
);
182+
183+
$this->checkStatusAndFollowRedirect();
184+
185+
// Verify problems are deleted
186+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
187+
self::assertSelectorNotExists('body:contains("Problem 1 for multi-delete")');
188+
self::assertSelectorNotExists('body:contains("Problem 2 for multi-delete")');
189+
// Problem 3 should still exist
190+
self::assertSelectorExists('body:contains("Problem 3 for multi-delete")');
191+
192+
// Verify problem 3 can still be deleted individually
193+
$this->verifyPageResponse('GET', static::$baseUrl . '/' . $problem3Id . static::$delete, 200);
194+
$this->client->submitForm('Delete', []);
195+
$this->checkStatusAndFollowRedirect();
196+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
197+
}
117198
}

webapp/tests/Unit/Controller/Jury/TeamAffiliationControllerTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\DataFixtures\Test\SampleAffiliationsFixture;
66
use App\Entity\TeamAffiliation;
7+
use Doctrine\ORM\EntityManagerInterface;
78
use App\Service\ConfigurationService;
89

910
class TeamAffiliationControllerTest extends JuryControllerTestCase
@@ -49,6 +50,76 @@ class TeamAffiliationControllerTest extends JuryControllerTestCase
4950
['icpcid' => '|viol']],
5051
'Only letters, numbers, dashes, underscores and dots are allowed.' => [['externalid' => '()']]];
5152

53+
public function testMultiDeleteTeamAffiliations(): void
54+
{
55+
$this->roles = ['admin'];
56+
$this->logOut();
57+
$this->logIn();
58+
59+
/** @var EntityManagerInterface $em */
60+
$em = static::getContainer()->get(EntityManagerInterface::class);
61+
62+
// Create some team affiliations to delete
63+
$affiliationsData = [
64+
['name' => 'Affiliation 1 for multi-delete', 'shortname' => 'affil1md'],
65+
['name' => 'Affiliation 2 for multi-delete', 'shortname' => 'affil2md'],
66+
['name' => 'Affiliation 3 for multi-delete', 'shortname' => 'affil3md'],
67+
];
68+
69+
$affiliationIds = [];
70+
$createdAffiliations = [];
71+
72+
foreach ($affiliationsData as $data) {
73+
$affiliation = new TeamAffiliation();
74+
$affiliation
75+
->setName($data['name'])
76+
->setShortname($data['shortname']);
77+
$em->persist($affiliation);
78+
$createdAffiliations[] = $affiliation;
79+
}
80+
81+
$em->flush();
82+
83+
// Get the IDs of the newly created affiliations
84+
foreach ($createdAffiliations as $affiliation) {
85+
$affiliationIds[] = $affiliation->getAffilid();
86+
}
87+
88+
$affiliation1Id = $affiliationIds[0];
89+
$affiliation2Id = $affiliationIds[1];
90+
$affiliation3Id = $affiliationIds[2];
91+
92+
// Verify affiliations exist before deletion
93+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
94+
foreach ([1, 2, 3] as $i) {
95+
self::assertSelectorExists(sprintf('body:contains("Affiliation %d for multi-delete")', $i));
96+
}
97+
98+
// Simulate multi-delete POST request
99+
$this->client->request(
100+
'POST',
101+
static::getContainer()->get('router')->generate('jury_team_affiliation_delete_multiple', ['ids' => [$affiliation1Id, $affiliation2Id]]),
102+
[
103+
'submit' => 'delete'
104+
]
105+
);
106+
107+
$this->checkStatusAndFollowRedirect();
108+
109+
// Verify affiliations are deleted
110+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
111+
self::assertSelectorNotExists('body:contains("Affiliation 1 for multi-delete")');
112+
self::assertSelectorNotExists('body:contains("Affiliation 2 for multi-delete")');
113+
// Affiliation 3 should still exist
114+
self::assertSelectorExists('body:contains("Affiliation 3 for multi-delete")');
115+
116+
// Verify affiliation 3 can still be deleted individually
117+
$this->verifyPageResponse('GET', static::$baseUrl . '/' . $affiliation3Id . static::$delete, 200);
118+
$this->client->submitForm('Delete', []);
119+
$this->checkStatusAndFollowRedirect();
120+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
121+
}
122+
52123
protected function helperProvideTranslateAddEntity(array $entity, array $expected): array
53124
{
54125
$config = static::getContainer()->get(ConfigurationService::class);

webapp/tests/Unit/Controller/Jury/TeamCategoryControllerTest.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Tests\Unit\Controller\Jury;
44

55
use App\Entity\TeamCategory;
6+
use Doctrine\ORM\EntityManagerInterface;
67

78
class TeamCategoryControllerTest extends JuryControllerTestCase
89
{
@@ -55,6 +56,74 @@ class TeamCategoryControllerTest extends JuryControllerTestCase
5556
'Only letters, numbers, dashes, underscores and dots are allowed.' => [['externalid' => 'yes|']],
5657
'This value should not be blank.' => [['name' => '']]];
5758

59+
public function testMultiDeleteTeamCategories(): void
60+
{
61+
$this->roles = ['admin'];
62+
$this->logOut();
63+
$this->logIn();
64+
65+
/** @var EntityManagerInterface $em */
66+
$em = static::getContainer()->get(EntityManagerInterface::class);
67+
68+
// Create some team categories to delete
69+
$categoriesData = [
70+
['name' => 'Category 1 for multi-delete'],
71+
['name' => 'Category 2 for multi-delete'],
72+
['name' => 'Category 3 for multi-delete'],
73+
];
74+
75+
$categoryIds = [];
76+
$createdCategories = [];
77+
78+
foreach ($categoriesData as $data) {
79+
$category = new TeamCategory();
80+
$category->setName($data['name']);
81+
$em->persist($category);
82+
$createdCategories[] = $category;
83+
}
84+
85+
$em->flush();
86+
87+
// Get the IDs of the newly created categories
88+
foreach ($createdCategories as $category) {
89+
$categoryIds[] = $category->getCategoryid();
90+
}
91+
92+
$category1Id = $categoryIds[0];
93+
$category2Id = $categoryIds[1];
94+
$category3Id = $categoryIds[2];
95+
96+
// Verify categories exist before deletion
97+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
98+
foreach ([1, 2, 3] as $i) {
99+
self::assertSelectorExists(sprintf('body:contains("Category %d for multi-delete")', $i));
100+
}
101+
102+
// Simulate multi-delete POST request
103+
$this->client->request(
104+
'POST',
105+
static::getContainer()->get('router')->generate('jury_team_category_delete_multiple', ['ids' => [$category1Id, $category2Id]]),
106+
[
107+
'submit' => 'delete'
108+
]
109+
);
110+
111+
$this->checkStatusAndFollowRedirect();
112+
113+
// Verify categories are deleted
114+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
115+
self::assertSelectorNotExists('body:contains("Category 1 for multi-delete")');
116+
self::assertSelectorNotExists('body:contains("Category 2 for multi-delete")');
117+
// Category 3 should still exist
118+
self::assertSelectorExists('body:contains("Category 3 for multi-delete")');
119+
120+
// Verify category 3 can still be deleted individually
121+
$this->verifyPageResponse('GET', static::$baseUrl . '/' . $category3Id . static::$delete, 200);
122+
$this->client->submitForm('Delete', []);
123+
$this->checkStatusAndFollowRedirect();
124+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
125+
}
126+
58127
protected function helperProvideTranslateAddEntity(array $entity, array $expected): array
59128
{
60129
return [$entity, $expected];

webapp/tests/Unit/Controller/Jury/TeamControllerTest.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,74 @@ class TeamControllerTest extends JuryControllerTestCase
9494
['icpcid' => '&viol', 'name' => 'icpcid violation-2']],
9595
'This value should not be blank.' => [['name' => '', 'displayName' => 'Teams should have a name']]];
9696

97+
public function testMultiDeleteTeams(): void
98+
{
99+
$this->roles = ['admin'];
100+
$this->logOut();
101+
$this->logIn();
102+
103+
/** @var EntityManagerInterface $em */
104+
$em = static::getContainer()->get(EntityManagerInterface::class);
105+
106+
// Create some teams to delete
107+
$teamsData = [
108+
['name' => 'Team 1 for multi-delete'],
109+
['name' => 'Team 2 for multi-delete'],
110+
['name' => 'Team 3 for multi-delete'],
111+
];
112+
113+
$teamIds = [];
114+
$createdTeams = [];
115+
116+
foreach ($teamsData as $data) {
117+
$team = new Team();
118+
$team->setName($data['name']);
119+
$em->persist($team);
120+
$createdTeams[] = $team;
121+
}
122+
123+
$em->flush();
124+
125+
// Get the IDs of the newly created teams
126+
foreach ($createdTeams as $team) {
127+
$teamIds[] = $team->getTeamid();
128+
}
129+
130+
$team1Id = $teamIds[0];
131+
$team2Id = $teamIds[1];
132+
$team3Id = $teamIds[2];
133+
134+
// Verify teams exist before deletion
135+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
136+
foreach ([1, 2, 3] as $i) {
137+
self::assertSelectorExists(sprintf('body:contains("Team %d for multi-delete")', $i));
138+
}
139+
140+
// Simulate multi-delete POST request
141+
$this->client->request(
142+
'POST',
143+
static::getContainer()->get('router')->generate('jury_team_delete_multiple', ['ids' => [$team1Id, $team2Id]]),
144+
[
145+
'submit' => 'delete'
146+
]
147+
);
148+
149+
$this->checkStatusAndFollowRedirect();
150+
151+
// Verify teams are deleted
152+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
153+
self::assertSelectorNotExists('body:contains("Team 1 for multi-delete")');
154+
self::assertSelectorNotExists('body:contains("Team 2 for multi-delete")');
155+
// Team 3 should still exist
156+
self::assertSelectorExists('body:contains("Team 3 for multi-delete")');
157+
158+
// Verify team 3 can still be deleted individually
159+
$this->verifyPageResponse('GET', static::$baseUrl . '/' . $team3Id . static::$delete, 200);
160+
$this->client->submitForm('Delete', []);
161+
$this->checkStatusAndFollowRedirect();
162+
$this->verifyPageResponse('GET', static::$baseUrl, 200);
163+
}
164+
97165
/**
98166
* Test that adding a team without a user and then editing it to add a user works.
99167
*/

0 commit comments

Comments
 (0)