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 필터 훅 도입).
81 lines
2.6 KiB
PHP
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']);
|
|
}
|
|
}
|