
    y/j+              	           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            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'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/benefits//redeemzredeem-1rR   r   r   /api/coins//ledgerr-   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summary
      postedrm   	availablec                 *    g | ]}|d          dk    |S )transaction_typereserver   r   txs     r   
<listcomp>zCtest_redeem_benefit_reserves_coins_idempotently.<locals>.<listcomp>4   )    [[[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   benefitrj   rs   ledgerrS   rT   rU   rV   rW   @py_assert0@py_assert2r\   @py_format7rY   rZ   r[   s                      r   /test_redeem_benefit_reserves_coins_idempotentlyr   #   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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$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&.$.&$..........&$.....&....$...........................)M211 M MM MMMMMMMMMMM MMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMM[[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D==EE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            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         }d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 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><   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   zpoor-1rg   r   rh   ri   i  r.   r0   r1   r2   r6   r7   detailcodeinsufficient_coinsrn   ro   rq   rr   rx   r{   )r   r   r   r"   r   r#   r$   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )r   r'   rR   r   r1   r   rS   rT   rU   rV   rW   r   r   r\   r   s                  r   .test_redeem_benefit_rejects_insufficient_coinsr   7   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;;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)L1!! L LL LLLLLLLLLLL LLLLLLLLLL LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLs   CD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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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- |d.         D             }t%          |          }
d/}|
|k    }|st          j        d|fd0|
|f          d1t          j                    v st          j        t$                    rt          j        t$                    nd1t          j        |          t          j        |
          t          j        |          d2z  }d3d4|iz  }t!          t          j        |                    d x}x}
x}}d S )5Nz/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>L   rd   r   r,   r8   re   rf   zredeem-fulfillrg   r   rk   /api/admin/redemptions/z/fulfillr   z	fulfill-1headersr   rh   ri   r-   r.   r0   rj   r2   r6   r7   rl   	fulfilledrn   ro   rq   rr   rs   rt   Tru   rw   rx   rz   r{   c                 *    g | ]}|d          dk    |S )r   capturer   r   s     r   r   zHtest_fulfill_redemption_captures_reserved_coins_once.<locals>.<listcomp>[   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   redemption_idrj   rs   r   rS   rT   rU   rV   rW   r   r   r\   r   rY   rZ   r[   s                       r   4test_fulfill_redemption_captures_reserved_coins_oncer   F   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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$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&.$.&$..........&$.....&....$...........................)L1!! L LL LLLLLLLLLLL LLLLLLLLLL LLLLLLLLLLLLLLLLLLLLLLLLLLLL[[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   EFFF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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%         }d&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( |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-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>d   rd   r   r,   r8   re   rf   zredeem-cancelrg   r   rk   r   z/cancelr   zcancel-1r   rh   ri   r-   r.   r0   cancelr2   r6   r7   rl   	cancelledrn   ro   rq   rr   rx   ry   r{   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>p   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   rS   rT   rU   rV   rW   r   r   r\   r   s                   r   .test_cancel_redemption_releases_reserved_coinsr   ^   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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???????????????????????????)N212 N NN NNNNNNNNNNN NNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNN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   D3E""E&)E&)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(M M Mb b b0u u u u ur   