7 dokumentów w .paul/codebase/ — overview, stack, architecture, conventions, testing, integrations, concerns (CRITICAL→LOW). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
Testing
Generated: 2026-04-26
Framework
- PHPUnit 10.5+ (
phpunit/phpunitincomposer.jsondev) - Config:
phpunit.xmlat project root - Bootstrap:
tests/bootstrap.php
Structure
tests/
├── bootstrap.php Test bootstrap (PSR-4 autoload for Domain\)
├── stubs/
│ ├── CacheHandler.php In-memory stub (replaces file-based cache)
│ └── S.php Helper facade stub
└── Unit/
└── Domain/
├── Languages/LanguagesRepositoryTest.php
├── Settings/SettingsRepositoryTest.php
└── User/UserRepositoryTest.php
Bootstrap Setup
tests/bootstrap.php:
- Loads Medoo ORM (
libraries/medoo/medoo.php) - Loads stubs before autoloader (to override
Shared\Cache\CacheHandler) - Registers PSR-4 autoloader for
Domain\namespace only
Critical: Stubs must be loaded before autoloader. CacheHandler stub provides reset() method for test isolation.
Test Pattern
All tests follow AAA (Arrange-Act-Assert) with Medoo mocked:
namespace Tests\Unit\Domain\Languages;
use Domain\Languages\LanguagesRepository;
use PHPUnit\Framework\TestCase;
class LanguagesRepositoryTest extends TestCase {
private function mockDb(): object {
return $this->createMock(\medoo::class);
}
protected function setUp(): void {
\Shared\Cache\CacheHandler::reset(); // clear in-memory cache
}
public function testLanguagesListReturnsArray(): void {
$db = $this->mockDb();
$db->method('select')->willReturn([['id' => 'pl', 'name' => 'Polski']]);
$repo = new LanguagesRepository($db);
$result = $repo->languagesList();
$this->assertSame([['id' => 'pl', 'name' => 'Polski']], $result);
}
public function testLanguagesListReturnsEmptyWhenNull(): void {
$db = $this->mockDb();
$db->method('select')->willReturn(null);
$this->assertSame([], (new LanguagesRepository($db))->languagesList());
}
public function testActiveLanguagesQueriesDbAndCaches(): void {
$expected = [['id' => 'pl', 'name' => 'Polski', 'domain' => null]];
$db = $this->mockDb();
$db->expects($this->once())->method('select')->willReturn($expected);
$repo = new LanguagesRepository($db);
$this->assertSame($expected, $repo->activeLanguages());
$this->assertSame($expected, $repo->activeLanguages()); // 2nd call hits cache
}
}
Stubs
tests/stubs/CacheHandler.php
In-memory replacement for Shared\Cache\CacheHandler:
static::$store— array key-value storereset()— clear all stored values (call insetUp())fetch($key)— return stored value orfalsestore($key, $value, $ttl)— store value (TTL ignored)delete($key)— remove value
tests/stubs/S.php
Stub for the \S global helper facade — prevents tests from hitting real filesystem/session code.
Coverage
Currently tested: Domain layer only
Domain\Languages\LanguagesRepository✓Domain\Settings\SettingsRepository✓Domain\User\UserRepository✓- All other Domain repositories: no tests yet
Not tested:
admin\controls\*— static controllersadmin\factory\*— deprecated wrappersfront\*— frontend layerShared\*— utilities- AJAX handlers
Running Tests
composer test
# or
./vendor/bin/phpunit
Adding Tests for New Repositories
When adding a new Domain\{Entity}\{Entity}Repository:
- Create
tests/Unit/Domain/{Entity}/{Entity}RepositoryTest.php - Call
\Shared\Cache\CacheHandler::reset()insetUp()if the repo uses caching - Mock
\medoovia$this->createMock(\medoo::class) - Test: null-to-empty-array coercion, cache hit (expects
once()), write returns expected type