
    mj%                        d dl mZ d dlmZ d dl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Z ddZddZddZd dZd!dZd!dZd!dZd!dZd!dZd!dZd!dZd!dZdS )"    )annotations)IteratorDecimalN)
Connection)
TestClient)get_db)
create_app)apply_migrationsreturnr   c                 ~    t          j        dd          } t           j        | _        |                     d           | S )Nz:memory:F)check_same_threadzPRAGMA foreign_keys = ON)sqlite3connectRowrow_factoryexecuteconns    2tests/unit/test_fastapi_user_dashboard_skeleton.py_connect_threadsafe_memoryr      s8    ?:???D{DLL+,,,K    r   r   c                h     t                      }d fd}||j        t          <   t          |          S )Nr   Iterator[Connection]c               3     K    V  d S )N r   s   r   override_dbz_client.<locals>.override_db   s      




r   )r   r   )r
   dependency_overridesr	   r   )r   appr   s   `  r   _clientr       sE    
,,C      (3CV$c??r   Nonec                    d}|                      d|f           |                      d|f           |                      d|f           |                      d|f           |                      d|f           |                      d|f           |                      d|f           |                      d	|f           |                      d
|f           |                      d||f           |                                  d S )N2099-05-17T12:00:00ZzINSERT INTO platforms(platform_id, name, platform_type, country, default_currency, created_at) VALUES ('p1', 'Demo Bank', 'broker', 'CH', 'CHF', ?)zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES ('a1', 'p1', 'Trading', 'brokerage', 'CHF', ?)zINSERT INTO instruments(instrument_id, asset_class, name, ticker, isin, currency, created_at) VALUES ('i1', 'stock', 'Demo Equity', 'DEMO', 'CH0000000000', 'CHF', ?)a  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, quantity, price_original, gross_amount_original, net_amount_original, currency_original, fx_rate_to_chf, fx_status, gross_amount_chf, net_amount_chf, source_type, is_confirmed, quality_status, created_at)
        VALUES ('t1', 'initial_snapshot', 'a1', 'i1', '2026-05-16', '2', '10', '20', '20', 'CHF', '1', 'ok', '20', '20', 'fixture', 1, 'ok', ?)
        zINSERT INTO market_prices(market_price_id, instrument_id, price_date, close, currency, provider, quality_status, created_at) VALUES ('mp1', 'i1', '2026-05-16', '12.34', 'CHF', 'fixture', 'fresh', ?)zINSERT INTO cash_balances(cash_balance_id, account_id, balance_date, currency, amount_original, fx_rate_to_chf, amount_chf, source_type, quality_status, created_at) VALUES ('c1', 'a1', '2026-05-16', 'CHF', '100.25', '1', '100.25', 'fixture', 'ok', ?)zwINSERT INTO crypto_wallets(wallet_id, wallet_name, wallet_type, created_at) VALUES ('w1', 'Cold Wallet', 'hardware', ?)zINSERT INTO crypto_assets(asset_id, symbol, coin_name, coingecko_id, created_at) VALUES ('btc', 'BTC', 'Bitcoin', 'bitcoin', ?)zINSERT INTO crypto_holdings(crypto_holding_id, wallet_id, asset_id, quantity, verification_status, created_at) VALUES ('h1', 'w1', 'btc', '0.5', 'ok', ?)zINSERT INTO crypto_prices(crypto_price_id, asset_id, coingecko_id, price_currency, price, provider, provider_timestamp, fetched_at, quality_status) VALUES ('cp1', 'btc', 'bitcoin', 'CHF', '80000', 'fixture', ?, ?, 'fresh'))r   commit)r   nows     r   _seed_minimal_read_modelsr&       s   
 CLL  g  jm  io  p  p  pLL  i  lo  kq  r  r  rLL  y  |  {A  B  B  BLL	 
   	LL  Z  ]`  \b  c  c  cLL  N  QT  PV  W  W  WLL  K  NQ  MS  T  T  TLL  S  VY  U[  \  \  \LL  m  ps  ou  v  v  vLL  r  ux  z}  t~      KKMMMMMr   payloaddictc                   t          d          t          d          z  }t          d          t          d          z  }||z   }t          | d                   |k    sJ t          | d                   |k    sJ t          | d                   t          d          k    sJ t          | d	                   t          d          k    sJ t          | d
                   |k    sJ d S )N0.580000210crypto_value_chfpostfinance_equity_value_chftruewealth_value_chf0cash_value_chftotal_value_chfr   )r'   expected_cryptoexpected_equityexpected_totals       r   *_assert_overview_matches_synthetic_fixturer7   5   s    ennww'7'77OcllWT]]2O$6N7-.//?BBBB79:;;NNNN71233ws||CCCC7+,--====7,-...@@@@@@r   c                     t                      } t          |            t          |           }|                    d          }|j        dk    sJ |                                dddddk    sJ |                    d          j        d	k    sJ d S )
