
    pj@,                        d dl mZ d dlZd dlmc mZ d dlm	Z	 d dl
Z
d dlmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZ d d
lmZmZmZ d dlm Z  d dl!m"Z" d Z#dd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 )    )annotationsN)Decimal)set_manual_fx_override)HistoricalFxUnavailableMockFxProvider)update_fx_ratesupsert_fx_rate)calculate_positions)"ensure_instrument_metadata_qualityupdate_instrument_metadata) confirm_instrument_price_mapping'ensure_instrument_price_mapping_quality)MockEquityPriceProviderrefresh_market_pricesstore_market_price)connect_memory)apply_migrationsc                     t                      } t          |            |                     d           |                     d           |                     d           | S )Nz|INSERT INTO platforms(platform_id,name,platform_type,default_currency,created_at) VALUES('p1','Broker','broker','CHF','now')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,created_at) VALUES('a1','p1','Account','brokerage','CHF','now')zINSERT INTO instruments(instrument_id,asset_class,name,ticker,isin,exchange,currency,created_at) VALUES('usd1','ETF','USD ETF','USETF','US0000000001','NYSE','USD','now'))r   r   execute)conns    e/home/agent/.hermes/worktrees/FinanceManager-sprint20d/tests/unit/test_true_wealth_valuation_pilot.py
setup_connr      s}    DTLL  P  Q  Q  QLL  b  c  c  cLL  }  ~  ~  ~K    missing	fx_statusfx_ratec               6    |                      d||f           d S )Na_  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, quantity, currency_original, fx_status, fx_rate_to_chf, source_type, is_confirmed, quality_status, created_at)
        VALUES('tx-usd','initial_position_snapshot','a1','usd1','2025-12-31','2','USD',?,?, 'true_wealth',1,'warning','now')
        )r   )r   r   r   s      r   add_snapshotr      s1    LL	 
G    r   returnNonec                    t                      } t          | d          }|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
                                          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}}t          | ddddddd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         }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 )Nusd1instrument_idmissing_provider_symbol==)z6%(py2)s
{%(py2)s = %(py0)s.mapping_status
} == %(py5)sresultpy0py2py5assert %(py7)spy7z\SELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_provider_symbol' AND status='active'c   z%(py1)s == %(py4)spy1py4assert %(py6)spy6mockUSETF.NNYSEmanualzconfirmed in pilotunhedgedactiver%   providerprovider_symbolprovider_market
confidencenotehedge_statusinstrument_statuszSSELECT COUNT(*) AS c FROM audit_log WHERE action='confirm_instrument_price_mapping'r   )r   r   mapping_status
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   fetchoner   )r   r)   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7s              r   Btest_provider_symbol_missing_alert_and_confirm_resolves_with_auditrY   %   s   <<D4TPPPF =$== $=========== $=============6=====6====== ====$============================<<vww  A  A  C  C  DG  H  M  LM  M  H  LM  M  M  M  M  M  M  M  M  M  M  H  LM  M  M  M  M  M  H  M  M  M  M  L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$T&bk  ~D  QY  `t  CM  ai  j  j  j  j<<mnnwwyyz}~  D  CD  D~  CD  D  D  D  D  D  D  D  D  D  D~  CD  D  D  D  D  D~  D  D  D  D  C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<<vww  A  A  C  C  DG  H  M  LM  M  H  LM  M  M  M  M  M  M  M  M  M  M  H  LM  M  M  M  M  M  H  M  M  M  M  L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r   c                    t                      } t          | 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}}t          | ddd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                                          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         }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#   r$   zYSELECT COUNT(*) AS c FROM alerts WHERE rule_id='hedge_status_unknown' AND status='active'r0   r1   r'   r2   r3   r6   r7   hedgedCHFzmanual hedge confirmation)r%   rD   hedged_to_currencyrC   zeSELECT hedge_status,is_currency_hedged,hedged_to_currency FROM instruments WHERE instrument_id='usd1'rD   is_currency_hedgedzMSELECT COUNT(*) AS c FROM audit_log WHERE action='update_instrument_metadata'r   )
r   r   r   rO   rG   rH   rL   rM   rN   r   )r   rU   rR   rV   rW   rX   insts          r   1test_hedge_status_unknown_warns_and_change_auditsr`   1   s   <<D&t6BBBB<<stt}}  AD  E  J  IJ  J  E  IJ  J  J  J  J  J  J  J  J  J  J  E  IJ  J  J  J  J  J  E  J  J  J  J  I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t6ej  rM  N  N  N  N<<  A  A  J  J  L  LD+8+8++++++++++8+++++++++8+++++++++++++++++++++++++++$%**%**********%*****%*******************************<<ghhqqsstwx}|}}x|}}}}}}}}}}}x|}}}}}}x}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}<<stt}}  AD  E  J  IJ  J  E  IJ  J  J  J  J  J  J  J  J  J  J  E  IJ  J  J  J  J  J  E  J  J  J  J  I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r   c            
        t                      } t          | dd           t          | ddddd	           t          | dd
