11from django .test import TestCase , Client
22from django .urls import reverse
33
4- from users .models import Membership
5-
6- from .factories import UserFactory
4+ from nominations .models import Fellow
75
86
97class FellowsRosterViewTests (TestCase ):
@@ -23,62 +21,18 @@ def test_alt_url_works(self):
2321 self .assertEqual (response .status_code , 200 )
2422
2523 def test_only_fellows_shown (self ):
26- """Only members with membership_type=FELLOW should appear on the roster."""
27- fellow_user = UserFactory (first_name = "Alice" , last_name = "Fellow" )
28- Membership .objects .create (
29- creator = fellow_user ,
30- membership_type = Membership .FELLOW ,
31- legal_name = "Alice Fellow" ,
32- preferred_name = "Alice" ,
33- email_address = fellow_user .email ,
34- )
35- basic_user = UserFactory (first_name = "Bob" , last_name = "Basic" )
36- Membership .objects .create (
37- creator = basic_user ,
38- membership_type = Membership .BASIC ,
39- legal_name = "Bob Basic" ,
40- preferred_name = "Bob" ,
41- email_address = basic_user .email ,
42- )
43- supporting_user = UserFactory (first_name = "Carol" , last_name = "Supporter" )
44- Membership .objects .create (
45- creator = supporting_user ,
46- membership_type = Membership .SUPPORTING ,
47- legal_name = "Carol Supporter" ,
48- preferred_name = "Carol" ,
49- email_address = supporting_user .email ,
50- )
24+ """All Fellow records should appear on the roster."""
25+ Fellow .objects .create (name = "Alice Fellow" , year_elected = 2020 , status = "active" )
26+ Fellow .objects .create (name = "Bob Emeritus" , year_elected = 2015 , status = "emeritus" )
5127 response = self .client .get (self .url )
5228 self .assertContains (response , "Alice Fellow" )
53- self .assertNotContains (response , "Bob Basic" )
54- self .assertNotContains (response , "Carol Supporter" )
29+ self .assertContains (response , "Bob Emeritus" )
5530
5631 def test_alphabetical_ordering (self ):
57- """Fellows should be ordered by last name, then first name."""
58- user_z = UserFactory (first_name = "Zara" , last_name = "Zebra" )
59- Membership .objects .create (
60- creator = user_z ,
61- membership_type = Membership .FELLOW ,
62- legal_name = "Zara Zebra" ,
63- preferred_name = "Zara" ,
64- email_address = user_z .email ,
65- )
66- user_a = UserFactory (first_name = "Alice" , last_name = "Alpha" )
67- Membership .objects .create (
68- creator = user_a ,
69- membership_type = Membership .FELLOW ,
70- legal_name = "Alice Alpha" ,
71- preferred_name = "Alice" ,
72- email_address = user_a .email ,
73- )
74- user_m = UserFactory (first_name = "Mike" , last_name = "Middle" )
75- Membership .objects .create (
76- creator = user_m ,
77- membership_type = Membership .FELLOW ,
78- legal_name = "Mike Middle" ,
79- preferred_name = "Mike" ,
80- email_address = user_m .email ,
81- )
32+ """Fellows should be ordered by name."""
33+ Fellow .objects .create (name = "Zara Zebra" , year_elected = 2020 , status = "active" )
34+ Fellow .objects .create (name = "Alice Alpha" , year_elected = 2019 , status = "active" )
35+ Fellow .objects .create (name = "Mike Middle" , year_elected = 2018 , status = "active" )
8236 response = self .client .get (self .url )
8337 content = response .content .decode ()
8438 pos_alice = content .index ("Alice Alpha" )
@@ -90,52 +44,62 @@ def test_alphabetical_ordering(self):
9044 def test_total_count_in_context (self ):
9145 """The context should include the total count of Fellows."""
9246 for i in range (3 ):
93- user = UserFactory (first_name = f"Fellow{ i } " , last_name = f"User{ i } " )
94- Membership .objects .create (
95- creator = user ,
96- membership_type = Membership .FELLOW ,
97- legal_name = f"Fellow{ i } User{ i } " ,
98- preferred_name = f"Fellow{ i } " ,
99- email_address = user .email ,
47+ Fellow .objects .create (
48+ name = f"Fellow{ i } User{ i } " , year_elected = 2020 , status = "active"
10049 )
10150 response = self .client .get (self .url )
10251 self .assertEqual (response .context ["total_count" ], 3 )
103- self .assertContains (response , "3" )
10452
10553 def test_empty_roster (self ):
10654 """When there are no Fellows, an appropriate message should be shown."""
10755 response = self .client .get (self .url )
10856 self .assertEqual (response .status_code , 200 )
10957 self .assertContains (response , "No PSF Fellows found" )
11058
111- def test_fellow_with_location (self ):
112- """Fellow with city and country should display location info."""
113- user = UserFactory (first_name = "Located" , last_name = "Fellow" )
114- Membership .objects .create (
115- creator = user ,
116- membership_type = Membership .FELLOW ,
117- legal_name = "Located Fellow" ,
118- preferred_name = "Located" ,
119- email_address = user .email ,
120- city = "Portland" ,
121- country = "USA" ,
59+ def test_year_displayed (self ):
60+ """Fellow year elected should be displayed in parentheses."""
61+ Fellow .objects .create (name = "Year Fellow" , year_elected = 2019 , status = "active" )
62+ response = self .client .get (self .url )
63+ self .assertContains (response , "Year Fellow (2019)" )
64+
65+ def test_emeritus_year_displayed (self ):
66+ """Emeritus fellows should show both elected and emeritus year."""
67+ Fellow .objects .create (
68+ name = "Old Fellow" , year_elected = 2005 , status = "emeritus" , emeritus_year = 2020
12269 )
12370 response = self .client .get (self .url )
124- self .assertContains (response , "Portland" )
125- self .assertContains (response , "USA" )
71+ self .assertContains (response , "Old Fellow (2005/2020)" )
12672
127- def test_fellow_without_location (self ):
128- """Fellow without city/country should still render without errors."""
129- user = UserFactory (first_name = "NoLoc" , last_name = "Fellow" )
130- Membership .objects .create (
131- creator = user ,
132- membership_type = Membership .FELLOW ,
133- legal_name = "NoLoc Fellow" ,
134- preferred_name = "NoLoc" ,
135- email_address = user .email ,
136- city = "" ,
137- country = "" ,
73+ def test_deceased_notes_displayed (self ):
74+ """Deceased fellows should show notes if present."""
75+ Fellow .objects .create (
76+ name = "Remembered Fellow" ,
77+ year_elected = 2010 ,
78+ status = "deceased" ,
79+ notes = "A great contributor." ,
13880 )
13981 response = self .client .get (self .url )
140- self .assertEqual (response .status_code , 200 )
141- self .assertContains (response , "NoLoc Fellow" )
82+ self .assertContains (response , "Remembered Fellow" )
83+ self .assertContains (response , "A great contributor." )
84+
85+ def test_sections_in_context (self ):
86+ """Context should include separate querysets for each status."""
87+ Fellow .objects .create (name = "Active One" , year_elected = 2020 , status = "active" )
88+ Fellow .objects .create (name = "Active Two" , year_elected = 2019 , status = "active" )
89+ Fellow .objects .create (name = "Emeritus One" , year_elected = 2010 , status = "emeritus" )
90+ Fellow .objects .create (name = "Deceased One" , year_elected = 2005 , status = "deceased" )
91+ response = self .client .get (self .url )
92+ self .assertEqual (response .context ["active_count" ], 2 )
93+ self .assertEqual (response .context ["emeritus_count" ], 1 )
94+ self .assertEqual (response .context ["deceased_count" ], 1 )
95+ self .assertEqual (response .context ["total_count" ], 4 )
96+
97+ def test_section_headings_rendered (self ):
98+ """Each section heading should appear when fellows of that status exist."""
99+ Fellow .objects .create (name = "Active Fellow" , year_elected = 2020 , status = "active" )
100+ Fellow .objects .create (name = "Emeritus Fellow" , year_elected = 2010 , status = "emeritus" )
101+ Fellow .objects .create (name = "Deceased Fellow" , year_elected = 2005 , status = "deceased" )
102+ response = self .client .get (self .url )
103+ self .assertContains (response , "Fellows (1)" )
104+ self .assertContains (response , "Emeritus Fellows (1)" )
105+ self .assertContains (response , "In Memoriam (1)" )
0 commit comments