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

1"""Tests for writing judges' names in other ways.""" 

2 

3from __future__ import annotations 

4 

5import pandas as pd 

6import pytest 

7from conftest import tables 

8 

9import fjc_biographies 

10from fjc_biographies import names 

11 

12 

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() 

29 

30 

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' 

42 

43 

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} 

56 

57 

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')) 

73 

74 

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'])