
    oi^
             	          d Z ddlZddlZddlZddlZddlZddlmZmZmZ ddl	Z	dZ
dZdZdZdZ ej                         j!                  d	      Z ej$                         Zee_        ddg d
ddg d
ddg d
ddg d
ddg d
ddg d
dZi ad Zd!dZd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*e+d k(  r e*        yy)"zt
Comprehensive Test Suite for Vera Medical CRM
Tests all phases: 1, 2, 3, 4, and 5
Generates a detailed test report
    N)datetimedate	timedeltazhttp://localhost:5050zdatabase/vera_medical.dbadminadmin123   z%Y%m%d_%H%M%S)passedfailedtests)phase1phase2phase3phase4phase5generalc                      t        j                  t        d      } | j                  d       | j                  d       t         j                  | _        | S )z,Get database connection with proper settingsg      >@timeoutzPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)sqlite3connectDB_PATHexecuteRowrow_factory)conns    =/home/ab5.sw7ft.com/public_html/scripts/test_comprehensive.pyget_db_connr   )   s=    ??7D1DLL*+LL,-{{DK    c                 4   |rdnd}|||t        j                         j                         d}t        |    d   j	                  |       |r&t        |    dxx   dz  cc<   t        d| d|        yt        |    d	xx   dz  cc<   t        d| d| d
|        y)zLog test resultu   ✅ PASSu   ❌ FAIL)namestatusmessage	timestampr   r	        : r
   z - N)r   now	isoformattest_resultsappendprint)phase	test_namer	   r"   r!   results         r   log_testr/   1   s    !ZzF\\^--/	F  ''/UH%*%6("YK()UH%*%6("YKs7)45r   c                     t        d       	 t        j                  t         dt              } | j
                  dk7  ryt        j                  t         dt        t        dt        d      } | j
                  dk(  rDd	| j                  j                         v sd
| j                  j                         v rt        d       yy# t        $ r}t        d|        Y d}~yd}~ww xY w)zLogin to the applicationu   
🔐 Logging in.../loginr      F)usernamepasswordTdatar   allow_redirectslogoutzcase searchu   ✅ Login successfulu   ❌ Login failed: N)r+   sessiongetBASE_URLREQUEST_TIMEOUTstatus_codepostUSERNAMEPASSWORDtextlower	Exception)responsees     r   loginrF   B   s    	
 !;;(62O;L3&<<j&H=# 	   
 3&H8K8K8M,MQ^bjbobobububwQw() "1#&'s   1C BC 	C#CC#c                     t        d       i } 	 t               }|j                  ddt         dt         dt         dt         ddt         dd	d
dddf
      j                  }|| d<   |j                  ddt         ddddf      j                  }|| d<   |j                  ddt         dddddf      j                  }|| d<   |j                  ddt         dt         |d t         dd!d"t         d#d$t         df      j                  }|| d%<   |j                  d&d't         d't         d(d)t         t        j                         j                         d*||||d+f      j                  }|| d,<   |j                  d-|t        j                         t        d./      z   j                         d0d1d2d(d(d3d4d5d6d7t         d8t         f      j                  }|| d9<   |j                  d:d;t         t        j                         j                         ||d(d<d=d>d?d@dAd+f      j                  }|| dB<   |j                  dCdDt         dEt        j                         j                         |dFdAdGt         dHt         d+f	      j                  }	|	| dI<   |j                  dJdKt         dLt         t        j                         t        d./      z   j                         |||dMdNd+f	      j                  }
|
| dO<   |j                          |j                          t        dP       | S # t        $ r.}t        dQ|        d4dFl}|j                          i cY dF}~S dF}~ww xY w)Rz*Create test data for comprehensive testingu   
📦 Creating test data...z
            INSERT INTO claimants (
                first_name, last_name, full_name, date_of_birth, email,
                address, city, province, postal_code, home_phone
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        TEST_FIRST_
TEST_LAST_z TEST_LAST_
1990-01-01test_@example.com123 Test StCalgaryABT1T1T1z403-555-1234claimant_idz
            INSERT INTO clients (
                company_name, address, city, province, postal_code
            ) VALUES (?, ?, ?, ?, ?)
        TEST_CLIENT_z456 Client AveEdmontonT2T2T2	client_idz
            INSERT INTO lawyer_firms (
                firm_name, address, city, province, postal_code, phone
            ) VALUES (?, ?, ?, ?, ?, ?)
        
TEST_FIRM_z789 Firm BlvdTorontoONM1M1M1z416-555-5678firm_idz
            INSERT INTO lawyer_contacts (
                first_name, last_name, lawyer_firm_id, email, fax,
                assistant_name, assistant_phone, assistant_email
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        TEST_LAWYER_FIRST_TEST_LAWYER_LAST_test_lawyer_z416-555-5679TEST_ASSISTANT_z416-555-5680test_assistant_	lawyer_ida>  
            INSERT INTO cases (
                record_id, file_case_id, assessment_type, case_notes,
                file_open_date, service_location,
                claimant_id, lawyer_firm_id, lawyer_contact_id,
                client_id, created_by
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        
TEST_CASE_IME - StandardTEST_CASE_NOTES_Calgary, ABTestUsercase_idaA  
            INSERT INTO appointments (
                case_id, appointment_date, appointment_time, doctor_name,
                location, service_code, assessment_type, status, invoiced,
                timezone, provider_specialty, reference, notes
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
           )daysz10:00zDr. Test DoctorzTest Clinic	scheduledr   zAmerica/Edmonton
Orthopedic	TEST_REF_TEST_APPT_NOTES_appointment_ida,  
            INSERT INTO invoices (
                invoice_number, invoice_date, case_id, appointment_id,
                service_code, service_description, fee, tax_rate, tax_amount,
                total_amount, status, created_by
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        	TEST_INV_zTest Serviceg     @@g      @g      I@g     h@draft
invoice_idz
            INSERT INTO reports (
                report_title, report_type, report_date, case_id, doctor_id,
                status, description, notes, uploaded_by
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
        TEST_REPORT_z
IME ReportNzTest report description zTest report notes 	report_idz
            INSERT INTO bring_forward_tasks (
                task_title, task_description, due_date, case_id, appointment_id,
                invoice_id, status, priority, created_by
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
        
TEST_TASK_zTest task description pendingmediumtask_idu"   ✅ Test data created successfullyu   ❌ Error creating test data: )r+   r   r   TEST_TIMESTAMP	lastrowidr   todayr(   r   commitcloserC   	traceback	print_exc)	test_datar   rQ   rU   rZ   r`   rf   rm   rp   rr   rv   rE   r|   s                r   create_test_datar   Y   sJ   	
()Iz} ll $ .)*().)^4DEN#<0
  9! 	" $/	-  LL "
 >*+
	
 9 	 "+	+ ,,  
 ()
	 9 	  '	) LL " ! 01/0>*,7n-.n-\:	
 9 	 "+	+ ,,   ()()~./JJL""$
& 9' 	(  '	)  ' ZZ\I1--88:'(~./
( 9) 	* '5	"# \\ # '(JJL""$
& 9' 	( #-	, LL " >*+JJL""$&~&67  01

 9 	  "+	+ ,,   ()$^$45ZZ\I1--88:

 9 	   '	)

23 .qc23		s   LL   	M)#MMMc                  Z   t        d       	 t               } g d}|D ]=  \  }}|r| j                  d| d| d| d| d	       '|dk(  s-| j                  d	       ? | j                          | j	                          t        d
       y# t
        $ r}t        d|        Y d}~yd}~ww xY w)zClean up all test datau   
🧹 Cleaning up test data...))bring_forward_tasks
task_title)case_reports	file_name)generated_lettersletter_subject)claimant_name_historynotes)invoice_line_itemsN)invoicesinvoice_number)appointment_medsr   )medical_documentationr   )appointment_additional_servicesservice_type)appointmentsr   )reportsreport_title)cases
case_notes)	claimants
first_name)clientscompany_name)lawyer_contactsr   )lawyer_firms	firm_namezDELETE FROM z WHERE z LIKE 'TEST_%' OR z LIKE '%TEST_PHASE%' OR z LIKE '%TEST_TIMESTAMP%'r   z
                        DELETE FROM invoice_line_items 
                        WHERE invoice_id IN (
                            SELECT id FROM invoices WHERE invoice_number LIKE 'TEST_%'
                        )
                    u   ✅ Cleanup completeu   ⚠️  Cleanup warning: N)r+   r   r   rz   r{   rC   )r   tablestablefieldrE   s        r   cleanup_test_datar     s    	
+,(/}
& # 	LE5|E7'%@RSXRYYqrwqx  yQ  R  S 00LL " 	 	

$% /)!-../s   <B	 
>B	 		B*B%%B*c            	      V   t        d       t        d       t        d       	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t               }|j                  d      j                         }|j                          |rCt        j                  t         d|d    dt              } t        dd| j                  dk(         nt        ddd	d       	 t               }|j                  d      j                         }|j                          |rCt        j                  t         d |d    d!t              } t        dd"| j                  dk(         nt        dd"d	d#       	 t               }|j                  d$      j                         }|j                          |rCt        j                  t         d%|d    d!t              } t        dd&| j                  dk(         y
t        dd&d	d'       y
# t        $ r"}t        ddd	t        |             Y d
}~yd
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~jd
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~[d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~Ld
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~=d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~.d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        dd"d	t        |             Y d
}~Rd
}~ww xY w# t        $ r!}t        dd&d	t        |             Y d
}~y
d
}~ww xY w)(z&Test general application functionality=
============================================================zGENERAL APPLICATION TESTS<============================================================/r   r   zHome page loadsr2   FN/caseszCases list page loads/clientszClients list page loads/lawyerszLawyers list page loads/doctorszDoctors list page loads/appointmentszAppointments list page loads	/invoiceszInvoices list page loads/reportsReports list page loadsSELECT id FROM clients LIMIT 1	/clients/id/contacts/newzClient contact form loadszNo clients found&SELECT id FROM lawyer_contacts LIMIT 1	/lawyers//editzLawyer view/edit functionalityzNo lawyers foundSELECT id FROM doctors LIMIT 1	/doctors/zDoctor view/edit functionalityzNo doctors found)r+   r9   r:   r;   r<   r/   r=   rC   strr   r   fetchoner{   )rD   rE   r   clientlawyerdoctors         r   test_generalr   K  s   	-	
%&	&M>;;(1~;G-x/C/Cs/JK
D;;(62O;L3X5I5IS5PQ
F;;(84o;N5x7K7Ks7RS
F;;(84o;N5x7K7Ks7RS
F;;(84o;N5x7K7Ks7RS
K;;(=9?;S:H<P<PTW<WX
G;;(95;O68L8LPS8ST
F;;(84o;N5x7K7Ks7RS

H}>?HHJ

{{hZym#T^m{nHY ;X=Q=QUX=XYY ;UDVW
M}FGPPR

{{hZye#LVe{fHY @(BVBVZ]B]^Y @%I[\
M}>?HHJ

{{hZye#LVe{fHY @(BVBVZ]B]^Y @%I[\s  >-uc!f==>  D3UCFCCD  F5uc!fEEF  F5uc!fEEF  F5uc!fEEF  K:E3q6JJK  G6s1vFFG  F5uc!fEEF  H7AGGH  M<eSVLLM  M<eSVLLMs  <N2  <O  <P <P< <Q* <R <S <S4 BT" BU %A=U> #U> 2	O;OO 	P)PP	P9P44P9<	Q'Q""Q'*	R3RR	S!R>>S	S1S,,S14	T=TT"	U+UU	U;U66U;>	V(V##V(c                     t        d       t        d       t        d       	 t        j                  t         dt              } d| j
                  j                         v }t        dd|       	 t        j                  t         dt              } d| j
                  v xs d| j
                  j                         v }d| j
                  v }t        dd|xr |       	 t        j                  t         dt              } d| j
                  j                         v xs d| j
                  j                         v }d| j
                  j                         v xs: d| j
                  j                         v xs d| j
                  j                         v }t        dd|xr |       	 ddddt         dddt         dt         ddd t         d!t         dd"}t        j                  t         d|t        d#$      } t        dd%| j                  d&k(         y# t        $ r"}t        dd	d
t        |             Y d}~d}~ww xY w# t        $ r"}t        ddd
t        |             Y d}~d}~ww xY w# t        $ r!}t        ddd
t        |             Y d}~d}~ww xY w# t        $ r!}t        dd%d
t        |             Y d}~yd}~ww xY w)'zTest Phase 1 featuresr   z,PHASE 1 TESTS - Case Management Enhancementsr   
/cases/newr   file_open_dater   z"Case form has file_open_date fieldzCase form loadsFNservice_codesservice codeIMEzService codes loaded from CSVservice_locationservice locationcalgaryedmontontorontoz%Service location dropdown with citiesrb   rd   
2020-01-01TEST_PHASE1_zMr.MaleTEST_PHASE1_FIRST_TEST_PHASE1_LAST_rJ   V1N1J5TEST_PHASE1_CLIENT_TEST_PHASE1_CLIENTNAME_)assessment_typer   date_of_lossr   claimant_titleclaimant_genderclaimant_first_nameclaimant_last_nameclaimant_date_of_birthclaimant_postal_codeclient_company_nameclient_client_nameclient_postal_codeTr5   z!Create case with service locationr2   )r+   r9   r:   r;   r<   rA   rB   r/   rC   r   rw   r>   r=   )rD   has_file_open_daterE   has_service_codeshas_imehas_service_locationhas_city_dropdown	case_datas           r   test_phase1r     s   	-	
89	&M=;;(:6;P-1D1D1FF?AST
K;;(:6;P+x}}<gRZR_R_ReReRg@g8==(:<M<YRYZ
S;;(:6;P1X]]5H5H5JJyN`dldqdqdwdwdyNy%)<)<)>>  L*PXP]P]PcPcPeBe  Lirv~  wD  wD  wJ  wJ  wL  jLBDXDn]no
O/ -(((89#%%77G#H$5n5E"F&2$,%88H#I$;N;K"L"*
	 <<8*J 7iQ`rv<w>@T@TX[@[\S  =,eSV<<=  K:E3q6JJK  SBE3q6RRS,  O>s1vNNOsc   AH /A-I CI1 #A1J 	I H;;I 	I.I))I.1	J:JJ	K'KKc            	      |	   t        d       t        d       t        d       	 t        j                  t         dt              } d| j
                  j                         v }d| j
                  j                         v xs d| j
                  j                         v }t        d	d
