# Tests Directory This directory contains all test files for the MineSeeker project. ## Quick Start ```bash # Run all tests (recommended) make test # Or with PHPUnit directly: vendor/bin/phpunit # Run specific test file vendor/bin/phpunit tests/Controller/ProfileControllerTest.php # Run with filter vendor/bin/phpunit --filter testCreateUser ``` ## Documentation For comprehensive testing documentation, see: - **[Testing Guide](../docs/testing/TESTING.md)** - Complete testing setup, best practices, troubleshooting - **[Factory Documentation](../docs/testing/FACTORIES.md)** - Detailed factory API reference ## Directory Structure ``` tests/ ├── Controller/ # HTTP endpoint tests ├── Dto/ # Data Transfer Object tests ├── Entity/ # Entity logic tests ├── Service/ # Service layer tests ├── Integration/ # Integration tests (example: FactoryExampleTest.php) ├── Factory/ # Foundry factory classes │ ├── UserFactory.php │ ├── GamerFactory.php │ ├── PlayedGameFactory.php │ ├── StepFactory.php │ ├── GridFactory.php │ ├── GridRowFactory.php │ ├── WebAuthnCredentialFactory.php │ └── ContactMessageFactory.php ├── WebTestCase.php # Base test class (extends this!) ├── bootstrap.php # PHPUnit bootstrap └── README.md # This file ``` ## Quick Factory Examples ```php use App\Tests\Factory\UserFactory; use App\Tests\Factory\PlayedGameFactory; use App\Tests\WebTestCase; class MyTest extends WebTestCase { public function testExample(): void { /** Create user */ $user = UserFactory::createOne(); /** Create game with registered players */ $game = PlayedGameFactory::new() ->withRegisteredPlayers() ->redWins() ->create(); /** Create multiple entities */ UserFactory::createMany(5); /** Access repository */ $users = UserFactory::repository()->findAll(); } } ``` ## Important Notes - **Always extend `App\Tests\WebTestCase`** - provides database isolation - **Use factories** - don't manually create entities with `new Entity()` - **Test database** - Tests run on `mineseeker_test`, never production - **Automatic rollback** - Each test is wrapped in a transaction ## Test Database Setup (One-time) ```bash # Create test database bin/console dbal:run-sql "CREATE DATABASE mineseeker_test" # Run migrations bin/console doctrine:migrations:migrate --env=test --no-interaction ``` ## Troubleshooting ### Tests interfering with each other? → Make sure your test extends `App\Tests\WebTestCase` ### Database schema out of sync? → Run `bin/console doctrine:migrations:migrate --env=test` ### Memory limit errors? → Run `php -d memory_limit=512M vendor/bin/phpunit` For more troubleshooting, see [Testing Guide](../docs/testing/TESTING.md#troubleshooting).