
    hjc#                     H   d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZ  e
j(                         d        Z e
j(                         d	        Z e
j(                         d
        Z G d d      Z G d d      Z G d d      Z G d d      Zy)u2   
Transaction edit and delete tests — Story 3.4.
    N)Decimal)Account)Category)Transaction)dbc                     t        ddd      }t        j                  j                  |       t        j                  j	                          |S )NChasecheckingT)nametype	is_active)r   _dbsessionaddcommit)r   as     N/var/www/html/financials/tests/test_blueprints/test_transaction_edit_delete.pyacctr      s5    W:>AKKOOAKKH    c                     t        ddd      }t        j                  j                  |       t        j                  j	                          |S )N	GroceriesT)r   	is_systemr   )r   r   r   r   r   )r   cs     r   catr      s5    kTTBAKKOOAKKHr   c                     d }t        dddt        d      |j                  |j                  d |ddd            }t        j                  j                  |       t        j                  j                          |S )Nc                     t        t        t        |            j                  t        d                  }t        j                  | |z   |z   j                               j                         S )N0.01)strr   quantizehashlibsha256encode	hexdigest)merchantamountdate_stramts       r   _hashztxn.<locals>._hash!   sN    '#f+&//@A~~x#~8@@BCMMOOr   
2026-05-15ALDI29.99T)datemerchant_normalizedmerchant_rawr%   
account_idcategory_id	is_manual
dedup_hash)r   r   idr   r   r   r   )r   r   r   r(   ts        r   txnr5      si    P 	"w77FF,7		A KKOOAKKHr   c                   $    e Zd Zd Zd Zd Zd Zy)TestEditGetc                    |j                  d|j                   d      }|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}}y )
N/transactions//edit   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponsepy0py2py5assert %(py7)spy7)getr3   status_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)
selfclientr   r5   r?   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s
             r   test_get_returns_200z TestEditGet.test_get_returns_2007   s    ::svvhe<=##*s*#s****#s******x***x***#***s*******r   c                    |j                  d|j                   d      }d}|j                  }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}}y )
Nr9   r:   s   ALDIinz,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}r?   py1py3rC   rD   rE   rF   r3   datarH   rI   rM   rJ   rK   rL   rN   rO   
rP   rQ   r   r5   r?   @py_assert0rS   @py_assert2rU   rV   s
             r   !test_form_prefilled_with_merchantz-TestEditGet.test_form_prefilled_with_merchant;   s    ::svvhe<='(--'w-''''w-'''w''''''('''('''-'''''''r   c                    |j                  d|j                   d      }d}|j                  }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}}y )
Nr9   r:   s   29.99rY   r[   r?   r\   rD   rE   r_   ra   s
             r   test_form_prefilled_with_amountz+TestEditGet.test_form_prefilled_with_amount?   s    ::svvhe<=(8==(x=((((x=(((x((((((8(((8(((=(((((((r   c                    |j                  d      }|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}}y )	N/transactions/9999/edit  r<   r>   r?   r@   rD   rE   )
rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   	rP   rQ   r   r?   rR   rS   rT   rU   rV   s	            r   test_nonexistent_returns_404z(TestEditGet.test_nonexistent_returns_404C   s    ::78##*s*#s****#s******x***x***#***s*******r   N)__name__
__module____qualname__rW   rd   rf   rk    r   r   r7   r7   6   s    +()+r   r7   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestEditPostc                    |j                  d|j                   dddd|j                  |j                  dddd	
      }|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        j                  j                  |       |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}	}|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}	}|j                   }d}t#        |      }||k(  }	|	s
t        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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}}y )Nr9   r:   
2026-05-20Whole Foods55.00 0r,   r$   r%   r0   r/   notes
force_saveFr`   follow_redirects.  r<   r>   r?   r@   rD   rE   z;%(py2)s
{%(py2)s = %(py0)s.merchant_normalized
} == %(py5)sr5   )z,%(py2)s
{%(py2)s = %(py0)s.date
} == %(py5)s)zL%(py2)s
{%(py2)s = %(py0)s.amount
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   )rA   rB   py4py6py8zassert %(py10)spy10)postr3   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   r   refreshr-   r,   r%   r   )rP   rQ   r   r5   r   r   r?   rR   rS   rT   rU   rV   @py_assert5@py_assert7@py_format9@py_format11s                   r   #test_valid_post_updates_transactionz0TestEditPost.test_valid_post_updates_transactionK   sU   ;;xu= %66''E
 "  # ##*s*#s****#s******x***x***#***s*******C &&7-7&-7777&-777777s777s777&777-7777777xx'<'x<''''x<''''''s'''s'''x'''<'''''''zz-W-WW--z-----z-------s---s---z------W---W---W-----------r   c                 d   |j                  d|j                   dddd|j                  |j                  ddd	       t        j                  j	                  |       t        t        d      j                  t        d
                  }t        j                  d|z   dz   j                               j                         }|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"                  |      rt        j$                  |      nddz  }
dd|
iz  }t'        t        j(                  |            d x}}	y )Nr9   r:   rs   rt   ru   rv   rw   rx   r`   r   r<   )z2%(py2)s
{%(py2)s = %(py0)s.dedup_hash
} == %(py4)sr5   expected)rA   rB   r   assert %(py6)sr   )r   r3   r   r   r   r   r   r   r    r!   r"   r#   r2   rH   rI   rJ   rK   rL   rM   rN   rO   )rP   rQ   r   r5   r   r   r'   r   rR   rT   @py_format5@py_format7s               r   test_edit_recomputes_dedup_hashz,TestEditPost.test_edit_recomputes_dedup_hash[   s   nSVVHE2 %66'':
 	 	C ''"++GFO<=>>=3#6#E"M"M"OPZZ\~~)~))))~))))))s)))s)))~))))))))))))))))r   c                 ~   |j                  d|j                   ddddd|j                  ddd	d
      }d}|j                  d   }||v }	|	slt        j                  d|	fd||f      t        j
                  |      t        j
                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}y )Nr9   r:   rs   Shop10.00r   rv   rw   rx   Fr{   LocationrY   z%(py1)s in %(py4)sr]   r   r   r   r   r3   headersrH   rI   rM   rN   rO   )rP   rQ   r   r5   r   r   r?   rb   rT   rc   r   r   s               r   test_edit_redirects_to_listz(TestEditPost.test_edit_redirects_to_listj   s    ;;xu= fDGGbPSE
 "  #  ?8#3#3J#??#?????#???????#????????r   c                    |j                  d|j                   ddddd|j                  ddd	d
      }d}|j                  }||v }	|	st        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}y )Nr9   r:   rs   r   r   r   rv   rw   rx   Tr{   s   Transaction updatedrY   r[   r?   r\   rD   rE   r   r3   r`   rH   rI   rM   rJ   rK   rL   rN   rO   )rP   rQ   r   r5   r   r   r?   rb   rS   rc   rU   rV   s               r   test_edit_flashes_successz&TestEditPost.test_edit_flashes_successq   s    ;;xu= fDGGbPSE
 !  " &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6r   c                    |j                  d|j                   ddddd|j                  ddd	
      }|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        j                  j                  |       |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}}y )Nr9   r:   rs   r   badr   rv   rw   rx   r   r;   r<   r>   r?   r@   rD   rE   r*   r~   r5   )r   r3   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   r   r   r-   )rP   rQ   r   r5   r   r?   rR   rS   rT   rU   rV   s              r   "test_invalid_amount_rerenders_formz/TestEditPost.test_invalid_amount_rerenders_formx   s4   ;;xu= fDGGbPSE
;  ##*s*#s****#s******x***x***#***s*******C &&0&0&&0000&&000000s000s000&000&0000000r   c                    |j                  ddddd|j                  ddd	      }|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}}y )Nrh   rs   r   r   r   rv   rw   rx   r   ri   r<   r>   r?   r@   rD   rE   r   r3   rG   rH   rI   rJ   rK   rL   rM   rN   rO   )
rP   rQ   r   r   r?   rR   rS   rT   rU   rV   s
             r   rk   z)TestEditPost.test_nonexistent_returns_404   s    ;;8 fDGGbPS@
;  ##*s*#s****#s******x***x***#***s*******r   N)	rl   rm   rn   r   r   r   r   r   rk   ro   r   r   rq   rq   J   s!    . *@71+r   rq   c                       e Zd Zd Zd Zd Zy)TestEditDuplicatec                 <   t        dddt        d      |j                  dt        j                  dj                               j                               }t        j                  j                  |       t        j                  j                          |j                  d|j                   dddd|j                  |j                  d	d
d      }|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}|j*                  }	|	j,                  } |       }||v }|st        j                  d|fd||f      t        j$                  |      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}	x}}y )Nr)   Target15.00TTarget15.002026-05-15r,   r-   r.   r%   r/   r1   r2   r9   r:   rv   rw   rx   r   r;   r<   r>   r?   r@   rD   rE   s	   duplicaterY   )z^%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.data
}.lower
}()
})r]   r^   rC   rE   py9zassert %(py11)spy11)r   r   r3   r    r!   r"   r#   r   r   r   r   r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r`   lower)rP   rQ   r   r5   r   r   otherr?   rR   rS   rT   rU   rV   rb   @py_assert6@py_assert8rc   @py_format10@py_format12s                      r   'test_editing_to_duplicate_shows_warningz9TestEditDuplicate.test_editing_to_duplicate_shows_warning   s   8!''*:ww$~~2::<>>Gik
 	;;xu= h'66sE
; 
 ##*s*#s****#s******x***x***#***s*******4x}}4}224244|44444|4444|444444x444x444}4442444444444444r   c                    |j                  d|j                   dddd|j                  |j                  dddd	
      }|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}	}y )Nr9   r:   r)   r*   r+   rv   rw   rx   Fr{   r}   r<   r>   r?   r@   rD   rE   r   )rP   rQ   r   r5   r   r   r?   rR   rS   rT   rU   rV   s               r   !test_editing_does_not_flag_itselfz3TestEditDuplicate.test_editing_does_not_flag_itself   s    ;;xu= f66sE
 "	  #
 ##*s*#s****#s******x***x***#***s*******r   c                     t        dddt        d      |j                  dt        j                  dj                               j                               }t        j                  j                  |       t        j                  j                          |j                  d|j                   dddd|j                  |j                  d	d
dd      }|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        j                  j+                  |       |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}
}	y )Nr)   r   r   Tr   r   r9   r:   rv   1rx   Fr{   r}   r<   r>   r?   r@   rD   rE   r~   r5   )r   r   r3   r    r!   r"   r#   r   r   r   r   r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   r-   )rP   rQ   r   r5   r   r   r   r?   rR   rS   rT   rU   rV   s                r   $test_force_save_on_edit_saves_anywayz6TestEditDuplicate.test_force_save_on_edit_saves_anyway   s   8!''*:ww$~~2::<>>Gik
 	;;xu= h'66sE
 "	  #
 ##*s*#s****#s******x***x***#***s*******C &&2(2&(2222&(222222s222s222&222(2222222r   N)rl   rm   rn   r   r   r   ro   r   r   r   r      s    5(+3r   r   c                   $    e Zd Zd Zd Zd Zd Zy)
TestDeletec           	         |j                   }|j                  d| dd      }|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        j                  }|j                  } ||      }d }||u }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      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}x}x}}y )Nr9   /deleteFr|   r}   r<   r>   r?   r@   rD   rE   )is)ze%(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.get
}(%(py5)s)
} is %(py10)sr   txn_id)rA   rB   r   rC   rE   r   zassert %(py12)spy12)r3   r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   queryrF   )rP   rQ   r   r5   r   r?   rR   rS   rT   rU   rV   r   @py_assert9r   r   @py_format13s                   r   $test_delete_hard_deletes_transactionz/TestDelete.test_delete_hard_deletes_transaction   sa   ;;xw?05  7##*s*#s****#s******x***x***#***s*******  4 $$4$V,44,4444,444444{444{444 444$444444V444V444,44444444444r   c                 X   |j                  d|j                   dd      }d}|j                  d   }||v }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }	t        t        j                  |	            d x}x}}y )Nr9   r   Fr   r   rY   r   r   r   r   r   )
rP   rQ   r   r5   r?   rb   rT   rc   r   r   s
             r   test_delete_redirects_to_listz(TestDelete.test_delete_redirects_to_list   s    ;;xw?05  7?8#3#3J#??#?????#???????#????????r   c                    |j                  d|j                   dd      }d}|j                  }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}y )Nr9   r   Tr   s   Transaction deletedrY   r[   r?   r\   rD   rE   r   ra   s
             r   test_delete_flashes_successz&TestDelete.test_delete_flashes_success   s    ;;xw?04  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6r   c                    |j                  d      }|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}}y )	Nz/transactions/9999/deleteri   r<   r>   r?   r@   rD   rE   )
r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rj   s	            r   #test_delete_nonexistent_returns_404z.TestDelete.test_delete_nonexistent_returns_404   s    ;;:;##*s*#s****#s******x***x***#***s*******r   N)rl   rm   rn   r   r   r   r   ro   r   r   r   r      s    5@
7
+r   r   )__doc__builtinsrJ   _pytest.assertion.rewrite	assertionrewriterH   r    decimalr   pytestapp.models.accountr   app.models.categoryr   app.models.transactionr   app.extensionsr   r   fixturer   r   r5   r7   rq   r   r   ro   r   r   <module>r      s        & ( . $
      ,+ +(<+ <+B/3 /3h+ +r   