File size: 2,847 Bytes
546c207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"""Table extraction and part-number validation."""

from spareparts import config, pdf_loader, table_parser


def test_page_26_matches_the_printed_table(doc):
    parsed = table_parser.parse_page(doc[25])

    assert parsed.pdf_page == 26
    assert parsed.section_code == "01"
    assert parsed.section_de == "Abdeckhaube"
    assert parsed.section_en == "Cover"
    assert parsed.models == "PU-ELA-Z"
    assert len(parsed.rows) == 36

    first = parsed.rows[0]
    assert first.part_no == "30302"
    assert first.name_de == "Drehknopf,kpl."
    assert first.name_en == "revoling button,cpl."
    assert first.name_fr == "bouton tournant,cpl."
    assert parsed.rows[-1].part_no == "79038"


def test_part_numbers_are_strings(doc):
    parsed = table_parser.parse_page(doc[25])
    assert all(isinstance(row.part_no, str) for row in parsed.rows)
    # A number that would lose meaning as an int must survive verbatim.
    assert table_parser.parse_page(doc[46]).rows  # page 47, checked below


def test_malformed_part_number_is_flagged_not_corrupted(doc):
    # Page 47 lists '351159' (6 digits) where the diagram prints '35159'.
    rows = {row.part_no: row for row in table_parser.parse_page(doc[46]).rows}
    assert "351159" in rows
    assert rows["351159"].is_malformed is True
    assert rows["351159"].name_de == "Kipperhebel"
    assert sum(row.is_malformed for row in rows.values()) == 1


def test_page_52_footnotes_filtered_but_later_parts_kept(doc):
    parsed = table_parser.parse_page(doc[51])

    # The '*', '**' and '***' definition rows are skipped, plus one blank row.
    assert [raw for _, raw in parsed.skipped_rows] == ["*", "**", "***", ""]
    assert parsed.rejected_rows == []

    numbers = [row.part_no for row in parsed.rows]
    assert len(numbers) == 24
    # Real parts listed *after* the footnote block must still be present.
    for part_no in ("30343", "30346", "32569", "79123"):
        assert part_no in numbers


def test_footnote_marker_is_split_off_the_german_name(doc):
    rows = {row.part_no: row for row in table_parser.parse_page(doc[51]).rows}
    assert rows["76744"].footnote == "*"
    assert rows["76744"].name_de == "Handkamm"
    assert rows["76752"].footnote == "**"
    assert rows["76752"].name_de == "Bürstenwalze"
    assert rows["30074"].footnote == ""


def test_document_wide_totals(doc):
    rows = 0
    distinct = set()
    skipped = 0
    for pdf_page in pdf_loader.find_catalogue_pages(doc):
        parsed = table_parser.parse_page(doc[pdf_page - 1])
        assert parsed.rejected_rows == [], f"page {pdf_page}"
        rows += len(parsed.rows)
        distinct.update(row.part_no for row in parsed.rows)
        skipped += len(parsed.skipped_rows)

    assert rows == config.EXPECTED_OCCURRENCES
    assert len(distinct) == config.EXPECTED_PARTS
    assert skipped == 13