@@ -316,17 +316,40 @@ def test_outsider_state_changes_after_response(self):
316316 before = self .get_detail (outsider )
317317 self .assertEqual (before .status_code , status .HTTP_200_OK )
318318 self .assertFalse (before .data ["has_responded" ])
319+ self .assertIsNone (before .data ["response_status" ])
319320 self .assertTrue (before .data ["can_respond" ])
320321 self .assertFalse (before .data ["can_manage_responses" ])
321322
322323 create_vacancy_response (user = outsider , vacancy = self .vacancy )
323324 after = self .get_detail (outsider )
324325 self .assertTrue (after .data ["has_responded" ])
326+ self .assertEqual (after .data ["response_status" ], "pending" )
325327 self .assertFalse (after .data ["can_respond" ])
326328
329+ def test_response_status_maps_processed_responses (self ):
330+ for is_approved , expected_status in (
331+ (True , "accepted" ),
332+ (False , "rejected" ),
333+ ):
334+ with self .subTest (is_approved = is_approved ):
335+ applicant = create_user (prefix = f"applicant-{ expected_status } " )
336+ create_vacancy_response (
337+ user = applicant ,
338+ vacancy = self .vacancy ,
339+ is_approved = is_approved ,
340+ )
341+
342+ response = self .get_detail (applicant )
343+
344+ self .assertEqual (response .status_code , status .HTTP_200_OK )
345+ self .assertTrue (response .data ["has_responded" ])
346+ self .assertEqual (response .data ["response_status" ], expected_status )
347+ self .assertFalse (response .data ["can_respond" ])
348+
327349 def test_leader_and_collaborator_states (self ):
328350 leader_response = self .get_detail (self .leader )
329351 self .assertFalse (leader_response .data ["has_responded" ])
352+ self .assertIsNone (leader_response .data ["response_status" ])
330353 self .assertFalse (leader_response .data ["can_respond" ])
331354 self .assertTrue (leader_response .data ["can_manage_responses" ])
332355
@@ -348,9 +371,35 @@ def test_closed_and_anonymous_states(self):
348371
349372 anonymous_response = self .get_detail (None )
350373 self .assertFalse (anonymous_response .data ["has_responded" ])
374+ self .assertIsNone (anonymous_response .data ["response_status" ])
351375 self .assertFalse (anonymous_response .data ["can_respond" ])
352376 self .assertFalse (anonymous_response .data ["can_manage_responses" ])
353377
378+ def test_response_status_does_not_add_separate_detail_query (self ):
379+ applicant = create_user (prefix = "query-count-applicant" )
380+ create_vacancy_response (user = applicant , vacancy = self .vacancy )
381+ self .client .force_authenticate (applicant )
382+
383+ with CaptureQueriesContext (connection ) as queries :
384+ response = self .client .get (f"/vacancies/{ self .vacancy .id } /" )
385+
386+ self .assertEqual (response .status_code , status .HTTP_200_OK )
387+ response_table = VacancyResponse ._meta .db_table
388+ response_queries = [
389+ query ["sql" ]
390+ for query in queries .captured_queries
391+ if response_table in query ["sql" ]
392+ ]
393+ self .assertEqual (len (response_queries ), 2 )
394+ self .assertEqual (
395+ sum (
396+ 'AS "current_user_response_is_approved"' in query
397+ for query in response_queries
398+ ),
399+ 1 ,
400+ )
401+ self .assertEqual (response .data ["response_status" ], "pending" )
402+
354403
355404class VacancyResponseDecisionContractTests (TestCase ):
356405 def setUp (self ):
0 commit comments