
    j                         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
mZ ddlmZ ddlmZ ddZddZ G d	 d
      Z G d d      Z G d d      Z G d d      Zy)uk   
Category management view tests — Story 3.2.
Tests cover: list, create, rename, soft-delete, and guards.
    N)Category)Transaction)Account)dbc                     t        | dd      }t        j                  j                  |       t        j                  j	                          |S )NTname	is_system	is_activer   _dbsessionaddcommitr	   cats     A/var/www/html/financials/tests/test_blueprints/test_categories.pyseed_systemr      s5    

=CKKOOCKKJ    c                     t        | dd      }t        j                  j                  |       t        j                  j	                          |S )NFTr   r   r   s     r   seed_customr      s5    

>CKKOOCKKJr   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestCategoriesListc                    |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/settings/categories   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponsepy0py2py5assert %(py7)spy7
getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	selfclientr   r    @py_assert1@py_assert4@py_assert3@py_format6@py_format8s	            r   test_page_returns_200z(TestCategoriesList.test_page_returns_200   s    ::45##*s*#s****#s******x***x***#***s*******r   c                    t        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 )
N	Groceriesr   s   Systeminz,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
}r    py1py3r$   r%   r&   )r   r(   datar*   r+   r/   r,   r-   r.   r0   r1   	r3   r4   r   r    @py_assert0r6   @py_assert2r8   r9   s	            r   test_shows_system_badgez*TestCategoriesList.test_shows_system_badge#   s    K ::45)HMM)yM))))yM)))y))))))H)))H)))M)))))))r   c                 d   t        d      }|j                  d      }d|j                   d}|j                  } |       }|j                  }||v}	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      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}x}x}	}y )Nr<   r   /settings/categories//deletenot in)zc%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.encode
}()
} not in %(py9)s
{%(py9)s = %(py7)s.data
}r    rA   rB   r$   r&   py9assert %(py11)spy11)r   r(   idencoderC   r*   r+   r/   r,   r-   r.   r0   r1   r3   r4   r   r   r    rE   rF   r6   @py_assert8@py_assert6@py_format10@py_format12s               r   )test_system_category_has_no_delete_buttonz<TestCategoriesList.test_system_category_has_no_delete_button(   s    +&::45&svvhg6T6==T=?Tx}}T?}TTTT?}TTT6TTT=TTT?TTTTTTxTTTxTTT}TTTTTTTTr   c                 d   t        d      }|j                  d      }d|j                   d}|j                  } |       }|j                  }||v }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      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}x}x}	}y )NTravelr   rI   rJ   r=   )z_%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.encode
}()
} in %(py9)s
{%(py9)s = %(py7)s.data
}r    rM   rO   rP   )r   r(   rQ   rR   rC   r*   r+   r/   r,   r-   r.   r0   r1   rS   s               r   &test_custom_category_has_delete_buttonz9TestCategoriesList.test_custom_category_has_delete_button-   s    (#::45&svvhg6P6==P=?P8==P?=PPPP?=PPP6PPP=PPP?PPPPPP8PPP8PPP=PPPPPPPPr   c                 J   t        ddd      }t        j                  j                  |       t        j                  j	                          |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 )NHiddenFr   r   s   HiddenrK   )z0%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.data
}r    r@   r%   r&   )r   r   r   r   r   r(   rC   r*   r+   r/   r,   r-   r.   r0   r1   
r3   r4   r   r   r    rE   r6   rF   r8   r9   s
             r   "test_inactive_categories_not_shownz5TestCategoriesList.test_inactive_categories_not_shown2   s    HG::45--y----y---y-------------------r   c                    |j                  d      }g }d}|j                  }||v }|}|s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  }|j                  |       |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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}	x}}
y )Nr   s   New Categorys   Add Categoryr=   )z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}r    )rB   r$   r&   z%(py9)srN   )z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
})py12py14py16z%(py18)spy18   zassert %(py21)spy21)r(   rC   r*   r+   r/   r,   r-   r.   append_format_boolopr0   r1   )r3   r4   r   r    r5   rF   rU   r6   rE   @py_assert11@py_assert15@py_assert13r9   rV   @py_format17@py_format19@py_format20@py_format22s                     r   test_shows_add_formz&TestCategoriesList.test_shows_add_form9   s    ::45SS(--S-/S?ShmmS?m3SSSSS-SSSSSSSSS(SSS(SSS-SSSSSSS?mSSS?SSSSSShSSShSSSmSSSSSSSSSSSSSSr   N)	__name__
__module____qualname__r:   rG   rX   r[   r_   rp    r   r   r   r      s#    +*
U
Q
.Tr   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestCreateCategoryc                    |j                  dddi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}	 ||	      }
|
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                  |      t        j                  |	      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}
x}x}x}}y )Nr   r	   rZ   FrC   follow_redirectsi.  r   r   r    r!   r%   r&   )r	   )is not)z%(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.filter_by
}(name=%(py6)s)
}.first
}()
} is not %(py15)sr   )r"   r#   py4py6py8py10ra   py15zassert %(py17)spy17)postr)   r*   r+   r,   r-   r.   r/   r0   r1   r   query	filter_byfirst)r3   r4   r   r    r5   r6   r7   r8   r9   @py_assert5@py_assert7@py_assert9ri   @py_assert14rk   @py_format16@py_format18s                    r    test_valid_post_creates_categoryz3TestCreateCategory.test_valid_post_creates_categoryA   sq   ;;5VX<N05  7##*s*#s****#s******x***x***#***s*******~~J~''JXJ'X6J6<<J<>JdJ>dJJJJ>dJJJJJJxJJJxJJJ~JJJ'JJJXJJJ6JJJ<JJJ>JJJdJJJJJJJJr   c                 B   |j                  dddi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 )Nr   r	   rZ   Frx   Locationr=   )z%(py1)s in %(py4)s)rA   r{   zassert %(py6)sr|   )r   headersr*   r+   r/   r0   r1   )	r3   r4   r   r    rE   r7   rF   @py_format5@py_format7s	            r   test_redirects_to_listz)TestCreateCategory.test_redirects_to_listG   s}    ;;5VX<N05  7%E)9)9*)EE%)EEEEE%)EEEE%EEE)EEEEEEEEr   c                    |j                  dddi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 )Nr   r	   rZ   Trx   s   Category addedr=   r?   r    r@   r%   r&   )
r   rC   r*   r+   r/   r,   r-   r.   r0   r1   rD   s	            r   test_flashes_successz'TestCreateCategory.test_flashes_successL   s    ;;5VX<N04  6 1HMM1 M1111 M111 111111H111H111M1111111r   c                    |j                  dddi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}
|	|
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                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
y )Nr   r	    Frx   r   r   r   r    r!   r%   r&   r   z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.query
}.count
}()
} == %(py9)sr   r"   r#   r{   r|   rN   rO   rP   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   countr3   r4   r   r    r5   r6   r7   r8   r9   r   rT   r   rV   rW   s                 r   test_empty_name_shows_errorz.TestCreateCategory.test_empty_name_shows_errorQ   s1   ;;5VRL05  7##*s*#s****#s******x***x***#***s*******~~*~##*#%**%****%******x***x***~***#***%***********r   c                    |j                  dddi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}
|	|
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                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
y )Nr   r	   3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFrx   r   r   r   r    r!   r%   r&   r   r   r   r   rO   rP   r   r   s                 r   test_name_too_long_rejectedz.TestCreateCategory.test_name_too_long_rejectedW   s2   ;;5VX<N05  7##*s*#s****#s******x***x***#***s*******~~*~##*#%**%****%******x***x***~***#***%***********r   c                    t        d       |j                  dddi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 )NrZ   r   r	   Trx      already existsr=   r?   r    r@   r%   r&   )r   r   rC   r*   r+   r/   r,   r-   r.   r0   r1   rD   s	            r   !test_duplicate_name_flashes_errorz4TestCreateCategory.test_duplicate_name_flashes_error]   s    H;;5VX<N04  6 1HMM1 M1111 M111 111111H111H111M1111111r   N)	rq   rr   rs   r   r   r   r   r   r   rt   r   r   rv   rv   @   s"    KF
2
++2r   rv   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestEditCategoryc                    t        d      }|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 )NrZ   rI   /editr   r   r   r    r!   r%   r&   )r   r(   rQ   r)   r*   r+   r,   r-   r.   r/   r0   r1   
r3   r4   r   r   r    r5   r6   r7   r8   r9   s
             r   test_edit_get_returns_200z*TestEditCategory.test_edit_get_returns_200g   s    (#:: 5cffXUCD##*s*#s****#s******x***x***#***s*******r   c                    t        d      }|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 )NrZ   rI   r   s   Travelr=   r?   r    r@   r%   r&   )r   r(   rQ   rC   r*   r+   r/   r,   r-   r.   r0   r1   r^   s
             r   test_edit_prefills_namez(TestEditCategory.test_edit_prefills_namel   s    (#:: 5cffXUCD)HMM)yM))))yM)))y))))))H)))H)))M)))))))r   c                 0   t        d      }|j                  d|j                   dddid       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 )NOld NamerI   r   r	   New NameFrx   r   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sr   r!   r%   r&   )r   r   rQ   r   r   refreshr	   r*   r+   r,   r-   r.   r/   r0   r1   	r3   r4   r   r   r5   r6   r7   r8   r9   s	            r   test_valid_rename_updatesz*TestEditCategory.test_valid_rename_updatesq   s    *%+CFF859@T%* 	 	,C xx%:%x:%%%%x:%%%%%%s%%%s%%%x%%%:%%%%%%%r   c                    t        d      }|j                  d|j                   dddi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 )Nr   rI   r   r	   r   Trx   s   Category updatedr=   r?   r    r@   r%   r&   r   r   rQ   rC   r*   r+   r/   r,   r-   r.   r0   r1   r^   s
             r   !test_valid_rename_flashes_successz2TestEditCategory.test_valid_rename_flashes_successx   s    *%;;!6svvheD%+Z$84  Q"3hmm3"m3333"m333"333333h333h333m3333333r   c                    t        d       t        d      }|j                  d|j                   dddi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 )NExistingTargetrI   r   r	   Trx   r   r=   r?   r    r@   r%   r&   r   r^   s
             r   #test_duplicate_rename_flashes_errorz4TestEditCategory.test_duplicate_rename_flashes_error~   s    J(#;;!6svvheD%+Z$84  Q 1HMM1 M1111 M111 111111H111H111M1111111r   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/settings/categories/9999/edit  r   r   r    r!   r%   r&   r'   r2   s	            r   !test_edit_nonexistent_returns_404z2TestEditCategory.test_edit_nonexistent_returns_404   s    ::>?##*s*#s****#s******x***x***#***s*******r   N)	rq   rr   rs   r   r   r   r   r   r   rt   r   r   r   r   f   s     +
*
&42+r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestDeleteCategoryc                 $   t        d      }|j                  d|j                   d       t        j                  j                  |       |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}}y )NUnusedrI   rJ   Fisz1%(py2)s
{%(py2)s = %(py0)s.is_active
} is %(py5)sr   r!   r%   r&   )r   r   rQ   r   r   r   r   r*   r+   r,   r-   r.   r/   r0   r1   r   s	            r   &test_delete_unused_custom_soft_deletesz9TestDeleteCategory.test_delete_unused_custom_soft_deletes   s    (#+CFF87;<C }}%%}%%%%}%%%%%%s%%%s%%%}%%%%%%%%%%r   c                    t        d      }|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 )Nr   rI   rJ   Try   s   Category deletedr=   r?   r    r@   r%   r&   r   r^   s
             r   test_delete_flashes_successz.TestDeleteCategory.test_delete_flashes_success   s    (#;;!6svvhgF04  6"3hmm3"m3333"m333"333333h333h333m3333333r   c                    t        d      }|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 )Nr<   rI   rJ   i  r   r   r    r!   r%   r&   )r   r   rQ   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   s
             r   'test_delete_system_category_returns_403z:TestDeleteCategory.test_delete_system_category_returns_403   s    +&;;!6svvhgFG##*s*#s****#s******x***x***#***s*******r   c                    t        ddd      }t        d      }t        j                  j	                  |       t        j                  j                          t        ddd|j                  |j                  	      }t        j                  j	                  |       t        j                  j                          |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}	}t        j                  j%                  |       |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}}y )NBankcheckingT)r	   typer   Usedz
2026-05-01Shopz10.00)datemerchant_normalizedamount
account_idcategory_idrI   rJ   r   s   in user=   r?   r    r@   r%   r&   r   r   r   r!   )r   r   r   r   r   r   r   rQ   r   rC   r*   r+   r/   r,   r-   r.   r0   r1   r   r   )r3   r4   r   acctr   txnr    rE   r6   rF   r8   r9   r5   r7   s                 r   +test_delete_with_transactions_flashes_errorz>TestDeleteCategory.test_delete_with_transactions_flashes_error   s   FtD&!6twwCFF
 	;;!6svvhgF04  6)HMM)yM))))yM)))y))))))H)))H)))M)))))))C }}$$}$$$$}$$$$$$s$$$s$$$}$$$$$$$$$$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 )	Nz /settings/categories/9999/deleter   r   r   r    r!   r%   r&   )
r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   s	            r   #test_delete_nonexistent_returns_404z6TestDeleteCategory.test_delete_nonexistent_returns_404   s    ;;AB##*s*#s****#s******x***x***#***s*******r   N)rq   rr   rs   r   r   r   r   r   rt   r   r   r   r      s    &4+
%"+r   r   )r<   )Custom)__doc__builtinsr,   _pytest.assertion.rewrite	assertionrewriter*   pytestapp.models.categoryr   app.models.transactionr   app.models.accountr   app.extensionsr   r   r   r   r   rv   r   r   rt   r   r   <module>r      sV      ( . & $
T TD!2 !2L!+ !+L%+ %+r   