Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/Unit/Middleware/DetectDeviceTest.php
T
HeuJung 8b9bfd0c91 refactor(ecommerce,pay): 간편결제 브랜드 마크 카탈로그 편입 + 애플페이 iOS 게이팅 이관
3사 PG 플러그인의 체크아웃 DOM 인젝터가 렌더 후 브랜드 마크를 주입하고
injector끼리 같은 버튼을 두고 경합하던 구조를 제거한다. 시각정보(색 배지/
SVG 로고)를 결제수단 카탈로그(_cached_brand_mark)로 편입해 코어 체크아웃
레이아웃의 신규 BrandMark 컴포넌트가 데이터 기반으로 직접 렌더한다.
reconcileKginicisPatchedDuplicates(중복 방어)도 함께 제거했다.

애플페이 iOS 게이팅도 injector 밖으로 이관: 이커머스 모듈 DetectDevice
미들웨어가 UA로 기기를 판정해 코어 core.frontend.filter_app_config 훅으로
appConfig.isIos를 주입하고(1차), 템플릿 부트스트랩이 iPadOS 데스크탑 UA를
클라 신호로 보정한다(2차). 코어는 훅만 제공하고 감지 로직은 모듈이 소유한다.

미들웨어는 Router::pushMiddlewareToGroup 이 아닌 HTTP Kernel::appendMiddlewareToGroup
으로 web 그룹에 등록한다(전자는 Router 레지스트리만 갱신해 SSR 셸 요청 파이프라인에
미반영 → isIos 항상 false). sirsoft-gdpr 선례와 동일.

코어 최소 요구 버전 7.0.5 상향(appConfig 필터 훅 도입).
2026-07-15 17:50:39 +09:00

81 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Modules\Sirsoft\Ecommerce\Tests\Unit\Middleware;
use App\Extension\HookManager;
use App\Services\SettingsService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Modules\Sirsoft\Ecommerce\Http\Middleware\DetectDevice;
use Modules\Sirsoft\Ecommerce\Listeners\InjectAppConfigDeviceListener;
use Modules\Sirsoft\Ecommerce\Tests\ModuleTestCase;
class DetectDeviceTest extends ModuleTestCase
{
/**
* @scenario mark_form=badge, requires_ios=true, device=ios
*
* @effects server_ua_sets_is_ios, applepay_shown_on_ios
*/
public function test_ios_user_agent_sets_is_ios_true_in_container(): void
{
$request = Request::create('/', 'GET', server: [
'HTTP_USER_AGENT' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)',
]);
(new DetectDevice)->handle($request, fn () => new Response);
$this->assertTrue(DetectDevice::isIos());
}
/**
* @scenario mark_form=badge, requires_ios=true, device=non_ios
*
* @effects server_ua_sets_is_ios, applepay_hidden_on_non_ios
*/
public function test_desktop_user_agent_sets_is_ios_false_in_container(): void
{
$request = Request::create('/', 'GET', server: [
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120',
]);
(new DetectDevice)->handle($request, fn () => new Response);
$this->assertFalse(DetectDevice::isIos());
}
public function test_is_ios_defaults_false_when_middleware_not_run(): void
{
// 컨테이너 미바인딩(미들웨어 미실행) 시 fail-safe(애플페이 기본 숨김).
$this->assertFalse(DetectDevice::isIos());
}
/**
* @scenario mark_form=badge, requires_ios=true, device=ipados_desktop_ua
*
* @effects is_ios_flows_to_global_appconfig
*/
public function test_listener_injects_is_ios_into_app_config_via_hook(): void
{
// iOS 미들웨어 통과 상태 재현.
$request = Request::create('/', 'GET', server: [
'HTTP_USER_AGENT' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)',
]);
(new DetectDevice)->handle($request, fn () => new Response);
// 리스너를 훅에 등록(모듈 부팅이 하는 것과 동일).
HookManager::addFilter(
'core.frontend.filter_app_config',
[new InjectAppConfigDeviceListener, 'injectDeviceFlags'],
20
);
$appConfig = app(SettingsService::class)->getAppConfigForFrontend();
$this->assertArrayHasKey('isIos', $appConfig);
$this->assertTrue($appConfig['isIos']);
}
}