
    wPj*                         d dl Zd dlmc mZ d dlmZ d dlm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZ d Zdd	d
efdZdd	d
ef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S )    N)
TestClient)Sessionselect)engineinit_dbseed_database)app)TaskCompletionTaskInstance
TaskStatusc                     | d         D ]9}|d         d         D ](}|d         dk    r|d         d         |d         fc c S ):t          d          )	Nchildrentasksopenkindbonuschildidzno bonus task foundAssertionErrorpayloadr   tasks      @/home/agent/projects/FamilyDashboard/backend/tests/test_tasks.py_bonus_task_idr   	   s|    $ 8 8'N6* 	8 	8DF|w&&W~d+T$Z777777 '	8 .
/
//    r   statusr   c                    | d         D ]:}|d         |         D ])}|d         dk    r|d         d         |d         |fc c S *;t          d|           )Nr   r   title   Wuschi fütternr   r   zno Wuschi task found in r   )r   r   r   r   s       r   _wuschi_taskr"      s    $ > >'N6* 	> 	>DG} 111W~d+T$Z====== 2	> <F<<
=
==r   c                    g }| d         D ]I}|d         |         D ]8}|d         dk    r*|                     |d         d         |d         |f           9J|S )Nr   r   r    r!   r   r   )append)r   r   matchesr   r   s        r   _all_wuschi_tasksr&      s{    G$ I I'N6* 	I 	IDG} 111gt 4d4j$GHHH	I Nr   c                     | d         D ]9}|d         d         D ](}|d         dk    r|d         d         |d         fc c S ):t          d          )	Nr   r   r   r   requiredr   r   zno required task foundr   r   s      r   _required_task_idr)   "   s|    $ 8 8'N6* 	8 	8DF|z))W~d+T$Z777777 *	8 1
2
22r   c                  
   t                       t          t                    5 } |                     d                                          }t          |          \  }}|                     d| d                                          d         }|                     d| dddi	          }|                     d| d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! |                                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'd(|iz  }t          t          j        |                    d x}x}
