
    LrdjF                        d dl mZ d dlZd dlmc 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 d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dl m!Z!m"Z" ddZ#d Z$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*dS )    )annotationsN)Decimal)data)page_00_command_centerpage_03_equities_etfspage_17_position_add) add_manual_position_from_catalogcreate_manual_catalog_entryensure_standard_broker_accounts)upsert_fx_rate)calculate_cash_balances)MockEquityPriceProviderstore_market_price)connect_memory)apply_migrations)FakeStreamlitsetup_multi_wallet_crypto_connstr   returnstrc                    g }| j         D ]V\  }}}|                    d |D                        |                    d |                                D                        Wd                    |          S )Nc              3  4   K   | ]}t          |          V  d S Nr   ).0args     ~/home/agent/.hermes/worktrees/FinanceManager-sprint7-postfinance-portfolio-source/tests/unit/test_dashboard_mvp_regressions.py	<genexpr>z _visible_text.<locals>.<genexpr>   s(      ..#SXX......    c              3  4   K   | ]}t          |          V  d S r   r   )r   values     r   r   z _visible_text.<locals>.<genexpr>   s(      ==ESZZ======r   
)callsextendvaluesjoin)r   parts_nameargskwargss        r   _visible_textr+      s~    E!x > >tV........==V]]__=======99Ur   c                     t                      } t          |            t          |            |                     d                                          d         }t          | ddddddd	dd

  
        }| ||fS )Nz;SELECT account_id FROM accounts ORDER BY account_id LIMIT 1
account_idstockzSynthetic Valued AGUSDUS0000000001SYNVNASDAQfmpz*synthetic catalog entry for MVP regression)	asset_classnamecurrencyisintickerexchangeproviderprovider_symbolnote)r   r   r   executefetchoner
   )connr-   
catalog_ids      r   setup_equity_connrA      s    DT#D)))[\\eegghtuJ,"9  J Z''r   Nonec                 H   t                      \  } }}t          | dddt          d          dd           |                                  t	          | ||dd	ddd
ddd          }|                     d|j        f                                          }|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         }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}||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}||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/   CHF
2026-01-15z0.91mockclosebase_currencyquote_currency	rate_daterater:   	rate_typeinitial_snapshot2100okz!synthetic position with cached FXT)
catalog_entry_idr-   position_typequantity_text
trade_dater6   cost_basis_original_text	fx_statusr<   confirmzfSELECT fx_rate_to_chf, fx_source, fx_status, gross_amount_chf FROM transactions WHERE transaction_id=?fx_rate_to_chf==z%(py1)s == %(py4)spy1py4assert %(py6)spy6	fx_sourcez
cache:mockrW   gross_amount_chfz91.0000)rA   r   r   commitr	   r=   transaction_idr>   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation)
r?   r-   r@   resulttx@py_assert0@py_assert3@py_assert2@py_format5@py_format7s
             r   Btest_manual_position_uses_cached_historical_fx_without_manual_raterr   ,   s~   #4#6#6 D*j4uUlahioapap  |B  NU  V  V  V  VKKMMM-#(!&0  F 
~  BH  BW  AY  
Z  
Z  
c  
c  
e  
eB)6)6))))))))))6)))))))))6)))))))))))))))))))))))))))k?*l*?l**********?l*****?****l***************************k?"d"?d""""""""""?d"""""?""""d""""""""""""""""""""""""""" !.Y.!Y..........!Y.....!....Y.............................r   c            	        t                      \  } }}|                     d|f                                          }||d         |d         |d         |d         dddd	}t          d
|gg ddddd          }|gg d|j        d<   d|j        d<   t          j        ||            t          |          }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 ]}||v}|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}||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 S )!NzASELECT * FROM instrument_catalog_entries WHERE catalog_entry_id=?r5   r7   r8   r9   r/   localu
   Bestätigt)rR   r5   r7   r8   r9   r6   data_sourcetrust_statusAktie)resultswarningsr   z$Automatisch aus Cache/Provider holen)position_add_asset_choiceposition_add_search_resultsposition_add_selected_indexposition_add_pos_currencyposition_add_fx_handling)inputsr{   r|   z	FX-Statusnot inz%(py1)s not in %(py3)stextr^   py3assert %(py5)spy5)