|xr |       	 t        j                  t         dt              } d| j
                  v xs d| j
                  j                         v }d| j
                  v }t        d	d|xr |       	 t        j                  t         dt              } t        d	d| j                  dk(         	 t        rdt        v r
t        d   }nOt               }|j                  d      j                         }|j                          |st        d	ddd       y|d   }t        j                  t         d| t              } | j                  dv }	| j                  dk(  rtd| j
                  j                         v xs: d| j
                  j                         v xs d| j
                  j                         v }
t        d	d|
d| j                          nt        d	dd d!| j                   d"       	 t               }|j                  d      j                         }|j                          |rCt        j                  t         d|d    d#t              } t        d	d$| j                  dk(         nt        d	d$dd       	 t               }|j                  d      j                         }|j                          |rCt        j                  t         d|d    d%t              } t        d	d&| j                  dk(         yt        d	d&dd       y# t        $ r"}t        d	ddt        |             Y d}~%d}~ww xY w# t        $ r"}t        d	ddt        |             Y d}~d}~ww xY w# t        $ r"}t        d	ddt        |             Y d}~d}~ww xY w# t        $ r"}t        d	ddt        |             Y d}~d}~ww xY w# t        $ r"}t        d	d$dt        |             Y d}~ld}~ww xY w# t        $ r!}t        d	d&dt        |             Y d}~yd}~ww xY w)'z!Test Phase 2 appointment featuresr   z(PHASE 2 TESTS - Appointment Enhancementsr   /appointments/newr   timezoneprovider_specialty	specialtyr   z#Appointment form has Phase 2 fieldszAppointment form loadsFNr   r   r   z+Appointment form has service codes from CSV/appointments/uninvoicedz"Uninvoiced appointments page loadsr2   rm   #SELECT id FROM appointments LIMIT 11Appointment view has confirmation letters sectionNo appointments foundr   /appointments/r2     letteruploadconfirmationStatus: TRoute exists (Status:  - may have template issues)/additional_servicesz*Appointment additional services page loads/printzAppointment print view loads)r+   r9   r:   r;   r<   rA   rB   r/   rC   r   r=   r~   r   r   r   r{   )rD   has_timezonehas_provider_specialtyrE   r   r   rm   r   appointmenthas_pagehas_letter_contents              r   test_phase2r     s    
-	
45	&MD;;(+<=;W!X]]%8%8%::!59L9L9N!N!vR]aiananatatavRv@,BiSij
Y;;(+<=;W+x}}<gRZR_R_ReReRg@g8==(HJ[Jg`gh
P;;(+CDo;^?AUAUY\A\]
_)Y6&'78N=D,,'LMVVXKJJL#VX]_vw(.N;;(>.9IJTc;d '':53&!)X]]-@-@-B!B  "ShRZR_R_ReReRgFg  "Sky  ~F  ~K  ~K  ~Q  ~Q  ~S  lSXRTfjrs{  tH  tH  sI  iJ  K XRTX\rs{  tH  tH  sI  Ie  [f  g

X}ll#HIRRT

{{hZ~k$>O=PPd#eo~{HXKXMaMaehMhiXKUTkl

J}ll#HIRRT

{{hZ~k$>O=PPV#Wap{qHX=x?S?SWZ?Z[X=uF]^K  D3UCFCCD  YH%QTUVQWXXY  P?AOOP8  _NPUWZ[\W]^^_  XGPSTUPVWWX  J95#a&IIJs   B	N+ -A-O <P A!P5 :CP5 BQ# A=R R +	O4OO	P"O??P	P2P--P25	Q >QQ #	R,R		R	R;R66R;c            	         t        d       t        d       t        d       	 t               } | j                  d      j                         }| j	                          |rCt
        j                  t         d|d    dt              }t        d	d
|j                  dk(         nt        d	d
dd       	 t               } | j                  d      j                         }| j	                          |rt        d	ddd       yt        d	ddd       y# t        $ r!}t        d	d
dt        |             Y d}~d}~ww xY w# t        $ r!}t        d	ddt        |             Y d}~yd}~ww xY w)zTest Phase 3 featuresr   z;PHASE 3 TESTS - Additional Services & Medical Documentationr   r   r   r   r   r   r   zAdditional services page loadsr2   Fr   Nz)Medical documentation upload route existsTzRoute implemented)r+   r   r   r   r{   r9   r:   r;   r<   r/   r=   rC   r   )r   r   rD   rE   s       r   test_phase3r   L  s@   	-	
GH	&M
L}ll#HIRRT

{{hZ~k$>O=PPd#eo~{HX?AUAUY\A\]X?H_`

W}ll#HIRRT

XJDRefXJESjk  L;UCFKKL  WFsSTvVVWs7   BD	 0A	D6 :D6 		D3D..D36	E ?EE c            	         t        d       t        d       t        d       	 t        j                  t         dt              } d| j
                  j                         v }d| j
                  j                         v }t        dd	|xr |       	 t        dddd       	 t        j                  t         dt              } d| j
                  j                         v }t        dd|       y# t        $ r!}t        dd
