109 lines
2.9 KiB
Markdown
109 lines
2.9 KiB
Markdown
|
|
# 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).
|