test: add end-to-end integration test for HTML filter to image extraction
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// lib/parse/integration_test.go
|
||||
package parse
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestIntegration_HTMLFilterToExtractImages(t *testing.T) {
|
||||
// Skip if html-kitty filter or w3m not available
|
||||
filterPath := filepath.Join(os.Getenv("HOME"),
|
||||
".local/libexec/aerc/filters/html-kitty")
|
||||
if _, err := os.Stat(filterPath); err != nil {
|
||||
t.Skip("html-kitty filter not found:", err)
|
||||
}
|
||||
if _, err := exec.LookPath("w3m"); err != nil {
|
||||
t.Skip("w3m not found:", err)
|
||||
}
|
||||
|
||||
// HTML with a data: URI image
|
||||
html := `<html><body>
|
||||
<p>Hello World</p>
|
||||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" alt="tiny red pixel">
|
||||
<p>Goodbye</p>
|
||||
</body></html>`
|
||||
|
||||
cmd := exec.Command("python3", filterPath)
|
||||
cmd.Stdin = strings.NewReader(html)
|
||||
cmd.Env = append(os.Environ(), "COLUMNS=80")
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t.Fatalf("filter failed: %v", err)
|
||||
}
|
||||
|
||||
// Extract images from filter output
|
||||
cleaned, images := ExtractImages(strings.NewReader(string(out)))
|
||||
if len(images) == 0 {
|
||||
t.Fatal("expected at least 1 image from filter output")
|
||||
}
|
||||
|
||||
// Verify image file exists on disk
|
||||
if _, err := os.Stat(images[0].Path); err != nil {
|
||||
t.Errorf("image file not found: %s", images[0].Path)
|
||||
}
|
||||
|
||||
// Verify alt text
|
||||
if images[0].Alt != "tiny red pixel" {
|
||||
t.Errorf("alt = %q, want 'tiny red pixel'", images[0].Alt)
|
||||
}
|
||||
|
||||
// Verify cleaned output has placeholder
|
||||
cleanedBytes, _ := io.ReadAll(cleaned)
|
||||
cleanedStr := string(cleanedBytes)
|
||||
if !strings.Contains(cleanedStr, "\x00IMG:0\x00") {
|
||||
t.Error("cleaned output missing placeholder")
|
||||
}
|
||||
|
||||
// Verify text content preserved
|
||||
if !strings.Contains(cleanedStr, "Hello World") {
|
||||
t.Error("text content 'Hello World' lost")
|
||||
}
|
||||
|
||||
// Clean up temp files
|
||||
for _, img := range images {
|
||||
dir := filepath.Dir(img.Path)
|
||||
os.RemoveAll(dir)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user