dt        |             Y d}~d}~ww xY w# t        $ r!}t        dddt        |             Y d}~d}~ww xY w# t        $ r!}t        dddt        |             Y d}~yd}~ww xY w)zTest Phase 4 invoice featuresr   z$PHASE 4 TESTS - Invoice Enhancementsr   /invoices/newr   due_dateprovider_feer   zInvoice form has Phase 4 fieldszInvoice form loadsFNz'Invoice line items functionality existsTzRoutes implementedr   overduezOverdue invoices detection)
r+   r9   r:   r;   r<   rA   rB   r/   rC   r   )rD   has_due_datehas_provider_feerE   has_overdues        r   test_phase4r  p  sQ   	-	
01	&M@;;(=9?;S!X]]%8%8%::)X]]-@-@-BB<l>_O_`
UDdL`a
H;;(95;O8==#6#6#887E  @/A??@  UDeSQRVTTU  H7AGGHsI   A+C* D AE *	D3DD	E D<<E	E.E))E.c            	         t        d       t        d       t        d       	 t        j                  t         dt              } t        dd| j                  dk(         	 t        j                  t         dt              } t        dd| j                  dk(         	 t               }|j                  d      j                         }|j                          |rBt        j                  t         d|d    t              } t        dd| j                  dk(         nt        ddd	d       	 t               }|j                  d      j                         }|j                          |rBt        j                  t         d|d    t              } t        dd| j                  dk(         nt        ddd	d       	 t        rdt        v r
t        d   }nOt               }|j                  d      j                         }|j                          |st        ddd	d       y
|d   }t        j                  t         d| t              } | j                  dv }t        dd|d| j                          	 t               }|j                  d      j                         }|j                          |r|d   }t        j                  t         d| t              } d| j                  j                         v xr: d| j                  j                         v xs d | j                  j                         v }	t        dd!|	       nt        dd!d	d       	 t        j                  t         d"t              } t        dd#| j                  dk(         	 t               }|j                  d$      j                         }
|j                          |
rQt        j                  t         d%|
d    d&t              } t        dd'| j                  dk(  d| j                          y
t        dd'd	d(       y
# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~ud
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        ddd	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        dd!d	t        |             Y d
}~d
}~ww xY w# t        $ r"}t        dd#d	t        |             Y d
}~d
}~ww xY w# t        $ r!}t        dd'd	t        |             Y d
}~y
d
}~ww xY w))zTest Phase 5 featuresr   z!PHASE 5 TESTS - Advanced Featuresr   /tasksr   r   zTasks list page loadsr2   FN
/tasks/newzCreate task form loadsSELECT id FROM cases LIMIT 1z/tasks/new/r   z Create task from case form loadszNo cases foundr   z/tasks/new/appointment/z'Create task from appointment form loadsr   rp   SELECT id FROM invoices LIMIT 1z#Create task from invoice form loadsNo invoices found in databasez/tasks/new/invoice/r   r   /cases/r   zupload reportreportz$Case view has reports upload sectionr   r   SELECT id FROM reports LIMIT 1	/reports/r   zReport print view loadsNo reports found in database)r+   r9   r:   r;   r<   r/   r=   rC   r   r   r   r   r{   r~   rA   rB   )rD   rE   r   caser   rp   invoicer	   rf   has_reports_sectionr  s              r   test_phase5r    s)   	-	
-.	&MC;;(62O;L2H4H4HC4OP
D;;(:6;P3X5I5IS5PQ

N}||:;DDF

{{hZ{4:,#GQ`{aHXA8CWCW[^C^_XA5JZ[

U}ll#HIRRT

{{hZ/F{SWGXFY#Zds{tHXH(J^J^beJefXH%Qhi
Q2"<0J=Dll#DENNPGJJL#H%Qpq J;;(+>zlKUd;e%%3@&HU]UiUiTjJkl
R}||:;DDF

4jG{{hZwwi#@/{ZH"+x}}/B/B/D"D  #Y/]e]j]j]p]p]rJr  KXv~  CK  CP  CP  CV  CV  CX  wXXEGZ[XEuN^_
E;;(84o;N4h6J6Jc6QR

E}>?HHJ

{{hZyf#MWf{gHX8(:N:NRU:UYabjbvbvawWxyX8%A_`s  C2E3q6BBC  D3UCFCCD  N=uc!fMMN  UDeSQRVTTU*  Q@%QPPQ   RA5#a&QQR  E4eSVDDE  E4eSVDDEs   <P  <Q	 BQ7 )BR% 5A!S AS *CT <T/  BU U 	Q$QQ		Q4Q//Q47	R" RR"%	S.SS	S>S99S>	T,
T''T,/	U8UU	V&VVc            	         t        d       t        d       t        d       	 t        j                  t         dt              } d| j
                  v xs d| j
                  j                         v }d| j
                  v xs d	| j
                  j                         v }d
| j
                  j                         v xs d| j
                  j                         v }t        dd|xr |xr |       	 t        j                  t         dt              } d| j
                  v xsA t        | j
                  j                         D cg c]  }d|v s	d|v sd|v s| c}      dkD  }t        dd|       	 t        j                  t         dt              } d| j
                  j                         v xs d| j
                  j                         v }d| j
                  j                         v xr: d| j
                  j                         v xr d| j
                  j                         v }t        dd|xr |       	 t        rdt        v r
