
    ?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	 d dl
mZmZ d dlmZ d dlmZ d d	lm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Decimal)add_equity_initial_snapshot)resolve_fx_rate_to_chf)store_market_price)_position_statuslist_equity_positions)refresh_equity_fx)connect_memory)apply_migrationsc                       e Zd ZdddZdddZy)ProviderNc                <    || _         || _        || _        g | _        y N)namerateerrorcalls)selfr   r   r   s       0tests/unit/test_fx_frankfurter_primary_hotfix.py__init__zProvider.__init__   s    		
8:
    c                    | j                   j                  |||f       | j                  r| j                  | j                  S r   )r   appendr   r   r   base_currencyquote_currency	rate_dates       r   get_ratezProvider.get_rate   s6    

=.)DE::**yyr   )NN)r   strr   zDecimal | Noner   zException | NonereturnNoner   r   r!   r   r!   r   z
str | None)__name__
__module____qualname__r   r     r   r   r   r      s    ;r   r   c                 0    t               } t        |        | S r   )r   r   conns    r   
setup_connr,      s    DTKr   c                h    | j                  d       | j                  d       | j                          y)NzINSERT INTO platforms(platform_id, name, platform_type, country, default_currency, created_at) VALUES ('p1', 'PostFinance', 'broker', 'CH', 'CHF', '2026-01-01')zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES ('a1', 'p1', 'Depot', 'brokerage', 'CHF', '2026-01-01')a1)executecommitr*   s    r   seed_accountr1   "   s4    LL  t  uLL  r  sKKMr   c                    t               } | j                  d       t        dt        d            }t        dt        d            }t	        | dd||gd	      }|j
                  d
k(  sJ |j                  dk(  sJ |j                  t        d      k(  sJ |j                  dgk(  sJ |j                  g k(  sJ | j                  d      j                         }|d   dk(  sJ |d   dk(  sJ y )NzINSERT INTO fx_rates(fx_rate_id, base_currency, quote_currency, rate_date, rate, provider, rate_type, quality_status, created_at) VALUES ('old', 'EUR', 'CHF', '2026-05-19', '0.9000', 'cache_fixture', 'close', 'fresh', '2026-05-19')frankfurterz0.9700
twelvedataz0.9600EUR
2026-05-20Tr   r   	providerspersistok)r5   CHFr6   zSELECT rate, provider FROM fx_rates WHERE base_currency='EUR' AND quote_currency='CHF' ORDER BY rate_date DESC, created_at DESC LIMIT 1providerr   )
r,   r/   r   r   r   statussourcer   r   fetchone)r+   r3   r4   resultlatests        r   Itest_resolve_fx_uses_frankfurter_before_stale_cache_and_before_twelvedatarB   )   s   <DLL  {  |='(*;<K,(9:J#Dbmoyaz  EI  JF==D   ==M)));;'(++++!= >>>>r!!!\\  d  e  n  n  pF*...&>X%%%r   c                    t               } | j                  d       t        dt        d            }t        dt        d            }t	        | dd||gd	
      }|j
                  dk(  sJ |j                  dk(  sJ |j                  t        d      k(  sJ |j                  dgk(  sJ |j                  g k(  sJ |j                  J y )NzINSERT INTO fx_rates(fx_rate_id, base_currency, quote_currency, rate_date, rate, provider, rate_type, quality_status, created_at) VALUES ('cached', 'USD', 'CHF', '2026-05-20', '0.8800', 'frankfurter', 'close', 'fresh', '2026-05-20')r3   frankfurter_provider_error)r   r4   twelvedata_provider_errorUSDr6   Tr7   r:   zcache:frankfurterz0.8800)rF   r;   r6   )r,   r/   r   RuntimeErrorr   r=   r>   r   r   r   warning)r+   r3   r4   r@   s       r   Ltest_resolve_fx_uses_cache_after_frankfurter_failure_before_twelvedata_noiserI   ;   s    <DLL  |  }==Y0Z[K,l;V.WXJ#Dbmoyaz  EI  JF==D   ==////;;'(++++!= >>>>r!!!>>!!!r   c                     t               } t        | dd      }|j                  dk(  sJ |j                  t	        d      k(  sJ |j
                  dk(  sJ y )Nr;   r6   )r   r   
not_needed1)r,   r   r=   r   r   r>   )r+   r@   s     r   /test_chf_resolution_is_not_needed_with_rate_onerM   K   sQ    <D#DVF==L(((;;'#,&&&==L(((r   c                    t               }t        |      }t        ||ddddddddd	d
dd      }t        ||j                  dt        d      ddddd	       |j                           G d d       G d d      | j                  dfd       | j                  dfd       t        ||j                        }t        |      }t        d |D              }|d   dk\  sJ |d    g k(  sJ |j                  d!k(  sJ |j                  d"k(  sJ y )#Nstock
Apple Inc.US0378331005APCXETRAr;   2300
2026-01-01Corez-synthetic Apple CHF cost basis, EUR valuationT
account_idasset_classr   isintickerexchangecurrencyquantity_textcost_basis_original_textsnapshot_datecategorynoteconfirmr6   100r5   fixturezAPC.DEfreshinstrument_id
price_datecloser^   r<   provider_symbolprovider_marketquality_statusc                      e Zd ZdZdddZy)^test_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.Frankfurterr3   Nc                *    ||fdk(  sJ t        d      S )N)r5   r;   z0.95r   r   s       r   r    zgtest_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.Frankfurter.get_ratek       !>2nDDD6?"r   r   r$   r%   r&   r'   r   r    r(   r   r   Frankfurterrp   i       	#r   rt   c                      e Zd ZdZd Zy)]test_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.TwelveDatar4   c                    t        d      )Nz7TwelveData must not be called when Frankfurter succeeds)AssertionError)r   argskwargss      r   r    zftest_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.TwelveData.get_rateq   s     !Z[[r   Nrs   r(   r   r   
TwelveDatarw   o   s    	\r   r|   1jarvis_finance.fx.providers.FrankfurterFxProviderc                              S r   r(   rt   s   r   <lambda>z[test_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.<lambda>t       U`Ub r   z0jarvis_finance.fx.providers.TwelveDataFxProviderc                              S r   r(   )r|   s   r   r   z[test_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.<lambda>u   s    T^T` r   c              3  @   K   | ]  }|j                   d k(  s|  ywrP   Nr   .0rows     r   	<genexpr>z\test_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.<genexpr>y   s     AL(@A   updated   warningsBewertetz190.00)r,   r1   r   r   ri   r   r0   setattrr   r
   nextr=   market_value_chf)	monkeypatchr+   rY   snapr@   rowsapplert   r|   s	          @@r   Itest_apple_eur_valuation_fx_recheck_gets_chf_market_value_via_frankfurterr   S   sD   <Dd#J&!&"<D  t4+=+=,^efk^lw|  HQ  ck  }D  U\  ]KKM# #\ \
 KMbcJL`atT%7%78F &DAAAE)!!!*###<<:%%%!!X---r   c                   t               }t        |      }t        ||ddddddddd	d
dd      }t        ||j                  dt        d      ddddd	       |j                           G d d      | j                  dfd       t        ||j                        }t        d t        |      D              }|d   g k(  sJ |j                  dk(  sJ |j                  dk(  sJ y )NrO   rP   rQ   AAPLNASDAQr;   rT   rU   rV   rW   z-synthetic Apple CHF cost basis, USD valuationTrX   r6   200rF   rf   rg   rh   c                      e Zd ZdZdddZy)^test_apple_usd_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.Frankfurterr3   Nc                *    ||fdk(  sJ t        d      S )N)rF   r;   z0.90r   r   s       r   r    zgtest_apple_usd_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.Frankfurter.get_rate   rr   r   r   r$   rs   r(   r   r   rt   r      ru   r   rt   r}   c                              S r   r(   r   s   r   r   z[test_apple_usd_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.<lambda>   r   r   c              3  @   K   | ]  }|j                   d k(  s|  ywr   r   r   s     r   r   z\test_apple_usd_valuation_fx_recheck_gets_chf_market_value_via_frankfurter.<locals>.<genexpr>   s     Xsxx<?WXr   r   r   z360.00)r,   r1   r   r   ri   r   r0   r   r   r   r
   r=   r   )r   r+   rY   r   r@   r   rt   s         @r   Itest_apple_usd_valuation_fx_recheck_gets_chf_market_value_via_frankfurterr      s   <Dd#J&!&"<D  t4+=+=,^efk^lw|  HQ  ci  {C  T[  \KKM# # KMbctT%7%78FX 5d ;XXE*###<<:%%%!!X---r   c                 `    ddddddd} t        |       dk(  sJ d| d<   t        |       d	k(  sJ y )
Nr:   
missing_fxz100.00rH   )price_status	fx_statusr   quality_warningsdata_quality_statusvaluation_statusu   Einstand unvollständig r   u   FX fehlt für Bewertung)r	   )r   s    r   Ktest_valuation_status_does_not_show_fx_missing_when_market_value_chf_existsr      sP    !$((%C C $==== CC $====r   N)r"   r!   )r"   r#   )
__future__r   decimalr   jarvis_finance.equity.manager   jarvis_finance.fx.ratesr   !jarvis_finance.market_data.pricesr   &jarvis_finance.services.equity_servicer	   r
   &jarvis_finance.services.market_servicer   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r,   r1   rB   rI   rM   r   r   r   r(   r   r   <module>r      sT    "  D : @ Z D : > &$" )+.\#.L>r   