
    aj                        d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZ d d	lmZ d d
lmZm Z  d Z!ddZ"ddZ#ddZ$ddZ%ddZ&dS )    )annotations)
TestClient)get_db)
create_app)confirm_create_budget_accountcreate_budget_account_previewlist_budget_accounts)confirm_create_categorycreate_category_previewlist_categories)get_budget_overviewget_category_summaryget_monthly_summary)confirm_budget_transaction"confirm_reverse_budget_transactionconfirm_transfer!create_budget_transaction_previewcreate_transfer_previewlist_budget_transactions"reverse_budget_transaction_preview)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S N)r   r   conns     tests/unit/test_budget_phase1.pydbr      s     DTK    returnNonec                    t                      } t          |            t          |           dk    sJ d |                     d          D             }h d                    |          sJ d |                     d          D             }|d                                         dk    sJ |d	                                         dk    sJ |d
                                         dk    sJ |                     d                                          d         dk    sJ |                     d                                          d         dk    sJ d S )N&   c                    h | ]
}|d          S )name .0rows     r   	<setcomp>zdtest_budget_phase1_tables_seeds_and_text_decimal_columns_are_created_idempotently.<locals>.<setcomp>!   s    gggcc&kgggr    z1SELECT name FROM sqlite_master WHERE type='table'>   budget_tagsbudget_accountsbudget_transfersbudget_categoriesbudget_transactionsbudget_transaction_tagsc                ,    i | ]}|d          |d         S )r&   typer'   r(   s     r   
<dictcomp>zetest_budget_phase1_tables_seeds_and_text_decimal_columns_are_created_idempotently.<locals>.<dictcomp>*   s"    jjjCs6{CKjjjr    z&PRAGMA table_info(budget_transactions)amount_originalTEXTfx_rate_to_chf
amount_chfz&SELECT COUNT(*) FROM budget_categoriesr      z SELECT COUNT(*) FROM budget_tags
   )r   r   r   executeissubsetupperfetchone)r   tablestx_colss      r   Qtest_budget_phase1_tables_seeds_and_text_decimal_columns_are_created_idempotentlyrA      so   44DTd##r))))ggT\\2e%f%fgggF   hv   kj4<<@h3i3ijjjG$%++--7777#$**,,6666< &&((F2222<<@AAJJLLQOSUUUUU<<:;;DDFFqIROOOOOOr    c                    t                      } t          | dddd          }|d         dk    sJ t          | |d                   }|d         }|d	         sJ t          |           d
         d         dk    sJ t	          ddg                              | |          }|d         dk    sJ |                     d|f                                          d
         d
k    sJ d S )Nz
Demo KontocheckingCHFr&   account_typecurrencysummaryu   Demo Konto · checking · CHFpayload	entity_idaudit_idr   r&   z'jarvis_finance.services.budget_accountsarchive_budget_accountfromliststatusarchivedz?SELECT is_active FROM budget_accounts WHERE budget_account_id=?)r   r   r   r	   
__import__rL   r;   r>   )r   preview	confirmed
account_idrP   s        r   5test_budget_accounts_preview_confirm_archive_and_listrU   2   s   44D+D<Ycqv2w2wxxG9!@@@@@-dGI4FGGI;'JZ    %%a(0L@@@@COgNhiii  A  A  BF  HR  S  SHH++++<<Y\f[hiirrttuvw{|||||||r    c                    t                      } t          |           }t          d |D                       }t          | dd|d         d          }t	          | |d                   }|d         }fd t          |           d          sJ t          d	d
g                              | |          }|d         dk    sJ d S )Nc              3  2   K   | ]}|d          dk    |V  dS r&   zEssen & HaushaltNr'   r)   cs     r   	<genexpr>zAtest_budget_categories_tree_create_and_archive.<locals>.<genexpr>C   s1      KK1V98J+J+J!+J+J+J+JKKr    Drogerieexpensecategory_id)r&   category_typeparent_category_idrI   rJ   c                >    t          fd| D                       S )Nc              3  p   K   | ]0}|d          k    p |                     dg                     V  1dS )r&   childrenN)get)r)   itemcontainsr&   s     r   r[   zStest_budget_categories_tree_create_and_archive.<locals>.contains.<locals>.<genexpr>H   sL      ffX\4<4'S88DHHZ4L4Ld+S+Sffffffr    )any)itemsr&   rf   s    `r   rf   z@test_budget_categories_tree_create_and_archive.<locals>.containsG   s+    fffff`effffffr    z)jarvis_finance.services.budget_categoriesarchive_categoryrM   rO   rP   )r   r   nextr   r
   rQ   ri   )r   
categoriesparentrR   rS   r^   rP   rf   s          @r   .test_budget_categories_tree_create_and_archiverm   @   s   44D &&JKKZKKKKKF%dZR[sy  {H  tI  -J  -J  K  KG'gi.@AAIK(Kg g g g g 8OD)):66666EQcPdeeevvw{  ~I  J  JHH++++++r    c            
         t                      } t          | dddd          d         }t          | dddd          d         }t          d t          |           D                       d	         }|d