t        d   }	nOt               }
|
j                  d      j                         }|
j!                          |st        dddd        y|d!   }	t        j                  t         d"|	 t              } | j"                  d#v }| j"                  d$k(  rtd%| j
                  j                         v xs: d&| j
                  j                         v xs d'| j
                  j                         v }t        dd|d(| j"                          nt        ddd)d*| j"                   d+       	 t        rd,t        v r
t        d,   }nOt               }
|
j                  d-      j                         }|
j!                          |st        dd.dd/       y|d!   }t        j                  t         d0| t              } | j"                  d$k(  }t        dd.|d(| j"                   d1       	 t        rld,t        v rdt        d,   }t        d2   }t               }
|
j                  d3|f      j                         }|
j!                          |st        dd4dd5       y|d6   }nYt               }
|
j                  d7      j                         }|
j!                          |st        dd4dd/       y|d!   }|d2   }|d6   }d8t$         }t        j                  t         d0| d9t              } | j"                  d$k7  rt        dd4dd:| j"                          yt               }
|
j                  d;|f      j                         }|
j                  d<|f      j                         }|
j!                          |r|d=   nd>t$         }|r|d?   n!t'        j(                         j+                         }|r|d@   ndAt$         }|||dB|dC}t        j-                  t         d0| d9|t        d)D      } dEdl} |j0                  dF       t               }
|
j                  dG||f      j                         }|
j!                          t        dd4|dudH|rdIndJ dK       |r?t               }
|
j                  dL||f       |
j3                          |
j!                          yy# t        $ r"}t        dddt        |             Y d}~d}~ww xY wc c}w # t        $ r"}t        dddt        |             Y d}~d}~ww xY w# t        $ r"}t        dddt        |             Y d}~d}~ww xY w# t        $ r"}t        dddt        |             Y d}~d}~ww xY w# t        $ r"}t        dd.dt        |             Y d}~d}~ww xY w# t        $ r!}t        dd4dt        |             Y d}~yd}~ww xY w)MzTest features implemented todayr   zTODAY'S FEATURES TESTSr   /lawyers/newr   zname="email"zlawyer.*emailz
name="fax"faxassistant_name	assistantr   z0Lawyer form has email, fax, and assistant fieldsFNr   r   r   MLECE   z&Case form loads service codes from CSVr   r   r   r   	vancouverz,Case form has service location city dropdownrm   r   r   r   r   r   r   r2   r   r   r   r   Tr   r   rf   z
                SELECT c.id, c.claimant_id 
                FROM cases c 
                WHERE c.claimant_id IS NOT NULL 
                LIMIT 1
            z'Case view has last name history sectionzNo cases with claimants foundr  z* (section may be empty if no name changes)rQ   z,SELECT last_name FROM claimants WHERE id = ?z+Name change tracking creates history recordzClaimant not found	last_namez
                SELECT c.id, c.claimant_id, cl.last_name
                FROM cases c
                JOIN claimants cl ON c.claimant_id = cl.id
                WHERE c.claimant_id IS NOT NULL
                LIMIT 1
            TEST_NAME_CHANGE_r   zCannot access edit page: z;SELECT file_case_id, file_open_date FROM cases WHERE id = ?z-SELECT first_name FROM claimants WHERE id = ?file_case_idra   r   r   rH   rb   )r  r   r   r   r   r5   r   g      ?zr
            SELECT * FROM claimant_name_history 
            WHERE claimant_id = ? AND new_last_name = ?
        zHistory record foundz	not foundz after name changez/UPDATE claimants SET last_name = ? WHERE id = ?)r+   r9   r:   r;   r<   rA   rB   r/   rC   r   lensplitr~   r   r   r   r{   r=   rw   r   ry   r(   r>   timesleeprz   )rD   	has_emailhas_faxhas_assistantrE   xr   r   
has_citiesrm   r   r   r   r   rf   r  rQ   old_claimantold_namenew_nameexisting_caseexisting_claimantr  r   r   	edit_datar#  historys                               r   test_todays_featuresr1    s    
-	
"#	&M_;;(<8/;R"hmm3_(--J]J]J_7_	(--/Q5HMM<O<O<Q3Q(HMM,?,?,AAi[T\TaTaTgTgTiEiNPYPw^ePwjwx
U;;(:6;P+x}}<  UPXP]P]PcPcPe  EP1inrsisw|  AB  xB  FJ  NO  FOQ  EP  AQ  TU  AUDFWX
[;;(:6;P1X]]5H5H5JJyN`dldqdqdwdwdyNy(--"5"5"77  HII\I\I^<^  Hcnrzrr  sF  sF  sH  dH
JL`Loeop
`)Y6&'78N=D,,'LMVVXKJJL$WY^`wx(.N;;(>.9IJTc;d '':53&!)X]]-@-@-B!B  "ShRZR_R_ReReRgFg  "Sky  ~F  ~K  ~K  ~Q  ~Q  ~S  lSY SUgkst|  uI  uI  tJ  jK  L Y SUY]st|  uI  uI  tJ  Jf  \g  h
Vi/	*G=D<< ! 
   JJL$MuVuv4jG;;(77)<o;V''3.ExS[\d\p\p[q  r\  R]  	^
MZi/	*G#M2K=D<<(VYdXfgpprLJJL$QSXZno#K0H=D<< !    JJL$QSXZyz4jG}-KK(H&~&67 ;;(77)5A?;[3&Y MuXqrz  sG  sG  rH  WI  J }%beldnoxxz LL)X[fZhirrt

8E}^4ZXfWgKh<I'78tzz|OeOeOgAR/=ZefteuXv )"*#6/,
	 <<8*GG9E B\k  ~B<  C 	

3},,   8$& '/hj 	 	

