From c9fc4a44affbc3e6a64eba17feb675cfefc91852 Mon Sep 17 00:00:00 2001 From: as6325400 Date: Fri, 25 Oct 2024 01:32:02 +0800 Subject: [PATCH] add unittest to test that the problems page does not show page, statement, sample data before contest start. --- .../Controller/Team/ProblemControllerTest.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/webapp/tests/Unit/Controller/Team/ProblemControllerTest.php b/webapp/tests/Unit/Controller/Team/ProblemControllerTest.php index 1817a6136c..1c4810f35e 100644 --- a/webapp/tests/Unit/Controller/Team/ProblemControllerTest.php +++ b/webapp/tests/Unit/Controller/Team/ProblemControllerTest.php @@ -4,6 +4,7 @@ use App\Entity\Problem; use App\Entity\Testcase; +use App\Entity\Contest; use App\Tests\Unit\BaseTestCase; use Doctrine\ORM\EntityManagerInterface; use Generator; @@ -183,4 +184,41 @@ public function testInteractiveSamples(): void $response = $this->client->getResponse(); self::assertEquals(404, $response->getStatusCode()); } + + /** + * Test that the problems page does not show page, statement, sample data before contest start. + */ + public function testAccessProblemBeforeContestStarts(): void + { + /** @var EntityManagerInterface $em */ + $em = self::getContainer()->get(EntityManagerInterface::class); + + $contest = $em->getRepository(Contest::class)->findOneBy(['shortname' => 'demo']); + $originalStartTime = $contest->getStarttimeString(); + + $lastSpacePosition = strrpos($originalStartTime, ' '); + $datetime = substr($originalStartTime, 0, $lastSpacePosition); + $timezone = substr($originalStartTime, $lastSpacePosition + 1); + $contest->setStarttimeString(date('Y-m-d H:i:s', strtotime('+3600 seconds', strtotime($datetime))) . ' ' . $timezone)->updateTimes(); + + $this->withChangedConfiguration('public_access_before_contest', true, function () { + $this->client->request('GET', '/public/problems'); + static::assertSelectorTextContains('.nav-item .nav-link.disabled', 'Problems'); + static::assertSelectorTextContains('.alert.alert-secondary', 'No problem texts available at this point.'); + + for ($i = 1; $i <= 3; $i++) { + $endpoints = [ + "/team/problems/{$i}/statement", + "/team/problems/{$i}/samples.zip" + ]; + + foreach ($endpoints as $endpoint) { + $this->client->request('GET', $endpoint); + $statusCode = $this->client->getResponse()->getStatusCode(); + static::assertSame(404, $statusCode, "Expected status code 404, got {$statusCode} for {$endpoint}"); + } + } + }); + $contest->setStarttimeString($originalStartTime)->updateTimes(); + } }