Nz/api/health   okzjarvis-finance-apir1   z	read-only)statusr   api_versionmodez/api/crypto/price-updatei  )r   r   r    getstatus_codejsonpost)r   clientresponses      r   .test_fastapi_v0_health_and_read_only_contractsrD   A   s    %''DTT]]Fzz-((H3&&&&==??6J[^hstttttt;;122>#EEEEEEr   c                     t                      } t          |            t          |            t          |           }|                    d                                          }|                    d                                          }|                    d                                          }|                    d                                          }t          |           t          |d         t                    sJ |d         d         dk    sJ t          |d         d	         t                    sJ |d         d
         dk    sJ t          |d         d         t                    sJ |d         dk    sJ |d         g k    sJ d S )N/api/overview/api/crypto/positions/api/equity/positionsz/api/cash/summaryr3   r   quantity_totalr*   market_value_chfnameDemo Equitypricecash_chfz0.00	positions)	r   r   r&   r    r>   r@   r7   
isinstancestr)r   rB   overviewcryptoequitycashs         r   =test_fastapi_v0_overview_and_positions_return_decimal_stringsrV   M   s{   %''DTd###T]]Fzz/**//11HZZ/005577FZZ/005577F::)**//11D.x888h01377777!9%&%////fQi 23S99999!9V----fQi(#.....
v%%%%""""""r   c                    t                      } t          |            t          |           }|                    d                                          }t          |                                          }|sJ d|vsJ d|vsJ d|vsJ d S )Nz/api/provider/statusapi_keytokensecret)r   r   r    r>   r@   rQ   lower)r   rB   r'   rendereds       r   ,test_fastapi_v0_provider_status_is_sanitizedr]   b   s    %''DTT]]Fjj/005577G7||!!##HNN7H$$$$(""""8######r   c                 h   t                      } t          |            t          |            t          |           }|                    d                                          }t          |          h dk    sJ t          |           t          |d         t                    sJ |d         dv sJ d S )NrF   >
   r2   r3   r.   equity_value_chflast_price_updatedata_quality_statusr0   critical_alerts_countunpriced_positions_countr/   r.   ra   >   r:   warningcritical)
r   r   r&   r    r>   r@   setr7   rP   rQ   )r   rB   r'   s      r   :test_vue_slice_overview_contract_uses_flat_decimal_stringsrg   q   s    %''DTd###T]]Fjj))..00Gw<<        /w777g01377777()-JJJJJJJr   c                    t                      } t          |            t          |            t          |           }|                    d                                          }|                    d                                          }|d         dddddd	d
dddddk    sJ |d         dk    sJ |d         d         d         dk    sJ t          |d         d         d         t                    sJ d S )NrG   z/api/crypto/positions/btcr   btcBitcoinBTCr*   r+   40000.00z100.00   Aktuellr#   z*https://www.coingecko.com/en/coins/bitcoin)asset_idrK   symbolrI   	price_chfrJ   portfolio_share_pctwallet_countprice_statusr`   coingecko_urlro   wallet_allocationswalletCold Walletquantityr   r   r&   r    r>   r@   rP   rQ   )r   rB   rO   details       r   2test_vue_slice_crypto_contract_and_detail_endpointr|      s   %''DTd###T]]F

