Files
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

63 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
namespace Modules\Sirsoft\Ecommerce\Tests\Unit\Helpers;
use Modules\Sirsoft\Ecommerce\Helpers\DeviceDetector;
use Modules\Sirsoft\Ecommerce\Tests\ModuleTestCase;
use PHPUnit\Framework\Attributes\DataProvider;
class DeviceDetectorTest extends ModuleTestCase
{
#[DataProvider('deviceTypeProvider')]
public function test_detect_from_user_agent(string $userAgent, string $expected): void
{
$this->assertSame($expected, DeviceDetector::detectFromUserAgent($userAgent));
}
/**
* @return array<string, array{0: string, 1: string}>
*/
public static function deviceTypeProvider(): array
{
return [
'iPhone' => ['Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)', 'mobile'],
'iPad' => ['Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)', 'mobile'],
'Android' => ['Mozilla/5.0 (Linux; Android 14; Pixel 8)', 'mobile'],
'desktop Chrome' => ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120', 'pc'],
'macOS Safari' => ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/17', 'pc'],
'empty' => ['', 'pc'],
];
}
/**
* @scenario mark_form=badge, requires_ios=true, device=ios
*
* @effects server_ua_sets_is_ios, applepay_shown_on_ios
*/
#[DataProvider('iosProvider')]
public function test_is_ios_from_user_agent(string $userAgent, bool $expected): void
{
$this->assertSame($expected, DeviceDetector::isIosFromUserAgent($userAgent));
}
/**
* @return array<string, array{0: string, 1: bool}>
*/
public static function iosProvider(): array
{
return [
'iPhone' => ['Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)', true],
'iPad' => ['Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)', true],
'iPod' => ['Mozilla/5.0 (iPod touch; CPU iPhone OS 15_0 like Mac OS X)', true],
// Android 모바일은 iOS 가 아님(애플페이 미노출).
'Android' => ['Mozilla/5.0 (Linux; Android 14; Pixel 8)', false],
// 데스크탑 UA 를 보내는 iPadOS 는 서버 UA 판정으로 놓친다(클라 보정 대상).
'macOS desktop UA' => ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/17', false],
'Windows' => ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120', false],
'empty' => ['', false],
];
}
}