package services
import (
"os"
"path/filepath"
"testing"
)
func TestParseCalibreMetadataOPF(t *testing.T) {
tests := []struct {
name string
opfContent string
wantTitle string
wantAuthor string
wantSeries string
wantTags int
wantErr bool
}{
{
name: "Complete metadata.opf",
opfContent: `
Test Book
Test Author
Fantasy
Adventure
Test description
Test Publisher
2024-01-15
en
978-0-123456-78-9
Contributor Name
`,
wantTitle: "Test Book",
wantAuthor: "Test Author",
wantSeries: "Test Series",
wantTags: 2,
wantErr: false,
},
{
name: "Minimal metadata.opf",
opfContent: `
Minimal Book
`,
wantTitle: "Minimal Book",
wantAuthor: "",
wantSeries: "",
wantTags: 0,
wantErr: false,
},
{
name: "Malformed XML",
opfContent: `
Test`,
wantTitle: "",
wantAuthor: "",
wantSeries: "",
wantTags: 0,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create temporary OPF file
tmpDir := t.TempDir()
opfPath := filepath.Join(tmpDir, "metadata.opf")
if err := os.WriteFile(opfPath, []byte(tt.opfContent), 0644); err != nil {
t.Fatalf("Failed to create test OPF: %v", err)
}
// Parse
scanner := &MediaScanner{}
got, err := scanner.parseCalibreMetadataOPF(opfPath)
if (err != nil) != tt.wantErr {
t.Errorf("parseCalibreMetadataOPF() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !tt.wantErr && got.Title != tt.wantTitle {
t.Errorf("Title = %v, want %v", got.Title, tt.wantTitle)
}
if !tt.wantErr && got.Author != tt.wantAuthor {
t.Errorf("Author = %v, want %v", got.Author, tt.wantAuthor)
}
if !tt.wantErr && got.Series != tt.wantSeries {
t.Errorf("Series = %v, want %v", got.Series, tt.wantSeries)
}
if !tt.wantErr && len(got.Tags) != tt.wantTags {
t.Errorf("Tags length = %v, want %v", len(got.Tags), tt.wantTags)
}
})
}
}
func TestExtractCalibreSidecar(t *testing.T) {
t.Run("Sidecar exists", func(t *testing.T) {
tmpDir := t.TempDir()
opfPath := filepath.Join(tmpDir, "metadata.opf")
bookPath := filepath.Join(tmpDir, "book.epub")
// Create OPF file
opfContent := `
Sidecar Test
Test Author
`
if err := os.WriteFile(opfPath, []byte(opfContent), 0644); err != nil {
t.Fatal(err)
}
// Test extraction
scanner := &MediaScanner{}
metadata := scanner.extractCalibreSidecar(bookPath)
if metadata == nil {
t.Error("Expected metadata, got nil")
return
}
if metadata.Title != "Sidecar Test" {
t.Errorf("Title = %v, want 'Sidecar Test'", metadata.Title)
}
})
t.Run("No sidecar", func(t *testing.T) {
tmpDir := t.TempDir()
bookPath := filepath.Join(tmpDir, "book.epub")
scanner := &MediaScanner{}
metadata := scanner.extractCalibreSidecar(bookPath)
if metadata != nil {
t.Error("Expected nil, got metadata")
}
})
}