t	          d          dddd           t          | ddd
t	          d          dd           t          |           j        d         }|j        }d }||u}|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        }||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}}|j        }d }||u }|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 S )!Nok0.9r   r#   r[   r\   r=   zhedged review)r%   rD   r]   rE   rC   
2026-01-0210USDr8   r9   2026-01-02T20:00:00+00:00r%   
price_dateclosecurrencyr?   r@   price_timestampz0.91rj   base_currencyquote_currency	rate_daterater?   	rate_typea1r#   )is not)z<%(py2)s
{%(py2)s = %(py0)s.market_value_chf
} is not %(py5)sposr*   r.   r/   currency_hedged_fx_attributioninz8%(py1)s in %(py5)s
{%(py5)s = %(py3)s.quality_warnings
}r4   py3r-   isz8%(py2)s
{%(py2)s = %(py0)s.total_return_chf
} is %(py5)s)r   r   r   r   r   r	   r
   	positionsmarket_value_chfrG   rH   rI   rJ   rK   rL   rM   rN   quality_warningstotal_return_chf)	r   rv   rP   rQ   rR   rS   rT   rU   rV   s	            r   ?test_chf_hedged_instrument_marks_fx_attribution_not_free_fx_pnlr   ?   s   <<Du5555t6ej  G  N]  ^  ^  ^  ^t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahioapap  |B  NU  V  V  V  V