x}}d S ))N/api/dashboard?date=2026-06-22/api/coins//ledgersummary/api/tasks/	/completeidempotency_keyztap-1json   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sfirstpy0py2py5assert %(py7)spy7coin_transactionamount   z%(py1)s == %(py4)spy1py4assert %(py6)spy6second
idempotentTis)z%(py1)s is %(py4)spostedreserved	availablerL   rM   rN   c                 H    g | ]}|d                               d          | S )commentzBonusaufgabe erledigt:
startswith.0txs     r   
<listcomp>zHtest_bonus_complete_is_idempotent_and_ledger_updates.<locals>.<listcomp>>   s0    qqqrbm>V>VWo>p>pqqqqr   transactions   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenr:   r;   rE   r>   assert %(py9)spy9)r   r   r	   getr3   r   poststatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprr   _format_explanationr[   )client	dashboardchild_idtask_idbeforer8   rH   ledger@py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7@py_assert6@py_assert5@py_format10s                       r   4test_bonus_complete_is_idempotent_and_ledger_updatesr{   *   s   III	C =FJJ?@@EEGG	*955';(;;;<<AACCIN<'<<<DUW^C_``=7===EVX_D`aa;(;;;<<= = = = = = = = = = = = = = = ########################5#####5#####################################::<<*+H5::5::::::::::5:::::5:::::::::::::::::::::::::::::::$$$$$$$$$$$$$$$$$$$$$$$$6$$$$$6$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;;==&.$.&$..........&$.....&....$...........................;;==# "Q&:&K(1,( ( # (     	   # (    	 $   	(              	           
 rqV[[]]>:qqqw3qrrwvwwrvwwwwwwwwwwwrvwwwwwwwwwwwww3wwwww3wwwwwwqwwwwrwwwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww   B>C--C14C1c                  	   t                       t          t                    5 } |                     d                                          }t          |          \  }}|                     d| d                                          d         }|                     d| dddi	           |                     d| d
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}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 )(Nz/api/dashboard?date=2026-06-18r,   r-   r.   r/   r0   r1   ztap-2r2   /undozundo-2r4   r5   r7   undor9   r=   r>   r?   r@   rA   )z%(py1)s == -%(py4)srC   r   r   r   rB   rF   rG   z%(py1)s == %(py3)srm   rD   py3assert %(py5)sr<   c              3   .   K   | ]}|d          dk    V  dS )r@   N rT   s     r   	<genexpr>z>test_bonus_undo_creates_counter_transaction.<locals>.<genexpr>O   s+      JJbr(|r!JJJJJJr   rX   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr:   r;   rE   )r   r   r	   r_   r3   r   r`   ra   rb   rc   rd   re   rf   rg   r   rh   r   )ri   rj   rk   rl   rm   r   rn   ro   rp   rq   rr   rs   rt   ry   ru   rv   rw   @py_format4s                     r   +test_bonus_undo_creates_counter_transactionr   A   s,   III	C =FJJ?@@EEGG	*955';(;;;<<AACCIN4'444<Mw;WXXX{{7777?PRZ>[{\\;(;;;<<= = = = = = = = = = = = = = = "s"s""""""""""s""""""""""""4"""""4""""""""""s"""""""""""""""""""""""""""99;;)*84:::4::::::::::4:::::4:::::::::::::::::::::::::::::::::99;;vx(2F2(F2222222222(F22222(2222F222222222222222222222222222;;==#-#v----------#v-----#-----------v-----v---------------------------JJFKKMM.,IJJJJ3JJJJJJJJJJJJJJJJ3JJJJJ3JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJr|   c                     t                       t          t                    5 } |                     d                                          }t          |          \  }}|                     d| d                                          d         }|                     d| d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         }g }d }||u }	|	}|	s|d         }d}||k    }|}|s-t          j	        d|	fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }
dd|
iz  }|                    |           |	s`t          j	        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }|                    |           t          j        |d          i z  }dd|iz  }t          t          j        |                    d x}x}x}	x}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}}	|r|d'         nd(}|                                d         d)         }|d)         }	|	|z   }||k    }|st          j	        d|fd*||f          t          j        |          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}x}x}	}|                                d         d/         }|d/         }	|	|z   }||k    }|st          j	        d|fd*||f          t          j        |          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}x}x}	}d S )0Nz/api/dashboard?date=2026-06-29r,   r-   r.   r/   r0   r1   z
required-1r2   r4   r5   r7   completer9   r=   r>   r?   transaction_typepenalty_reversalrJ   )z%(py2)s is %(py5)stransaction)r;   r<   z%(py7)s)z%(py10)s == %(py13)s)py10py13z%(py15)spy15rY   zassert %(py18)spy18r   r   donerB   rC   rF   rG   r@   r   rL   )z%(py1)s == (%(py4)s + %(py5)s)expected_delta)rD   rE   r<   assert %(py8)spy8rN   )r   r   r	   r_   r3   r)   r`   ra   rb   rc   rd   re   rf   rg   r   rh   r$   _format_boolop)ri   rj   rk   rl   rm   r   rn   ro   rp   rq   rr   rs   r   rt   @py_assert9@py_assert12@py_assert11@py_format14@py_format16@py_format17@py_format19ru   rv   rw   r   rx   @py_format9s                              r   /test_required_complete_does_not_book_plus_coinsr   R   s   III	C =FJJ?@@EEGG	-i88';(;;;<<AACCIN;;?W???GXZfFg;hh;(;;;<<= = = = = = = = = = = = = = = &3&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&--//"45KWW$W;$WWWWW+.@"AWEWW"AEW"WWWWWWWWWWWW;$WWWWWWWWWWWW;WWWWW;WWWWWW$WWWWWWWWWWWWWWWWWWWWWWWWWWW"AEWWWWWW"AWWWWEWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW==??6"8,66,6666666666,66666,6666666666666666666666666666666.9@[**qN;;==#H-R1AR1AN1RR-1RRRRRRRRRRR-1RRRRRR-RRRR1ARRRRRRRRRRRNRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR;;==#K0XF;4GX4G.4XX04XXXXXXXXXXX04XXXXXX0XXXX4GXXXXXXXXXXX.XXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs   B!CCCc                     t                       t          t                    5 } |                     d                                          }t          |d          \  }}}|                     d| dddi          }|                     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}}t          |d          \  }}}||k    }|st          j	        d
|fd||f          dt          j                    v st          j        |          rt          j        |          nddt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    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 )Nr+   r   r   r/   r0   r1   zwuschi-doner2   r4   r5   r7   r   r9   r=   r>   r   z%(py0)s == %(py2)sreloaded_idrl   r:   r;   assert %(py4)srE   r   rB   rC   rF   rG   )r   r   r	   r_   r3   r"   r`   ra   rb   rc   rd   re   rf   rg   r   rh   )ri   rj   _rl   r   reloadedro   rp   rq   rr   rs   r   r   @py_format3rv   rt   ru   rw   s                     r   =test_bonus_task_complete_persists_done_after_dashboard_reloadr   d   s   III	C GFJJ?@@EEGG	$Yv>>>7A;;?W???GXZgFh;ii::>??DDFF	G G G G G G G G G G G G G G G &3&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&'@@@A{D'!!!!!!!!!!;'!!!!!!!!!!!!;!!!!!;!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!>#V#>V##########>V#####>####V#############################s   BB00B47B4c                     t                       t          t                    5 } |                     d                                          }t          |d          }t          |          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        t                    rt          j        t                    nd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                                          d         }|                     d|	 dddi          }|                     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          ||          }g }||k    }|st          j        d|fd||f          dt          j
                    v st          j        t
                    rt          j        t
                    nddt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          dz  }dd |iz  }t          t          j        |                    d x}x}x}}t          |d!          }t          |          }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        t                    rt          j        t                    nd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!h}||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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, |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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 S )0Nr+   r   r   rA   r5   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr[   open_wuschi)r:   rD   r   rG   r   r   r   r,   r-   r.   r/   r0   r1   zshared-wuschi-doner2   r4   r7   r   r9   r=   r>   z@%(py5)s
{%(py5)s = %(py0)s(%(py1)s, status=%(py3)s)
} == %(py8)sr&   r   r:   rD   r   r<   r   assert %(py10)sr   r   done_wuschic                 &    h | ]\  }}}|d          S r   r   )rU   r   r   s      r   	<setcomp>zZtest_shared_bonus_task_disappears_for_both_children_when_completed_once.<locals>.<setcomp>   s"    999zq!TDN999r   rB   rC   rF   rG   rL   rM   rN   rO   c                 H    g | ]}|d                               d          | S )rQ   zBonusaufgabe erledigt: WuschirR   rT   s     r   rW   z[test_shared_bonus_task_disappears_for_both_children_when_completed_once.<locals>.<listcomp>   sQ      G  G  GByMLdLd  fE  MF  MF  G"  G  G  Gr   rX   rY   bonus_transactions)r   r   r	   r_   r3   r&   r[   rb   rc   rd   re   rf   rg   r   rh   r`   ra   )ri   rj   r   ru   ry   rp   rw   r   completing_child_idrl   r   rm   r   r   completing_ledgerro   rq   rr   rs   @py_assert7rx   @py_format11r   rt   rv   r   s                             r   Gtest_shared_bonus_task_disappears_for_both_children_when_completed_oncer   r   s	   III	C 	ZFJJ?@@EEGG	'	&AAA;$1$1$$$$$$$$$$1$$$$$$$$$$$$s$$$$$s$$$$$$$$$$$$$;$$$$$;$$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$*5a.'WaF*=FFFGGLLNNyY;;?W???GXZnFo;pp::>??DDFF"JJ'Q5H'Q'Q'QRRWWYY	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z &3&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&.4;Xf555;;5;;;;;;;;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;;;;;X;;;;;;f;;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#HV<<<K{ q q          q            3     3             {     {          q                           99[999EfXE9XEEEEEEEEEE9XEEEEE9EEEEXEEEEEEEEEEEEEEEEEEEEEEEEEEEY' "Q&:&K(1,, , ' ,     	   ' ,    	 (   	,              	           
 G  G'8'H  G  G  G!""'a'"a''''''''''"a''''''''''''3'''''3'''''''''''''!'''''!''''''"''''a'''''''''''''''''''''''''''''s   G6H%%H),H)c            
         t                       t          t                    5 } |                     d                                          }t          |d          d         \  }}|                     d| d                                          d         }|                     d d	d
di           |                     d                                          }fdt          |d          D             d         d         }|                     d| dd
di          }|                     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          ||          }t!          |          }d}||k    }|s`t          j	        d|fd||f          dt          j                    v st          j        t                     rt          j        t                     nddt          j                    v st          j        t
                    rt          j        t
                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }dd |iz  }t          t          j        |                    d x}x}x}x}}d}t          ||          }g }||k    }|st          j	        d|fd!||f          dt          j                    v st          j        t
                    rt          j        t
                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          d"z  }d#d$|iz  }t          t          j        |                    d x}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             }d, |D             }