23388::IZZ34499;;FQ<&'!3E      *&&&&&'*84EEEEf1215jA3GGGGGGGr   c                    t                      } t          |            t          |            t          |           }|                    d                                          |                    d                                          }ddddddd	d
dd dd}fd|D             |k    sJ d         d         dk    sJ d         d         dk    sJ d         d         J |d         dk    sJ d S )NrH   z/api/equity/positions/a1:i1za1:i1rL   DEMOCH0000000000TradingAktier1   CHFz12.34u   Einstand unvollständig)position_idrK   tickerisinaccountasset_classry   currencyrM   rJ   r;   c                .    i | ]}|d          |         S )r   r   ).0keyrO   s     r   
<dictcomp>zFtest_vue_slice_equity_contract_and_detail_endpoint.<locals>.<dictcomp>   s$    777sC1c"777r   r   data_statusmissingr?   price_missingrr   r   )r   r   r&   r    r>   r@   )r   rB   r{   expectedrO   s       @r   2test_vue_slice_equity_contract_and_detail_endpointr      s-   %''DTd###T]]F

23388::IZZ566;;==F  + H 8777h7778CCCCQ<&)3333Q<&/9999Q<-.666- G++++++r   c            	        t                      } t          |            t          |            t          |           }|                    d                                          }|ddddddddgk    sJ |                    d	                                          }|d
         d         d         dk    sJ t          |d
         d         d         t                    sJ d S )Nz/api/walletsw1rx   hardwarerm   rl   rn   )	wallet_idrK   wallet_typeprovider
coin_countrJ   r;   z/api/wallets/w1coinsr   rp   rk   ry   rz   )r   rB   walletsr{   s       r   test_vue_slice_wallets_contractr      s    %''DTd###T]]Fjj((--//G!%" *	
 	

 
 
 
 
 ZZ)**//11F'?1h'50000fWoa(4c:::::::r   c                   | dz  }|dz  }|                     d           |dz                      dd           |                    d	t          |                     |                    d
d           |                    |            t                      }t          |           t          |          }|                    d          	                                }t          |          
                                }|d         d         dk    sJ |d         d                             d          sJ d|vsJ d|vsJ d|vsJ d S )NruntimereportsT)parentszportfolio_report.htmlz<html>ok</html>zutf-8)encodingJARVIS_FINANCE_RUNTIME_DIR(JARVIS_FINANCE_BLOCK_RUNTIME_INSIDE_REPOr1   z/api/reportsr   formathtmlpath_displayrX   rY   rZ   )mkdir
write_textsetenvrQ   chdirr   r   r    r>   r@   r[   endswith)tmp_pathmonkeypatchr   r   r   rB   r'   r\   s           r   .test_vue_slice_reports_contract_and_no_secretsr      sa   "G	!GMM$M&&223Dw2WWW3S\\BBBA3GGGh%''DTT]]Fjj((--//G7||!!##H1:h6))))1:n%../FGGGGGH$$$$(""""8######r   )r   r   )r   r   r   r   )r   r   r   r!   )r'   r(   r   r!   )r   r!   )
__future__r   collections.abcr   decimalr   r   r   fastapi.testclientr   jarvis_finance.api.dependenciesr	   jarvis_finance.api.mainr
   !jarvis_finance.storage.migrationsr   r   r    r&   r7   rD   rV   r]   rg   r|   r   r   r   r   r   r   <module>r      s   " " " " " " $ $ $ $ $ $              ) ) ) ) ) ) 2 2 2 2 2 2 . . . . . . > > > > > >         *	A 	A 	A 	A	F 	F 	F 	F# # # #*$ $ $ $K K K K2H H H H6, , , ,:; ; ; ;0$ $ $ $ $ $r   