* @category Class * @license https://www.gnu.org/licenses/lgpl-3.0.en.html GNU Lesser General Public License * @link www.splendidbear.org * @since 2026. 04. 21. */ #[TestDox('Profile Controller')] class ProfileControllerTest extends WebTestCase { private KernelBrowser $client; protected function setUp(): void { parent::setUp(); $this->client = static::createClient(); } #[Test] #[TestDox('Profile page requires authentication')] public function profilePageRequiresAuthentication(): void { $this->client->request('GET', '/profile'); self::assertResponseRedirects('/login'); } #[Test] #[TestDox('Profile security page requires authentication')] public function profileSecurityPageRequiresAuthentication(): void { $this->client->request('GET', '/profile/security'); self::assertResponseRedirects('/login'); } #[Test] #[TestDox('Profile avatar upload requires authentication')] public function profileAvatarPageRequiresAuthentication(): void { $this->client->request('POST', '/profile/avatar'); self::assertResponseRedirects('/login'); } #[Test] #[TestDox('Battle share page returns 404 for non-existent game')] public function battleSharePageReturns404ForNonExistentGame(): void { $uuid = '00000000-0000-4000-a000-000000000000'; $this->client->request('GET', '/battle/' . $uuid); self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } #[Test] #[TestDox('Battle share page displays valid game details')] public function battleSharePageShowsValidGame(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->redWins() ->create(); $crawler = $this->client->request('GET', '/battle/' . $game->uuid); self::assertResponseIsSuccessful(); self::assertSelectorExists('h1'); self::assertGreaterThan(0, $crawler->filter('body')->count()); } #[Test] #[TestDox('Battle share page has Open Graph meta tags for social sharing')] public function battleSharePageHasOgMetaTags(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->redWins() ->create(); $this->client->request('GET', '/battle/' . $game->uuid); self::assertResponseIsSuccessful(); self::assertSelectorExists('meta[property="og:title"]'); self::assertSelectorExists('meta[property="og:image"]'); self::assertSelectorExists('meta[property="og:description"]'); self::assertSelectorExists('meta[property="og:type"]'); } #[Test] #[TestDox('OG battle image returns 404 for non-existent game')] public function ogBattleImageReturns404ForNonExistentGame(): void { $uuid = '00000000-0000-4000-a000-000000000000'; $this->client->request('GET', '/og/battle/' . $uuid . '.png'); self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } #[Test] #[TestDox('OG battle image generates valid PNG for existing game')] public function ogBattleImageReturnsImageForValidGame(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->redWins() ->create(); $this->client->request('GET', '/og/battle/' . $game->uuid . '.png'); self::assertResponseIsSuccessful(); self::assertResponseHeaderSame('Content-Type', 'image/png'); } #[Test] #[TestDox('Battle share page returns 404 for invalid UUID format')] public function battleSharePageWithInvalidUuidFormat(): void { $this->client->request('GET', '/battle/invalid-uuid'); self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } }