import unittest
from olmocr.bench.synth.mine_html_templates import extract_html_metadata
class TestExtractHtmlMetadata(unittest.TestCase):
def test_extract_metadata_portuguese_document(self):
"""Test metadata extraction from a Portuguese document with mixed content."""
html_content = """
Test Document
Política de Metadados
Este é um documento de teste com texto em português.
Contém múltiplos parágrafos para simular conteúdo real.
Image placeholder 1
Mais texto após a imagem.
"""
metadata = extract_html_metadata(html_content)
# Check language extraction
self.assertEqual(metadata['primary_language'], 'pt')
# Check rotation values (always fixed)
self.assertTrue(metadata['is_rotation_valid'])
self.assertEqual(metadata['rotation_correction'], 0)
# Check table/diagram detection
# With 1 image (500 chars) and small text content, image ratio > 50%
self.assertFalse(metadata['is_table'])
self.assertTrue(metadata['is_diagram']) # Image estimate dominates
def test_extract_metadata_table_heavy_document(self):
"""Test metadata extraction from a document that is mostly tables."""
html_content = """
Small intro text
Cell 1 | Cell 2 | Cell 3 |
Data A | Data B | Data C |
More data | More data | More data |
Even more data | Even more data | Even more data |
Lots of data | Lots of data | Lots of data |
Table content | Table content | Table content |
Final row | Final row | Final row |
"""
metadata = extract_html_metadata(html_content)
self.assertEqual(metadata['primary_language'], 'en')
self.assertTrue(metadata['is_table']) # Should be True as >50% is table
self.assertFalse(metadata['is_diagram'])
def test_extract_metadata_image_heavy_document(self):
"""Test metadata extraction from a document that is mostly images."""
html_content = """
Brief text
Image 1
Image 2
Image 3
Image 4
Image 5
"""
metadata = extract_html_metadata(html_content)
self.assertEqual(metadata['primary_language'], 'es')
self.assertFalse(metadata['is_table'])
self.assertTrue(metadata['is_diagram']) # Should be True as >50% is images
def test_extract_metadata_language_with_region(self):
"""Test that language codes with regions (e.g., pt-BR) are shortened."""
html_content = """
Texto em português brasileiro
"""
metadata = extract_html_metadata(html_content)
# Should convert pt-BR to pt
self.assertEqual(metadata['primary_language'], 'pt')
def test_extract_metadata_no_html_tag(self):
"""Test extraction when there's no html tag (defaults to 'en')."""
html_content = """
Content without html tag
"""
metadata = extract_html_metadata(html_content)
self.assertEqual(metadata['primary_language'], 'en') # Should default to 'en'
def test_extract_metadata_mixed_content(self):
"""Test a document with mixed content types."""
html_content = """
Política de Metadados para Livros e Capítulos de Livro UFPA
Política de Metadados para Livros e Capítulos de Livro UFPA
Essa política de metadados possui o objetivo de garantir a consistência do trabalho executado no Portal do Livro Aberto. Dessa forma, foi desenvolvido com base no esquema de metadados do Dublin Core com adaptações para a realidade brasileira e local.
METADADOS |
VALOR |
REPETITIVO |
CONDIÇÃO |
dc.type |
Tipo de documento |
Não |
Obrigatório |
dc.title |
Título e subtítulo (se houver) |
Não |
Obrigatório |
dc.title.alternative |
Título alternativo |
Sim |
Opcional |
dc.creator |
Autor |
Sim |
Opcional |
dc.creator.Lattes |
URL do currículo Lattes do autor |
Sim |
Opcional |
dc.creator.ORCID |
ORCID do autor |
Sim |
Opcional |
dc.description.affiliation |
Afiliação do autor |
Sim |
Opcional |
dc.contributor.organizer |
Organizador |
Sim |
Opcional |
dc.contributor.organizerLattes |
URL do currículo Lattes do organizador |
Sim |
Opcional |
dc.contributor.organizerORCID |
ORCID do organizador |
Sim |
Opcional |
dc.description.affiliationOrganizer |
Afiliação do organizador |
Sim |
Opcional |
dc.contributor.coordinator |
Coordenador |
Sim |
Opcional |
dc.contributor.coordinatorLattes |
URL do currículo Lattes do coordenador |
Sim |
Opcional |
dc.contributor.coordinatorORCID |
ORCID do coordenador |
Sim |
Opcional |
dc.contributor.affiliationCoordinator |
Afiliação do coordenador |
Sim |
Opcional |
dc.contributor.editor |
Editor |
Sim |
Opcional |
dc.contributor.editorLattes |
URL do currículo Lattes do editor |
Sim |
Opcional |
dc.contributor.editorORCID |
ORCID do editor |
Sim |
Opcional |
dc.description.affiliationEditor |
Afiliação do editor |
Sim |
Opcional |
"""
metadata = extract_html_metadata(html_content)
self.assertEqual(metadata['primary_language'], 'pt')
self.assertTrue(metadata['is_table'])
self.assertFalse(metadata['is_diagram'])
def test_extract_metadata_empty_body(self):
"""Test extraction with empty or minimal content."""
html_content = """
"""
metadata = extract_html_metadata(html_content)
self.assertEqual(metadata['primary_language'], 'de')
self.assertFalse(metadata['is_table'])
self.assertFalse(metadata['is_diagram'])
self.assertTrue(metadata['is_rotation_valid'])
self.assertEqual(metadata['rotation_correction'], 0)
if __name__ == '__main__':
unittest.main()