t#          |
          }d-dg}||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        |          d0z  }d1d2|iz  }t          t          j        |                    d x}
x}x}}d S )3N/api/dashboard?date=2026-06-23r   r   r   r,   r-   r.   r/   r0   r1   zshared-wuschi-done-undor2   c                 ,    g | ]}|d          k    |S )rY   r   )rU   itemrl   s     r   rW   z[test_shared_bonus_task_undo_reopens_for_both_children_and_reverses_once.<locals>.<listcomp>   s+    xxxeijkelpwewewewewewr   r   rY   r~   zshared-wuschi-openr4   r5   r7   r   r9   r=   r>   rA   )z_%(py8)s
{%(py8)s = %(py0)s(%(py6)s
{%(py6)s = %(py1)s(%(py2)s, status=%(py4)s)
})
} == %(py11)sr[   r&   r   )r:   rD   r;   rE   rG   r   py11zassert %(py13)sr   r   r   r   r   r   rm   r   r   r<   c                 &    g | ]}d |d         v |S )r!   rQ   r   rT   s     r   rW   z[test_shared_bonus_task_undo_reopens_for_both_children_and_reverses_once.<locals>.<listcomp>   s*    dddARVXYbVcAcAc"AcAcAcr   rX   c              3   &   K   | ]}|d          V  dS )r@   Nr   rT   s     r   r   zZtest_shared_bonus_task_undo_reopens_for_both_children_and_reverses_once.<locals>.<genexpr>   s&      <<2"X,<<<<<<r   r   rZ   sortedr\   r]   r^   )r   r   r	   r_   r3   r&   r`   ra   rb   rc   rd   re   rf   rg   r   rh   r[   r   )ri   rj   first_child_idr   rm   done_dashboardsibling_done_task_idr   r   rn   ro   rp   rq   rr   rs   ry   r   @py_assert10r   @py_format12r   ru   rx   r   r   rt   r   r   rz   rl   s                                @r   Gtest_shared_bonus_task_undo_reopens_for_both_children_and_reverses_oncer      s   III	C 
JFJJ?@@EEGG	%6y%P%P%PQR%S"A.AAABBGGII)T4'444<MOh;ijjj$DEEJJLLxxxx1B>Z`1a1a1axxxyz{|}~{{D)=DDDL]_sKt{uu::>??DDFFA.AAABBGGII
J 
J 
J 
J 
J 
J 
J 
J 
J 
J 
J 
J 
J 
J 
J "s"s""""""""""s""""""""""""4"""""4""""""""""s"""""""""""""""""""""""""""28? &999?39::?a?:a??????????:a????????????3?????3????????????? ????? ????????????????????????&????9????:????a???????????????????????????????.4;Xf555;;5;;;;;;;;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;;;;;X;;;;;;f;;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ddvn'=ddd<<);<<<G6<<<GQG<GGGGGGGGGG<GGGGGGGGGGGG6GGGGG6GGGGGG<GGGG<GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGs   EF  FFc                  ~   t                       t          t                    5 } |                     d                                          }t          |d          \  }}|                     d dddi           |                     d d	dd
i          }|                     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}}t          |d          \  }}
}|
k    }|st          j	        d|fd|
f          dt          j                    v st          j        |
          rt          j        |
          nddt          j                    v st          j                  rt          j                  nddz  }dd|iz  }t          t          j        |                    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}}f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 )"Nr   r   r   r/   r0   r1   zwuschi-done-undor2   r~   zwuschi-openr4   r5   r7   r   r9   r=   r>   r   r   rl   r   r   rE   r   rB   rC   rF   rG   c              3   R   K   | ]!}|d          d         D ]}|d         k    V  "dS )r   r   r   Nr   )rU   r   r   rl   s      r   r   zLtest_bonus_task_undo_persists_open_after_dashboard_reload.<locals>.<genexpr>   sF      jjSXY`SabhSijj4tDzW$jjjjjjjr   r   r   allr   )r   r   r	   r_   r3   r"   r`   ra   rb   rc   rd   re   rf   rg   r   rh   r   )ri   rj   r   r   r   ro   rp   rq   rr   rs   r   r   r   rv   rt   ru   rw   rl   s                    @r   9test_bonus_task_undo_persists_open_after_dashboard_reloadr      sj   III	C GFJJ?@@EEGG	$Yv>>>7A4'444<MOa;bccc{{7777?PR_>`{aa::>??DDFFG G G G G G G G G G G G G G G "s"s""""""""""s""""""""""""4"""""4""""""""""s"""""""""""""""""""""""""""'@@@A{D'!!!!!!!!!!;'!!!!!!!!!!!!;!!!!!;!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!>#V#>V##########>V#####>####V###########################jjjj(:2Fjjjj3jjjjjjjjjjjjjjjj3jjjjj3jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjs   BCCCc                  J   t                       t          t                    5 } |                     d                                          }t          |d          \  }}}|                     d| dddi           |                     d| d	dd
i           d d d            n# 1 swxY w Y   t          t                    5 }t                       d d d            n# 1 swxY w Y   t          t                    5 } |                     d                                          }d d d            n# 1 swxY w Y   t          |d          \  }}}||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          nddt          j                    v st          j        |          rt          j        |          nddz  }	dd|	iz  }
t!          t          j        |
                    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/   r0   r1   zwuschi-seed-doner2   r~   zwuschi-seed-openr5   r   r   rl   r   r   rE   r   rB   rC   rF   rG   )r   r   r	   r_   r3   r"   r`   r   r   r   rb   rc   rd   re   rf   rg   r   rh   )ri   rj   r   rl   sessionr   r   r   ro   r   rv   rt   rq   ru   rw   s                  r   +test_bonus_task_undo_survives_seed_databaser      s   III	C `FJJ?@@EEGG	$Yv>>>7A4'444<MOa;bccc0'0008IK]7^___	` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 
 G              	C GF::>??DDFFG G G G G G G G G G G G G G G (@@@A{D'!!!!!!!!!!;'!!!!!!!!!!!!;!!!!!;!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!>#V#>V##########>V#####>####V#############################s6   A7B&&B*-B*C  C$'C$?(D33D7:D7c                  	   t                       t          t                    5 } |                     d                                          }t          |d          \  }}}|                     d| dddi           |                     d| d	dd
i           d d d            n# 1 swxY w Y   t          t                    5 }|                    t          |          }|j
        }t          j        }||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }	dd|	iz  }
t'          t          j        |
                    d x}x}}|j        }d }||u }|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            n# 1 swxY w Y   t          t                    5 } |                     d                                          }d d d            n# 1 swxY w Y   t          |d          \  }}}||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          nddt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t'          t          j        |                    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-25r   r   r/   r0   r1   zwuschi-session-doner2   r~   zwuschi-session-openr5   )zH%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.open
}instancer   )r:   r;   rE   rG   r   r   rJ   )z4%(py2)s
{%(py2)s = %(py0)s.completed_at
} is %(py5)sr9   r=   r>   r   r   rl   r   r   rE   r   rB   rC   rF   rG   )r   r   r	   r_   r3   r"   r`   r   r   r   r   r   r   rb   rc   rd   re   rf   rg   r   rh   completed_at)ri   rj   r   rl   r   r   ro   ry   rq   rw   r   rp   rr   rs   r   r   r   r   rv   rt   ru   s                        r   8test_bonus_task_undo_survives_backend_restart_simulationr      s   III	C cFJJ?@@EEGG	$Yv>>>7A4'444<MOd;efff0'0008IK`7abbb	c c c c c c c c c c c c c c c 
 -G;;|W551*/1/1111111111/111111111111x11111x11111111111111111*11111*111111/111111111111111111111111111$,,$,,,,,,,,,,$,,,,,,,,,,,,x,,,,,x,,,,,,$,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,- - - - - - - - - - - - - - -
 
C GF::>??DDFFG G G G G G G G G G G G G G G'@@@A{D'!!!!!!!!!!;'!!!!!!!!!!!!;!!!!!;!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!>#V#>V##########>V#####>####V#############################s7   A7B&&B*-B*G.J??KK(LLLc                     t                       t          t                    5 } |                     d                                          }t          |d          \  }}}d d d            n# 1 swxY w Y   t          t                    5 }|                    t          |          }|	                    t          ||d                     t          j        |_        d |_        |	                    |           |                                 d d d            n# 1 swxY w Y   t          t                    5 } |                     d                                          }d d d            n# 1 swxY w Y   t          |d          \  }}}	||k    }
|
st!          j        d|
fd||f          dt%          j                    v st!          j        |          rt!          j        |          ndd	t%          j                    v st!          j        |          rt!          j        |          nd	d
z  }dd|iz  }t-          t!          j        |                    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-26r   r   zhistorical-completion)task_instance_idrk   r1   r5   r   r   rl   r   r   rE   r   rB   rC   rF   rG   )r   r   r	   r_   r3   r"   r   r   r   addr
   r   r   r   r   commitrb   rc   rd   re   rf   rg   r   rh   )ri   rj   rk   rl   r   r   r   r   r   r   ro   r   rv   rt   rq   ru   rw   s                    r   9test_taskcompletion_does_not_override_taskinstance_statusr      s   III	C FFJJ?@@EEGG	+IfEEE'1F F F F F F F F F F F F F F F 
 G;;|W55NGh`wxxxyyy$/ $H               
C GF::>??DDFFG G G G G G G G G G G G G G G'@@@A{D'!!!!!!!!!!;'!!!!!!!!!!!!;!!!!!;!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!>#V#>V##########>V#####>####V#############################s6   =A,,A03A0BDD D8(E,,E03E0c                     t                       t          t                    5 } |                     d          }d d d            n# 1 swxY w Y   |j        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-27zcache-controlzno-store, max-age=0r5   rB   rC   rF   rG   )
r   r   r	   r_   headersrb   rc   rg   r   rh   )ri   responsert   rq   ru   rv   rw   s          r   test_api_responses_are_no_storer      sA   III	C @F::>??@ @ @ @ @ @ @ @ @ @ @ @ @ @ @O,E0EE,0EEEEEEEEEEE,0EEEEEE,EEEE0EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs   AA	A	)%builtinsrd   _pytest.assertion.rewrite	assertionrewriterb   fastapi.testclientr   sqlmodelr   r   app.db.sessionr   r   r   app.mainr	   
app.modelsr
   r   r   r   strr"   r&   r)   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s                 ) ) ) ) ) ) $ $ $ $ $ $ $ $ 9 9 9 9 9 9 9 9 9 9       ? ? ? ? ? ? ? ? ? ?0 0 0 ,2 > > >S > > > > 17   #    3 3 3x x x.K K K"Y Y Y$$ $ $( ( (6H H H,k k k $ $ $$$ $ $($ $ $*F F F F Fr   