Coverage for tests/test_names.py: 100%
51 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-22 22:47 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-22 22:47 +0000
1"""Tests for writing judges' names in other ways."""
3from __future__ import annotations
5import pandas as pd
6import pytest
7from conftest import tables
9import fjc_biographies
10from fjc_biographies import names
13def test_permutations() -> None:
14 written = fjc_biographies.name_permutations('Milton', 'Dale', 'Smith', 'Jr.')
15 assert written == {
16 'name_first_middle_last': 'Milton Dale Smith',
17 'name_first_middle_last_bracket_period': 'Milton Dale Smith',
18 'name_first_middle_last_suffix': 'Milton Dale Smith, Jr.',
19 'name_first_middle_last_suffix_bracket_period': 'Milton Dale Smith, Jr.',
20 'name_first_middle_initial_last': 'Milton D. Smith',
21 'name_first_middle_initial_last_bracket_period': 'Milton D. Smith',
22 'name_first_middle_initial_last_suffix': 'Milton D. Smith, Jr.',
23 'name_first_middle_initial_last_suffix_bracket_period': 'Milton D. Smith, Jr.',
24 'name_first_last': 'Milton Smith',
25 'name_first_last_bracket_period': 'Milton Smith',
26 'name_first_last_suffix': 'Milton Smith, Jr.',
27 'name_first_last_suffix_bracket_period': 'Milton Smith, Jr.'}
28 assert list(written) == names.columns()
31def test_permutations_with_brackets() -> None:
32 written = names.permutations('R[obert]', 'Lanier', 'Anderson', 'III')
33 # The brackets are removed, or the brackets and the letters in them are
34 # replaced with a period.
35 assert written['name_first_middle_last'] == 'Robert Lanier Anderson'
36 assert written['name_first_middle_last_bracket_period'] == 'R. Lanier Anderson'
37 assert written['name_first_middle_last_suffix'] == 'Robert Lanier Anderson, III'
38 assert written['name_first_middle_last_suffix_bracket_period'] == 'R. Lanier Anderson, III'
39 assert written['name_first_middle_initial_last_bracket_period'] == 'R. L. Anderson'
40 assert written['name_first_last'] == 'Robert Anderson'
41 assert written['name_first_last_bracket_period'] == 'R. Anderson'
44def test_permutations_with_missing_parts() -> None:
45 # Without a middle name or a suffix, there are no extra spaces or commas.
46 written = names.permutations('Mary', None, 'Lynch', float('nan'))
47 assert set(written.values()) == {'Mary Lynch'}
48 # A middle name that is an initial keeps a single period.
49 assert names.permutations('John', 'Q.', 'Howard')['name_first_middle_initial_last'] == 'John Q. Howard'
50 # Spaces are made single, and the initial is that of the first middle name.
51 written = names.permutations(' Kim ', 'van Pelt', 'Doe')
52 assert written['name_first_middle_last'] == 'Kim van Pelt Doe'
53 assert written['name_first_middle_initial_last'] == 'Kim V. Doe'
54 # A name with no first or last name has no permutations.
55 assert set(names.permutations(None, None, None).values()) == {None}
58def test_add_permutations() -> None:
59 people = fjc_biographies.tidy(tables()['demographics'])
60 added = names.add_permutations(people)
61 columns = list(added.columns)
62 # The columns come right after the suffix.
63 start = columns.index('suffix') + 1
64 assert columns[start:start + len(names.columns())] == names.columns()
65 assert columns[start + len(names.columns())] == 'birth_year'
66 fields = added.set_index('nid')
67 assert fields.loc[108, 'name_first_middle_last_suffix_bracket_period'] == 'R. Lanier Fields, III'
68 assert fields.loc[105, 'name_first_last'] == 'Norman Smith'
69 assert fields.loc[105, 'name_first_last_bracket_period'] == 'N. Smith'
70 assert fields.loc[112, 'name_first_middle_last'] == 'John Marsh'
71 with pytest.raises(KeyError, match = 'suffix'):
72 names.add_permutations(people.drop(columns = 'suffix'))
75def test_roster_has_permutations() -> None:
76 files = tables()
77 roster = fjc_biographies.build_roster(files['service'], files['demographics'], files['career'])
78 assert set(names.columns()) <= set(roster.columns)
79 by_judge = fjc_biographies.roster_by_judge(roster)
80 # The names describe the judge, so they are not numbered.
81 assert 'name_first_last' in by_judge.columns
82 assert 'name_first_last_1' not in by_judge.columns
83 # A judge who is not in the file of demographics has none.
84 missing = fjc_biographies.build_roster(files['service'], files['demographics'].iloc[1:])
85 assert missing.loc[missing['nid'] == 101, names.columns()].isna().all(axis = None)
86 assert pd.api.types.is_string_dtype(roster['name_first_last'])