
    P1i;                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZ dd	lmZ  e       Z G d
 de      Zy)z
Unit tests for enhanced person relations API endpoint.

Tests verify that the /api/bazi/person-relations/ endpoint correctly includes
simplified BaZi data for p1_data and p2_data in the expected format.
    )TestCase)get_user_model)reverse)	APIClient)status)datetime)Person)GroupRelationc                   R    e 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y)PersonRelationsEnhancedAPITestz=Test enhanced person relations API with simplified BaZi data.c           
         t               | _        t        j                  j	                  ddd      | _        | j                  j                  | j
                         t        j                  j                  ddt        dd	d	      t        d
d      | j
                  d      | _        | j                  j                          | j                  j                          t        j                  j                  ddt        ddd      t        dd      | j
                  d      | _        | j                  j                          | j                  j                          t        j                  j                  ddt        ddd      t        dd      | j
                  d      | _        | j                  j                          | j                  j                          t         j                  j                  | j
                  | j                  | j                  dg dg dg dg       | _        d!| j
                  _        | j
                  j                          y")#zSet up test data.13900000001ztest@example.comtestpass123phoneemailpassworduserOwnerM        r   Tnamegender
birth_date
birth_time
created_byownerz
Person OneFi              Fz
Person Twoi  
         -   sanheode   )p1r/   r0      )p2r/   r0   r(   
owner_userperson1person2relation_typeby	completedN)r   clientUserobjectscreate_userr   force_authenticater
   creater   r	   r"   calculate_bazisaver7   r8   r   group_relationgroup_relations_state)selfs    J/home/cursorai/projects/iching/api/tests/test_person_relations_enhanced.pysetUpz$PersonRelationsEnhancedAPITest.setUp   s   kLL,,$" - 
	
 	&&DII&6 ^^**D!Q'B{yy + 

 	

!!#

 ~~,,D!R(Ar{yy - 
 	##%~~,,D"b)B|yy - 
 	##% ,33::yyLLLL!"#$ ; 

 +6		'		    c                    t        d      }| j                  j                  |      }| j                  |j                  t
        j                         |j                         }| j                  |d   d       | j                  d|       | j                  t        |d         d       |d   d   }| j                  d|       | j                  d|       | j                  d|       | j                  d	|       | j                  d
|       | j                  d|       |d
   }| j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       |d   }| j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       y)zMTest that API response includes simplified BaZi data for p1_data and p2_data.api:bazi-person-relationsr   readyresultsr   tr2   r4   r:   p1_datap2_datar   r   r   r    baziN)r   r<   getassertEqualstatus_coder   HTTP_200_OKjsonassertInassertGreaterlen)rF   urlresponsedatarelationrO   rP   s          rG   3test_person_relations_includes_simplified_bazi_datazRPersonRelationsEnhancedAPITest.test_person_relations_includes_simplified_bazi_dataV   s   12;;??3'--v/A/AB}} 	h1i&3tI/3 	?1% 	c8$dH%dH%dH%i*i* 9%fg&h(lG,lG,fg& 9%fg&h(lG,lG,fg&rI   c                     t        d      }| j                  j                  |      }|j                         }|d   d   }|d   d   }g d}|D ]Q  }| j	                  ||d| d       | j                  ||   t        d	| d
       | j                  ||   dd	| d       S |d   d   }|D ]Q  }| j	                  ||d| d       | j                  ||   t        d	| d
       | j                  ||   dd	| d       S y)zHTest that BaZi data follows the {yg, ye, mg, me, dg, de, hg, he} format.rK   rM   r   rO   rQ   )ygyemgmedgdehghezMissing key 'z' in p1_data bazizKey 'z' should be integerz' should be non-negativerP   z' in p2_data baziN)r   r<   rR   rV   rW   assertIsInstanceintassertGreaterEqual)	rF   rZ   r[   r\   r]   p1_baziexpected_keyskeyp2_bazis	            rG   !test_bazi_data_has_correct_formatz@PersonRelationsEnhancedAPITest.test_bazi_data_has_correct_format~   s'   12;;??3'}}	?1% 9%f-H CMM#w-u<M(NO!!'#,uSEAT5UV##GCL!uSEAY5Z[ ! 9%f- CMM#w-u<M(NO!!'#,uSEAT5UV##GCL!uSEAY5Z[ !rI   c                 l   t        d      }| j                  j                  |      }|j                         }|d   d   }|d   d   }|d   d   }g d}|D ]j  }| j	                  ||   dd| d	       | j                  ||   d
