test(core/browser/platform): 26 extreme RED/GREEN TDD cycles and full regression hardening (3,235 PASS)
This commit is contained in:
parent
bcd242691f
commit
8677853822
100 changed files with 4814 additions and 333 deletions
|
|
@ -0,0 +1,119 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Paca.Core.Config;
|
||||
using Paca.Core.Detection;
|
||||
using Paca.Core.Security;
|
||||
using Xunit;
|
||||
|
||||
namespace Paca.Tests.Detection;
|
||||
|
||||
public class UrlAndMediaDetectionExtremeRedTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(null)]
|
||||
[InlineData("")]
|
||||
[InlineData(" ")]
|
||||
[InlineData("not a url")]
|
||||
[InlineData("javascript:alert('pwn')")]
|
||||
[InlineData("data:text/html,<script>alert(1)</script>")]
|
||||
[InlineData("file:///C:/Windows/System32/calc.exe")]
|
||||
[InlineData("blob:https://youtube.com/1234-5678")]
|
||||
public void SocialSiteDetector_TryMatchString_InvalidOrDangerousUrls_ReturnsFalse(string? input)
|
||||
{
|
||||
var result = SocialSiteDetector.TryMatch(input, out var normalized, out var label);
|
||||
Assert.False(result);
|
||||
Assert.Empty(normalized);
|
||||
Assert.Empty(label);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
||||
[InlineData("https://youtu.be/dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
||||
[InlineData("https://www.youtube.com/shorts/dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
||||
[InlineData("https://twitter.com/OpenAI/status/1234567890", "https://x.com/OpenAI/status/1234567890", "X")]
|
||||
[InlineData("https://x.com/OpenAI/status/1234567890", "https://x.com/OpenAI/status/1234567890", "X")]
|
||||
[InlineData("https://www.instagram.com/reel/C_xyz123/", "https://www.instagram.com/reel/C_xyz123", "INSTAGRAM")]
|
||||
[InlineData("https://www.tiktok.com/@user/video/1234567890", "https://www.tiktok.com/@user/video/1234567890", "TIKTOK")]
|
||||
public void SocialSiteDetector_TryMatchString_ValidUrls_NormalizesCorrectly(string input, string expectedUrl, string expectedLabel)
|
||||
{
|
||||
var result = SocialSiteDetector.TryMatch(input, out var normalized, out var label);
|
||||
Assert.True(result);
|
||||
Assert.Equal(expectedUrl, normalized);
|
||||
Assert.Equal(expectedLabel, label);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MediaDetector_Classify_NullConfig_ReturnsNullWithoutThrowing()
|
||||
{
|
||||
var result = MediaDetector.Classify("https://cdn.example.com/video.mp4", "video/mp4", 1024 * 1024, null!);
|
||||
Assert.Null(result);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("javascript:alert('xss')")]
|
||||
[InlineData("data:video/mp4;base64,AAAA")]
|
||||
[InlineData("file:///C:/videos/test.mp4")]
|
||||
[InlineData("blob:https://example.com/uuid-1234")]
|
||||
public void MediaDetector_Classify_DangerousSchemes_ReturnsNull(string dangerousUri)
|
||||
{
|
||||
var config = new AppConfig();
|
||||
var result = MediaDetector.Classify(dangerousUri, "video/mp4", 1024 * 1024, config);
|
||||
Assert.Null(result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MediaDetector_Classify_InvalidNegativeLengthBelowMinusOne_ReturnsNull()
|
||||
{
|
||||
var config = new AppConfig();
|
||||
var result = MediaDetector.Classify("https://cdn.example.com/video.mp4", "video/mp4", -99999L, config);
|
||||
Assert.Null(result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MediaDetector_ProbeFormat_BoundaryFtypBox_RecognizesMp4()
|
||||
{
|
||||
var ftypBytes = new byte[] { 0, 0, 0, 0x18, (byte)'f', (byte)'t', (byte)'y', (byte)'p', (byte)'m', (byte)'p', (byte)'4', (byte)'2' };
|
||||
var format = MediaDetector.ProbeFormat(ftypBytes);
|
||||
Assert.Equal("mp4", format);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CredentialSecurityAuditor_PerformAudit_NullList_ReturnsHealthyZeroReport()
|
||||
{
|
||||
var report = CredentialSecurityAuditor.PerformAudit(null!);
|
||||
Assert.NotNull(report);
|
||||
Assert.Equal(100, report.OverallHealthScore);
|
||||
Assert.Equal(0, report.TotalAccounts);
|
||||
Assert.Empty(report.Issues);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CredentialSecurityAuditor_PerformAudit_ListWithNullElements_FiltersNullsWithoutThrowing()
|
||||
{
|
||||
var credentials = new List<SiteCredentialRecord?>
|
||||
{
|
||||
new() { Id = "1", Domain = "example.com", Username = "user1", DecryptedPassword = "Password123!" },
|
||||
null,
|
||||
new() { Id = "2", Domain = "test.com", Username = "user2", DecryptedPassword = "SuperSecurePassword2026!#" }
|
||||
};
|
||||
|
||||
var report = CredentialSecurityAuditor.PerformAudit(credentials!);
|
||||
Assert.NotNull(report);
|
||||
Assert.Equal(2, report.TotalAccounts);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CredentialSecurityAuditor_PerformAudit_DetectsWeakAndReusedPasswords()
|
||||
{
|
||||
var credentials = new List<SiteCredentialRecord>
|
||||
{
|
||||
new() { Id = "1", Domain = "site1.com", Username = "user", DecryptedPassword = "123" },
|
||||
new() { Id = "2", Domain = "site2.com", Username = "user", DecryptedPassword = "123" }
|
||||
};
|
||||
|
||||
var report = CredentialSecurityAuditor.PerformAudit(credentials);
|
||||
Assert.True(report.WeakPasswordCount > 0);
|
||||
Assert.True(report.ReusedPasswordCount > 0);
|
||||
Assert.True(report.OverallHealthScore < 100);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue