* @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('Factory Examples')] class FactoryExampleTest extends WebTestCase { #[Test] #[TestDox('Creates a verified user with UserFactory')] public function createUser(): void { $user = UserFactory::createOne(); self::assertInstanceOf(User::class, $user->_real()); self::assertNotNull($user->username); self::assertNotNull($user->email); self::assertTrue($user->isVerified); } #[Test] #[TestDox('Creates an unverified user')] public function createUnverifiedUser(): void { $user = UserFactory::createOne(['isVerified' => false]); self::assertFalse($user->isVerified); } #[Test] #[TestDox('Creates multiple users at once')] public function createMultipleUsers(): void { UserFactory::createMany(5); self::assertCount(5, UserFactory::repository()->findAll()); } #[Test] #[TestDox('Creates an anonymous gamer with guest username')] public function createAnonymousGamer(): void { $gamer = GamerFactory::new()->anonymous()->create(); self::assertStringStartsWith('Guest_', $gamer->userName); self::assertNotNull($gamer->ip); self::assertNotNull($gamer->connTimestamp); } #[Test] #[TestDox('Creates a game with two registered players')] public function createGameWithRegisteredPlayers(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->create(); self::assertInstanceOf(PlayedGame::class, $game->_real()); self::assertNotNull($game->red); self::assertNotNull($game->blue); self::assertNull($game->redAnon); self::assertNull($game->blueAnon); } #[Test] #[TestDox('Creates a game with two anonymous players')] public function createGameWithAnonymousPlayers(): void { $game = PlayedGameFactory::new() ->withAnonymousPlayers() ->create(); self::assertNull($game->red); self::assertNull($game->blue); self::assertNotNull($game->redAnon); self::assertNotNull($game->blueAnon); } #[Test] #[TestDox('Creates a finished game where red player wins')] public function createFinishedGame(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->redWins() ->create(); self::assertEquals(26, $game->redPoints); self::assertLessThan(26, $game->bluePoints); } #[Test] #[TestDox('Creates a game with multiple steps from both players')] public function createGameWithSteps(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->create(); StepFactory::new() ->forPlayer('red') ->mine() ->create(['playedGame' => $game]); StepFactory::new() ->forPlayer('red') ->mine() ->create(['playedGame' => $game]); StepFactory::new() ->forPlayer('red') ->mine() ->create(['playedGame' => $game]); StepFactory::new() ->forPlayer('blue') ->safe() ->create(['playedGame' => $game]); StepFactory::new() ->forPlayer('blue') ->safe() ->create(['playedGame' => $game]); self::assertCount(5, StepFactory::repository()->findAll()); } #[Test] #[TestDox('Creates a game with a 16x16 grid')] public function createGameWithGrid(): void { $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->create(); $grid = GridFactory::createOne(['playedGame' => $game]); self::assertCount(16, $grid->gridRow); } #[Test] #[TestDox('Creates a WebAuthn credential for a user')] public function createWebAuthnCredential(): void { $user = UserFactory::createOne(); $credential = WebAuthnCredentialFactory::new() ->withName('YubiKey 5C') ->recentlyUsed() ->create(['user' => $user]); self::assertEquals($user->_real(), $credential->user); self::assertEquals('YubiKey 5C', $credential->credentialName); self::assertNotNull($credential->lastUsedAt); } #[Test] #[TestDox('Creates a contact message with consent')] public function createContactMessage(): void { $message = ContactMessageFactory::createOne(); self::assertNotNull($message->name); self::assertNotNull($message->email); self::assertNotNull($message->content); self::assertTrue($message->consent); self::assertNotNull($message->createdAt); } #[Test] #[TestDox('Tests are isolated - database is reset between tests')] public function databaseIsolation(): void { UserFactory::createMany(3); self::assertCount(3, UserFactory::repository()->findAll()); /** Database will be reset before next test due to ResetDatabase trait */ } }