feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,157 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Paca.Core.Browser;
using Xunit;
namespace Paca.Tests.Browser;
/// <summary>
/// 웹뷰 비디오 재생, 캐시 저장, 로그인/세션 유지 게이트 (Gate 169 ~ Gate 176)
/// </summary>
public class WebViewMediaAndSessionGateTests
{
private static readonly string MobileProjectDir = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..", "src", "Paca.Mobile"));
[Fact]
public void Gate169_BrowserMediaPlaybackConfig_Audit()
{
var config = BrowserMediaPlaybackConfig.Default;
// 비디오 자동 및 스크립트 재생 보장
Assert.False(config.RequiresUserGestureForMedia);
// HTTPS 사이트 내 HTTP 미디어 스트림 재생 보장 (Mixed Content)
Assert.True(config.AllowMixedContent);
// 비디오 하드웨어 가속 디코딩 보장
Assert.True(config.EnableHardwareAcceleration);
// 최신 Chrome 정규 모바일 User-Agent 스푸핑
Assert.Contains("Chrome", config.CustomUserAgent);
Assert.Contains("Mobile Safari", config.CustomUserAgent);
Assert.DoesNotContain("wv", config.CustomUserAgent); // 웹뷰 서명 제거
}
[Fact]
public void Gate170_BrowserSessionAndCookiePersistence_Audit()
{
var cookiePolicy = new BrowserCookieSessionPolicy();
Assert.True(cookiePolicy.AcceptCookies);
// 소셜 로그인(Google, Naver, Kakao)에 필수적인 써드파티 쿠키 허용
Assert.True(cookiePolicy.AcceptThirdPartyCookies);
// 쿠키 디스크 플러시 스케줄러 검증
Assert.True(cookiePolicy.RequiresDiskFlushOnNavigation);
Assert.True(cookiePolicy.RequiresDiskFlushOnBackground);
var tracker = new BrowserSessionTracker();
tracker.UpdateCookie("accounts.google.com", "SID=abcd1234efgh; Secure; HttpOnly");
tracker.UpdateCookie("youtube.com", "LOGIN_INFO=xyz987; Secure");
// 세션 유지 검증
Assert.True(tracker.HasActiveSession("youtube.com"));
Assert.True(tracker.HasActiveSession("accounts.google.com"));
}
[Fact]
public void Gate171_BrowserCacheAndStoragePolicy_Audit()
{
var storagePolicy = BrowserCacheAndStoragePolicy.Default;
// 최신 비디오 플레이어(LocalStorage/IndexedDB) 필수 저장소 보장
Assert.True(storagePolicy.DomStorageEnabled);
Assert.True(storagePolicy.DatabaseEnabled);
// HTTP 캐시 정책
Assert.Equal(BrowserCacheMode.DefaultWithCache, storagePolicy.CacheMode);
Assert.True(storagePolicy.CacheSizeBytes >= 100 * 1024 * 1024); // 최소 100MB 이상 캐시 할당
}
[Fact]
public void Gate172_OAuthPopupAndMultiWindowPolicy_Audit()
{
var oauthPolicy = new OAuthPopupPolicy();
// 팝업 허용 및 윈도우 생성 정책
Assert.True(oauthPolicy.SupportMultipleWindows);
Assert.True(oauthPolicy.JavaScriptCanOpenWindowsAutomatically);
// OAuth 로그인 URL인지 감지
Assert.True(oauthPolicy.IsOAuthLoginUrl("https://accounts.google.com/o/oauth2/v2/auth?client_id=123"));
Assert.True(oauthPolicy.IsOAuthLoginUrl("https://nid.naver.com/oauth2.0/authorize?client_id=abc"));
Assert.True(oauthPolicy.IsOAuthLoginUrl("https://kauth.kakao.com/oauth/authorize?client_id=xyz"));
Assert.False(oauthPolicy.IsOAuthLoginUrl("https://m.youtube.com/watch?v=123"));
}
[Fact]
public void Gate173_Html5VideoFullscreenController_Audit()
{
var fsController = new Html5VideoFullscreenController();
Assert.False(fsController.IsCustomViewShowing);
// 비디오 전체화면 요청
fsController.EnterFullscreen("custom_video_view_123");
Assert.True(fsController.IsCustomViewShowing);
Assert.Equal("custom_video_view_123", fsController.ActiveCustomViewId);
// 비디오 전체화면 해제 (백버튼 또는 축소)
fsController.ExitFullscreen();
Assert.False(fsController.IsCustomViewShowing);
Assert.Null(fsController.ActiveCustomViewId);
}
[Fact]
public void Gate174_DesktopWebView2ParityConfig_Audit()
{
// 데스크톱 Paca WebView2 환경 설정 검증
var desktopConfig = DesktopWebView2ParityConfig.Default;
Assert.True(desktopConfig.PersistUserDataFolder);
Assert.Contains("PacaUserData", desktopConfig.UserDataSubdirectory);
Assert.True(desktopConfig.AutoplayPolicyNoUserGestureRequired);
Assert.True(desktopConfig.EnableMixedContent);
}
[Fact]
public void Gate175_SiteCompatibilityRegistry_Audit()
{
var registry = new SiteCompatibilityRegistry();
// YouTube 전용 호환 설정
var yt = registry.GetOptimizationFor("https://m.youtube.com/watch?v=999");
Assert.True(yt.ForceDesktopVideoPlayer || yt.BypassInAppBrowserCheck);
// 치지직 / SOOP 전용 호환 설정
var chzzk = registry.GetOptimizationFor("https://chzzk.naver.com/live/12345");
Assert.True(chzzk.EnableLowLatencyStreaming);
}
[Fact]
public void Gate176_ComprehensiveMediaAndSessionJourneyAudit()
{
// 전체 복합 시나리오: 사용자 브라우징 ➔ 소셜 로그인 ➔ 비디오 스트림 재생 ➔ 캐시 저장 ➔ 세션 영속화
var mediaConfig = BrowserMediaPlaybackConfig.Default;
var sessionTracker = new BrowserSessionTracker();
var storagePolicy = BrowserCacheAndStoragePolicy.Default;
var fsController = new Html5VideoFullscreenController();
// 1. 구글 로그인 및 세션 쿠키 수신
sessionTracker.UpdateCookie("youtube.com", "LOGIN_INFO=Token12345; Path=/; Domain=.youtube.com; Secure");
Assert.True(sessionTracker.HasActiveSession("youtube.com"));
// 2. 비디오 재생 시 Mixed Content 및 User Gesture 우회 확인
Assert.True(mediaConfig.AllowMixedContent);
Assert.False(mediaConfig.RequiresUserGestureForMedia);
// 3. LocalStorage 및 HTTP 캐시 활성화 상태 확인
Assert.True(storagePolicy.DomStorageEnabled);
// 4. 비디오 재생 후 전체화면 제어
fsController.EnterFullscreen("yt_player_container");
Assert.True(fsController.IsCustomViewShowing);
fsController.ExitFullscreen();
Assert.False(fsController.IsCustomViewShowing);
// 5. 백그라운드 전환 시 쿠키 영속화 플러시 요청
bool flushed = sessionTracker.FlushToDisk();
Assert.True(flushed);
}
}