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,77 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using Paca.App.Services;
using Paca.Tests.Infrastructure;
using Xunit;
namespace Paca.Tests.E2E;
/// <summary>
/// Phase 4 심화 하드닝 게이트 (TDD 선행 RED):
/// - Gate 401: MainWindow의 Ctrl+Shift+P 전체 일시정지 단축키(pauseall) 배선 무결성
/// - Gate 402: 미디어 팝업 및 사이트 정보 내 하드코딩 색상(#FF4444, #10B981)의 시맨틱 브러시 일체화
/// - Gate 403: ShortcutManager 기본 단축키 목록과 MainWindow 키 라우터 전수 패리티 검증
/// </summary>
public class DesktopUiAndShortcutHardeningPhase4Tests
{
private static readonly string AppDir = Path.Combine(SourceTree.Root, "src", "Paca.App");
// =========================================================================
// Gate 401: MainWindow Ctrl+Shift+P 단축키 배선 검증
// =========================================================================
[Fact]
public void Gate401_MainWindow_PauseAll_Shortcut_CtrlShiftP_Audit()
{
var mwCs = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml.cs"));
// OnPreviewKeyDown 에서 Ctrl+Shift+P 입력 시 PauseAllDownloads() 호출 보증
var pattern = @"ModifierKeys\.Control\s*\|\s*ModifierKeys\.Shift\)\s*&&\s*e\.Key\s*==\s*Key\.P\b";
Assert.Matches(pattern, mwCs);
Assert.Contains("PauseAllDownloads", mwCs);
}
// =========================================================================
// Gate 402: 하드코딩 색상(#FF4444, #10B981) 시맨틱 브러시 일체화
// =========================================================================
[Fact]
public void Gate402_MainWindow_SemanticBrushes_NoHardcodedHex_In_Popups()
{
var mwXaml = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml"));
// 1) 라인 2695 미디어 팝업 헤더 텍스트 하드코딩 #FF4444 금지
Assert.DoesNotContain("Foreground=\"#FF4444\"", mwXaml);
// 2) 라인 2908 사이트 보안 안전한 연결 텍스트 하드코딩 #10B981 금지
Assert.DoesNotContain("Foreground=\"#10B981\"", mwXaml);
// 3) 해당 위치가 시맨틱 브러시(ErrorBrush, SuccessBrush)로 대체되었는지 검증
Assert.Contains("Foreground=\"{DynamicResource ErrorBrush}\"", mwXaml);
Assert.Contains("Foreground=\"{DynamicResource SuccessBrush}\"", mwXaml);
}
// =========================================================================
// Gate 403: ShortcutManager 기본 단축키와 MainWindow 라우터 전수 패리티
// =========================================================================
[Fact]
public void Gate403_ShortcutManager_AllDefaultShortcuts_AreHandled_OrMappable()
{
var mwCs = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml.cs"));
// ShortcutManager 에 선언된 핵심 기본 단축키 액션들이 MainWindow 에 실제로 배선되어 있는지 검증
var coreActions = new[]
{
"newtab", "closetab", "reopentab", "find", "address",
"downloads", "palette", "devtools", "fullscreen", "refresh", "print", "pauseall"
};
foreach (var action in coreActions)
{
Assert.True(ShortcutManager.Defaults.ContainsKey(action),
$"ShortcutManager.Defaults 에 '{action}' 이 선언되어 있어야 합니다.");
}
// pauseall 이 MainWindow.xaml.cs 에 단축키 키 핸들러로 등록되어 있는지 확인
Assert.Contains("PauseAllDownloads", mwCs);
}
}