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:
parent
a88aafa1e5
commit
0e568f1f0a
975 changed files with 130593 additions and 16783 deletions
136
tests/Paca.Tests/App/QuickActionSpotlightTwoPhase20Tests.cs
Normal file
136
tests/Paca.Tests/App/QuickActionSpotlightTwoPhase20Tests.cs
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Paca.Core.QuickActions;
|
||||
using Xunit;
|
||||
|
||||
namespace Paca.Tests.App;
|
||||
|
||||
public class QuickActionSpotlightTwoPhase20Tests
|
||||
{
|
||||
private static readonly string SolutionRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", ".."));
|
||||
|
||||
[Theory]
|
||||
[InlineData("https://www.youtube.com/watch?v=dQw4w9WgXcQ", ClipboardIntentType.MediaDownload)]
|
||||
[InlineData("https://twitter.com/user/status/123456789", ClipboardIntentType.MediaDownload)]
|
||||
[InlineData("https://example.com/live/stream.m3u8", ClipboardIntentType.MediaDownload)]
|
||||
[InlineData("https://news.ycombinator.com", ClipboardIntentType.BrowseUrl)]
|
||||
[InlineData("125 * 40 - 15", ClipboardIntentType.Expression)]
|
||||
[InlineData("just regular plain text", ClipboardIntentType.None)]
|
||||
[InlineData(null, ClipboardIntentType.None)]
|
||||
public void Gate201_ClipboardDetector_AccuratelyClassifiesContent(string? text, ClipboardIntentType expected)
|
||||
{
|
||||
var detector = new QuickActionClipboardDetector();
|
||||
var result = detector.DetectIntent(text);
|
||||
|
||||
Assert.Equal(expected, result.IntentType);
|
||||
if (expected != ClipboardIntentType.None)
|
||||
{
|
||||
Assert.False(string.IsNullOrWhiteSpace(result.SuggestedActionTitle));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate202_FavoritesManager_AddRemoveAndPersistFavorites()
|
||||
{
|
||||
string tempJson = Path.Combine(Path.GetTempPath(), $"paca_fav_test_{Guid.NewGuid():N}.json");
|
||||
try
|
||||
{
|
||||
var manager = new QuickActionFavoritesManager(tempJson);
|
||||
|
||||
Assert.False(manager.IsFavorite("browser.new_tab"));
|
||||
|
||||
// 1. Toggle on
|
||||
bool added = manager.ToggleFavorite("browser.new_tab");
|
||||
Assert.True(added);
|
||||
Assert.True(manager.IsFavorite("browser.new_tab"));
|
||||
Assert.Contains("browser.new_tab", manager.GetFavorites());
|
||||
|
||||
// 2. Reload from JSON disk
|
||||
var manager2 = new QuickActionFavoritesManager(tempJson);
|
||||
Assert.True(manager2.IsFavorite("browser.new_tab"));
|
||||
|
||||
// 3. Toggle off
|
||||
bool removed = manager2.ToggleFavorite("browser.new_tab");
|
||||
Assert.False(removed);
|
||||
Assert.False(manager2.IsFavorite("browser.new_tab"));
|
||||
Assert.DoesNotContain("browser.new_tab", manager2.GetFavorites());
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (File.Exists(tempJson)) File.Delete(tempJson);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate203_UserCustomActionStore_RegistersAndInstantiatesQuickActionItem()
|
||||
{
|
||||
string tempJson = Path.Combine(Path.GetTempPath(), $"paca_custom_test_{Guid.NewGuid():N}.json");
|
||||
try
|
||||
{
|
||||
var store = new UserCustomActionStore(tempJson);
|
||||
var custom = new UserCustomAction(
|
||||
Id: "custom.my_intranet",
|
||||
Title: "사내 인트라넷 열기",
|
||||
Keywords: "intranet work 사내포털",
|
||||
TargetUrl: "https://intranet.company.internal",
|
||||
ShortcutHint: "Ctrl+Alt+I"
|
||||
);
|
||||
|
||||
store.AddOrUpdate(custom);
|
||||
Assert.Single(store.GetAll());
|
||||
|
||||
// Convert to QuickActionItem
|
||||
var catalog = new QuickActionCatalog();
|
||||
store.InjectIntoCatalog(catalog);
|
||||
|
||||
var injected = catalog.FindById("custom.my_intranet");
|
||||
Assert.NotNull(injected);
|
||||
Assert.Equal("사내 인트라넷 열기", injected.Title);
|
||||
Assert.Equal(QuickActionCategory.Ecosystem, injected.Category);
|
||||
|
||||
// Reload from disk
|
||||
var store2 = new UserCustomActionStore(tempJson);
|
||||
Assert.Single(store2.GetAll());
|
||||
Assert.Equal("custom.my_intranet", store2.GetAll().First().Id);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (File.Exists(tempJson)) File.Delete(tempJson);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(10, "방금 전")]
|
||||
[InlineData(300, "5분 전")]
|
||||
[InlineData(7200, "2시간 전")]
|
||||
[InlineData(90000, "어제")]
|
||||
public void Gate204_QuickActionTimeFormatter_RendersNaturalRelativeTime(int secondsAgo, string expectedKorean)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
var past = now.AddSeconds(-secondsAgo);
|
||||
|
||||
string formatted = QuickActionTimeFormatter.FormatRelativeTime(past, now, "ko");
|
||||
Assert.Equal(expectedKorean, formatted);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate205_LauncherWindowXaml_ContainsClipboardBannerAndFavoritesSupport()
|
||||
{
|
||||
string xamlPath = Path.Combine(SolutionRoot, "src", "Paca.App", "QuickActionLauncherWindow.xaml");
|
||||
string xaml = File.ReadAllText(xamlPath);
|
||||
|
||||
Assert.Contains("x:Name=\"ClipboardSuggestionBanner\"", xaml);
|
||||
Assert.Contains("x:Name=\"ClipboardBannerTitle\"", xaml);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate206_LauncherWindowCs_WiresClipboardDetectionOnActivate()
|
||||
{
|
||||
string csPath = Path.Combine(SolutionRoot, "src", "Paca.App", "QuickActionLauncherWindow.xaml.cs");
|
||||
string cs = File.ReadAllText(csPath);
|
||||
|
||||
Assert.Contains("CheckClipboardIntent()", cs);
|
||||
Assert.Contains("QuickActionClipboardDetector", cs);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue