
    xtPj              	           d dl Zd dlmc mZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ ddeded	ed
dfdZd Zd Zd Zd Zd ZdS )    N)
TestClient)init_db)app)admin_headers   clienttarget_child_idneededreturnc                 v   d}d}||k     r|                      d|d                                          }t          fd|d         D                       }|d         d         D ]E}|d	         d
k    r7|                     d|d          ddd|d          i           ||d         z  }F|dz  }||k     d S d S )Nr      z/api/dashboard?date=2026-06-02dc              3   @   K   | ]}|d          d         k    |V  dS )childidN ).0itemr	   s     C/home/agent/projects/FamilyDashboard/backend/tests/test_benefits.py	<genexpr>z$_earn_bonus_coins.<locals>.<genexpr>   s8      llDT']SWEX\kEkEk4EkEkEkEkll    childrentasksopenkindbonusz/api/tasks/r   z	/completeidempotency_keyzearn-json
coin_value   )getr   nextpost)r   r	   r
   earnedday	dashboardchild_boardtasks    `      r   _earn_bonus_coinsr*      s    F
C
6//JJGcGGGHHMMOO	llllIj,Alllll(0 	- 	-DF|w&&?$t*???GXZnbfgkblZnZnFoppp$|,,q 6//////r   c                     t                       t          t                    5 } |                     d                                          }|d         d         d         d         }|                     d|           }d d d            n# 1 swxY w Y   |j        }d}||k    }|st          j        d|fd	||f          d
t          j	                    v st          j
        |          rt          j        |          nd
t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|                                }	|	d         }t          |          }d}
||
k    }|st          j        d|fd||
f          dt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |
          dz  }dd|iz  }t          t          j        |                    d x}x}x}}
d |	d         D             }t          |          }|sddt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }t          t          j        |                    d x}}d |	d         D             }t!          |          }|sddt          j	                    v st          j
        t                     rt          j        t                     ndt          j        |          t          j        |          dz  }t          t          j        |                    d x}}d S )Nz/api/dashboard?date=2026-06-20r   r   r   r   /api/benefits?child_id=   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponsepy0py2py5assert %(py7)spy7benefits   )>=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slenr3   r4   py4r7   assert %(py9)spy9c              3      K   | ]}d |v V  	dS )
affordableNr   r   r   s     r   r   z>test_benefits_are_listed_with_affordability.<locals>.<genexpr>   s'      DD|t#DDDDDDr   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr3   r4   r=   c              3   .   K   | ]}|d          dk    V  dS )titlezExtra VorlesenNr   rB   s     r   r   z>test_benefits_are_listed_with_affordability.<locals>.<genexpr>    s,      QQTtG} 00QQQQQQr   any)r   r   r   r"   r   status_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr;   rD   rH   )r   r'   child_idr1   @py_assert1@py_assert4@py_assert3@py_format6@py_format8payload@py_assert6@py_assert5@py_format10@py_format5s                 r   +test_benefits_are_listed_with_affordabilityr]      s<   III	C DFJJ?@@EEGG	Z(+G4T:::BBBCCD D D D D D D D D D D D D D D
 &3&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&mmooGz"(3"##(q(#q((((((((((#q((((((((((((3(((((3(((((("((((#((((q(((((((((((((((((((((((((((((DD
0CDDDD3DDDDDDDDDDDDDDDD3DDDDD3DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDQQWZ=PQQQQ3QQQQQQQQQQQQQQQQ3QQQQQ3QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQs   AB		BBc                     t                       t          t                    5 } |                     d                                          }|d         d         d         d         }t          | |d           t          d |                     d	|                                           d
         D                       }|                     d| d                                          d         }|                     d|d          d|dd          }|                     d|d          d|dd          }|                     d| d                                          }d d d            n# 1 swxY w Y   |j        }d}	||	k    }
|
st          j
        d|
fd||	f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}
}	|                                d         d         }d}
||
k    }|slt          j
        d|fd||
f          t          j        |          t          j        |
          dz  }dd |iz  }t          t          j        |                    d x}x}}
|j        }d}	||	k    }
|
st          j
        d|
fd||	f          d!t          j                    v st          j        |          rt          j        |          nd!t          j        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}
}	|                                d"         }d#}
||
u }|slt          j
        d$|fd%||
f          t          j        |          t          j        |
          dz  }dd |iz  }t          t          j        |                    d x}x}}
|d         }|d&         |d         dz   |d'         dz
  d(}
||
k    }|slt          j
        d|fd||
f          t          j        |          t          j        |
          dz  }dd |iz  }t          t          j        |                    d x}x}}
d) |d*         D             }t#          |          }
d+}|
|k    }|st          j
        d|fd,|
|f          d-t          j                    v st          j        t"                    rt          j        t"                    nd-t          j        |          t          j        |
          t          j        |          d.z  }d/d0|iz  }t          t          j        |                    d x}x}
x}}d S )1Nz/api/dashboard?date=2026-06-21r   r   r   r      r
   c              3   2   K   | ]}|d          dk    |V  dS pricer_   Nr   rB   s     r   r   zBtest_redeem_benefit_reserves_coins_idempotently.<locals>.<genexpr>)   \        C  Cost{o|  AB  pB  pBt  pB  pB  pB  pB  C  Cr   r,   r8   /api/coins//ledgersummary/api/benefits//redeemzredeem-1rR   r   r   r-   r.   r0   firstr2   r6   r7   
redemptionstatusreservedz%(py1)s == %(py4)spy1r=   assert %(py6)spy6second
idempotentTisz%(py1)s is %(py4)sposted	availablery   rn   rz   c                 *    g | ]}|d          dk    |S )transaction_typereserver   r   txs     r   
<listcomp>zCtest_redeem_benefit_reserves_coins_idempotently.<locals>.<listcomp>9   )    [[[rr:L7MQZ7Z7Z7Z7Z7Zr   transactionsr!   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr;   r<   r>   r?   )r   r   r   r"   r   r*   r#   r$   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r;   )r   r'   rR   benefitbeforerk   rt   ledgerrS   rT   rU   rV   rW   @py_assert0@py_assert2r\   @py_format7rY   rZ   r[   s                       r   /test_redeem_benefit_reserves_coins_idempotentlyr   #   sd   III	C 	DFJJ?@@EEGG	Z(+G4T:&(15555  C  C

3WX3W3W(X(X(](](_(_`j(k  C  C  C  C  C;(;;;<<AACCINCWT]CCCW_t~JJ  A  ADgdmDDDX`u  LA  LA  B  B;(;;;<<AACC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D ########################5#####5#####################################::<<%h/=:=/:==========/:=====/====:===========================$$$$$$$$$$$$$$$$$$$$$$$$6$$$$$6$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&.$.&$..........&$.....&....$...........................) ":&*K(1,! !  !     	    !    	    	!              	           
 \[VN3[[[a3[\\a`aa\`aaaaaaaaaaa\`aaaaaaaaaaaaa3aaaaa3aaaaaa[aaaa\aaaa`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   D?E..E25E2c                     t                       t          t                    5 } |                     d                                          }|d         d         d         d         }t          d |                     d|                                           d         D                       }|                     d	| d
                                          d         }|                     d|d          d|dd          }|                     d	| d
                                          }d d d            n# 1 swxY w Y   |j        }d}||k    }	|	st          j	        d|	fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}|                                d         d         }d}	||	k    }|slt          j	        d|fd||	f          t          j        |          t          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}}	|d         }||k    }|st          j	        d|fd||f          t          j        |          d t          j                    v st          j        |          rt          j        |          nd d!z  }d"d#|iz  }
