v7.0.0-beta.2 release

This commit is contained in:
HeuJung
2026-04-20 20:37:49 +09:00
parent 6595fd0eb5
commit fa8eba7a0d
1165 changed files with 107118 additions and 762127 deletions
@@ -0,0 +1,105 @@
<?php
namespace Tests\Unit\Extension;
use App\Extension\AbstractModule;
use App\Extension\ModuleManager;
use Mockery;
use ReflectionClass;
use Tests\TestCase;
/**
* resolveForceUpdateSource() 회귀 테스트.
*
* PO 정책 (2026-04-14): --force 시 번들 우선, 번들 없으면 GitHub 폴백.
*
* 본 테스트는 ModuleManager 의 private 메서드를 Reflection으로 직접 검증한다.
* AbstractModule 은 getIdentifier/getVendor 가 final 이므로 Mockery 로 모킹한다.
*/
class ModuleForceUpdateSourceTest extends TestCase
{
protected function tearDown(): void
{
Mockery::close();
parent::tearDown();
}
private function invokeResolve(ModuleManager $manager, string $identifier): ?string
{
$reflection = new ReflectionClass($manager);
$method = $reflection->getMethod('resolveForceUpdateSource');
$method->setAccessible(true);
return $method->invoke($manager, $identifier);
}
private function setBundledModules(ModuleManager $manager, array $bundled): void
{
$reflection = new ReflectionClass($manager);
$prop = $reflection->getProperty('bundledModules');
$prop->setAccessible(true);
$prop->setValue($manager, $bundled);
}
private function setLoadedModules(ModuleManager $manager, array $modules): void
{
$reflection = new ReflectionClass($manager);
$prop = $reflection->getProperty('modules');
$prop->setAccessible(true);
$prop->setValue($manager, $modules);
}
private function makeFakeModule(?string $githubUrl): AbstractModule
{
$mock = Mockery::mock(AbstractModule::class);
$mock->shouldReceive('getGithubUrl')->andReturn($githubUrl);
return $mock;
}
public function test_resolves_bundled_when_in_memory_cache(): void
{
$manager = app(ModuleManager::class);
$this->setBundledModules($manager, [
'test-mod' => ['version' => '1.0.0'],
]);
$this->assertSame('bundled', $this->invokeResolve($manager, 'test-mod'));
}
public function test_resolves_github_when_no_bundle_but_github_url_present(): void
{
$manager = app(ModuleManager::class);
$this->setBundledModules($manager, []);
$this->setLoadedModules($manager, [
'test-mod' => $this->makeFakeModule('https://github.com/test/repo'),
]);
$this->assertSame('github', $this->invokeResolve($manager, 'test-mod'));
}
public function test_returns_null_when_neither_bundle_nor_github_available(): void
{
$manager = app(ModuleManager::class);
$this->setBundledModules($manager, []);
$this->setLoadedModules($manager, [
'test-mod' => $this->makeFakeModule(null),
]);
$this->assertNull($this->invokeResolve($manager, 'test-mod'));
}
public function test_prefers_bundled_over_github_when_both_exist(): void
{
$manager = app(ModuleManager::class);
// 번들과 GitHub 모두 존재하는 시나리오 — PO 정책상 bundled 우선
$this->setBundledModules($manager, [
'test-mod' => ['version' => '1.0.0'],
]);
$this->setLoadedModules($manager, [
'test-mod' => $this->makeFakeModule('https://github.com/test/repo'),
]);
$this->assertSame('bundled', $this->invokeResolve($manager, 'test-mod'));
}
}