
    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lmc 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)up   
Service-layer tests for category_service — Story 3.2.
Tests run against the in-memory DB via the db fixture.
    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     E/var/www/html/financials/tests/test_services/test_category_service.pyseed_system_categoryr      s5    

=CKKOOCKKJ    c                     t        | dd      }t        j                  j                  |       t        j                  j	                          |S )NFTr   r   r   s     r   seed_custom_categoryr      s5    

>CKKOOCKKJr   c                       e Zd Zd Zd Zy)TestGetAllActivec                    |j                         5  t        d      }t        ddd      }t        j                  j                  |       t        j                  j                          t        j                         }|D cg c]  }|j                   }}d}||v }	|	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}||v}	|	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        y c c}w # 1 sw Y   y xY w)NActiveInactiveFr   )in)z%(py1)s in %(py3)snames)py1py3zassert %(py5)spy5)not in)z%(py1)s not in %(py3)s)app_contextr   r   r   r   r   r   svcget_all_activer	   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation)selfappr   activeinactiveresultcr   @py_assert0@py_assert2@py_format4@py_format6s               r   test_returns_only_activez)TestGetAllActive.test_returns_only_active    s:   __ 	+)(3FZ5ERHKKOOH%KK '')F%+,QVV,E,$8u$$$$8u$$$8$$$$$$u$$$u$$$$$$$*:U****:U***:******U***U*******	+ 	+ -	+ 	+s   A/G- G(EG-(G--G6c                    |j                         5  t        d       t        d       t        j                         }|d   }|j
                  }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}}d d d        y # 1 sw Y   y xY w)
N	Groceriesz
AAA Customr   Tis)z1%(py3)s
{%(py3)s = %(py1)s.is_system
} is %(py6)s)r   r    py6zassert %(py8)spy8)r#   r   r   r$   r%   r
   r&   r'   r(   r,   r-   )
r.   r/   r   r2   r4   r5   @py_assert5@py_assert4@py_format7@py_format9s
             r   !test_system_categories_come_firstz2TestGetAllActive.test_system_categories_come_first+   s    __ 	/ - .'')F!9.9&&.$.&$....&$...9...&...$.......	/ 	/ 	/s   CC&&C/N)__name__
__module____qualname__r8   rC    r   r   r   r      s    	+/r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestCreateCustomc                    |j                         5  t        j                  d      }t        j                  j                          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}}
d d d        y # 1 sw Y   y xY w)	NTravel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   py0py2py4r=   r>   py10py12py15assert %(py17)spy17)r#   r$   create_customr   r   r   r   query	filter_byfirstr&   r'   r)   r*   r+   r(   r,   r-   r.   r/   r   r   @py_assert1@py_assert3r?   @py_assert7@py_assert9@py_assert11@py_assert14@py_assert13@py_format16@py_format18s                 r   test_creates_categoryz&TestCreateCustom.test_creates_category7   s"   __ 	O##H-CKK >>N>++NN+:N:@@N@BN$NB$NNNNB$NNNNNN8NNN8NNN>NNN+NNNNNN:NNN@NNNBNNN$NNNNNNNN	O 	O 	Os   F F::Gc                    |j                         5  t        j                  d      }|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        y # 1 sw Y   y xY w)	NrK   Fr;   )z1%(py2)s
{%(py2)s = %(py0)s.is_system
} is %(py5)sr   rQ   rR   r!   assert %(py7)spy7)r#   r$   rY   r
   r&   r'   r)   r*   r+   r(   r,   r-   	r.   r/   r   r   r^   r@   r_   r7   @py_format8s	            r   test_new_category_is_not_systemz0TestCreateCustom.test_new_category_is_not_system=   s    __ 	*##H-C==)E)=E))))=E))))))3)))3)))=)))E)))))))	* 	* 	*   CC77D c                    |j                         5  t        j                  d      }|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        y # 1 sw Y   y xY w)	NrK   Tr;   z1%(py2)s
{%(py2)s = %(py0)s.is_active
} is %(py5)sr   ri   rj   rk   )r#   r$   rY   r   r&   r'   r)   r*   r+   r(   r,   r-   rl   s	            r   test_new_category_is_activez,TestCreateCustom.test_new_category_is_activeB   s    __ 	)##H-C==(D(=D((((=D((((((3(((3(((=(((D(((((((	) 	) 	)ro   c                     |j                         5  t        j                  t        d      5  t	        j
                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrequiredmatch r#   pytestraises
ValueErrorr$   rY   r.   r/   r   s      r   test_empty_name_raisesz'TestCreateCustom.test_empty_name_raisesG   sW    __ 	&z< &!!"%&	& 	&& &	& 	&"   A AA A	A  A)c                     |j                         5  t        j                  t        d      5  t	        j
                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrt   ru   z   rx   r|   s      r   test_whitespace_only_raisesz,TestCreateCustom.test_whitespace_only_raisesL   sW    __ 	)z< )!!%()	) 	)) )	) 	)r~   c                     |j                         5  t        j                  t        d      5  t	        j
                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N50ru   3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrx   r|   s      r   test_name_too_long_raisesz*TestCreateCustom.test_name_too_long_raisesQ   sW    __ 	,z6 ,!!(+,	, 	,, ,	, 	,r~   c                     |j                         5  t        d       t        j                  t        d      5  t        j                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrK   already existsru   )r#   r   ry   rz   r{   r$   rY   r|   s      r   test_duplicate_name_raisesz+TestCreateCustom.test_duplicate_name_raisesV   s`    __ 	, *z1AB ,!!(+,	, 	,, ,	, 	,"   'A+AA+A(	$A++A4N)
rD   rE   rF   rg   rn   rr   r}   r   r   r   rG   r   r   rI   rI   6   s&    O*
)
&
)
,
,r   rI   c                   *    e Zd Zd Zd Zd Zd Zd Zy)
TestRenamec                    |j                         5  t        d      }t        j                  |d       t        j
                  j                          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}}
d d d        y # 1 sw Y   y xY w)
NzOld NamezNew NamerL   rM   rO   r   rP   rW   rX   )r#   r   r$   renamer   r   r   r   rZ   r[   r\   r&   r'   r)   r*   r+   r(   r,   r-   r]   s                 r   test_renames_categoryz TestRename.test_renames_category`   s*   __ 	Q&z2CJJsJ'KK >>P>++PP+<P<BBPBDPDPDDPPPPDDPPPPPP8PPP8PPP>PPP+PPPPPP<PPPBPPPDPPPDPPPPPPPP		Q 	Q 	Qs   F,GGc                     |j                         5  t        d      }t        j                  t        d      5  t        j                  |d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NTestrt   ru   rw   r#   r   ry   rz   r{   r$   r   r.   r/   r   r   s       r   r}   z!TestRename.test_empty_name_raisesg   sa    __ 	$&v.Cz< $

3#$	$ 	$$ $	$ 	$"   'A,A A, A)	%A,,A5c                     |j                         5  t        d      }t        j                  t        d      5  t        j                  |d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   ru   r   r   r   s       r   r   z$TestRename.test_name_too_long_raisesm   sa    __ 	*&v.Cz6 *

3)*	* 	** *	* 	*r   c                    |j                         5  t        d       t        d      }t        j                  t        d      5  t        j                  |d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NExistingTargetr   ru   r   r   s       r   r   z%TestRename.test_duplicate_name_raisess   sj    __ 	, ,&x0Cz1AB ,

3
+,	, 	,, ,	, 	,s#   2A7A+A7+A4	0A77B c                     |j                         5  t        d      }t        j                  |d       d d d        y # 1 sw Y   y xY w)NSame)r#   r   r$   r   r   s       r   'test_rename_to_same_name_does_not_raisez2TestRename.test_rename_to_same_name_does_not_raisez   s9    __ 	$&v.CJJsF#	$ 	$ 	$s	   "<AN)rD   rE   rF   r   r}   r   r   r   rG   r   r   r   r   _   s    Q$*,$r   r   c                       e Zd Zd Zd Zd Zy)TestSoftDeletec                    |j                         5  t        d      }t        j                  |       t        j
                  j                          t        j                  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}}d d d        y # 1 sw Y   y xY w)	NUnusedFr;   rq   	refreshedri   rj   rk   )r#   r   r$   soft_deleter   r   r   r   rZ   getidr   r&   r'   r)   r*   r+   r(   r,   r-   )
r.   r/   r   r   r   r^   r@   r_   r7   rm   s
             r   (test_soft_deletes_unused_custom_categoryz7TestSoftDelete.test_soft_deletes_unused_custom_category   s    __ 	0&x0COOC KK  **3662I&&/%/&%////&%//////9///9///&///%///////	0 	0 	0s   D/E		Ec                     |j                         5  t        d      }t        j                  t        d      5  t        j                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr:   Systemru   )r#   r   ry   rz   r{   r$   r   r   s       r   test_system_category_raisesz*TestSoftDelete.test_system_category_raises   s_    __ 	%&{3Cz: %$%	% 	%% %	% 	%r   c                 F   |j                         5  t        ddd      }t        d      }t        j                  j                  |       t        j                  j                          t        ddd|j                  |j                  	      }t        j                  j                  |       t        j                  j                          t        j                  t        d
      5  t        j                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NBankcheckingT)r	   typer   Usedz
2026-05-01Shopz10.00)datemerchant_normalizedamount
account_idcategory_idzin useru   )r#   r   r   r   r   r   r   r   r   ry   rz   r{   r$   r   )r.   r/   r   acctr   txns         r   &test_category_with_transactions_raisesz5TestSoftDelete.test_category_with_transactions_raises   s    __ 	%Z4HD&v.CKKOOD!KK !v477C KKOOC KK z: %$%	% 	%% %	% 	%s$   CD$D:DD	DD N)rD   rE   rF   r   r   r   rG   r   r   r   r      s    0%%r   r   )r:   )Custom)__doc__builtinsr)   _pytest.assertion.rewrite	assertionrewriter&   ry   app.models.categoryr   app.models.transactionr   app.models.accountr   app.extensionsr   r   app.services.category_serviceservicescategory_servicer$   r   r   r   rI   r   r   rG   r   r   <module>r      sY      ( . & $ + +
/ /.$, $,R$ $F% %r   