dddd|dgd}t	          | |          }|d         dk    sJ t          | |d                   }|d         }|d         sJ |                     d|f                                          d         dk    sJ t	          | i |dddd d          }t          | |d                   d         dk    sJ t	          | i |ddd          }	|	d         d v sJ t          | ||d!ddd"d#          }
t          | |
d                   }|d         dk    sJ t          | |d$d%i          }|d&                             d'          sJ t          | ||d                   }|d         dk    sJ |                     d(                                          d         d)k    sJ t          t          |                     d*k    sJ t          |           d+         sJ t!          | d,          d-         d,k    sJ t#          | d,          sJ d S ).NHaushaltrC   rD   rE   rJ   Reservesavingsc              3  2   K   | ]}|d          dk    |V  dS rX   r'   rY   s     r   r[   zXtest_manual_income_expense_transfer_reversal_and_overview_write_audit.<locals>.<genexpr>S   s1      XX!&	EW8W8WA8W8W8W8WXXr    r^   r]   
2026-05-16zSynthetische Ausgabez12.34Einmalig)rT   transaction_typetransaction_datedescriptionr5   currency_originalr^   	tag_names	fx_status
not_neededrI   rK   zUSELECT typeof(amount_original) FROM budget_transactions WHERE budget_transaction_id=?r   textincomezSynthetische Einnahmez20.00)ru   rw   r5   r^   rO   rS   EURz5.00)rx   r5   >   okmissingz3.00zSynthetischer Transfer)from_account_idto_account_idr5   rx   rv   rw   reasonzSynthetische KorrekturrH   Reversalz@SELECT COUNT(*) FROM audit_log WHERE entity_type LIKE 'budget_%'      current_monthz2026-05month)r   r   rj   r   r   r   r;   r>   r   r   r   
startswithr   lenr   r   r   r   )r   	account_a	account_bcategoryexpense_payloadrR   rS   tx_idincome_preview
fx_previewtransfer_previewtransferrev_previewreversals                 r   Etest_manual_income_expense_transfer_reversal_and_overview_write_auditr   O   s   44D-dZYcqv4w4wxx  zE  FI-dYXaot4u4uvv  xC  DIXXt44XXXXXYfgH  %(-"" \	 	O 0oFFG;<////*41CDDIk"EZ    <<orwqyzz  D  D  F  F  GH  I  MS  S  S  S  S6t  >H  >Hem  V  kr  CG  >H  >H  >H  I  IN%dN9,EFFxPT_____24  :DO  :Dbg  }C  :D  :D  :D  E  EJk"&77777.ten  DJ  af  |H  Yq  6r  6r  s  s&6y&ABBHH,,,,4T58MeBfggKy!,,Z888881${9?UVVHH,,,,<<Z[[ddffghimnnnnn'--..!3333t$$_5555tY//8IEEEEi0000000r    c                   
 t                      
t                      } 
fd}|| j        t          <   t	          |           }dddd}|                    d|          }|j        dk    sJ |                    d	|                                d
                   }|j        dk    sJ |                                d         }|dddddd}|                    d|          }|j        dk    sJ |                    d|                                d
                   }	|	j        dk    sJ |                    d          j        dk    sJ |                    d          j        dk    sJ |                    d          j        dk    sJ d S )Nc               3     K    V  d S r   r'   r   s   r   override_dbzKtest_budget_api_endpoints_preview_confirm_and_overview.<locals>.override_db   s      




r    z	API KontorC   rD   rE   z/api/budget/accounts/preview)json   z/api/budget/accounts/confirmrI   rJ   r]   rs   zAPI Ausgabez10.00)rT   ru   rv   rw   r5   rx   z /api/budget/transactions/previewz /api/budget/transactions/confirmz/api/budget/overviewz/api/budget/transactionsz,/api/budget/categories/summary?month=2026-05)	r   r   dependency_overridesr   r   poststatus_coder   rd   )appr   clientaccount_payloadrR   confirmrT   
tx_payload
tx_preview
tx_confirmr   s             @r   6test_budget_api_endpoints_preview_confirm_and_overviewr   {   s   44D
,,C     (3CV$__F*JTYZZOkk8kOOG#%%%%kk8w||~~i?XkYYG#%%%%,J *	_k  }J  _f  }B  C  CJ?jQQJ!S((((?jooFWFWXaFbccJ!S((((::,--9S@@@@::011=DDDD::DEEQUXXXXXXXr    N)r!   r"   )'
__future__r   fastapi.testclientr   jarvis_finance.api.dependenciesr   jarvis_finance.api.mainr   'jarvis_finance.services.budget_accountsr   r   r	   )jarvis_finance.services.budget_categoriesr
   r   r   'jarvis_finance.services.budget_overviewr   r   r   +jarvis_finance.services.budget_transactionsr   r   r   r   r   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   rA   rU   rm   r   r   r'   r    r   <module>r      s   " " " " " " ) ) ) ) ) ) 2 2 2 2 2 2 . . . . . . G  G  G  G  G  G  G  G  G  G w w w w w w w w w w r r r r r r r r r r                  ; : : : : : R R R R R R R R  P P P P*} } } }, , , ,)1 )1 )1 )1XY Y Y Y Y Yr    