I7Z^K^bq  ~Ery  KV  rW  Wi  aj  	k =DLLJXWbLcdKKMJJL	 i  _NPUWZ[\W]^^_ EP UDeSQRVTTU  [JESVWXSYZZ[8  `OQVX[\]X^__`6  VEucRSfUUV`  ZI5RUVWRXYYZs   C	[ -A[;  [6[6[; .C\) 4A!] C] -A!^ A^ $A+^3 A^3  A'^3 E>^3 	[3[..[36[; ;	\&\!!\&)	]2]]	^ ]==^	^0^++^03	_<__c                  T   t        d       t        d       t        d       t        j                         j                         i t        d} d}d}t        j                         D ]W  \  }}||d   z  }||d   z  }|d   |d   |d   |d   z   |d   |d   z   dkD  r|d   |d   |d   z   z  dz  d	d
ndd| d   |<   Y ||||z   ||z   dkD  r|||z   z  dz  d	d
ndd| d   d<   dt         d}t        |d      5 }t        j                  | |d       ddd       t        d       t        d       t        d       t        d| d||z    d| d   d   d    d       t        d       | d   j                         D ]:  \  }}|dk7  st        d|j                          d|d    d|d    d |d    d	       < t        d!|        t        |       }dt         d"}	t        |	d      5 }|j                  |       ddd       t        d#|	        | S # 1 sw Y   xY w# 1 sw Y   %xY w)$z"Generate comprehensive test reportr   zTEST REPORT GENERATIONr   )r#   summarydetailsr   r	   r
   d   z.1f%z0%)r	   r
   totalsuccess_rater3  )total_passedtotal_failedtotal_testsr8  overalltest_report_z.jsonw   )indentNzTEST SUMMARYz

Overall: r   z tests passed (r8  )z

By Phase:r%   r&   r7  z	 passed (u    
📄 Detailed report saved to: z.htmlu   📄 HTML report saved to: )r+   r   r'   r(   r)   itemsrw   openjsondumpuppergenerate_html_reportwrite)
r  r9  r:  r,   resultsreport_filefr3  html_report	html_files
             r   generate_reportrN    s   	-	
"#	&M \\^--/F LL&,,. 
w))))h'h'X&)::nuv~n  CJ  KS  CT  oT  XY  nY 1WX5FQYIZ5Z [^a acfgghi  _c	$
y% 
 %$#l2[gjv[vz{Z{LL<,GH3NPSTTUV  BF	$F9i  ! 06K	k3	 '1		&!A&' 
-	.	&M	K~Q|l'B&C?SYZcSdenSop~S  SA  AB  C  D	- +113 swIBu{{}oR(9':!GG<L;MYW^_mWnVoopqrs 
-k]
;< 'v.K~.e4I	i	 		'	{
34M-' '$ s   ;H(HHH'c                    d| d    d| d   d   d    d| d   d   d    d	| d   d   d
    d| d   d   d    d}| d   j                         D ]~  \  }}|d   s|d|j                         j                  dd       d|d    d|d    dz  }|d   D ]3  }d|d   v rdnd}|d| d|d    d|d    d |d!   r	d"|d!    d#nd$ d%	z  }5 |d&z  } |d'z  }|S )(zGenerate HTML test reportaF  <!DOCTYPE html>
<html>
<head>
    <title>Vera Medical CRM - Test Report</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
        .container { max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        h1 { color: #333; }
        .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 20px 0; }
        .summary-card { background: #f8f9fa; padding: 15px; border-radius: 5px; border-left: 4px solid #007bff; }
        .summary-card h3 { margin: 0 0 10px 0; color: #666; font-size: 14px; }
        .summary-card .number { font-size: 24px; font-weight: bold; color: #333; }
        .phase-section { margin: 30px 0; padding: 20px; background: #f8f9fa; border-radius: 5px; }
        .test-item { padding: 10px; margin: 5px 0; background: white; border-radius: 3px; border-left: 3px solid #ccc; }
        .test-item.pass { border-left-color: #28a745; }
        .test-item.fail { border-left-color: #dc3545; }
        .status { font-weight: bold; }
        .pass .status { color: #28a745; }
        .fail .status { color: #dc3545; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Vera Medical CRM - Comprehensive Test Report</h1>
        <p>Generated: r#   z</p>
        
        <div class="summary">
            <div class="summary-card">
                <h3>Total Tests</h3>
                <div class="number">r3  r<  r;  z</div>
            </div>
            <div class="summary-card">
                <h3>Passed</h3>
                <div class="number" style="color: #28a745;">r9  z</div>
            </div>
            <div class="summary-card">
                <h3>Failed</h3>
                <div class="number" style="color: #dc3545;">r:  z</div>
            </div>
            <div class="summary-card">
                <h3>Success Rate</h3>
                <div class="number">r8  z)</div>
            </div>
        </div>
r4  r   z5
        <div class="phase-section">
            <h2>PHASEzPHASE z# Tests</h2>
            <p>Passed: r	   z | Failed: r
   z</p>
PASSr!   passfailz#
            <div class="test-item z(">
                <span class="status">z
</span> - r    z
                r"   z<br><small>z</small> z
            </div>
z
        </div>
z
    </div>
</body>
</html>
)rB  rF  replace)r  htmlr,   rI  teststatus_classs         r   rG  rG    s   0 k*+ ,%
 &,I%6y%A-%P$Q R= >DI=Ny=YZh=i<j k= >DI=Ny=YZh=i<j k% &,I%6y%A.%Q$R SS,D\ !+113 w7 &&w9: ;)*+gh6G5H I D
  ( )/4>)Avv ##/. 1&&*8n%5ZV~ N<@O;tI/x8QST U    D& 	  D
 Kr   c            	      j   t        d       t        d       t        d       	 t        j                  t         dt              } | j
                  dk(  xr d| j                  j                         v }t        dd	|       t        rd
t        v rwdt        v rmi ddddddddt         dt        j                         j                         ddt         ddt         ddddt         dddd d!d"d#d$d%d&d'd(d)t         d*d+d,d-t         }t        j                  t         d|t        d./      } | j
                  dk(  xr: d| j                  j                         v xs d0| j                  j                         v }t        dd1|       |rnt               }|j!                  d2d3t         d4f      j#                         }|j%                          |r|d5   t        d6<   t        dd7d.       y;t        dd7d8d9       y;y;y;y;y;# t&        $ r!}t        dd:d8t)        |             Y d;}~y;d;}~ww xY w)<z0Test comprehensive case creation with all fieldsr   zCASE CREATION TESTSr   r   r   r2   r  r   zCase creation form loadsrQ   rU   r   rb   r   zToronto, ONr   r   r   TEST_CASE_CREATION_r   r   TEST_CREATE_FIRST_r   TEST_CREATE_LAST_r   rJ   claimant_emailtest_create_rL   claimant_addressrM   claimant_cityrW   claimant_provincerX   r   M5H2N2claimant_home_phonez416-555-0100r   TEST_CREATE_CLIENT_client_namezTest Client Nameclient_file_numberzCLT-Tr5   successzCreate case with all fieldsz,SELECT id FROM cases WHERE case_notes LIKE ?z%TEST_CASE_CREATION_r6  r   created_case_idz"Case creation verified in databaseFzCase not found in databasezCase creation testsN)r+   r9   r:   r;   r<   r=   rA   rB   r/   r~   rw   r   ry   r(   r>   r   r   r   r{   rC   r   )rD   has_formr   createdr   r  rE   s          r   test_case_creationrk  3  s    
-	
 	&M*A;;(:6;P''3.R6X]]=P=P=R3R5x@ )3y8P!#3"M   3N3CD	
 !$**,"8"8": &);N;K'L %(9.9I&J ), !L0@"M #M   $T ' &~ &)<^<L'M  1!" %^,<&=#I& ||xj
$;)Udvz|{H**c1}vATATAV7V7|Zcgogtgtgzgzg|Z|GX<gF "}||$RWklzk{{|U}T  A  J  J  L

37:I/0X'KTRX'KUTpq 3 9Q39D  A0%Q@@As   GH 5H 	H2H--H2c            
      \
   t        d       t        d       t        d       g d} g d}| D ]T  \  }}}	 t        j                  t         | t              }|j
                  dv }t        d| |d	|j
                          V |D ]T  \  }}}	 t        j                  t         | t              }|j
                  dv }t        d| |d	|j
                          V t        rt               }t        j                  d      }	|	s(|j                  d      j                         }
|
r|
d   nd}	t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}t        j                  d      }|s(|j                  d      j                         }|r|d   nd}|j                          g }|	r8|j                  d|	 dd fd|	 d!dd"fd|	 d#dd$fd%|	 d&dd'fd%|	 d(dd)fg       |r(|j                  d*| dd+fd*| d!dd,fd*| d-dd.fg       |r|j                  d/| d!dd0fg       |r|j                  d1| d!dd2fg       |r7|j                  d3| dd4fd3| d!dd5fd3| d6dd7fd3| d8dd9fd:|	 dd;fg       |r |j                  d<| dd=fd<| d6dd>fg       |r7|j                  d?| dd@fd?| d!ddAfd?| dBddCfd?| d6ddDfdE| ddFfg       |r |j                  dG| ddHfdG| d!ddIfg       |D ]T  \  }}}	 t        j                  t         | t              }|j
                  dJv }t        d| |d	|j
                          V yy# t        $ r#}t        d| d
t        |             Y d}~d}~ww xY w# t        $ r#}t        d| d
t        |             Y d}~sd}~ww xY w# t        $ r"}t        d| d
t        |             Y d}~d}~ww xY w)Kz%Test ALL endpoints in the applicationr   zCOMPREHENSIVE ENDPOINT TESTSr   ))r1   GETz
Login page)z/logoutrm  Logout)z/favicon.icorm  Favicon)r   rm  	Dashboard)z/searchrm  zGlobal search page)r   rm  z
Cases list)r   rm  zNew case form)r   rm  zClients list)r   rm  zLawyers list)r  rm  zNew lawyer form)r   rm  zDoctors list)z/doctors/newrm  zNew doctor form)r   rm  zAppointments list)r   rm  zNew appointment form)r   rm  zUninvoiced appointments)r   rm  zReports list)z/reports/newrm  zNew report form)r   rm  zInvoices list)r   rm  zNew invoice form)r  rm  z
Tasks list)r  rm  zNew task form))z/api/search/casesrm  zCase search API)z/api/search/clientsrm  zClient search API)z/api/search/lawyersrm  zLawyer search API)z/api/search/doctorsrm  zDoctor search API)z/api/searchrm  zGlobal search API)z/api/invoices/next_numberrm  zNext invoice number API)z/api/forms/listrm  zForms list API)z/api/check/claimantrm  zCheck claimant APIr   )r2   .     r   r   FN)r2   i    rf   r  r   rU   r   r`   r   	doctor_idr   rm   r   rr   r  rp   r	  rv   *SELECT id FROM bring_forward_tasks LIMIT 1r  rm  z	Case viewr   zCase edit formz/report/uploadz$Case report upload (POST-only route)z/api/cases/r   zCase appointments APIr   zCase invoices APIr   zClient viewzClient edit formr   zNew client contact formr   zLawyer edit formr   zDoctor edit formr   zAppointment viewzAppointment edit formr   zAppointment print viewr   zAppointment additional servicesz/appointments/new/zNew appointment for caser  zReport viewzReport print view
/invoices/zInvoice viewzInvoice edit formz/line_itemszInvoice line itemszInvoice print viewz/invoices/new/zNew invoice from appointment/tasks/z	Task viewzTask edit form)r2   rq  rs  i  )r+   r9   r:   r;   r<   r=   r/   rC   r   r~   r   r   r   r{   extend)static_endpointsapi_endpointsendpointmethoddescriptionrD   r	   rE   r   rf   r  rU   r   r`   r   rt  r   rm   r   rr   r  rp   r  rv   taskdynamic_viewss                             r   test_all_endpointsr  f  s]    
-	
()	&M'T	M *: A%&+	A{{hZz#:O{TH))_<FY;-&HXEYEYDZ:[\	A *7 A%&+	A{{hZz#:O{TH))_<FY;-&HXEYEYDZ:[\	A } --	*<< >?HHJD$(d4jdG MM+.	\\"BCLLNF(.tDI MM+.	\\"JKTTVF(.tDI MM+.	\\"BCLLNF(.tDI #'78,,'LMVVXK2=[.4N MM+.	\\"BCLLNF(.tDI ]]<0
ll#DENNPG*1tJ --	*<< LMVVXD$(d4jdG

   7)$e[97)5)52BC7)>2E;abwi}5u>UVwiy15:MN"    YK(%?YKu-u6HIYK}5u>WX" 
   YKu-u6HI"    YKu-u6HI"    !.!12E;MN!.!17@WX!.!18%AYZ!.!11EFOpq%gY/8RS"    YK(%?YKv.7JK"    j\*E>Bj\/8KLj\5u>RSj\0%9MN!.!12E;YZ"    7)$e[97)5)52BC"  .; 	E)HfkE";;(H:'>;X "--1EE{mfI]I]H^>_`	EW   	AY;-%Q@@	A  	AY;-%Q@@	Al  E{meSVDDEsJ   AR"ASAT "	S+S		S	S=S88S= 	T+	T&&T+c            	      F
   t        d       t        d       t        d       t               } | j                  d      j                         }|rt	 t        j                  t         d|d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd|d|j                          nt        dddd       | j                  d      j                         }|rt	 t        j                  t         d|d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd|d|j                          nt        dddd       | j                  d      j                         }|rt	 t        j                  t         d|d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd|d|j                          nt        dddd       | j                  d      j                         }|rt	 t        j                  t         d|d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd|d|j                          nt        dddd       | j                  d      j                         }|rt	 t        j                  t         d|d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd|d|j                          nt        dddd        | j                  d!      j                         }	|	rt	 t        j                  t         d"|	d    t              }|j                  dk(  xr d	|j                  j                         d