t          t          j        |
                    d x}}d S )$Nz/api/dashboard?date=2026-06-24r   r   r   r   c              3   2   K   | ]}|d          dk    |V  dS )rc   r   Nr   rB   s     r   r   zAtest_redeem_benefit_rejects_insufficient_coins.<locals>.<genexpr>A   s\        D  Dost{o|  AC  pC  pCt  pC  pC  pC  pC  D  Dr   r,   r8   re   rf   rg   rh   ri   zpoor-1rj   r   i  r.   r0   r1   r2   r6   r7   detailcodeinsufficient_coinsro   rp   rr   rs   z%(py1)s == %(py3)sr   rq   py3assert %(py5)sr5   )r   r   r   r"   r   r#   r$   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )r   r'   rR   r   r   r1   r   rS   rT   rU   rV   rW   r   r   r\   r   @py_format4s                    r   .test_redeem_benefit_rejects_insufficient_coinsr   <   s	   III	C DFJJ?@@EEGG	Z(+G4T:  D  D

3WX3W3W(X(X(](](_(_`j(k  D  D  D  D  D;(;;;<<AACCIN;;FFFFZbw  NA  NA;  B  B;(;;;<<AACCD D D D D D D D D D D D D D D &3&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&==??8$V,D0DD,0DDDDDDDDDDD,0DDDDDD,DDDD0DDDDDDDDDDDDDDDDDDDDDDDDDDDD)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&s   D	D88D<?D<c                  .   t                       t          t                    5 } |                     d                                          }|d         d         d         d         }t          | |d           t          d |                     d	|                                           d
         D                       }|                     d| d                                          d         }|                     d|d          d|dd                                          d         d         }|                     d| dt          |           ddi          }|                     d| dt          |           ddi          }|                     d| d                                          }d d d            n# 1 swxY w Y   |j	        }	d}
|	|
k    }|st          j        d|fd|	|
f          dt          j                    v st          j        |          rt          j        |          ndt          j        |	          t          j        |
          dz  }dd|iz  }t!          t          j        |                    d x}	x}}
|                                d         d          }d!}||k    }|slt          j        d|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }t!          t          j        |                    d x}x}}|j	        }	d}
|	|
k    }|st          j        d|fd|	|
f          d&t          j                    v st          j        |          rt          j        |          nd&t          j        |	          t          j        |
          dz  }dd|iz  }t!          t          j        |                    d x}	x}}
|                                d'         }d(}||u }|slt          j        d)|fd*||f          t          j        |          t          j        |          d#z  }d$d%|iz  }t!          t          j        |                    d x}x}}|d         }|d+         dz
  |d,         |d-         dz
  d.}||k    }|slt          j        d|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }t!          t          j        |                    d x}x}}d/ |d0         D             }	t%          |	          }d1}||k    }|st          j        d|fd2||f          d3t          j                    v st          j        t$                    rt          j        t$                    nd3t          j        |	          t          j        |          t          j        |          d4z  }d5d6|iz  }t!          t          j        |                    d x}	x}x}}d S )7Nz/api/dashboard?date=2026-06-22r   r   r   r   r_   r`   c              3   2   K   | ]}|d          dk    |V  dS rb   r   rB   s     r   r   zGtest_fulfill_redemption_captures_reserved_coins_once.<locals>.<genexpr>R   rd   r   r,   r8   re   rf   rg   rh   ri   zredeem-fulfillrj   r   rl   /api/admin/redemptions/z/fulfillr   z	fulfill-1headersr   r-   r.   r0   rk   r2   r6   r7   rm   	fulfilledro   rp   rr   rs   rt   ru   Trv   rx   ry   rn   rz   r{   c                 *    g | ]}|d          dk    |S )r}   capturer   r   s     r   r   zHtest_fulfill_redemption_captures_reserved_coins_once.<locals>.<listcomp>f   r   r   r   r!   r   r;   r<   r>   r?   )r   r   r   r"   r   r*   r#   r$   r   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r;   )r   r'   rR   r   r   redemption_idrk   rt   r   rS   rT   rU   rV   rW   r   r   r\   r   rY   rZ   r[   s                        r   4test_fulfill_redemption_captures_reserved_coins_oncer   L   s   III	C DFJJ?@@EEGG	Z(+G4T:&(15555  C  C