d
#
#
-n
=C+t+t++++++++++t++++++++++++3+++++3++++++++++t++++++++++++++++++++++++++++Cs/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CsCCCCCs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'4'4''''''''''4''''''''''''3'''''3''''''''''4'''''''''''''''''''''''''''''r   c                    t                      } t          |            t          i dh          }t          | |dgd          }|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                                          }|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         }	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         }	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 )N)rf   r\   
2025-12-31)unavailablerf   r   )r?   
currenciesrp   r1   r'   )z5%(py2)s
{%(py2)s = %(py0)s.warning_count
} == %(py5)sr)   r*   r.   r/   zcSELECT quality_status,error_status FROM fx_rates WHERE base_currency='USD' AND quote_currency='CHF'quality_statusmanual_override_requiredr2   r3   r6   r7   z^SELECT COUNT(*) AS c FROM alerts WHERE rule_id='historical_fx_unavailable' AND status='active'r0   z]SELECT COUNT(*) AS c FROM alerts WHERE rule_id='manual_override_required' AND status='active')r   r   r   r   warning_countrG   rH   rI   rJ   rK   rL   rM   rN   r   rO   )r   r?   r)   rP   rQ   rR   rS   rT   rowrU   rV   rW   rX   s                r   Jtest_historical_fx_unavailable_sets_manual_override_required_without_crashr   M   s   <<Db/K.LMMMHTH%T`aaaF$1$1$$$$$$$$$$1$$$$$$$$$$$$6$$$$$6$$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$
,,|
}
}  G  G  I  IC >$>> $>>>>>>>>>>> $>>>>>> >>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>><<xyy  C  C  E  E  FI  J  O  NO  O  J  NO  O  O  O  O  O  O  O  O  O  O  J  NO  O  O  O  O  O  J  O  O  O  O  NO  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O<<wxx  B  B  D  D  EH  I  N  MN  N  I  MN  N  N  N  N  N  N  N  N  N  N  I  MN  N  N  N  N  N  I  N  N  N  N  MN  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  Nr   c            
        t                      } t          |            |                     d           t          j        t
                    5  t          | dddt          d          d           d d d            n# 1 swxY w Y   t          | dddt          d          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         }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 )NzINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES('m1','kritisch','fx','instrument','usd1','manual_override_required','manual','active','now')rf   r\   r   rc    )rn   ro   rp   rq   rC   zstatement ratezESELECT COUNT(*) AS c FROM audit_log WHERE action='manual_fx_override'r0   r1   r'   r2   r3   r6   r7   z-SELECT status FROM alerts WHERE alert_id='m1'statusresolved)r   r   r   pytestraises
ValueErrorr   r   rO   rG   rH   rL   rM   rN   )r   rU   rR   rV   rW   rX   s         r   Itest_manual_fx_override_requires_note_audits_and_resolves_manual_requiredr   [   s   <<DLL  ^  _  _  _	z	"	" F Ft5Zfmtuzm{m{  CE  	F  	F  	F  	FF F F F F F F F F F F F F F F 4uUVbipqviwiw  O  P  P  P  P<<_``iikkloputuuptuuuuuuuuuuuptuuuuuupuuuutu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<<GHHQQSST\]kakk]akkkkkkkkkkk]akkkkkk]kkkkakkkkkkkkkkkkkkkkkkkkkkkkkkkkkks   #A;;A?A?c                    t                      } t          | dddddddd		  	         |                     d
           t          | t	          dt          d          i          dd          }|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                                          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}}t!          | dddd            t          | t	          dd i          dd!          }t          | t	          dd i          dd!          }|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%                                          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#   r8   r9   r:   r;   mapr<   r=   r>   zINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES('mp1','warnung','market_data','instrument','usd1','missing_market_price','missing','active','now')re   etfrd   )r?   asset_classri   r1   r'   )z5%(py2)s
{%(py2)s = %(py0)s.updated_count
} == %(py5)sr)   r*   r.   r/   z.SELECT status FROM alerts WHERE alert_id='mp1'r   r   r2   r3   r6   r7   delistedexclude_from_auto_price_updatezstatus reviewr%   rE   valuation_policyrC   z
2026-01-03)z6%(py2)s
{%(py2)s = %(py0)s.excluded_count
} == %(py5)sresult2result3zZSELECT COUNT(*) AS c FROM alerts WHERE rule_id='delisted_or_suspended' AND status='active'r0   )r   r   r   r   r   r   updated_countrG   rH   rI   rJ   rK   rL   rM   rN   rO   r   excluded_count)r   r)   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r   r   s                r   Otest_market_price_resolves_missing_and_delisted_is_excluded_without_alert_floodr   h   s8   <<D$T&bk  ~D  QY  `e  t~  RZ  [  [  [  [LL  d  e  e  e"42I9V]^bVcVcJd2e2esx  FR  S  S  SF$1$1$$$$$$$$$$1$$$$$$$$$$$$6$$$$$6$$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$<<HIIRRTTU]^lbll^blllllllllll^bllllll^llllbllllllllllllllllllllllllllllt6Z  kK  Ra  b  b  b  b#D3JIW[K\3]3]kp  ~J  K  K  KG#D3JIW[K\3]3]kp  ~J  K  K  KG!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&7&&&&&7&&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&7&&&&&7&&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&<<tuu~~  A  A  BE  F  K  JK  K  F  JK  K  K  K  K  K  K  K  K  K  K  F  JK  K  K  K  K  K  F  K  K  K  K  JK  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  Kr   c            
     X   t                      } t          | dd           t          | dddd           t          | dd	t	          d
          dddd           t          | ddd	t	          d          dd           t          |           j        d         }|j        }ddh}||v }|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           |                     d           t          | dddt	          d          dd           t          | d           j        d         }|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%                                          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 )+Nrb   rc   r   r#   r<   r=   review)r%   rD   rE   rC   rd   re   rf   r8   r9   rg   rh   r\   rj   rm   rs   aligned
acceptablerx   )zB%(py2)s
{%(py2)s = %(py0)s.valuation_timestamp_status
} in %(py5)srv   r*   r.   r/   zDELETE FROM fx_ratesz#UPDATE alerts SET status='resolved'
2026-01-01r1   )max_price_fx_time_delta_hoursstale_mismatchr'   )zB%(py2)s
{%(py2)s = %(py0)s.valuation_timestamp_status
} == %(py5)spos2zTSELECT COUNT(*) AS c FROM alerts WHERE rule_id='stale_valuation' AND status='active'r0   r2   r3   r6   r7   )r   r   r   r   r   r	   r
   r   valuation_timestamp_statusrG   rH   rI   rJ   rK   rL   rM   rN   r   rO   )r   rv   rP   rQ   rR   rS   rT   r   rU   rV   rW   rX   s               r   2test_timestamp_alignment_and_stale_valuation_alertr   x   s   <<Du5555t6
