
    mj                        d dl mZ d dlZd dlmc 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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S )    )annotationsN)
Connection)
create_app)CashSnapshotConfirmRequest)ensure_canonical_cash_accountsconfirm_cash_snapshot)get_portfolio_advisor_snapshot)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    T/home/agent/.hermes/repos/FinanceManager/tests/unit/test_portfolio_advisor_phase8.py_connectr      s8    ?:???D{DLL+,,,K    r   Nonec                   d}d}t          |            |                     d                                          d         }t          | t	          |ddddd	d
                     |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d|f           |                     d||f           |                                  d S )Nz2026-06-30T10:00:00Zz2099-06-30T10:00:00ZzKSELECT account_id FROM accounts WHERE account_name='PostFinance Cash-Konto'r   manual_balancez
2026-06-3010000.00zadvisor fixturepT)
account_idsnapshot_typebalance_date
amount_chfnote
preview_idconfirmzINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES ('plat_pf', 'PostFinance', 'broker', 'CHF', ?)zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES ('acct_pf', 'plat_pf', 'Depot', 'brokerage', 'CHF', ?)zINSERT INTO instruments(instrument_id, asset_class, name, ticker, isin, currency, created_at) VALUES ('inst_vti', 'etf', 'Vanguard Total Stock Market ETF', 'VTI', 'US9229087690', 'USD', ?)aM  INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, gross_amount_chf, net_amount_chf, currency_original, source_type, is_confirmed, quality_status, created_at) VALUES ('tx_pf', 'initial_snapshot', 'acct_pf', 'inst_vti', '2026-06-30', '30000.00', '30000.00', 'USD', 'fixture', 1, 'ok', ?)zINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES ('plat_tw', 'True Wealth', 'roboadvisor', 'CHF', ?)zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES ('acct_tw', 'plat_tw', 'TrueWealth Gesamtwert', 'managed_portfolio', 'CHF', ?)zINSERT INTO account_value_snapshots(snapshot_id, account_id, valuation_date, total_value_chf, source_type, created_at) VALUES ('snap_tw', 'acct_tw', '2026-06-30', '50000.00', 'fixture', ?)z{INSERT INTO crypto_wallets(wallet_id, wallet_name, wallet_type, created_at) VALUES ('wallet', '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 ('holding', 'wallet', 'btc', '0.1', 'ok', ?)zINSERT INTO crypto_prices(crypto_price_id, asset_id, coingecko_id, price_currency, price, provider, provider_timestamp, fetched_at, quality_status) VALUES ('price', 'btc', 'bitcoin', 'CHF', '100000.00', 'fixture', ?, ?, 'fresh'))r   r   fetchoner   r   commit)r   nowfresh_price_timecash_ids       r   _seed_portfolior(      s   
 C-"4(((llhiirrttuvwG$ :g]m  }I  V`  gx  EH  RV  !W  !W  !W  X  X  XLL  _  be  ag  h  h  hLL  q  tw  sy  z  z  zLL  P  SV  RX  Y  Y  YLL  a  dg  ci  j  j  jLL  d  gj  fl  m  m  mLL  I  LO  KQ  R  R  RLL  P  SV  RX  Y  Y  YLL  O  RU  QW  X  X  XLL  S  VY  U[  \  \  \LL  v  y|  x~      LL  x  {K  M]  z^  _  _  _KKMMMMMr   c                 x   t                      } t          |            t          |            t          |           }|j        }d}||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|j        }d}||k    }|st          j        d|fd	||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d
 |j        D             }|d         }|j        }	d}
|	|
k    }|st          j        d|fd|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d         }|j        }	d}
|	|
k    }|st          j        d|fd|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d         }|j        }	d}
|	|
k    }|st          j        d|fd|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d         }|j        }	d}
|	|
k    }|st          j        d|fd|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
d}|j        }||v }	|	st          j        d|	fd||f          t          j
        |          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 |j        D             }h 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! |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% |j        D             }|d         }|j        }	d&}
|	|
k    }|st          j        d|fd'|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
d(}|d)         }|j        }
||
v }	|	st          j        d|	fd*||
f          t          j
        |          t          j
        |          t          j
        |
          d+z  }dd|iz  }t          t          j        |                    d x}x}	x}}
