
    @&j%                        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mZmZmZmZ d dlmZ d dlmZ  G d d	      Z G d
 d      Z G d d      Zd ZddZddZddZddZddZddZddZy)    )annotations)Path)data)page_13_equity_manage)ProviderCandidateexport_mapping_decision_packgenerate_mapping_candidatesrank_candidaterecalculate_candidate_rankingsreject_mapping_candidateselect_mapping_candidate)connect_memory)apply_migrationsc                      e Zd ZdZddZd Zy)StaticLookupProviderstaticNc                    |xs i | _         y N)candidates_by_isin)selfr   s     5tests/unit/test_true_wealth_mapping_candidates_c3d.py__init__zStaticLookupProvider.__init__   s    "4":    c               L    t        | j                  j                  |g             S r   )listr   get)r   isinnametickerexchangecurrencys         r   lookupzStaticLookupProvider.lookup   s     D++//b9::r   r   )__name__
__module____qualname__r   r   r"    r   r   r   r      s    D;;r   r   c                      e Zd Zd Zd Zy)FakeTabc                    | S r   r&   )r   s    r   	__enter__zFakeTab.__enter__   s    r   c                     yNFr&   )r   argss     r   __exit__zFakeTab.__exit__"   s    r   N)r#   r$   r%   r*   r.   r&   r   r   r(   r(      s    r   r(   c                  ~    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)FakeStc                     y r   r&   r   r-   kwargss      r   titlezFakeSt.title'       r   c                     y r   r&   r2   s      r   captionzFakeSt.caption(   r5   r   c                     y r   r&   r2   s      r   warningzFakeSt.warning)   r5   r   c                     y r   r&   r2   s      r   	subheaderzFakeSt.subheader*   r5   r   c                     y r   r&   r2   s      r   writezFakeSt.write+   r5   r   c                     y r   r&   r2   s      r   successzFakeSt.success,   r5   r   c                     y r   r&   r2   s      r   errorzFakeSt.error-   r5   r   c                     y r   r&   r2   s      r   infozFakeSt.info.   r5   r   c                     y r   r&   r2   s      r   dividerzFakeSt.divider/   r5   r   c                     y r   r&   r2   s      r   	dataframezFakeSt.dataframe0   r5   r   c                     y r   r&   r2   s      r   tablezFakeSt.table1   r5   r   c                <    |D cg c]  }t                c}S c c}w r   r(   )r   labels_s      r   tabszFakeSt.tabs2   s    v#>!GI#>>#>s   c                    |r|d   S d S )Nr   r&   )r   labeloptionsr3   s       r   	selectboxzFakeSt.selectbox3   s    '!*3YUY3Yr   c                &    |j                  dd      S )Nvalue )r   r2   s      r   
text_inputzFakeSt.text_input4   s    &**Wb2I+Ir   c                     y)NrU   r&   r2   s      r   	text_areazFakeSt.text_area5   s    r   c                     y)Nz
2025-12-31r&   r2   s      r   
date_inputzFakeSt.date_input6   s    ,r   c                     yr,   r&   r2   s      r   checkboxzFakeSt.checkbox7   s    r   c                    t               S r   rK   r2   s      r   expanderzFakeSt.expander8   s	    	)9r   c                     yr,   r&   r2   s      r   buttonzFakeSt.button9   s    er   N)r#   r$   r%   r4   r7   r9   r;   r=   r?   rA   rC   rE   rG   rI   rN   rR   rV   rX   rZ   r\   r^   r`   r&   r   r   r0   r0   &   s;    *,,.*,*),.*>YI3>593r   r0   c                     t               } t        |        | j                  d       | j                  d       | j                  d       | j                  d       | S )NzINSERT INTO platforms(platform_id,name,platform_type,default_currency,created_at) VALUES('p1','True Wealth','broker','CHF','now')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,created_at) VALUES('a1','p1','TW','brokerage','CHF','now')zINSERT INTO instruments(instrument_id,asset_class,name,ticker,isin,exchange,currency,created_at) VALUES('inst1','ETF','Global Equity ETF','GETF','CH0000000001',NULL,'USD','now')aA  INSERT INTO transactions(transaction_id,transaction_type,account_id,instrument_id,trade_date,quantity,currency_original,fx_status,source_type,is_confirmed,quality_status,created_at) VALUES('tx1','initial_position_snapshot','a1','inst1','2025-12-31','1','USD','missing','broker_import_reviewed_snapshot',1,'warning','now'))r   r   execute)conns    r   
setup_connrd   <   sc    DTLL  U  VLL  ]  ^LL  E  FLL  U  VKr   c                 4   dddddddd} t        dd	ddddd
dd	      }t        dddddddd      }t        | |d      }t        | |d      }|j                  |j                  kD  sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ y )NCH0000000001ETFGlobal Equity ETFGETFSWXCHF)r   asset_classr   r   r    r!   trading_currencyopenfigiGETF.SWetfactiveopenfigi_isin_mapping	providerprovider_symbolr    r!   r   r   rl   instrument_statusevidence_sourceyahooNYSEUSDstockyahoo_finance_search)rt   ru   r    r!   r   r   rl   rw      )candidate_countz
ISIN passtu   Währung passtcurrency_mismatch)r   r
   ranking_scoreranking_reason
