Files
doczyai-pipelines/fieldExtraction/tests/preprocessing_test.py
T
Alex Galarce 9db0fb328e Merged in bugfix/identify-tables (pull request #544)
Don't consider table-subpages each individually for reimbursement exhibit identification

* Refine EXHIBIT_CHECK prompt

* test: rework `get_exhibit_pages` for table subpages

* Fix indentation

* Experimental table de-chunking

* Increase max_tokens for Claude model in exhibit page processing

* fix get_pages_to_process docstring

* refactor: improved docstring for get_exhibit_pages

* move `get_pages_to_process` to `preprocess.py`

* test: add unit tests for get_pages_to_process function

* Comment out debugging lines

* Changed prompt that was breading universal_json_load parsing

* fix: handle "no results" case in get_reimbursement_primary function

* fixed docstring


Approved-by: Katon Minhas
2025-05-28 16:57:23 +00:00

194 lines
6.9 KiB
Python

import pytest
from src.investment.preprocess import get_pages_to_process
class TestGetPagesToProcess:
"""Test cases for get_pages_to_process function."""
def test_regular_pages_only(self):
"""Test processing exhibits with no subpages - should return exhibit pages for chunk processing."""
reimbursement_exhibits = ["1", "5"]
exhibit_chunk_mapping = {
"1": "1",
"2": "1",
"3": "1",
"5": "5",
"6": "5",
"7": "7"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
assert result == ["1", "5"]
def test_subpages_only(self):
"""Test processing exhibits with subpages - should return all subpages individually."""
reimbursement_exhibits = ["5"]
exhibit_chunk_mapping = {
"1": "1",
"5.1": "5",
"5.2": "5",
"5.3": "5",
"7": "7"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
assert set(result) == {"5.1", "5.2", "5.3"}
def test_mixed_regular_and_subpages(self):
"""Test processing mix of regular exhibits and exhibits with subpages."""
reimbursement_exhibits = ["1", "5", "8"]
exhibit_chunk_mapping = {
"1": "1", # Regular exhibit (no subpages)
"2": "1",
"5.1": "5", # Exhibit with subpages
"5.2": "5",
"5.3": "5",
"8": "8", # Regular exhibit
"9": "8",
"10": "8"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
expected = ["1", "5.1", "5.2", "5.3", "8"]
assert set(result) == set(expected)
def test_exhibit_with_base_page_and_subpages(self):
"""Test exhibit that has both base page and subpages (e.g., '5', '5.1', '5.2')."""
reimbursement_exhibits = ["5"]
exhibit_chunk_mapping = {
"1": "1",
"5": "5", # Base page
"5.1": "5", # Subpages
"5.2": "5",
"7": "7"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
# Should return all pages in the exhibit since it has subpages
assert set(result) == {"5", "5.1", "5.2"}
def test_empty_reimbursement_exhibits(self):
"""Test handling of empty reimbursement exhibits list."""
reimbursement_exhibits = []
exhibit_chunk_mapping = {
"1": "1",
"2": "1",
"5.1": "5",
"5.2": "5"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
assert result == []
def test_complex_subpage_numbering(self):
"""Test complex subpage numbering patterns."""
reimbursement_exhibits = ["5", "10"]
exhibit_chunk_mapping = {
"1": "1",
"5.0": "5", # Different subpage patterns
"5.1": "5",
"5.10": "5", # Double digit subpage
"5.2": "5",
"10.1": "10",
"10.11": "10", # Double digit subpage
"10.2": "10"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
expected_5 = {"5.0", "5.1", "5.10", "5.2"}
expected_10 = {"10.1", "10.11", "10.2"}
assert set(result) == expected_5.union(expected_10)
def test_single_exhibit_single_page(self):
"""Test single exhibit with single page."""
reimbursement_exhibits = ["1"]
exhibit_chunk_mapping = {
"1": "1"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
assert result == ["1"]
def test_decimal_in_exhibit_name_not_subpage(self):
"""Test edge case where exhibit name contains decimal but isn't a subpage."""
# This might be an edge case depending on your data format
reimbursement_exhibits = ["1.5"] # Exhibit named "1.5"
exhibit_chunk_mapping = {
"1.5": "1.5", # This is the exhibit itself, not a subpage
"2": "1.5" # Regular page belonging to exhibit "1.5"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
# Since "1.5" contains a decimal, it should process pages individually
assert set(result) == {"1.5", "2"}
def test_order_preservation(self):
"""Test that the order of processing is preserved/predictable."""
reimbursement_exhibits = ["1", "5", "8"]
exhibit_chunk_mapping = {
"1": "1",
"5.2": "5",
"5.1": "5", # Intentionally out of order
"8": "8"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
# Should maintain order of exhibits in reimbursement_exhibits
assert result[0] == "1" # First exhibit
assert "5.2" in result and "5.1" in result # Subpages from second exhibit
assert result[-1] == "8" # Last exhibit
def test_multiple_exhibits_with_subpages(self):
"""Test multiple exhibits that all have subpages."""
reimbursement_exhibits = ["3", "7", "12"]
exhibit_chunk_mapping = {
"1": "1",
"3.1": "3",
"3.2": "3",
"7.1": "7",
"7.2": "7",
"7.3": "7",
"12.1": "12",
"12.2": "12"
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
expected = ["3.1", "3.2", "7.1", "7.2", "7.3", "12.1", "12.2"]
assert set(result) == set(expected)
# Integration test with actual preprocessing flow
class TestGetPagesToProcessIntegration:
"""Integration tests that simulate real preprocessing scenarios."""
def test_table_splitting_scenario(self):
"""Test scenario where tables are split creating subpages."""
# Simulate a scenario where exhibit 5 had a large table that got split
reimbursement_exhibits = ["1", "5"]
exhibit_chunk_mapping = {
"1": "1", # Regular exhibit
"2": "1",
"5": "5", # Original exhibit page
"5.1": "5", # Table continuation pages
"5.2": "5",
"5.3": "5",
"6": "6" # Next exhibit (not reimbursement)
}
result = get_pages_to_process(reimbursement_exhibits, exhibit_chunk_mapping)
# Exhibit 1: regular processing (chunk)
# Exhibit 5: individual processing (has subpages from table splitting)
expected = ["1", "5", "5.1", "5.2", "5.3"]
assert set(result) == set(expected)