not_neededmanual_override_requiredmanual_override)z%(py0)s not in %(py2)sinternal)py0py2zassert %(py4)sr_   inz%(py1)s in %(py3)s)rA   r=   r>   r   session_stater   renderr+   rf   rg   rh   @py_builtinslocals_should_repr_global_nameri   rj   )r?   _account_idr@   search_resultselectedr   r   rm   ro   @py_format4@py_format6r   @py_assert1@py_format3rp   s                  r   Ptest_position_add_user_mode_hides_internal_fx_status_values_for_foreign_currencyr   F   sv   $5$7$7!D+zLL!dgqfstt}}M&f%f%)!*-$	 	H 
)08@zr+R+R+,).(N
 

 
 
B DL*Z\6]6]B2367B23D)))D";d"""""""""";d""""";"""""""""""d"""""d"""""""""""""""""""""""""""Q $ $t##########xt############x#####x#############t#####t##########################191T99999999991T99999199999999999T99999T99999999999999999999999999999r   c                    t                      } t          |            t          |            t          dhdddddddd	
          }t	          j        ||            t          |          }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}}t          |           }d |j                                        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Cash speichernCashu(   Anderes Konto · Manual Portfolio · CHFrD   123.45z
2026-01-31zsynthetic cash balanceT)rz   position_add_cash_accountposition_add_cash_currencyposition_add_cash_amountposition_add_cash_dateposition_add_cash_noteposition_add_cash_confirm)button_pressesr   zCash erfassenr   r   r   r   r   r   zCash gespeichertc              3  \   K   | ]'}|j         t          d           k    o
|j        dk    V  (dS )r   rD   N)amount_originalr   r6   )r   balances     r   r   zXtest_cash_asset_choice_renders_cash_entry_and_writes_audited_snapshot.<locals>.<genexpr>   sY        E  E^ew&'(*;*;;Y@PTY@Y  E  E  E  E  E  Er   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r   r   r_   )r   r   r   r   r   r   r+   rf   rg   rh   r   r   r   ri   rj   r   balancesr%   r   )r?   r   r   rm   ro   r   r   r   r   rn   rp   s              r   Etest_cash_asset_choice_renders_cash_entry_and_writes_audited_snapshotr   h   s   DT#D)))	())/)S*/(0&2&>)-
 

 
 
B D)))D"?d""""""""""?d"""""?"""""""""""d"""""d"""""""""""""""""""""""""""%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&t,,H E  Eiqiz  jB  jB  jD  jD  E  E  E  E3  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E3  E  E  E  E  E3  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  E  E  E  E  Er   c                $   t                      \  }}}t          |dddt          d          dd           t          |||dd	ddd
dd
  
         |                     t
          dd            t          dh          }t          j        ||           t          |          }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}