risk_flags)instgoodbad	good_rankbad_ranks        r   9test_candidate_ranking_prioritizes_isin_currency_exchanger   F   s    "5BUaguz  IN  di  jDj)V[fk  sF  M[  in  BJ  \s  tD
Wfv`el  GU  cj  |R  SCtT1=IdC;H""X%;%;;;;933333y77777("5"5555r   c                    t               } | j                  d       t        dt        dddddddd	d
	      t        dddddddd	d
	      gi      }t	        | |       t        |       }t        j                  |       }|d   dk(  sJ |D ch c]  }|d   	 c}dhk(  sJ t        |d   d         t        |d   d         k\  sJ |d   d   sJ |d   d   dk(  sJ y c c}w )NzYUPDATE instruments SET currency='CHF', trading_currency='CHF' WHERE instrument_id='inst1'rf   rn   zGETF.USry   rz   rh   rp   rq   rr   rs   ro   rj   rk   rt   multiple_listings_same_isin   review_statusneeds_manual_reviewr   r   r   candidate_provider_symbol)	rd   rb   r   r   r	   r   r   !get_instrument_mapping_candidatesint)rc   rt   summaryrowsrs        r   Btest_same_isin_multiple_listings_remain_review_required_and_sortedr   R   sN   <DLLlm#^:ySYdi  qD  KY  gl  @H  Zq  	r:ySXch  pC  JX  fk  G  Yp  	q6 % H  x8,T2G11$7D01Q666(,-1Ao-2G1HHHHtAw'(CQ0H,IIII7#$$$7./9<<< .s   
Cc                T   t               }t        dt        ddddddddd	
	      gi      }t        ||       t	        |       | dz  dz  }t        ||d      }|j                  d      |d   dk(  sJ |d   dk(  sJ |d   du sJ dv sJ g d}t        fd|D              rJ y )Nrf   rn   ro   rj   rk   rh   rp   rq   rr   rs   r   runtime_exportszdecision_pack.md   )output_pathtop_nutf-8encodinginstrument_countr   candidate_rowstop_candidates_presentTzRanking Reason)quantityamountmarket_value
kontostandportfolioanteilzprice:c              3  ^   K   | ]$  }|j                         j                         v  & y wr   )lower).0tokentexts     r   	<genexpr>zLtest_decision_pack_runtime_only_contains_no_amount_fields.<locals>.<genexpr>r   s"     HU5;;=DJJL0Hs   *-)rd   r   r   r	   r   r   	read_textany)tmp_pathrc   rt   outr   	forbiddenr   s         @r   9test_decision_pack_runtime_only_contains_no_amount_fieldsr   c   s    <D#^:ySXch  pC  JX  fk  G  Yp  	q6 % H  x8"4(
&
&);
;C*4SJG=='=*D%&!+++#$)))+,444t###aIHiHHHHHr   c                 N   t               } dD ]  }| j                  d|dddd||ddf	        t        d	t        d
ddddd	ddd	      gi      }t	        | |       | j                  d      j                         d   }t        | |d       | j                  d      j                         d   dk(  sJ | j                  d      j                         d   dk(  sJ | j                  d      j                         d   dk(  sJ | j                  d      j                         d   dk(  sJ y )N)missing_provider_symbolambiguous_provider_mappingcandidate_review_requiredzINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES(?,?,?,?,?,?,?,?,?)warnungmarket_data
instrumentinst1rq   nowrf   rn   ro   rj   rk   rh   rp   rr   rs   r   <SELECT candidate_id FROM instrument_price_mapping_candidatescandidate_idzmanual dashboard confirmationr   notezKSELECT COUNT(*) AS c FROM audit_log WHERE action='select_mapping_candidate'cr   zSELECT COUNT(*) AS c FROM alerts WHERE status='active' AND rule_id IN ('missing_provider_symbol','ambiguous_provider_mapping','candidate_review_required')r   zmSELECT provider_symbol, exchange, trading_currency FROM instrument_price_mappings WHERE instrument_id='inst1'ru   zTSELECT COUNT(*) AS c FROM instrument_catalog_entries WHERE provider_symbol='GETF.SW')rd   rb   r   r   r	   fetchoner   )rc   rulert   r   s       r   Ftest_candidate_confirmation_resolves_mapping_alerts_and_writes_catalogr   u   s   <Df o  X  [_  aj  ly  {G  IP  RV  X\  ^f  hm  Zn  	oo#^6GQ[mv  BG  RW  ^q  xF  TY  mu  G^  7_  6`  %a  bHx8<< ^_hhjkyzLTCbc<<efooqruvz{{{{<<  u  v      A  BE  F  JK  K  K  K<<  H  I  R  R  T  Uf  g  kt  t  t  t<<noxxz{~  DE  E  E  Er   c            
     j   t               } t        dt        ddddd      gi      }t        | |       | j	                  d      j                         d	   }t        | |d
       | j	                  d      j                         d   dk(  sJ | j	                  d|f      j                         d   dk(  sJ y )Nrf   rn   ro   rj   rk   rt   ru   r    r!   r   r   r   r   zwrong listingr   zKSELECT COUNT(*) AS c FROM audit_log WHERE action='reject_mapping_candidate'r   r   zRSELECT review_status FROM instrument_price_mapping_candidates WHERE candidate_id=?r   rejected)rd   r   r   r	   rb   r   r   )rc   rt   r   s      r   %test_candidate_rejection_writes_auditr      s    <D#^6GQ[mv  BG  RW  ^l  7m  6n  %o  pHx8<< ^_hhjkyzLT?S<<efooqruvz{{{{<<lo{n}~  H  H  J  KZ  [  _i  i  i  ir   c            
         t               } t        dt        ddddd      gi      }t        | |       t	        |        t        j                  t               |        y )Nrf   rn   ro   rj   rk   r   r   )rd   r   r   r	   r   r   renderr0   )rc   rt   s     r   Ctest_dashboard_review_ui_renders_ranked_candidates_without_live_apir      sj    <D#^6GQ[mv  BG  RW  ^l  7m  6n  %o  pHx8"4(  40r   c                     t        d      } | j                         sJ | j                  d      }d|v sJ d|v sJ t        d      j                         rJ y )Nz3docs/personal-finance-cashflow-budgeting-backlog.mdr   r   zBacklog onlyzDo not implementz#src/jarvis_finance/personal_finance)r   existsr   )docr   s     r   Dtest_personal_finance_backlog_document_exists_without_implementationr      sb    
D
EC::<<=='=*DT!!!%%%9:AACCCCr   N)returnNone)
__future__r   pathlibr   jarvis_finance.dashboardr   jarvis_finance.dashboard.pagesr   %jarvis_finance.market_data.candidatesr   r   r	   r
   r   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r(   r0   rd   r   r   r   r   r   r   r   r&   r   r   <module>r      sr    "  ) @   ; >; ; 4 4,	6="I$Ei1Dr   