fnu}~~~~t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahinaoao  {A  MT  U  U  U  U
d
#
#
-n
=C)Fi-FF)-FFFFFFFFFFF)-FFFFFFFFFFFFF3FFFFF3FFFFFF)FFFF-FFFFFFFFFFFFFFFFFFFFFFFFFFFFLL'(((LL67774uUlahinaoao  {A  MT  U  U  U  Ut1EEEOP^_D*>.>>*.>>>>>>>>>>>*.>>>>>>>>>>>>>4>>>>>4>>>>>>*>>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>>><<nooxxzz{~  E  DE  E  DE  E  E  E  E  E  E  E  E  E  E  DE  E  E  E  E  E  E  E  E  E  D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t          d          ddd           t          | ddt          d	          dd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                                          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#   r   100rf   r8   r9   )r%   ri   rj   rk   r?   r@   rd   50ztSELECT corporate_action_status,split_or_corporate_action_review_required FROM instruments WHERE instrument_id='usd1'corporate_action_status	suspectedr'   r2   r3   r6   r7   )split_or_corporate_action_review_requiredr1   z_SELECT COUNT(*) AS c FROM alerts WHERE rule_id='corporate_action_suspected' AND status='active'r0   )
r   r   r   r   rO   rG   rH   rL   rM   rN   )r   r_   rU   rR   rV   rW   rX   s          r   Etest_corporate_action_large_price_move_flags_no_auto_split_correctionr      s   <<Dt6lRYZ_R`R`kp  |B  T]  ^  ^  ^  ^t6lRYZ^R_R_jo  {A  S\  ]  ]  ]  ]<<  O  P  P  Y  Y  [  [D)*9k9*k9999999999*k99999*9999k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;<AA<AAAAAAAAAA<AAAAA<AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<<yzz  D  D  F  F  GJ  K  P  OP  P  K  OP  P  P  P  P  P  P  P  P  P  P  K  OP  P  P  P  P  P  K  P  P  P  P  OP  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  P  Pr   c            
     D	   t                      } t          | dd           t          | ddddd	           t          |           j        d
         }|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}}t          | ddt          d          dddd           t!          | dddt          d          dd           t          |           j        d
         }|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 }||u }|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        }||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}	}t          | dd$d%d&'           t          |           j        d
         }
|
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 S )*Nrb   rc   r   r#   r<   r=   
none_knownr   )r%   rD   rE   r   rC   rs   partially_valuabler'   )z8%(py2)s
{%(py2)s = %(py0)s.valuation_status
} == %(py5)spos_missingr*   r.   r/   rd   re   rf   r8   r9   rg   rh   r\   rj   rm   valuablerv   r}   r   snapshot_onlyrx   rz   r{   r   r   excluder   not_valuablepos_blocked)r   r   r   r
   r   valuation_statusrG   rH   rI   rJ   rK   rL   rM   rN   r   r   r	   r   r   )r   r   rP   rQ   rR   rS   rT   rv   rU   rV   r   s              r   Htest_valuation_statuses_and_total_return_remains_incomplete_for_snapshotr      s   <<Du5555t6
fn  IU  \d  e  e  e  e%d++5nEK'?+??'+???????????'+?????????????;?????;??????'????+????????????????????????????t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahinaoao  {A  MT  U  U  U  U
d
#
#
-n
=C-:-:----------:------------3-----3----------:---------------------------'4'4''''''''''4''''''''''''3'''''3''''''''''4'''''''''''''''''''''''''''2c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2c22222c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t6Z  kK  R[  \  \  \  \%d++5nEK'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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999999999999r   )r    r!   ).
__future__r   builtinsrI   _pytest.assertion.rewrite	assertionrewriterG   decimalr   r   jarvis_finance.fx.overridesr   jarvis_finance.fx.providersr   r   jarvis_finance.fx.ratesr   r	   jarvis_finance.ledger.positionsr
   &jarvis_finance.market_data.instrumentsr   r   #jarvis_finance.market_data.mappingsr   r   !jarvis_finance.market_data.pricesr   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   rY   r`   r   r   r   r   r   r   r    r   r   <module>r      s   " " " " " "                      > > > > > > O O O O O O O O C C C C C C C C ? ? ? ? ? ? q q q q q q q q y y y y y y y y p p p p p p p p p p : : : : : : > > > > > >   %.t     	M 	M 	M 	MJ J J J( ( ( (N N N N
l 
l 
l 
lK K K K E E E E"P P P P: : : : : :r   