d| d       | j	                  ||   dd| d	       | j                  ||   d
d| d       l g d}	|	D ]j  }| j	                  ||   dd| d	       | j                  ||   dd| d       | j	                  ||   dd| d	       | j                  ||   dd| d       l y)z9Test that BaZi god/earth indices are within valid ranges.rK   rM   r   rO   rQ   rP   )r`   rb   rd   rf   zP1 z should be >= 0	   z should be <= 9zP2 )ra   rc   re   rg      z should be <= 11N)r   r<   rR   rV   rj   assertLessEqual)
rF   rZ   r[   r\   r]   rk   rn   god_keysrm   
earth_keyss
             rG   %test_bazi_indices_within_valid_rangeszDPersonRelationsEnhancedAPITest.test_bazi_indices_within_valid_ranges   sr   12;;??3'}}	?1%9%f-9%f- ,C##GCL!s3%5OP  qCuO2LM##GCL!s3%5OP  qCuO2LM	  .
C##GCL!s3%5OP  rS=M3NO##GCL!s3%5OP  rS=M3NO	 rI   c                 `   t        d      }| j                  j                  |      }|j                         }|d   d   }|d   }|d   }t        j
                  j                  |      }t        j
                  j                  |      }|d   }	| j                  |	d   |j                         | j                  |	d	   |j                         | j                  |	d
   t        |j                               | j                  |	d   t        |j                               |d   }
| j                  |
d   |j                         | j                  |
d	   |j                         | j                  |
d
   t        |j                               | j                  |
d   t        |j                               y)zFTest that person data in API response matches actual database records.rK   rM   r   r2   r4   idrO   r   r   r   r    rP   N)r   r<   rR   rV   r
   r>   rS   r   r   strr   r    )rF   rZ   r[   r\   r]   p1_idp2_id
person1_db
person2_dbrO   rP   s              rG   )test_person_data_matches_database_recordszHPersonRelationsEnhancedAPITest.test_person_data_matches_database_records   sz   12;;??3'}}	?1%  ^^''5'1
^^''5'1
 9%*//:*J,=,=>.J4I4I0JK.J4I4I0JK 9%*//:*J,=,=>.J4I4I0JK.J4I4I0JKrI   c                    t        d      }| j                  j                  |      }|j                         }|d   d   }|d   }|d   }t        j
                  j                  |      }t        j
                  j                  |      }|d   d   }	|j                  }
| j                  |	d	   |
d
   d          | j                  |	d   |
d
   d          | j                  |	d   |