d, |j        D             }|d-         }|j        }	d.g}
|	|
k    }|st          j        d|fd/|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
d0}|d-         }|j        }
||
v }	|	st          j        d|	fd1||
f          t          j
        |          t          j
        |          t          j
        |
          d+z  }dd|iz  }t          t          j        |                    d x}x}	x}}
d2 |j        D             }t5          |          }|sd"d3t          j                    v st          j	        t4                    rt          j
        t4                    nd3t          j
        |          t          j
        |          d$z  }t          t          j        |                    d x}}d4 |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}}d5 |j        D             }|d6         }|j        }	d7}
|	|
k    }|st          j        d|fd8|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d6         }|j        }	d9}
|	|
u }|st          j        d:|fd;|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d6         }|j        }	d<}
|	|
k    }|st          j        d|fd=|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
d>}|d6         }|j         }
||
v }	|	st          j        d|	fd?||
f          t          j
        |          t          j
        |          t          j
        |
          d+z  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d@         }|j        }	dAdBh}
|	|
v }|st          j        d|fdC|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
|d@         }|j!        }	d}
|	|
k    }|st          j        d|fdD|	|
f          t          j
        |          t          j
        |	          t          j
        |
          dz  }dd|iz  }t          t          j        |                    d x}x}	x}}
d S )ENz#Allokations- und Datenchecks (Beta))==)z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)ssnapshot)py0py2py5zassert %(py7)spy7z	100000.00)z7%(py2)s
{%(py2)s = %(py0)s.total_value_chf
} == %(py5)sc                    i | ]
}|j         |S  )key.0items     r   
<dictcomp>zdtest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<dictcomp>4   s    EEE$txEEEr   
truewealthz50000.00)z9%(py3)s
{%(py3)s = %(py1)s.current_value_chf
} == %(py6)s)py1py3py6zassert %(py8)spy8own_equitiesz30000.00cashr   cryptozUnternehmen/Holdingsin)z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.tabs
})r8   r9   r.   c                    h | ]	}|j         
S r1   )
parent_keyr4   nodes     r   	<setcomp>zctest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<setcomp>:   s    AAADOAAAr   >   r=   r>   equities)>=)z%(py1)s >= %(py4)s)r8   py4zassert %(py6)sr:   c              3  B   K   | ]}|j         d k    o
|j        dk    V  dS )USArF   N)labelrB   rC   s     r   	<genexpr>zctest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<genexpr>;   s5      jjtzU"Dt*'Djjjjjjr   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r,   r-   rH   c                    i | ]
}|j         |S r1   
source_keyr3   s     r   r6   zdtest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<dictcomp><   s    WWWT4?DWWWr   pending_import)z.%(py3)s
{%(py3)s = %(py1)s.status
} == %(py6)szTop Holdingsown_etfs)z2%(py1)s in %(py6)s
{%(py6)s = %(py4)s.dimensions
})r8   rH   r:   c                    i | ]
}|j         |S r1   rO   r3   s     r   r6   zdtest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<dictcomp>?   s    IIItIIIr   truewealth_screensz*.png)z6%(py3)s
{%(py3)s = %(py1)s.expected_files
} == %(py6)sasset_allocation)z1%(py1)s in %(py6)s
{%(py6)s = %(py4)s.mapped_to
}c              3  (   K   | ]}|j         d u V  dS )FN)execution_allowed)r4   steps     r   rL   zctest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<genexpr>B   s*      MM4t%.MMMMMMr   allc              3     K   | ]}d |v V  	dS )zKeine Auto-OrdersNr1   )r4   	guardrails     r   rL   zctest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<genexpr>C   s(      UUI"i/UUUUUUr   c                    i | ]
}|j         |S r1   )symbolr3   s     r   r6   zdtest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_values.<locals>.<dictcomp>D   s    IIITt{DIIIr   VTIWATCH)z.%(py3)s
{%(py3)s = %(py1)s.signal
} == %(py6)sF)is)z9%(py3)s
{%(py3)s = %(py1)s.execution_allowed
} is %(py6)slocal_rules_v1)z.%(py3)s
{%(py3)s = %(py1)s.source
} == %(py6)sdata_quality_incomplete)z4%(py1)s in %(py6)s
{%(py6)s = %(py4)s.risk_factors
}BTCHOLDREDUCE)z.%(py3)s
{%(py3)s = %(py1)s.signal
} in %(py6)s)z8%(py3)s
{%(py3)s = %(py1)s.portfolio_bucket
} == %(py6)s)"r   r
   r(   r	   title
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationtotal_value_chfsource_allocationcurrent_value_chftabsdrilldown_nodesrM   lookthrough_placeholdersstatus
dimensionsimport_sourcesexpected_files	mapped_toworkflowrY   
guardrailsinvestment_signalssignalrW   sourcerisk_factorsportfolio_bucket)r   r+   @py_assert1@py_assert4@py_assert3@py_format6@py_format8sources@py_assert0@py_assert2@py_assert5@py_format7@py_format9@py_format5lookthroughimportssignalss                    r   Ptest_portfolio_advisor_snapshot_lives_in_finance_manager_with_exact_local_valuesr   +   s   ::DTD-d33H>BBB>BBBBBBBBBBB>BBBBBBBBBBBBB8BBBBB8BBBBBB>BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB#2{2#{2222222222#{2222222222228222228222222#2222{222222222222222222222222222EE(*DEEEG< @ 2@j@2j@@@@@@@@@@2j@@@@@ @@@@2@@@@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>"B"4B
B4
BBBBBBBBBB4
BBBBB"BBBB4BBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBB6?:?,:
:,
::::::::::,
:::::?::::,::::
:::::::::::::::::::::::::::::8<.<*<.*<<<<<<<<<<.*<<<<<<<<<.<<<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!2X]2!]2222222222!]22222!22222222222X22222X222222]222222222222222222222222222AA(@AAAcEcEcEccAEcccccccccccAEccccccAccccEccccccccccccccccccccccccccccjjQYQijjjj3jjjjjjjjjjjjjjjj3jjjjj3jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWX5VWWWK|$?$+?/??+/???????????+/??????$????+????/???????????????????????????????[4?4??>???????????>??????>????4??????????????????????????????????II1HIIIG'(D(7DG9D79DDDDDDDDDD79DDDDD(DDDD7DDDD9DDDDDDDDDDDDDDDDDDDDDDDDDDDDD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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HHHMM8;LMMMM3MMMMMMMMMMMMMMMM3MMMMM3MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMUUATUUUU3UUUUUUUUUUUUUUUU3UUUUU3UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIIX-HIIIG5>+> +G+ G++++++++++ G+++++>++++ ++++G+++++++++++++++++++++++++++++5>4>+4u4+u4444444444+u44444>4444+4444u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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44444444444$CC(CC$(CCCCCCCCCCC$(CCCCCC$CCCCCCCC(CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC5>6> 6VX$66 $66666666666 $666666>6666 6666$6666666666666666666666666666665>6>*6h6*h6666666666*h66666>6666*6666h6666666666666666666666666666666r   c                    t                      } |                                 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 )Npathsz/api/portfolio/advisorr?   )z%(py1)s in %(py3)s)r8   r9   zassert %(py5)sr.   )
r   openapirg   rh   rl   ri   rj   rk   rm   rn   )appr   r   r   @py_format4r   s         r   Etest_portfolio_advisor_api_route_is_registered_in_finance_manager_appr   M   s    
,,CKKMM'"E#,#u,,,,,,,,,,#u,,,,,#,,,,,,,,,,,u,,,,,u,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   )r   r   )r   r   r   r   )r   r   )
__future__r   builtinsri   _pytest.assertion.rewrite	assertionrewriterg   r   r   jarvis_finance.api.mainr   $jarvis_finance.api.schemas.positionsr   $jarvis_finance.services.cash_servicer   r   )jarvis_finance.services.portfolio_advisorr	   !jarvis_finance.storage.migrationsr
   r   r(   r   r   r1   r   r   <module>r      s   " " " " " "                     . . . . . . K K K K K K f f f f f f f f T T T T T T > > > > > >      .7 7 7 7D- - - - - -r   