||
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/   rD   rE   0.90rF   rG   rH   rN   rO   rP   zsynthetic unvalued positionT	rR   r-   rS   rT   rU   r6   rV   r<   rX   equity_price_provider_by_namec                (    t          ddid          S )Nr1   50r/   r6   r   r(   s    r   <lambda>zKtest_equity_page_refreshes_valuation_from_mapped_provider.<locals>.<lambda>   s4    ^uw}  @D  wE  PU  _V  _V  _V r   zBewertung aktualisierenr   r   r   r   r   r   r   zBewertung aktualisiertz8SELECT COUNT(*) AS c FROM market_prices WHERE close='50'c   rZ   r\   r]   r`   ra   )rA   r   r   r	   setattrr   r   r   r+   rf   rg   rh   r   r   r   ri   rj   r=   r>   )monkeypatchr?   r-   r@   r   r   rm   ro   r   r   rn   rp   rq   s                r   9test_equity_page_refreshes_valuation_from_mapped_providerr      sB   #4#6#6 D*j4uUlahioapap  |B  NU  V  V  V  V$#(!&*    -/N  QV  QV  W  W  W	'@&A	B	B	BB T***D$,$,,,,,,,,,,$,,,,,$,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#+#t++++++++++#t+++++#+++++++++++t+++++t+++++++++++++++++++++++++++<<RSS\\^^_bchghhcghhhhhhhhhhhcghhhhhhchhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhr   c                   t                      \  }}}t          |dddt          d          dd           t          |||dd	ddd
dd
  
         |                     t
          dd            |                     t
          dd            t          dh          }t          j        ||           d}t          |          }||v }|st          j
        d|fd||f          t          j        |          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        |          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}}
d S )$Nr/   rD   rE   r   rF   rG   rH   rN   1rP   zsynthetic cc positionTr   CoinGeckoClientc                 <     t          dddddi                      S )NProvider get_crypto_pricesrD   c                    i S r   r   )selfidsr6   s      r   r   z_test_command_center_price_refresh_updates_crypto_and_equity.<locals>.<lambda>.<locals>.<lambda>   s      ce r   )rD   )type)_kwargss    r   r   zMtest_command_center_price_refresh_updates_crypto_and_equity.<locals>.<lambda>   sO      VgUYZdfhk~  Ae  Ae  Ae  kf  Vg  Vg  Vi  Vi r   r   c                (    t          ddid          S )Nr1   42r/   r   r   r   s    r   r   zMtest_command_center_price_refresh_updates_crypto_and_equity.<locals>.<lambda>   s4    _vx~  AE  xF  QV  `W  `W  `W r   zPreise aktualisierenr   z
Aktien/ETFr   )z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r+   r   )r^   r   r_   ra   zassert %(py8)spy8z8SELECT COUNT(*) AS c FROM market_prices WHERE close='42'r   r   rZ   r\   r]   r`   ra   )rA   r   r   r	   r   r   r   r   r+   rf   rg   rh   r   r   r   ri   rj   r=   r>   )r   r?   r-   r@   r   rm   @py_assert5ro   rq   @py_format9rn   rp   s               r   ;test_command_center_price_refresh_updates_crypto_and_equityr      s   #4#6#6 D*j4uUlahioapap  |B  NU  V  V  V  V$#(!&$    .0A  Di  Di  j  j  j.0O  RW  RW  X  X  X	'=&>	?	?	?B!"d+++,=,,,<,,,,,,,,,,,<,,,,,,<,,,,,,,,,,,=,,,,,=,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<<RSS\\^^_bchghhcghhhhhhhhhhhcghhhhhhchhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhr   c                 N   t                      } t          d t          j        |           D                       }t          j        | |d         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         }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}||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 S )Nc              3  2   K   | ]}|d          dk    |V  dS )symbolETHNr   )r   rows     r   r   zXtest_crypto_detail_exposes_cache_source_and_timestamp_without_raw_ids.<locals>.<genexpr>   s2      eescRZm_dNdNdsNdNdNdNdeer   	_asset_idiɚ;)price_max_age_secondspreisquellezsynthetic-cacherZ   r\   r]   r`   ra   cache_statuszlokaler Cacheasset_idr   r   detailr   r   r   coingecko_id)r   nextdashboard_dataget_crypto_coin_summaryget_crypto_coin_detailrf   rg   rh   ri   rj   r   r   r   )
r?   ethr   rm   rn   ro   rp   rq   r   r   s
             r   Etest_crypto_detail_exposes_cache_source_and_timestamp_without_raw_idsr      s1   )++D
eenDTJJeee
e
eC24[9IajkkkF- 5$55 $55555555555 $555555 5555$5555555555555555555555555555.!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4444444444444444444444#:V##########:V#####:###########V#####V###########################'>''''''''''>'''''>'''''''''''''''''''''''''''''''''''''''''''''r   )r   r   r   r   )r   rB   )+
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriterf   decimalr   jarvis_finance.dashboardr   r   jarvis_finance.dashboard.viewsr   r   r   jarvis_finance.equity.manager	   r
   r   jarvis_finance.fx.ratesr   jarvis_finance.ledger.cashr   !jarvis_finance.market_data.pricesr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   test_dashboard_ux_sprint2r   r   r+   rA   rr   r   r   r   r   r   r   r   r   <module>r      s   " " " " " "                     ; ; ; ; ; ; n n n n n n n n n n H  H  H  H  H  H  H  H  H  H 2 2 2 2 2 2 > > > > > > Y Y Y Y Y Y Y Y : : : : : : > > > > > > S S S S S S S S   ( ( ((/ / / /4: : : :DE E E E4i i i i4i i i i2	( 	( 	( 	( 	( 	(r   