120 lines
3.8 KiB
C#
120 lines
3.8 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Paca.Browser;
|
|
using Paca.Browser.Pwa;
|
|
using Paca.Browser.Tabs;
|
|
using Xunit;
|
|
|
|
namespace Paca.Tests.Browser;
|
|
|
|
public class ChromeWebAppManifestTests
|
|
{
|
|
[Fact]
|
|
public void WebAppManifestParser_Parses_Standard_Manifest_Json()
|
|
{
|
|
var json = @"
|
|
{
|
|
""name"": ""YouTube Music"",
|
|
""short_name"": ""Music"",
|
|
""start_url"": ""/index.html"",
|
|
""display"": ""standalone"",
|
|
""theme_color"": ""#ff0000"",
|
|
""background_color"": ""#ffffff"",
|
|
""icons"": [
|
|
{
|
|
""src"": ""/icons/icon-192.png"",
|
|
""sizes"": ""192x192"",
|
|
""type"": ""image/png""
|
|
},
|
|
{
|
|
""src"": ""https://cdn.example.com/icon-512.png"",
|
|
""sizes"": ""512x512"",
|
|
""type"": ""image/png""
|
|
}
|
|
]
|
|
}";
|
|
var baseUri = new Uri("https://music.youtube.com");
|
|
var manifest = WebAppManifestParser.Parse(json, baseUri);
|
|
|
|
Assert.NotNull(manifest);
|
|
Assert.Equal("YouTube Music", manifest.Name);
|
|
Assert.Equal("Music", manifest.ShortName);
|
|
Assert.Equal("https://music.youtube.com/index.html", manifest.StartUrl);
|
|
Assert.Equal("standalone", manifest.Display);
|
|
Assert.Equal("#ff0000", manifest.ThemeColor);
|
|
Assert.Equal("#ffffff", manifest.BackgroundColor);
|
|
Assert.Equal(2, manifest.Icons.Count);
|
|
Assert.Equal("https://music.youtube.com/icons/icon-192.png", manifest.Icons[0].Src);
|
|
Assert.Equal("https://cdn.example.com/icon-512.png", manifest.Icons[1].Src);
|
|
}
|
|
|
|
[Fact]
|
|
public void WebAppManifestParser_IsInstallable_Validates_PWA_Criteria()
|
|
{
|
|
var baseUri = new Uri("https://example.com");
|
|
|
|
// Valid standalone PWA
|
|
var valid = WebAppManifestParser.Parse(@"
|
|
{
|
|
""name"": ""Paca App"",
|
|
""start_url"": ""/"",
|
|
""display"": ""standalone"",
|
|
""icons"": [{ ""src"": ""/icon.png"", ""sizes"": ""192x192"" }]
|
|
}", baseUri);
|
|
Assert.True(WebAppManifestParser.IsInstallable(valid));
|
|
|
|
// Missing name
|
|
var noName = WebAppManifestParser.Parse(@"
|
|
{
|
|
""start_url"": ""/"",
|
|
""display"": ""standalone"",
|
|
""icons"": [{ ""src"": ""/icon.png"" }]
|
|
}", baseUri);
|
|
Assert.False(WebAppManifestParser.IsInstallable(noName));
|
|
|
|
// Display browser (not standalone/minimal-ui/fullscreen)
|
|
var browserDisplay = WebAppManifestParser.Parse(@"
|
|
{
|
|
""name"": ""Web Site"",
|
|
""start_url"": ""/"",
|
|
""display"": ""browser"",
|
|
""icons"": [{ ""src"": ""/icon.png"" }]
|
|
}", baseUri);
|
|
Assert.False(WebAppManifestParser.IsInstallable(browserDisplay));
|
|
|
|
// Empty icons
|
|
var noIcons = WebAppManifestParser.Parse(@"
|
|
{
|
|
""name"": ""No Icons"",
|
|
""start_url"": ""/"",
|
|
""display"": ""standalone"",
|
|
""icons"": []
|
|
}", baseUri);
|
|
Assert.False(WebAppManifestParser.IsInstallable(noIcons));
|
|
}
|
|
|
|
[Fact]
|
|
public void OmniboxActionEvaluator_Matches_InstallApp()
|
|
{
|
|
var actionsKr = OmniboxActionEvaluator.GetMatchingActions("앱 설치");
|
|
Assert.Contains(actionsKr, a => a.ActionId == "action:install-app");
|
|
|
|
var actionsPwa = OmniboxActionEvaluator.GetMatchingActions("pwa");
|
|
Assert.Contains(actionsPwa, a => a.ActionId == "action:install-app");
|
|
|
|
var action = OmniboxActionEvaluator.AllActions.FirstOrDefault(a => a.ActionId == "action:install-app");
|
|
Assert.NotNull(action);
|
|
Assert.Contains("PWA", action.DisplayTitle);
|
|
}
|
|
|
|
[Fact]
|
|
public void ChromeInternalUrlRouter_Routes_ChromeApps()
|
|
{
|
|
Assert.True(ChromeInternalUrlRouter.IsInternal("chrome://apps"));
|
|
var action = ChromeInternalUrlRouter.Route("chrome://apps");
|
|
Assert.Equal(ChromeInternalAction.Apps, action);
|
|
|
|
var suggestions = ChromeInternalUrlRouter.GetSuggestions("chrome://app");
|
|
Assert.Contains(suggestions, s => s.Url == "chrome://apps");
|
|
}
|
|
}
|