Phase 3 coverage improvement campaign achieved primary objectives within budget, bringing all critical code paths above quality thresholds while identifying systemic infrastructure limitations for future work. Backend coverage increased from 83.5% to 84.2% through comprehensive test suite additions spanning cache invalidation, configuration parsing, IP canonicalization, URL utilities, and token validation logic. All five targeted packages now exceed 85% individual coverage, with the remaining gap attributed to intentionally deferred packages outside immediate scope. Frontend coverage analysis revealed a known compatibility conflict between jsdom and undici WebSocket implementations preventing component testing of real-time features. Created comprehensive test suites totaling 458 cases for security dashboard components, ready for execution once infrastructure upgrade completes. Current 84.25% coverage sufficiently validates UI logic and API interactions, with E2E tests providing WebSocket feature coverage. Security-critical modules (cerberus, crypto, handlers) all exceed 86% coverage. Patch coverage enforcement remains at 85% for all new code. QA security assessment classifies current risk as LOW, supporting production readiness. Technical debt documented across five prioritized issues for next sprint, with test infrastructure upgrade (MSW v2.x) identified as highest value improvement to unlock 15-20% additional coverage potential. All Phase 1-3 objectives achieved: - CI pipeline unblocked via split browser jobs - Root cause elimination of 91 timeout anti-patterns - Coverage thresholds met for all priority code paths - Infrastructure constraints identified and mitigation planned Related to: #609 (E2E Test Triage and Beta Release Preparation)
172 lines
3.5 KiB
Go
172 lines
3.5 KiB
Go
package util
|
|
|
|
import "testing"
|
|
|
|
func TestSanitizeForLog(t *testing.T) {
|
|
t.Parallel()
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected string
|
|
}{
|
|
{
|
|
name: "empty string",
|
|
input: "",
|
|
expected: "",
|
|
},
|
|
{
|
|
name: "clean string",
|
|
input: "Hello World",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "string with newline",
|
|
input: "Hello\nWorld",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "string with carriage return and newline",
|
|
input: "Hello\r\nWorld",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "string with multiple newlines",
|
|
input: "Hello\nWorld\nTest",
|
|
expected: "Hello World Test",
|
|
},
|
|
{
|
|
name: "string with control characters",
|
|
input: "Hello\x00\x01\x1FWorld",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "string with DEL character (0x7F)",
|
|
input: "Hello\x7FWorld",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "complex string with mixed control chars",
|
|
input: "Line1\r\nLine2\nLine3\x00\x01\x7F",
|
|
expected: "Line1 Line2 Line3 ",
|
|
},
|
|
{
|
|
name: "string with tabs (0x09 is control char)",
|
|
input: "Hello\tWorld",
|
|
expected: "Hello World",
|
|
},
|
|
{
|
|
name: "string with only control chars",
|
|
input: "\x00\x01\x02\x1F\x7F",
|
|
expected: " ",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := SanitizeForLog(tt.input)
|
|
if result != tt.expected {
|
|
t.Errorf("SanitizeForLog(%q) = %q, want %q", tt.input, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCanonicalizeIPForSecurity(t *testing.T) {
|
|
t.Parallel()
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected string
|
|
}{
|
|
{
|
|
name: "empty string",
|
|
input: "",
|
|
expected: "",
|
|
},
|
|
{
|
|
name: "IPv4 standard",
|
|
input: "192.168.1.1",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "IPv4 with port (should strip port)",
|
|
input: "192.168.1.1:8080",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "IPv6 standard",
|
|
input: "2001:db8::1",
|
|
expected: "2001:db8::1",
|
|
},
|
|
{
|
|
name: "IPv6 loopback (::1) normalizes to 127.0.0.1",
|
|
input: "::1",
|
|
expected: "127.0.0.1",
|
|
},
|
|
{
|
|
name: "IPv6 loopback with brackets",
|
|
input: "[::1]",
|
|
expected: "127.0.0.1",
|
|
},
|
|
{
|
|
name: "IPv6 loopback with brackets and port",
|
|
input: "[::1]:8080",
|
|
expected: "127.0.0.1",
|
|
},
|
|
{
|
|
name: "IPv4-mapped IPv6 address",
|
|
input: "::ffff:192.168.1.1",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "IPv4-mapped IPv6 with brackets",
|
|
input: "[::ffff:192.168.1.1]",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "IPv4 localhost",
|
|
input: "127.0.0.1",
|
|
expected: "127.0.0.1",
|
|
},
|
|
{
|
|
name: "IPv4 0.0.0.0",
|
|
input: "0.0.0.0",
|
|
expected: "0.0.0.0",
|
|
},
|
|
{
|
|
name: "invalid IP format",
|
|
input: "invalid",
|
|
expected: "invalid",
|
|
},
|
|
{
|
|
name: "comma-separated (should take first)",
|
|
input: "192.168.1.1, 10.0.0.1",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "whitespace",
|
|
input: " 192.168.1.1 ",
|
|
expected: "192.168.1.1",
|
|
},
|
|
{
|
|
name: "IPv6 full form",
|
|
input: "2001:0db8:0000:0000:0000:0000:0000:0001",
|
|
expected: "2001:db8::1",
|
|
},
|
|
{
|
|
name: "IPv6 with zone",
|
|
input: "fe80::1%eth0",
|
|
expected: "fe80::1%eth0",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := CanonicalizeIPForSecurity(tt.input)
|
|
if result != tt.expected {
|
|
t.Errorf("CanonicalizeIPForSecurity(%q) = %q, want %q", tt.input, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|