d   d          | j                  |	d   |
d   d          | j                  |	d   |
d   d          | j                  |	d   |
d   d          | j                  |	d   |
d   d          | j                  |	d   |
d   d          |d   d   }|j                  }| j                  |d	   |d
   d          | j                  |d   |d
   d          | j                  |d   |d   d          | j                  |d   |d   d          | j                  |d   |d   d          | j                  |d   |d   d          | j                  |d   |d   d          | j                  |d   |d   d          y)z@Test that BaZi data in response matches calculated BaZi results.rK   rM   r   r2   r4   rx   rO   rQ   r`   yeargodra   earthrb   monthrc   rd   dayre   rf   hourrg   rP   N)r   r<   rR   rV   r
   r>   bazi_resultrS   )rF   rZ   r[   r\   r]   r{   r|   r}   r~   rk   	p1_resultrn   	p2_results                rG   )test_bazi_data_matches_calculated_resultszHPersonRelationsEnhancedAPITest.test_bazi_data_matches_calculated_results   s   12;;??3'}}	?1% ^^''5'1
^^''5'1
 9%f-**		&(9%(@A	&(9'(BC	'(:5(AB	'(:7(CD	%(8(?@	%(8(AB	&(9%(@A	&(9'(BC 9%f-**		&(9%(@A	&(9'(BC	'(:5(AB	'(:7(CD	%(8(?@	%(8(AB	&(9%(@A	&(9'(BCrI   c                 d   t        d      }| j                  j                  |      }|j                         }|d   d   }h d}|d   }t	        |j                               }| j                  ||d||z
          |d   }t	        |j                               }	| j                  |	|d|	|z
          y	)
z5Test that person data only contains essential fields.rK   rM   r   >   rQ   r   r   r   r    rO   zP1 data has unexpected fields: rP   zP2 data has unexpected fields: N)r   r<   rR   rV   setkeysrS   )
rF   rZ   r[   r\   r]   expected_fieldsrO   	p1_fieldsrP   	p2_fieldss
             rG   )test_no_unnecessary_fields_in_person_datazHPersonRelationsEnhancedAPITest.test_no_unnecessary_fields_in_person_data   s    12;;??3'}}	?1% Q 9%'	O9)o:U9VW	Y 9%'	O9)o:U9VW	YrI   c           
         t         j                  j                  ddt        ddd      t	        dd      | j
                  d	      }|j                          |j                          t        j                  j                  | j
                  | j                  |d
g dg dg dg       t        d      }| j                  j                  |      }|j                         }| j                  t        |d         d       t!        |d         D ]g  \  }}| j#                  d|d| d       | j#                  d|d| d       | j#                  d|d   d| d       | j#                  d|d   d| d       i y)z8Test that all relations in response include person data.zPerson Threer#   i     r&      r)   Fr   sanxingr-   r2   r/   r0   r$   )r4   r/   r0   r&   r5   rK   rM   r1   rO   z	Relation z missing p1_datarP   z missing p2_datarQ   z p1_data missing baziz p2_data missing baziN)r
   r>   rA   r   r	   r   rB   rC   r   r7   r   r<   rR   rV   rj   rY   	enumeraterW   )rF   person3rZ   r[   r\   ir]   s          rG   ,test_multiple_relations_all_have_person_datazKPersonRelationsEnhancedAPITest.test_multiple_relations_all_have_person_data  sb    ..''D!Q'B|yy ( 
 	 $$yyLL#"## 	% 
	
 12;;??3'}}DO 4a8 %T)_5KAxMM)X1#=M/NOMM)X1#=M/NOMM&(9"51#EZ7[\MM&(9"51#EZ7[\	 6rI   c                    | j                   j                  }| j                   j                          t        d      }| j                  j                  |      }| j                  |j                  t        j                         |j                         }|d   D ]5  }d|v r| j                  d|d          d|v s!| j                  d|d          7 y)z1Test that API handles missing persons gracefully.rK   rM   rO   rQ   rP   N)r7   ry   deleter   r<   rR   rS   rT   r   rU   rV   rW   )rF   deleted_person_idrZ   r[   r\   r]   s         rG   *test_api_handles_missing_person_gracefullyzIPersonRelationsEnhancedAPITest.test_api_handles_missing_person_gracefully6  s     !LLOO12;;??3' 	--v/A/AB}} YHH$fhy&9:H$fhy&9:	 (rI   c                     | j                   j                  d       t        d      }| j                   j                  |      }| j	                  |j
                  t        j                  t        j                  g       y)z8Test that unauthorized users cannot access the endpoint.Nr   rK   )	r<   r@   r   rR   rW   rT   r   HTTP_401_UNAUTHORIZEDHTTP_403_FORBIDDEN)rF   rZ   r[   s      rG   test_unauthorized_access_deniedz>PersonRelationsEnhancedAPITest.test_unauthorized_access_deniedK  s[    &&D&112;;??3' 	h**V-I-I6KdKd,efrI   c           
      6   t         j                  j                  ddd      }t        j                  j	                  ddt        ddd	      t        d	d
      |d      }t        j                  j	                  ddt        ddd      t        dd      |d      }t        j                  j	                  |||dg dg dg dg       t        d      }| j                  j                  |      }|j                         }|d   D ]  }|d   }|d   }	t        j                  j                  |      }
t        j                  j                  |	      }| j                  |
j                  | j                         | j                  |j                  | j                          y) z7Test that users can only see their own group relations.13900000002zother@example.comotherpass123r   zOther Ownerr   i  r3   r(   r   Tr   zOther Personr#   r   r&         r'   Fr,   )r.   r/   r0   r   r   )r4   r/   r0   rq   r5   rK   rM   r2   r4   rx   N)r=   r>   r?   r
   rA   r   r	   r   r   r<   rR   rV   rS   r!   r   )rF   
other_userother_ownerother_personrZ   r[   r\   r]   r{   r|   r7   r8   s               rG   $test_user_can_only_see_own_relationszCPersonRelationsEnhancedAPITest.test_user_can_only_see_own_relationsU  s    \\--%# . 

 nn++D!R(B{! , 
 ~~,,D!R(B|! - 
 	$$! !"$79LM 	% 	
 12;;??3'}} YHTNETNEnn((E(2Gnn((E(2GW//;W//; (rI   N)__name__
__module____qualname____doc__rH   r^   ro   rv   r   r   r   r   r   r   r    rI   rG   r   r      sG    G<|&'P\2P6L<&DPY.%]N;*g1<rI   r   N)r   django.testr   django.contrib.authr   django.urlsr   rest_framework.testr   rest_frameworkr   datetimer   r	   bazi.modelsr
   bazi.models_groupr   r=   r   r   rI   rG   <module>r      s:    ! .  ) !   +q<X q<rI   