Remove checks
This commit is contained in:
parent
954a9d705e
commit
0b4d32dada
28 changed files with 1656 additions and 3846 deletions
|
|
@ -28,7 +28,6 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"git.happydns.org/happyDeliver/internal/api"
|
||||
"golang.org/x/net/html"
|
||||
)
|
||||
|
||||
|
|
@ -608,453 +607,6 @@ func TestAnalyzeContent_ImageAltAttributes(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestGenerateHTMLValidityCheck(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
expectedScore int
|
||||
}{
|
||||
{
|
||||
name: "Valid HTML",
|
||||
results: &ContentResults{
|
||||
HTMLValid: true,
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
expectedScore: 2,
|
||||
},
|
||||
{
|
||||
name: "Invalid HTML",
|
||||
results: &ContentResults{
|
||||
HTMLValid: false,
|
||||
HTMLErrors: []string{"Parse error"},
|
||||
},
|
||||
expectedStatus: api.CheckStatusFail,
|
||||
expectedScore: 0,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
check := analyzer.generateHTMLValidityCheck(tt.results)
|
||||
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
if check.Score != tt.expectedScore {
|
||||
t.Errorf("Score = %v, want %v", check.Score, tt.expectedScore)
|
||||
}
|
||||
if check.Category != api.Content {
|
||||
t.Errorf("Category = %v, want %v", check.Category, api.Content)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateLinkChecks(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
expectedScore int
|
||||
}{
|
||||
{
|
||||
name: "All links valid",
|
||||
results: &ContentResults{
|
||||
Links: []LinkCheck{
|
||||
{URL: "https://example.com", Valid: true, Status: 200},
|
||||
{URL: "https://example.org", Valid: true, Status: 200},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
expectedScore: 4,
|
||||
},
|
||||
{
|
||||
name: "Broken links",
|
||||
results: &ContentResults{
|
||||
Links: []LinkCheck{
|
||||
{URL: "https://example.com", Valid: true, Status: 404, Error: "Not found"},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusFail,
|
||||
expectedScore: 0,
|
||||
},
|
||||
{
|
||||
name: "Links with warnings",
|
||||
results: &ContentResults{
|
||||
Links: []LinkCheck{
|
||||
{URL: "https://example.com", Valid: true, Warning: "Could not verify"},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusWarn,
|
||||
expectedScore: 3,
|
||||
},
|
||||
{
|
||||
name: "No links",
|
||||
results: &ContentResults{},
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
checks := analyzer.generateLinkChecks(tt.results)
|
||||
|
||||
if tt.name == "No links" {
|
||||
if len(checks) != 0 {
|
||||
t.Errorf("Expected no checks, got %d", len(checks))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if len(checks) == 0 {
|
||||
t.Fatal("Expected at least one check")
|
||||
}
|
||||
|
||||
check := checks[0]
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
if check.Score != tt.expectedScore {
|
||||
t.Errorf("Score = %v, want %v", check.Score, tt.expectedScore)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateImageChecks(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
}{
|
||||
{
|
||||
name: "All images have alt",
|
||||
results: &ContentResults{
|
||||
Images: []ImageCheck{
|
||||
{Src: "img1.jpg", HasAlt: true, AltText: "Alt 1"},
|
||||
{Src: "img2.jpg", HasAlt: true, AltText: "Alt 2"},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
},
|
||||
{
|
||||
name: "No images have alt",
|
||||
results: &ContentResults{
|
||||
Images: []ImageCheck{
|
||||
{Src: "img1.jpg", HasAlt: false},
|
||||
{Src: "img2.jpg", HasAlt: false},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusFail,
|
||||
},
|
||||
{
|
||||
name: "Some images have alt",
|
||||
results: &ContentResults{
|
||||
Images: []ImageCheck{
|
||||
{Src: "img1.jpg", HasAlt: true, AltText: "Alt 1"},
|
||||
{Src: "img2.jpg", HasAlt: false},
|
||||
},
|
||||
},
|
||||
expectedStatus: api.CheckStatusWarn,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
checks := analyzer.generateImageChecks(tt.results)
|
||||
|
||||
if len(checks) == 0 {
|
||||
t.Fatal("Expected at least one check")
|
||||
}
|
||||
|
||||
check := checks[0]
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
if check.Category != api.Content {
|
||||
t.Errorf("Category = %v, want %v", check.Category, api.Content)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateUnsubscribeCheck(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
}{
|
||||
{
|
||||
name: "Has unsubscribe link",
|
||||
results: &ContentResults{
|
||||
HasUnsubscribe: true,
|
||||
UnsubscribeLinks: []string{"https://example.com/unsubscribe"},
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
},
|
||||
{
|
||||
name: "No unsubscribe link",
|
||||
results: &ContentResults{},
|
||||
expectedStatus: api.CheckStatusWarn,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
check := analyzer.generateUnsubscribeCheck(tt.results)
|
||||
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
if check.Category != api.Content {
|
||||
t.Errorf("Category = %v, want %v", check.Category, api.Content)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateTextConsistencyCheck(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
}{
|
||||
{
|
||||
name: "High consistency",
|
||||
results: &ContentResults{
|
||||
TextPlainRatio: 0.8,
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
},
|
||||
{
|
||||
name: "Low consistency",
|
||||
results: &ContentResults{
|
||||
TextPlainRatio: 0.1,
|
||||
},
|
||||
expectedStatus: api.CheckStatusWarn,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
check := analyzer.generateTextConsistencyCheck(tt.results)
|
||||
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateImageRatioCheck(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
expectedStatus api.CheckStatus
|
||||
}{
|
||||
{
|
||||
name: "Reasonable ratio",
|
||||
results: &ContentResults{
|
||||
ImageTextRatio: 3.0,
|
||||
Images: []ImageCheck{{}, {}, {}},
|
||||
},
|
||||
expectedStatus: api.CheckStatusPass,
|
||||
},
|
||||
{
|
||||
name: "High ratio",
|
||||
results: &ContentResults{
|
||||
ImageTextRatio: 7.0,
|
||||
Images: make([]ImageCheck, 7),
|
||||
},
|
||||
expectedStatus: api.CheckStatusWarn,
|
||||
},
|
||||
{
|
||||
name: "Excessive ratio",
|
||||
results: &ContentResults{
|
||||
ImageTextRatio: 15.0,
|
||||
Images: make([]ImageCheck, 15),
|
||||
},
|
||||
expectedStatus: api.CheckStatusFail,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
check := analyzer.generateImageRatioCheck(tt.results)
|
||||
|
||||
if check.Status != tt.expectedStatus {
|
||||
t.Errorf("Status = %v, want %v", check.Status, tt.expectedStatus)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateSuspiciousURLCheck(t *testing.T) {
|
||||
results := &ContentResults{
|
||||
SuspiciousURLs: []string{
|
||||
"https://bit.ly/abc123",
|
||||
"https://192.168.1.1/page",
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
check := analyzer.generateSuspiciousURLCheck(results)
|
||||
|
||||
if check.Status != api.CheckStatusWarn {
|
||||
t.Errorf("Status = %v, want %v", check.Status, api.CheckStatusWarn)
|
||||
}
|
||||
if check.Category != api.Content {
|
||||
t.Errorf("Category = %v, want %v", check.Category, api.Content)
|
||||
}
|
||||
if !strings.Contains(check.Message, "2") {
|
||||
t.Error("Message should mention the count of suspicious URLs")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetContentScore(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
minScore int
|
||||
maxScore int
|
||||
}{
|
||||
{
|
||||
name: "Nil results",
|
||||
results: nil,
|
||||
minScore: 0,
|
||||
maxScore: 0,
|
||||
},
|
||||
{
|
||||
name: "Perfect content",
|
||||
results: &ContentResults{
|
||||
HTMLValid: true,
|
||||
Links: []LinkCheck{{Valid: true, Status: 200}},
|
||||
Images: []ImageCheck{{HasAlt: true}},
|
||||
HasUnsubscribe: true,
|
||||
TextPlainRatio: 0.8,
|
||||
ImageTextRatio: 3.0,
|
||||
},
|
||||
minScore: 90,
|
||||
maxScore: 100,
|
||||
},
|
||||
{
|
||||
name: "Poor content",
|
||||
results: &ContentResults{
|
||||
HTMLValid: false,
|
||||
Links: []LinkCheck{{Valid: true, Status: 404}},
|
||||
Images: []ImageCheck{{HasAlt: false}},
|
||||
HasUnsubscribe: false,
|
||||
TextPlainRatio: 0.1,
|
||||
ImageTextRatio: 15.0,
|
||||
SuspiciousURLs: []string{"url1", "url2"},
|
||||
},
|
||||
minScore: 0,
|
||||
maxScore: 25,
|
||||
},
|
||||
{
|
||||
name: "Average content",
|
||||
results: &ContentResults{
|
||||
HTMLValid: true,
|
||||
Links: []LinkCheck{{Valid: true, Status: 200}},
|
||||
Images: []ImageCheck{{HasAlt: true}},
|
||||
HasUnsubscribe: false,
|
||||
TextPlainRatio: 0.5,
|
||||
ImageTextRatio: 4.0,
|
||||
},
|
||||
minScore: 50,
|
||||
maxScore: 90,
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
score := analyzer.GetContentScore(tt.results)
|
||||
|
||||
if score < tt.minScore || score > tt.maxScore {
|
||||
t.Errorf("GetContentScore() = %v, want between %v and %v", score, tt.minScore, tt.maxScore)
|
||||
}
|
||||
|
||||
// Ensure score is capped at 100
|
||||
if score > 100 {
|
||||
t.Errorf("Score %v exceeds maximum of 100", score)
|
||||
}
|
||||
|
||||
// Ensure score is not negative
|
||||
if score < 0 {
|
||||
t.Errorf("Score %v is negative", score)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateContentChecks(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
results *ContentResults
|
||||
minChecks int
|
||||
}{
|
||||
{
|
||||
name: "Nil results",
|
||||
results: nil,
|
||||
minChecks: 0,
|
||||
},
|
||||
{
|
||||
name: "Complete results",
|
||||
results: &ContentResults{
|
||||
HTMLValid: true,
|
||||
Links: []LinkCheck{{Valid: true}},
|
||||
Images: []ImageCheck{{HasAlt: true}},
|
||||
HasUnsubscribe: true,
|
||||
TextContent: "Plain text",
|
||||
HTMLContent: "<p>HTML text</p>",
|
||||
ImageTextRatio: 3.0,
|
||||
},
|
||||
minChecks: 5, // HTML, Links, Images, Unsubscribe, Text consistency, Image ratio
|
||||
},
|
||||
{
|
||||
name: "With suspicious URLs",
|
||||
results: &ContentResults{
|
||||
HTMLValid: true,
|
||||
SuspiciousURLs: []string{"url1"},
|
||||
},
|
||||
minChecks: 3, // HTML, Unsubscribe, Suspicious URLs
|
||||
},
|
||||
}
|
||||
|
||||
analyzer := NewContentAnalyzer(5 * time.Second)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
checks := analyzer.GenerateContentChecks(tt.results)
|
||||
|
||||
if len(checks) < tt.minChecks {
|
||||
t.Errorf("Got %d checks, want at least %d", len(checks), tt.minChecks)
|
||||
}
|
||||
|
||||
// Verify all checks have the Content category
|
||||
for _, check := range checks {
|
||||
if check.Category != api.Content {
|
||||
t.Errorf("Check %s has category %v, want %v", check.Name, check.Category, api.Content)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Helper functions for testing
|
||||
|
||||
func parseHTML(htmlStr string) (*html.Node, error) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue