adding tool and tests
This commit is contained in:
120
main_test.go
Normal file
120
main_test.go
Normal file
@@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGenerateSlug(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
input string
|
||||
expected string
|
||||
}{
|
||||
{"Normal title", "The Ultimate Guide to Go", "the-ultimate-guide-to-go"},
|
||||
{"Long title truncation", "This is a very long title that should be cut off", "this-is-a-very-long"},
|
||||
{"Punctuation removal", "Wow! This is: awesome (really).", "wow-this-is-awesome-really"},
|
||||
{"Multiple spaces", "Title with spaces", "title-with-spaces"},
|
||||
{"Empty string", "", ""},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := generateSlug(tt.input)
|
||||
if got != tt.expected {
|
||||
t.Errorf("generateSlug(%q) = %q; want %q", tt.input, got, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestProcessHTML(t *testing.T) {
|
||||
inputHTML := `
|
||||
<html>
|
||||
<body>
|
||||
<h2>Capo Notation</h2>
|
||||
<p>Here is an image:</p>
|
||||
<img src="https://cdn.example.com/81ef078d0f81976e11d05467fb8f233d.jpg" />
|
||||
<img src="https://other.com/cat.jpg?size=large" />
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
|
||||
targetURL, _ := url.Parse("https://example.com/blog/post")
|
||||
outDir := "/tmp/output"
|
||||
|
||||
modifiedHTML, jobs, err := processHTML(inputHTML, targetURL, outDir)
|
||||
if err != nil {
|
||||
t.Fatalf("processHTML failed: %v", err)
|
||||
}
|
||||
|
||||
if len(jobs) != 2 {
|
||||
t.Fatalf("expected 2 image jobs, got %d", len(jobs))
|
||||
}
|
||||
|
||||
// Test first image (CDN hash fallback to nearest preceding heading)
|
||||
job1 := jobs[0]
|
||||
if !strings.HasPrefix(filepath.Base(job1.LocalPath), "capo-notation-") {
|
||||
t.Errorf("expected job1 filename to fallback to 'capo-notation-', got %q", filepath.Base(job1.LocalPath))
|
||||
}
|
||||
|
||||
// Test second image (Original filename)
|
||||
job2 := jobs[1]
|
||||
if !strings.HasPrefix(filepath.Base(job2.LocalPath), "cat-") {
|
||||
t.Errorf("expected job2 filename to fallback to 'cat-', got %q", filepath.Base(job2.LocalPath))
|
||||
}
|
||||
|
||||
// Ensure modified HTML has rewritten srcs and alts.
|
||||
if !strings.Contains(modifiedHTML, `alt="Capo Notation"`) {
|
||||
t.Errorf("modified HTML missing injected fallback alt text for job1.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDownloadImage(t *testing.T) {
|
||||
expectedContent := []byte("fake image content")
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/notfound.jpg" {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
w.Write(expectedContent)
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
tmpFile, err := os.CreateTemp("", "test_img_*.jpg")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create temp file: %v", err)
|
||||
}
|
||||
tmpPath := tmpFile.Name()
|
||||
tmpFile.Close()
|
||||
defer os.Remove(tmpPath)
|
||||
|
||||
ctx := context.Background()
|
||||
client := server.Client()
|
||||
|
||||
err = downloadImage(ctx, client, server.URL+"/test.jpg", tmpPath)
|
||||
if err != nil {
|
||||
t.Fatalf("downloadImage failed on valid URL: %v", err)
|
||||
}
|
||||
|
||||
content, err := os.ReadFile(tmpPath)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to read written file: %v", err)
|
||||
}
|
||||
if string(content) != string(expectedContent) {
|
||||
t.Errorf("expected content %q, got %q", expectedContent, content)
|
||||
}
|
||||
|
||||
err = downloadImage(ctx, client, server.URL+"/notfound.jpg", tmpPath)
|
||||
if err == nil {
|
||||
t.Errorf("expected error on 404 response, got nil")
|
||||
} else if !strings.Contains(err.Error(), "bad status 404") {
|
||||
t.Errorf("expected 404 error message, got %q", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user