v7.0.0-beta.2 release
This commit is contained in:
1 parent
6595fd0eb5
commit
fa8eba7a0d
1165 files changed
+107118
-762127
No files matched your search
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Http\Controllers\Base;
|
||||
|
||||
use App\Contracts\Extension\CacheInterface;
|
||||
use App\Http\Controllers\Api\Base\PublicBaseController;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* PublicBaseController::cached() 에러 응답 캐시 제외 검증.
|
||||
*
|
||||
* 확장 설치 직후·활성화 전 등의 일시적 상태에서 error 응답이 영구 캐시되어
|
||||
* 복구 후에도 잘못된 응답을 반환하던 문제를 방지하는 공용 룰 검증.
|
||||
*/
|
||||
class PublicBaseControllerCachedTest extends TestCase
|
||||
{
|
||||
private function invokeCached(callable $callback, string $key = 'test-key', int $ttl = 60): mixed
|
||||
{
|
||||
$controller = new class extends PublicBaseController {
|
||||
public function callCached(string $key, callable $callback, int $ttl): mixed
|
||||
{
|
||||
return $this->cached($key, $callback, $ttl);
|
||||
}
|
||||
};
|
||||
|
||||
return $controller->callCached($key, $callback, $ttl);
|
||||
}
|
||||
|
||||
public function test_success_response_is_cached(): void
|
||||
{
|
||||
$cache = app(CacheInterface::class);
|
||||
$cache->forget('test-success');
|
||||
|
||||
$calls = 0;
|
||||
$callback = function () use (&$calls) {
|
||||
$calls++;
|
||||
|
||||
return ['success' => true, 'data' => ['foo' => 'bar']];
|
||||
};
|
||||
|
||||
// 1회차 — 캐시 miss → callback 실행 + 저장
|
||||
$r1 = $this->invokeCached($callback, 'test-success');
|
||||
// 2회차 — 캐시 hit → callback 재실행 안 됨
|
||||
$r2 = $this->invokeCached($callback, 'test-success');
|
||||
|
||||
$this->assertEquals($r1, $r2);
|
||||
$this->assertEquals(1, $calls, 'success 응답은 캐시되어 callback 이 한 번만 실행되어야 함');
|
||||
|
||||
$cache->forget('test-success');
|
||||
}
|
||||
|
||||
public function test_error_response_is_not_cached(): void
|
||||
{
|
||||
$cache = app(CacheInterface::class);
|
||||
$cache->forget('test-error');
|
||||
|
||||
$calls = 0;
|
||||
$callback = function () use (&$calls) {
|
||||
$calls++;
|
||||
|
||||
return ['error' => 'template_not_found'];
|
||||
};
|
||||
|
||||
// 1회차 — callback 실행, 에러라 캐시 안 됨
|
||||
$r1 = $this->invokeCached($callback, 'test-error');
|
||||
// 2회차 — 여전히 캐시 miss, callback 재실행
|
||||
$r2 = $this->invokeCached($callback, 'test-error');
|
||||
|
||||
$this->assertEquals($r1, $r2);
|
||||
$this->assertEquals(2, $calls, 'error 응답은 캐시되지 않아 callback 이 매번 실행되어야 함');
|
||||
}
|
||||
|
||||
public function test_recovers_when_callback_stops_returning_error(): void
|
||||
{
|
||||
$cache = app(CacheInterface::class);
|
||||
$cache->forget('test-recover');
|
||||
|
||||
$callCount = 0;
|
||||
$callback = function () use (&$callCount) {
|
||||
$callCount++;
|
||||
|
||||
// 1~2회는 에러, 3회째부터 성공 (활성화 전 → 활성화 후 시뮬레이션)
|
||||
if ($callCount < 3) {
|
||||
return ['error' => 'template_not_found'];
|
||||
}
|
||||
|
||||
return ['success' => true, 'data' => ['recovered' => true]];
|
||||
};
|
||||
|
||||
$r1 = $this->invokeCached($callback, 'test-recover');
|
||||
$this->assertArrayHasKey('error', $r1);
|
||||
|
||||
$r2 = $this->invokeCached($callback, 'test-recover');
|
||||
$this->assertArrayHasKey('error', $r2);
|
||||
|
||||
// 3회째 — 성공 응답 반환되고 캐시에 저장
|
||||
$r3 = $this->invokeCached($callback, 'test-recover');
|
||||
$this->assertArrayHasKey('success', $r3);
|
||||
|
||||
// 4회째 — 캐시 hit
|
||||
$r4 = $this->invokeCached($callback, 'test-recover');
|
||||
$this->assertEquals($r3, $r4);
|
||||
$this->assertEquals(3, $callCount, '3번째 호출에서 성공 후 캐시되어 4번째는 callback 재실행 안 됨');
|
||||
|
||||
$cache->forget('test-recover');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Http\Requests;
|
||||
|
||||
use App\Http\Requests\Module\PerformModuleUpdateRequest;
|
||||
use App\Http\Requests\Plugin\PerformPluginUpdateRequest;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* 모듈/플러그인 업데이트 요청 검증 규칙 테스트.
|
||||
*
|
||||
* layout_strategy 와 vendor_mode 가 유효한 값만 수용하는지 확인.
|
||||
*/
|
||||
class PerformExtensionUpdateRequestTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider validLayoutStrategyProvider
|
||||
*/
|
||||
public function test_module_update_request_accepts_valid_layout_strategy(string $strategy): void
|
||||
{
|
||||
$rules = (new PerformModuleUpdateRequest())->rules();
|
||||
$validator = Validator::make(['layout_strategy' => $strategy], $rules);
|
||||
|
||||
$this->assertFalse($validator->fails(), "layout_strategy={$strategy} 은 유효해야 합니다");
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider validLayoutStrategyProvider
|
||||
*/
|
||||
public function test_plugin_update_request_accepts_valid_layout_strategy(string $strategy): void
|
||||
{
|
||||
$rules = (new PerformPluginUpdateRequest())->rules();
|
||||
$validator = Validator::make(['layout_strategy' => $strategy], $rules);
|
||||
|
||||
$this->assertFalse($validator->fails(), "layout_strategy={$strategy} 은 유효해야 합니다");
|
||||
}
|
||||
|
||||
public function test_module_update_request_rejects_invalid_layout_strategy(): void
|
||||
{
|
||||
$rules = (new PerformModuleUpdateRequest())->rules();
|
||||
$validator = Validator::make(['layout_strategy' => 'invalid'], $rules);
|
||||
|
||||
$this->assertTrue($validator->fails());
|
||||
$this->assertArrayHasKey('layout_strategy', $validator->errors()->toArray());
|
||||
}
|
||||
|
||||
public function test_plugin_update_request_rejects_invalid_layout_strategy(): void
|
||||
{
|
||||
$rules = (new PerformPluginUpdateRequest())->rules();
|
||||
$validator = Validator::make(['layout_strategy' => 'invalid'], $rules);
|
||||
|
||||
$this->assertTrue($validator->fails());
|
||||
$this->assertArrayHasKey('layout_strategy', $validator->errors()->toArray());
|
||||
}
|
||||
|
||||
public function test_module_update_request_layout_strategy_is_optional(): void
|
||||
{
|
||||
$rules = (new PerformModuleUpdateRequest())->rules();
|
||||
$validator = Validator::make([], $rules);
|
||||
|
||||
$this->assertFalse($validator->fails(), 'layout_strategy 미지정 시에도 통과해야 함');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider validVendorModeProvider
|
||||
*/
|
||||
public function test_module_update_request_accepts_valid_vendor_mode(string $mode): void
|
||||
{
|
||||
$rules = (new PerformModuleUpdateRequest())->rules();
|
||||
$validator = Validator::make(['vendor_mode' => $mode], $rules);
|
||||
|
||||
$this->assertFalse($validator->fails(), "vendor_mode={$mode} 은 유효해야 합니다");
|
||||
}
|
||||
|
||||
public function test_plugin_update_request_rejects_invalid_vendor_mode(): void
|
||||
{
|
||||
$rules = (new PerformPluginUpdateRequest())->rules();
|
||||
$validator = Validator::make(['vendor_mode' => 'invalid'], $rules);
|
||||
|
||||
$this->assertTrue($validator->fails());
|
||||
$this->assertArrayHasKey('vendor_mode', $validator->errors()->toArray());
|
||||
}
|
||||
|
||||
public static function validLayoutStrategyProvider(): array
|
||||
{
|
||||
return [
|
||||
'overwrite' => ['overwrite'],
|
||||
'keep' => ['keep'],
|
||||
];
|
||||
}
|
||||
|
||||
public static function validVendorModeProvider(): array
|
||||
{
|
||||
return [
|
||||
'auto' => ['auto'],
|
||||
'composer' => ['composer'],
|
||||
'bundled' => ['bundled'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user