3WX3W3W(X(X(](](_(_`j(k  C  C  C  C  C;(;;;<<AACCIN3WT]333&;KLL $ 
 
 $&&  $%
 MmMMMWdekWlWl  uF  HS  tT  U  UN}NNNXeflXmXm  vG  IT  uU  V  V;(;;;<<AACCD D D D D D D D D D D D D D D ########################5#####5#####################################::<<%h/>;>/;>>>>>>>>>>/;>>>>>/>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>$$$$$$$$$$$$$$$$$$$$$$$$6$$$$$6$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&.$.&$..........&$.....&....$...........................) "Q&:&K(1,! !  !     	    !    	    	!              	           
 \[VN3[[[a3[\\a`aa\`aaaaaaaaaaa\`aaaaaaaaaaaaa3aaaaa3aaaaaa[aaaa\aaaa`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   FF>>GGc                     t                       t          t                    5 } |                     d                                          }|d         d         d         d         }t          | |d           t          d |                     d	|                                           d
         D                       }|                     d| d                                          d         }|                     d|d          d|dd                                          d         d         }|                     d| dt          |           ddi          }|                     d| d                                          }d d d            n# 1 swxY w Y   |j	        }d}	||	k    }
|
st          j        d|
fd||	f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |	          dz  }dd|iz  }t!          t          j        |                    d x}x}
}	|                                d         d          }d!}
||
k    }|slt          j        d|fd"||
f          t          j        |          t          j        |
          d#z  }d$d%|iz  }t!          t          j        |                    d x}x}}
|d         }||k    }|st          j        d|fd&||f          t          j        |          d't          j                    v st          j        |          rt          j        |          nd'd(z  }d)d*|iz  }t!          t          j        |                    d x}}d+ |d,         D             }t%          |          }
|
sd-d.t          j                    v st          j        t$                    rt          j        t$                    nd.t          j        |          t          j        |
          d/z  }t!          t          j        |                    d x}}
d S )0Nz/api/dashboard?date=2026-06-23r   r   r   r   r_   r`   c              3   2   K   | ]}|d          dk    |V  dS rb   r   rB   s     r   r   zAtest_cancel_redemption_releases_reserved_coins.<locals>.<genexpr>o   rd   r   r,   r8   re   rf   rg   rh   ri   zredeem-cancelrj   r   rl   r   z/cancelr   zcancel-1r   r-   r.   r0   cancelr2   r6   r7   rm   	cancelledro   rp   rr   rs   r   r   r   r   r5   c              3   F   K   | ]}|d          dk    o|d         dk    V  dS )r}   releasereserved_amountiNr   r   s     r   r   zAtest_cancel_redemption_releases_reserved_coins.<locals>.<genexpr>|   s?      ttWYr$%2Rr:K7LPR7Rttttttr   r   rC   rH   rE   )r   r   r   r"   r   r*   r#   r$   r   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rH   )r   r'   rR   r   r   r   r   r   rS   rT   rU   rV   rW   r   r   r\   r   r   s                     r   .test_cancel_redemption_releases_reserved_coinsr   i   s3   III	C DFJJ?@@EEGG	Z(+G4T:&(15555  C  C

3WX3W3W(X(X(](](_(_`j(k  C  C  C  C  C;(;;;<<AACCIN3WT]333&?KK $ 
 
 $&&  $%
 M}MMMWdekWlWl  uF  HR  tS  T  T;(;;;<<AACCD D D D D D D D D D D D D D D $$$$$$$$$$$$$$$$$$$$$$$$6$$$$$6$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&x0?K?0K??????????0K?????0????K???????????????????????????)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tt]cdr]stttt3tttttttttttttttt3ttttt3ttttttttttttttttttttttttttttttttts   E$FFF)r   )builtinsrL   _pytest.assertion.rewrite	assertionrewriterJ   fastapi.testclientr   app.db.sessionr   app.mainr   tests.conftestr   intr*   r]   r   r   r   r   r   r   r   <module>r      s                 ) ) ) ) ) ) " " " " " "       ( ( ( ( ( (
 
j 
3 
 
UY 
 
 
 
R R Rb b b2' ' ' b b b:u u u u ur   