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

99 lines
3.6 KiB
C#

using System.Linq;
using Paca.Browser.Downloads;
using Xunit;
namespace Paca.Tests.Browser;
public class ChromeDownloadShelfSecurityTests
{
[Fact]
public void AutoOpenFilePolicy_Strictly_Blocks_Dangerous_Executable_Extensions()
{
var policy = new ChromeAutoOpenFilePolicy();
// Must reject common executable and script types
string[] dangerous = { ".exe", ".bat", ".cmd", ".ps1", ".vbs", ".js", ".msi", ".scr", ".jar", ".pif", ".cpl", ".hta" };
foreach (var ext in dangerous)
{
bool setSuccess = policy.SetAutoOpen(ext, true);
Assert.False(setSuccess);
Assert.False(policy.IsAutoOpenEnabled(ext));
Assert.False(policy.CanAutoOpen($"payload{ext}"));
Assert.False(policy.CanAutoOpen($"PAYLOAD{ext.ToUpperInvariant()}"));
}
}
[Fact]
public void AutoOpenFilePolicy_Allows_Safe_Extensions_And_Toggles_State()
{
var policy = new ChromeAutoOpenFilePolicy();
Assert.False(policy.CanAutoOpen("document.pdf"));
bool setPdf = policy.SetAutoOpen(".pdf", true);
Assert.True(setPdf);
Assert.True(policy.IsAutoOpenEnabled(".pdf"));
Assert.True(policy.CanAutoOpen("document.pdf"));
Assert.True(policy.CanAutoOpen("REPORT.PDF"));
// Disable
policy.SetAutoOpen("pdf", false);
Assert.False(policy.IsAutoOpenEnabled(".pdf"));
Assert.False(policy.CanAutoOpen("document.pdf"));
}
[Fact]
public void DownloadShelfCoordinator_Tracks_Items_And_Enforces_Capacity()
{
var coordinator = new ChromeDownloadShelfCoordinator(maxItems: 3);
Assert.Empty(coordinator.Items);
Assert.False(coordinator.IsVisible);
var it1 = coordinator.AddOrUpdate("1", "video1.mp4", 1000);
var it2 = coordinator.AddOrUpdate("2", "video2.mp4", 2000);
var it3 = coordinator.AddOrUpdate("3", "video3.mp4", 3000);
Assert.Equal(3, coordinator.Items.Count);
Assert.True(coordinator.IsVisible);
// Adding 4th item evicts oldest (it1)
var it4 = coordinator.AddOrUpdate("4", "video4.mp4", 4000);
Assert.Equal(3, coordinator.Items.Count);
Assert.DoesNotContain(coordinator.Items, x => x.Id == "1");
Assert.Contains(coordinator.Items, x => x.Id == "4");
// Update progress
coordinator.UpdateProgress("4", bytesReceived: 2000, speedBytesPerSec: 500000, isComplete: false);
var item4 = coordinator.Items.First(x => x.Id == "4");
Assert.Equal(2000, item4.BytesReceived);
Assert.Equal(50, item4.Percent);
Assert.False(item4.IsComplete);
// Mark complete
coordinator.UpdateProgress("4", bytesReceived: 4000, speedBytesPerSec: 0, isComplete: true, filePath: @"C:\downloads\video4.mp4");
item4 = coordinator.Items.First(x => x.Id == "4");
Assert.Equal(100, item4.Percent);
Assert.True(item4.IsComplete);
Assert.Equal(@"C:\downloads\video4.mp4", item4.FilePath);
}
[Fact]
public void DownloadShelfCoordinator_Dismiss_And_Clear()
{
var coordinator = new ChromeDownloadShelfCoordinator();
coordinator.AddOrUpdate("1", "doc.pdf", 500);
coordinator.AddOrUpdate("2", "music.mp3", 1500);
Assert.Equal(2, coordinator.Items.Count);
Assert.True(coordinator.IsVisible);
coordinator.DismissItem("1");
Assert.Single(coordinator.Items);
Assert.Equal("2", coordinator.Items[0].Id);
Assert.True(coordinator.IsVisible);
coordinator.DismissAll();
Assert.Empty(coordinator.Items);
Assert.False(coordinator.IsVisible);
}
}