releases/tests/Paca.Tests/Browser/ChromeHistoryEngineTests.cs

129 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Paca.Browser.History;
using Xunit;
namespace Paca.Tests.Browser;
public class ChromeHistoryEngineTests
{
[Fact]
public void HistoryFilter_Filters_By_Keywords_And_Domain()
{
var now = DateTime.UtcNow;
var entries = new List<ChromeHistoryEntry>
{
new("https://github.com/microsoft/vscode", "Microsoft VS Code Repository", now.AddMinutes(-10)),
new("https://github.com/dotnet/runtime", "dotnet/runtime on GitHub", now.AddHours(-1)),
new("https://developer.mozilla.org/en-US/", "MDN Web Docs", now.AddHours(-2)),
new("https://news.ycombinator.com/", "Hacker News", now.AddDays(-1))
};
var engine = new ChromeHistoryEngine(entries);
// Keyword search in title or url
var searchGit = engine.Search("GitHub");
Assert.Equal(2, searchGit.Count);
var searchMdn = engine.Search("docs");
Assert.Single(searchMdn);
Assert.Equal("MDN Web Docs", searchMdn[0].Title);
// Domain search
var domainHits = engine.GetByDomain("github.com");
Assert.Equal(2, domainHits.Count);
}
[Fact]
public void HistoryClustering_Groups_Into_Today_Yesterday_Last7Days_And_Older()
{
var now = new DateTime(2026, 9, 13, 12, 0, 0, DateTimeKind.Utc);
var entries = new List<ChromeHistoryEntry>
{
new("https://site1.com", "Site 1", now.AddMinutes(-5)), // Today
new("https://site2.com", "Site 2", now.AddDays(-1).AddHours(-1)), // Yesterday
new("https://site3.com", "Site 3", now.AddDays(-3)), // Last 7 Days
new("https://site4.com", "Site 4", now.AddDays(-10)) // Older
};
var engine = new ChromeHistoryEngine(entries);
var clustered = engine.GetClusteredHistory(now);
Assert.Single(clustered.Today);
Assert.Equal("Site 1", clustered.Today[0].Title);
Assert.Single(clustered.Yesterday);
Assert.Equal("Site 2", clustered.Yesterday[0].Title);
Assert.Single(clustered.Last7Days);
Assert.Equal("Site 3", clustered.Last7Days[0].Title);
Assert.Single(clustered.Older);
Assert.Equal("Site 4", clustered.Older[0].Title);
}
[Fact]
public void HistoryAggregator_Groups_By_Domain_With_Visit_Counts()
{
var now = DateTime.UtcNow;
var entries = new List<ChromeHistoryEntry>
{
new("https://github.com/microsoft/vscode", "VS Code", now.AddMinutes(-10)),
new("https://github.com/dotnet/runtime", "Dotnet", now.AddMinutes(-5)),
new("https://github.com/golang/go", "Golang", now),
new("https://google.com/search?q=test", "Google Search", now.AddHours(-1))
};
var engine = new ChromeHistoryEngine(entries);
var domainSummaries = engine.GetDomainSummaries();
Assert.Equal(2, domainSummaries.Count);
var githubSummary = domainSummaries.First(s => s.Domain == "github.com");
Assert.Equal(3, githubSummary.TotalVisits);
Assert.Equal(3, githubSummary.Entries.Count);
var googleSummary = domainSummaries.First(s => s.Domain == "google.com");
Assert.Equal(1, googleSummary.TotalVisits);
}
[Fact]
public void HistoryDeletion_Removes_By_Domain_Or_Date_Range()
{
var now = DateTime.UtcNow;
var entries = new List<ChromeHistoryEntry>
{
new("https://github.com/1", "GH1", now.AddMinutes(-10)),
new("https://github.com/2", "GH2", now.AddHours(-5)),
new("https://google.com/1", "G1", now.AddDays(-2)),
new("https://spam.com/bad", "Spam", now.AddDays(-15))
};
var engine = new ChromeHistoryEngine(entries);
// Delete by domain
int deletedGithub = engine.DeleteByDomain("github.com");
Assert.Equal(2, deletedGithub);
Assert.Equal(2, engine.AllEntries.Count);
Assert.DoesNotContain(engine.AllEntries, e => e.Url.Contains("github.com"));
// Clear older than 10 days
int deletedOld = engine.ClearOlderThan(TimeSpan.FromDays(10), now);
Assert.Equal(1, deletedOld);
Assert.Single(engine.AllEntries);
Assert.Equal("https://google.com/1", engine.AllEntries[0].Url);
}
[Theory]
[InlineData("방문 기록")]
[InlineData("히스토리")]
[InlineData("history")]
[InlineData("search history")]
public void Omnibox_Matches_History_Action(string query)
{
var actions = Paca.Browser.Tabs.OmniboxActionEvaluator.GetMatchingActions(query);
Assert.NotEmpty(actions);
Assert.Contains(actions, a => a.ActionId == "action:history");
}
}