d v}t        dd#|d|j                          nt        dd#dd$       | j                          y
# t        $ r"}t        dddt        |             Y d
}~fd
}~ww xY w# t        $ r"}t        dddt        |             Y d
}~d
}~ww xY w# t        $ r"}t        dddt        |             Y d
}~|d
}~ww xY w# t        $ r"}t        dddt        |             Y d
}~d
}~ww xY w# t        $ r"}t        dddt        |             Y d
}~d
}~ww xY w# t        $ r"}t        dd#dt        |             Y d
}~d
}~ww xY w)%z(Test all view pages for proper renderingr   zVIEW PAGE TESTSr   r  r  r   r   r2   errorNr   r   zCase view page rendersr   FNo cases found in databaser   r   zClient view page rendersNo clients found in databaser   r   zAppointment view page renders!No appointments found in databaser  r  zReport view page rendersr  r	  rv  zInvoice view page rendersr
  ru  rw  zTask view page rendersNo tasks found in databaser+   r   r   r   r9   r:   r;   r<   r=   rA   rB   r/   rC   r   r{   )
r   r  rD   r	   rE   r   r   r  r  r~  s
             r   test_all_viewsr  +  s    
-	
	&M=D <<67@@BD	I{{hZwtDzl#C_{]H))S0_WHMMDWDWDYZ^[^D_5_FY 8&HXMaMaLbBcd 	4e=YZ \\:;DDFF	K{{hZy#GQ`{aH))S0_WHMMDWDWDYZ^[^D_5_FY :FhxOcOcNdDef 	6?]^ ,,DENNPK	P{{hZ~k$>O=P#Q[j{kH))S0_WHMMDWDWDYZ^[^D_5_FY ?8T\ThThSiIjk 	;UDgh \\:;DDFF	K{{hZy#GQ`{aH))S0_WHMMDWDWDYZ^[^D_5_FY :FhxOcOcNdDef 	6?]^ ll<=FFHG	L{{hZz'$-#ISb{cH))S0_WHMMDWDWDYZ^[^D_5_FY ;VxPXPdPdOeEfg 	7@_` <<DENNPD	I{{hZwtDzl#C_{]H))S0_WHMMDWDWDYZ^[^D_5_FY 8&HXMaMaLbBcd 	4e=YZJJLC  	IY 8%QHH	I  	KY :E3q6JJ	K  	PY ?AOO	P  	KY :E3q6JJ	K  	LY ;UCFKK	L  	IY 8%QHH	Is   A2P 1A2P= A2Q+ 7A2R A2S =A2S5 	P:P55P:=	Q(Q##Q(+	R4RR	S"R??S	S2S--S25	T >TT c            	      >   t        d       t        d       t        d       t               } | j                  d      j                         }|r	 t        j                  t         d|d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd|d|j                          nt        dddd       | j                  d      j                         }|r	 t        j                  t         d|d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd|d|j                          nt        dddd       | j                  d      j                         }|r	 t        j                  t         d|d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd|d|j                          nt        dddd       | j                  d      j                         }|r	 t        j                  t         d|d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd|d|j                          nt        dddd       | j                  d       j                         }|r	 t        j                  t         d!|d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd"|d|j                          nt        dd"dd#       | j                  d$      j                         }	|	r	 t        j                  t         d%|	d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd&|d|j                          nt        dd&dd'       | j                  d(      j                         }
|
r	 t        j                  t         d)|
d    dt              }|j                  d	k(  xr[ d
|j                  j                         dd vxr: d|j                  j                         v xs d|j                  j                         v }t        dd*|d|j                          nt        dd*dd+       | j                          y# t        $ r"}t        dddt        |             Y d}~wd}~ww xY w# t        $ r"}t        dddt        |             Y d}~d}~ww xY w# t        $ r"}t        dddt        |             Y d}~d}~ww xY w# t        $ r"}t        dddt        |             Y d}~ad}~ww xY w# t        $ r"}t        dd"dt        |             Y d}~d}~ww xY w# t        $ r"}t        dd&dt        |             Y d}~d}~ww xY w# t        $ r"}t        dd*dt        |             Y d}~Kd}~ww xY w),z%Test CRUD operations for all entitiesr   zCRUD OPERATIONS TESTSr   z*SELECT id, file_case_id FROM cases LIMIT 1r  r   r   r   r2   r  Nr   forminputr   zCase edit form loadsr   Fr  r   r   zClient edit form loadsr  r   r   zLawyer edit form loadszNo lawyers found in databaser   r   zDoctor edit form loadszNo doctors found in databaser   r   zAppointment edit form loadsr  r	  rv  zInvoice edit form loadsr
  ru  rw  zTask edit form loadsr  r  )r   r  rD   r	   rE   r   r   r   r   r  r~  s              r   test_crud_operationsr    s    
-	
!"	&M=D <<DENNPD	G{{hZwtDzl%#HRa{bH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 6(8K_K_J`@ab 	2E;WX \\:;DDFF	I{{hZye#LVe{fH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 8&HXMaMaLbBcd 	4e=[\ \\BCLLNF	I{{hZye#LVe{fH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 8&HXMaMaLbBcd 	4e=[\ \\:;DDFF	I{{hZye#LVe{fH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 8&HXMaMaLbBcd 	4e=[\ ,,DENNPK	N{{hZ~k$>O=PPU#V`o{pH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY =vRZRfRfQgGhi 	95Bef ll<=FFHG	J{{hZz'$-#NXg{hH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 96XhNbNbMcCde 	5u>]^ <<DENNPD	G{{hZwtDzl%#HRa{bH))S0  jWHMMDWDWDYZ^[^D_5_  jekowo|o|  pC  pC  pE  fE  fi  IP  T\  Ta  Ta  Tg  Tg  Ti  IiFY 6(8K_K_J`@ab 	2E;WXJJL[  	GY 6s1vFF	G  	IY 8%QHH	I  	IY 8%QHH	I  	IY 8%QHH	I  	NY =uc!fMM	N  	JY 95#a&II	J  	GY 6s1vFF	Gs   B/Y .B/Z B/Z9 .B/[' B/\ .B/] B/]1 	Z&ZZ	Z6Z11Z69	[$[[$'	\0\\	] \;;] 	].]))].1	^:^^c                  @    t                t                t                y)z*Wrapper for comprehensive endpoint testingN)r  r  r   r   r   test_endpointsr    s    r   c                     t        d       t        d       t        d       t        dt                t        dt                t                t	               s t        d       t        j                  d       t               at        st        d       t                t                t                t                t                t                t                t!                t#                t%               } t                t        d       t        d	       t        d       | d
   d   d   dkD  rt        j                  d       yt        j                  d       y)zRun all testsr   z+VERA MEDICAL CRM - COMPREHENSIVE TEST SUITEz
Test Run: z
Base URL: u   ❌ Failed to login. Exiting.r$   u@   ⚠️  Warning: Test data creation failed. Some tests may fail.r   zTEST SUITE COMPLETEr3  r<  r:  r   N)r+   rw   r;   r   rF   sysexitr   r~   r   r   rk  r   r   r  r  r1  r  rN  )r  s    r   mainr    s    	&M	
78	&M	J~&
'(	Jxj
!"  7-. !"IPQ NMMMMM F 	-	
 	&M i#N3a7r   __main__)rT  ),__doc__requestsr   osr  r#  r   r   r   rD  r;   r   r?   r@   r<   r'   strftimerw   Sessionr9   r   r)   r~   r   r/   rF   r   r   r   r   r   r   r  r  r1  rN  rG  rk  r  r  r  r  r  __name__r  r   r   <module>r     sV     	 
  . .  #
$((9 (


! a"5a"5a"5a"5a"5q26 	6".B+/beMV6OxTJtWHHDeEVhZ\8tH\1AfCEJRh^@/b zF r   