Files
IPSExtractor/services/services-count-facturas-medicas-serving/internal/pipeline/processor_timing_test.go
T

112 lines
2.5 KiB
Go

package pipeline
import (
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"github.com/pys/pdf-count/internal/domain"
"github.com/pys/pdf-count/internal/ocr"
)
func testPDFDir(t *testing.T) string {
t.Helper()
if d := os.Getenv("COUNT_TEST_PDF_DIR"); d != "" {
if st, err := os.Stat(d); err == nil && st.IsDir() {
return d
}
t.Fatalf("COUNT_TEST_PDF_DIR=%s not a directory", d)
}
var starts []string
if _, file, _, ok := runtime.Caller(0); ok {
starts = append(starts, filepath.Dir(file))
}
if wd, err := os.Getwd(); err == nil {
starts = append(starts, wd)
}
for _, start := range starts {
dir := start
for i := 0; i < 8; i++ {
candidate := filepath.Join(dir, "docs", "plan_pruebas", "data")
if st, err := os.Stat(candidate); err == nil && st.IsDir() {
return candidate
}
parent := filepath.Dir(dir)
if parent == dir {
break
}
dir = parent
}
}
return ""
}
func listFixturePDFs(t *testing.T, dir string) []string {
t.Helper()
entries, err := os.ReadDir(dir)
if err != nil {
t.Fatalf("read pdf dir: %v", err)
}
var files []string
for _, e := range entries {
if e.IsDir() {
continue
}
name := e.Name()
if strings.EqualFold(filepath.Ext(name), ".pdf") {
files = append(files, filepath.Join(dir, name))
}
}
return files
}
func TestProcessPDFTimingFixtures(t *testing.T) {
dir := testPDFDir(t)
if dir == "" {
t.Skip("PDF fixtures not found; set COUNT_TEST_PDF_DIR to docs/plan_pruebas/data")
}
pdfs := listFixturePDFs(t, dir)
if len(pdfs) == 0 {
t.Skip("no PDF files in " + dir)
}
engine, err := ocr.NewEngine("spa", 1)
if err != nil {
t.Skipf("tesseract not available: %v", err)
}
defer engine.Close()
proc := NewProcessor(nil, engine, Options{
DPI: 200,
DBSCANEps: 10,
DBSCANMinSamples: 1,
LogPipelineTiming: true,
})
t.Logf("pdf_dir=%s files=%d", dir, len(pdfs))
t.Logf("%-28s %8s %8s %8s %8s %8s %6s %s",
"file", "render", "ocr", "cluster", "infer", "total", "count", "status")
for _, path := range pdfs {
data, err := os.ReadFile(path)
if err != nil {
t.Fatalf("read %s: %v", path, err)
}
name := filepath.Base(path)
res := proc.ProcessPDF(name, data)
t.Logf("%-28s %6dms %6dms %6dms %6dms %6dms %6d %s",
name, res.RenderMs, res.OCRMs, res.ClusterMs, res.InferMs, res.TotalMs, res.ServiceCount, res.Status)
if res.Status == domain.StatusError {
t.Errorf("%s failed: %s", name, res.Error)
continue
}
if res.TotalMs <= 0 {
t.Errorf("%s: TotalMs should be > 0", name)
}
}
}