11import pytest
22import time
3- from typing import Optional
3+ import logging
4+ from typing import Optional , Callable
45from datetime import datetime
56from datetime import date , timedelta
67from playwright .sync_api import Page , expect
1819from classes .subject import Subject
1920from pages .base_page import BasePage
2021
22+ logger = logging .getLogger (__name__ )
23+
2124
2225# Helpers
2326def compose_diagnosis_text_with_reason (
@@ -67,6 +70,44 @@ def prepare_subject_for_test(
6770 return nhs_number
6871
6972
73+ def assert_diagnosis_event_details (
74+ event_details : dict ,
75+ expected_status_not : Optional [str ],
76+ expected_event : str = "Record Diagnosis Date" ,
77+ expected_reason : Optional [str ] = None ,
78+ assert_today : bool = True ,
79+ log : Optional [Callable [[str ], None ]] = None ,
80+ ) -> None :
81+ if log :
82+ log (f"Checking event: { event_details ['event' ]} " )
83+ log (f"Checking status: { event_details .get ('latest_event_status' , '' )} " )
84+ log (f"Checking item: { event_details ['item' ]} " )
85+
86+ if expected_status_not is not None :
87+ assert expected_status_not not in event_details .get (
88+ "latest_event_status" , ""
89+ ), f"Expected status '{ expected_status_not } ' to be absent, but got: { event_details .get ('latest_event_status' )} "
90+
91+ assert event_details ["event" ] == expected_event
92+
93+ if expected_reason is not None :
94+ assert (
95+ expected_reason in event_details ["item" ]
96+ ), f"Expected reason '{ expected_reason } ' to be part of item, but got: { event_details ['item' ]} "
97+ else :
98+ assert (
99+ event_details .get ("diagnosis_reason" ) is None
100+ ), f"Expected 'diagnosis_reason' to be None, but got: { event_details .get ('diagnosis_reason' )} "
101+
102+ assert "Diag Date :" in event_details ["item" ]
103+
104+ if assert_today :
105+ today_formatted = date .today ().strftime ("%d %b %Y" )
106+ assert (
107+ today_formatted in event_details ["item" ]
108+ ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
109+
110+
70111# Scenario 1
71112@pytest .mark .regression
72113@pytest .mark .vpn_required
@@ -383,16 +424,12 @@ def test_amend_diagnosis_date_with_reason(page: Page):
383424 # Step 5: Assertions
384425 subject_event_status_s9 = SubjectEpisodeEventsAndNotesPage (page )
385426 event_details = subject_event_status_s9 .get_latest_event_details ()
386- assert "A51" not in event_details .get ("latest_event_status" , "" )
387- assert event_details ["event" ] == "Record Diagnosis Date"
388- assert (
389- amend_reason in event_details ["item" ]
390- ), f"Expected reason '{ amend_reason } ' to be part of item, but got: { event_details ['item' ]} "
391- assert "Diag Date :" in event_details ["item" ]
392- today_formatted = date .today ().strftime ("%d %b %Y" ) # "21 Jul 2025"
393- assert (
394- today_formatted in event_details ["item" ]
395- ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
427+ assert_diagnosis_event_details (
428+ event_details ,
429+ expected_status_not = "A51" ,
430+ expected_reason = amend_reason ,
431+ log = logger .debug ,
432+ )
396433
397434
398435# Scenario 10
@@ -469,12 +506,11 @@ def get_diagnosis_reason():
469506 return None
470507
471508
472- # Scenario 11
473509@pytest .mark .regression
474510@pytest .mark .vpn_required
475511@pytest .mark .fobt_diagnosis_date_entry
476512def test_amend_diagnosis_date_no_change_alert (page : Page ):
477- # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
513+ # Step 1: Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
478514 criteria = {
479515 "latest episode type" : "FOBT" ,
480516 "latest episode status" : "Open" ,
@@ -484,17 +520,14 @@ def test_amend_diagnosis_date_no_change_alert(page: Page):
484520 }
485521 prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
486522
487- # Step 2: Search subject and go to profile
488- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
489-
490- # Step 3: Interact with subject page
523+ # Step 2: Interact with subject page
491524 subject_page_s11 = RecordDiagnosisDatePage (page )
492525 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
493526 page .get_by_role ("checkbox" ).check ()
494527 page .get_by_role ("button" , name = "Amend Diagnosis Date" ).click ()
495528 subject_page_s11 .click_save_button ()
496529
497- # Step 5 : Assert alert message
530+ # Step 3 : Assert alert message
498531 alert_message = subject_page_s11 .get_alert_message ()
499532 expected = "An amended date of diagnosis must not be earlier than the recorded diagnosis date and not in the future."
500533 assert expected in alert_message , f"Unexpected alert message. Got: { alert_message } "
@@ -681,16 +714,9 @@ def test_record_and_amend_diagnosis_date_multiple_times(page: Page):
681714 # Step 6: Assertions
682715 subject_event_s15 = SubjectEpisodeEventsAndNotesPage (page )
683716 event_details = subject_event_s15 .get_latest_event_details ()
684- assert "A50" not in event_details ["latest_event_status" ]
685- assert event_details ["event" ] == "Record Diagnosis Date"
686- assert (
687- event_details .get ("diagnosis_reason" ) is None
688- ), f"Expected 'diagnosis_reason' to be None, but got: { event_details .get ('diagnosis_reason' )} "
689- assert "Diag Date :" in event_details ["item" ]
690- today_formatted = date .today ().strftime ("%d %b %Y" ) # "16 Jul 2025"
691- assert (
692- today_formatted in event_details ["item" ]
693- ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
717+ assert_diagnosis_event_details (
718+ event_details , expected_status_not = "A50" , expected_reason = None , log = logger .debug
719+ )
694720
695721 # --- Second: Amend Diagnosis Date (today, with reason) ---
696722 # Step 7: Interact with subject page
@@ -708,16 +734,12 @@ def test_record_and_amend_diagnosis_date_multiple_times(page: Page):
708734 # Step 8: Assertions
709735 subject_event_status_s15 = SubjectEpisodeEventsAndNotesPage (page )
710736 event_details = subject_event_status_s15 .get_latest_event_details ()
711- assert "A51" not in event_details .get ("latest_event_status" , "" )
712- assert event_details ["event" ] == "Record Diagnosis Date"
713- assert (
714- amend_reason in event_details ["item" ]
715- ), f"Expected reason '{ amend_reason } ' to be part of item, but got: { event_details ['item' ]} "
716- assert "Diag Date :" in event_details ["item" ]
717- today_formatted = date .today ().strftime ("%d %b %Y" ) # "16 Jul 2025"
718- assert (
719- today_formatted in event_details ["item" ]
720- ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
737+ assert_diagnosis_event_details (
738+ event_details ,
739+ expected_status_not = "A51" ,
740+ expected_reason = amend_reason ,
741+ log = logger .debug ,
742+ )
721743
722744 # --- Third: Remove Diagnosis Date (clear date, with reason) ---
723745 # Step 9: Interact with subject page
@@ -772,16 +794,12 @@ def test_record_and_amend_diagnosis_date_multiple_times(page: Page):
772794 # Step 12: Assertions
773795 subject_event_status_s15 = SubjectEpisodeEventsAndNotesPage (page )
774796 event_details = subject_event_status_s15 .get_latest_event_details ()
775- assert "A51" not in event_details .get ("latest_event_status" , "" )
776- assert event_details ["event" ] == "Record Diagnosis Date"
777- assert (
778- amend_reason in event_details ["item" ]
779- ), f"Expected reason '{ amend_reason } ' to be part of item, but got: { event_details ['item' ]} "
780- assert "Diag Date :" in event_details ["item" ]
781- today_formatted = date .today ().strftime ("%d %b %Y" ) # "16 Jul 2025"
782- assert (
783- today_formatted in event_details ["item" ]
784- ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
797+ assert_diagnosis_event_details (
798+ event_details ,
799+ expected_status_not = "A51" ,
800+ expected_reason = amend_reason ,
801+ log = logger .debug ,
802+ )
785803
786804
787805# Scenario 16
@@ -831,16 +849,9 @@ def test_support_user_can_amend_diagnosis_date_earlier(page: Page):
831849 # Step 6: Assertions
832850 subject_event_s16 = SubjectEpisodeEventsAndNotesPage (page )
833851 event_details = subject_event_s16 .get_latest_event_details ()
834- assert "A50" not in event_details ["latest_event_status" ]
835- assert event_details ["event" ] == "Record Diagnosis Date"
836- assert (
837- event_details .get ("diagnosis_reason" ) is None
838- ), f"Expected 'diagnosis_reason' to be None, but got: { event_details .get ('diagnosis_reason' )} "
839- assert "Diag Date :" in event_details ["item" ]
840- today_formatted = date .today ().strftime ("%d %b %Y" ) # "16 Jul 2025"
841- assert (
842- today_formatted in event_details ["item" ]
843- ), f"Expected today's date ({ today_formatted } ) in item but got: { event_details ['item' ]} "
852+ assert_diagnosis_event_details (
853+ event_details , expected_status_not = "A50" , expected_reason = None , log = logger .debug
854+ )
844855
845856 # --- Second: Amend Diagnosis Date (yesterday, with reason) ---
846857 # Step 7: Interact with subject page
0 commit comments