
    /&j5                       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 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d d	lmZ d d
l m!Z! d dl"m#Z#  G d d          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/d&dZ0d&dZ1d&d Z2d&d!Z3d&d"Z4d&d#Z5d&d$Z6d&d%Z7dS )'    )annotationsN)Decimal)data)page_13_equity_manage)set_manual_fx_override)
LookupUnavailableProviderCandidate%dedupe_missing_provider_symbol_alertsexport_mapping_decision_packexport_mapping_review_templategenerate_mapping_candidatesrank_candidaterecalculate_candidate_rankingsreject_mapping_candidateselect_mapping_candidate)"ensure_instrument_metadata_quality)refresh_market_prices)connect_memory)apply_migrationsc                  &    e Zd ZdZddddZd ZdS )StaticLookupProviderstaticNFfailc               &    |pi | _         || _        d S N)candidates_by_isinr   )selfr   r   s      ]/home/agent/.hermes/repos/FinanceManager/tests/unit/test_true_wealth_mapping_candidates_c3.py__init__zStaticLookupProvider.__init__   s    "4":			    c               ~    | j         rt          d          t          | j                            |g                     S )Nzlookup down)r   r   listr   get)r   isinnametickerexchangecurrencys         r   lookupzStaticLookupProvider.lookup#   s;    9 	3#M222D+//b99:::r!   r   )__name__
__module____qualname__r&   r    r*    r!   r   r   r      sH        D     ; ; ; ; ;r!   r   c                      e Zd ZdZddZdS )RaisingPriceProviderraisingsymbolstrc                     t          d          )Nz>price provider should not be called without confirmed mappings)AssertionError)r   r2   s     r   	get_pricezRaisingPriceProvider.get_price,   s    ]^^^r!   N)r2   r3   )r+   r,   r-   r&   r6   r.   r!   r   r0   r0   )   s3        D_ _ _ _ _ _r!   r0   c                      e Zd Zd Zd ZdS )FakeTabc                    | S r   r.   )r   s    r   	__enter__zFakeTab.__enter__1   s    r!   c                    dS NFr.   )r   argss     r   __exit__zFakeTab.__exit__4   s    ur!   N)r+   r,   r-   r:   r>   r.   r!   r   r8   r8   0   s2              r!   r8   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dS )FakeStc                    d S r   r.   r   r=   kwargss      r   titlezFakeSt.title9         r!   c                    d S r   r.   rB   s      r   captionzFakeSt.caption:   rE   r!   c                    d S r   r.   rB   s      r   warningzFakeSt.warning;   rE   r!   c                    d S r   r.   rB   s      r   	subheaderzFakeSt.subheader<   rE   r!   c                    d S r   r.   rB   s      r   writezFakeSt.write=   rE   r!   c                    d S r   r.   rB   s      r   successzFakeSt.success>   rE   r!   c                    d S r   r.   rB   s      r   errorzFakeSt.error?   rE   r!   c                    d S r   r.   rB   s      r   infozFakeSt.info@   rE   r!   c                    d S r   r.   rB   s      r   dividerzFakeSt.dividerA   rE   r!   c                    d S r   r.   rB   s      r   	dataframezFakeSt.dataframeB   rE   r!   c                    d S r   r.   rB   s      r   tablezFakeSt.tableC   rE   r!   c                    d |D             S )Nc                *    g | ]}t                      S r.   r8   ).0_s     r   
<listcomp>zFakeSt.tabs.<locals>.<listcomp>D   s    #>#>#>!GII#>#>#>r!   r.   )r   labelss     r   tabszFakeSt.tabsD   s    #>#>v#>#>#>>r!   c                    |r|d         nd S )Nr   r.   )r   labeloptionsrC   s       r   	selectboxzFakeSt.selectboxE   s    :Y'!**UY3Yr!   c                .    |                     dd          S )Nvalue )r$   rB   s      r   
text_inputzFakeSt.text_inputF   s    &**Wb2I2I+Ir!   c                    dS )Nrh   r.   rB   s      r   	text_areazFakeSt.text_areaG   s    r!   c                    dS )N
2025-12-31r.   rB   s      r   
date_inputzFakeSt.date_inputH   s    ,,r!   c                    dS r<   r.   rB   s      r   checkboxzFakeSt.checkboxI   s    r!   c                    t                      S r   r\   rB   s      r   expanderzFakeSt.expanderJ   s    		)9r!   c                    dS r<   r.   rB   s      r   buttonzFakeSt.buttonK   s    eer!   N)r+   r,   r-   rD   rG   rI   rK   rM   rO   rQ   rS   rU   rW   rY   ra   re   ri   rk   rn   rp   rr   rt   r.   r!   r   r@   r@   8   s        ***,,,,,,...***,,,***))),,,...***>>>YYYIII333>>>55599933333r!   r@   c                     t                      } t          |            |                     d           |                     d           |                     d           |                     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_connry   N   s    DTLL  U  V  V  VLL  ]  ^  ^  ^LL  E  F  F  FLL  U  V  V  VKr!   returnNonec                 
   t                      } t          dt          ddddddd          gi          }t          | |	          }|                     d
                                          }|                     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}|
|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}|
|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"}|
|k    }|slt          j        d|fd|
|f          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}
x}}d#}||k    }|st          j        d|fd$||f          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}}d S ))NCH0000000001stooqGETF.SWSWXUSDGlobal Equity ETFactiveproviderprovider_symbolr(   r)   r&   r%   instrument_statusr   zMSELECT * FROM instrument_price_mapping_candidates WHERE instrument_id='inst1'zQSELECT COUNT(*) AS c FROM instrument_price_mappings WHERE mapping_status='mapped'c   ==)z8%(py2)s
{%(py2)s = %(py0)s.candidates_found
} == %(py5)sresultpy0py2py5assert %(py7)spy7)z7%(py2)s
{%(py2)s = %(py0)s.high_confidence
} == %(py5)s
confidencehighz%(py1)s == %(py4)spy1py4assert %(py6)spy6review_statusproposedcandidate_asset_classetfcandidate_hedge_statusunknowncandidate_valuation_policy
live_pricer   z%(py0)s == %(py3)smapping_countr   py3assert %(py5)sr   )ry   r   r	   r   rv   fetchonecandidates_found
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprr5   _format_explanationhigh_confidence)rx   r   r   rowr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7@py_format4s                  r   ?test_candidate_generator_creates_high_candidate_from_isin_matchr   X   s   <<D#*GYafqv  ~Q  Xf  zB  C  C  C  D%  H )AAAF
,,f
g
g
p
p
r
rCLL!tuu~~  A  A  BE  FM"'a'"a''''''''''"a''''''''''''6'''''6''''''"''''a'''''''''''''''''''''''''''!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&6&&&&&6&&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-:-:----------:---------:---------------------------&'050'50000000000'500000'00005000000000000000000000000000'(5I5(I5555555555(I55555(5555I555555555555555555555555555+,<<,<<<<<<<<<<,<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=A=A==Ar!   c                    t                      } t          dt          ddd          gi          }t          | |           |                     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 S )Nr}   manualUNKNOWNr   )r   r   r&   r   zHSELECT confidence,review_status FROM instrument_price_mapping_candidatesr   lowr   r   r   r   r   r   needs_manual_reviewry   r   r	   r   rv   r   r   r   r   r5   r   )rx   r   r   r   r   r   r   r   s           r   :test_name_only_candidate_is_review_required_low_confidencer   j   s   <<D#^6GQYkt  |O  7P  7P  7P  6Q  %R  S  SHx8888
,,a
b
b
k
k
m
mC|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8#88#88888888888#8888888888#888888888888888888888888888888r!   c            
     0   t                      } t          dt          dddd          t          dddd          gi          }t          | |          }d |                     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h}	||	k    }|st          j        d|fd||	f          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}}	|                     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~   r   r   r   r   r(   r%   yahoor   c                    h | ]
}|d          S )r   r.   )r]   rs     r   	<setcomp>zItest_multiple_candidates_are_manual_review_and_alerted.<locals>.<setcomp>z   s/      F  F  Fq/"  F  F  Fr!   z=SELECT review_status FROM instrument_price_mapping_candidatesr   r   )zB%(py2)s
{%(py2)s = %(py0)s.ambiguous_provider_mapping
} == %(py5)sr   r   r   r   r   r   statusesr   r   r   z_SELECT COUNT(*) AS c FROM alerts WHERE rule_id='ambiguous_provider_mapping' AND status='active'r   r   r   r   r   )ry   r   r	   r   rv   fetchallambiguous_provider_mappingr   r   r   r   r   r   r5   r   r   )rx   r   r   r   r   r   r   r   r   r   r   r   r   r   s                 r   6test_multiple_candidates_are_manual_review_and_alertedr   s   s   <<D#^7IPU\jkkk7IPU\jkkk6 %  H )AAAF F  FDLL9x,y,y  -C  -C  -E  -E  F  F  FH,11,1111111111,1111111111116111116111111,1111111111111111111111111111111-..8...........8.............8.....8................................<<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                 2   t                      } t          | t          i                     }|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   r   r   )zE%(py2)s
{%(py2)s = %(py0)s.instruments_without_candidate
} == %(py5)sr   r   r   r   \SELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_provider_symbol' AND status='active'r   r   r   r   r   )ry   r   r   instruments_without_candidater   r   r   r   r   r   r5   r   rv   r   rx   r   r   r   r   r   r   r   r   r   r   s              r   6test_no_candidate_keeps_missing_provider_symbol_activer      s   <<D(8LR8P8PQQQF/414/14444444444/14444444444446444446444444/44441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<<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}}|                     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inst1)instrument_idzYSELECT COUNT(*) AS c FROM alerts WHERE rule_id='hedge_status_unknown' AND status='active'r   r   r   r   r   r   r   z^SELECT COUNT(*) AS c FROM alerts WHERE rule_id='instrument_status_unknown' AND status='active')	ry   r   rv   r   r   r   r   r5   r   rx   r   r   r   r   r   s         r   /test_hedge_and_instrument_status_unknown_alertsr      s$   <<D&t7CCCC<<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<<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  O  Or!   c                 L   t                      } t          dt          ddddddd          gi          }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}}|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}||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~   r   r   CHFzGlobal Equity ETF CHF Hedgedr   r   r   znSELECT candidate_is_hedged,candidate_hedged_to_currency,review_status FROM instrument_price_mapping_candidatesz@SELECT hedge_status FROM instruments WHERE instrument_id='inst1'candidate_is_hedgedr   r   r   r   r   r   candidate_hedged_to_currencyr   r   hedge_statusr   r   )	rx   r   r   instr   r   r   r   r   s	            r   :test_chf_hedged_candidate_remains_proposed_until_confirmedr      s|   <<D#^6GQXjs  D  OT  [y  @N  bj  7k  7k  7k  6l  %m  n  nHx8888
,,  H  I  I  R  R  T  TC<<Z[[ddffD$%**%**********%*****%*******************************-.7%7.%7777777777.%77777.7777%7777777777777777777777777778#88#88888888888#8888888888#8888888888888888888888888888,9,9,,,,,,,,,,9,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r!   c                 4   t                      } 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}}d S )NTr   r   r   r   )zC%(py2)s
{%(py2)s = %(py0)s.provider_lookup_unavailable
} == %(py5)sr   r   r   r   z`SELECT COUNT(*) AS c FROM alerts WHERE rule_id='provider_lookup_unavailable' AND status='active'r   r   r   r   r   )ry   r   r   provider_lookup_unavailabler   r   r   r   r   r   r5   r   rv   r   r   s              r   )test_provider_lookup_error_does_not_crashr      s   <<D(8LRV8W8W8WXXXF-22-2222222222-2222222222226222226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<<z{{  E  E  G  G  HK  L  Q  PQ  Q  L  PQ  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  L  PQ  Q  Q  Q  Q  Q  L  Q  Q  Q  Q  PQ  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Q  Qr!   c                    t                      } |                     d           t          dt          dddddd          gi          }t	          | |	           |                     d
                                          d         }t          | |d          }|sedddt          j                    v st          j
        |          rt          j        |          ndiz  }t          t          j        |                    |                     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('mps','warnung','market_data','instrument','inst1','missing_provider_symbol','missing','active','now')r}   r~   r   r   r   r   )r   r   r(   r)   r%   r   r   <SELECT candidate_id FROM instrument_price_mapping_candidatescandidate_idmanual confirmationr   notezassert %(py0)sr   
mapping_idzsSELECT COUNT(*) AS c FROM audit_log WHERE action IN ('confirm_instrument_price_mapping','select_mapping_candidate')r      )>=)z%(py1)s >= %(py4)sr   r   r   r   r   r   r   )ry   rv   r   r	   r   r   r   r   r   r   r   r   r5   r   r   )
rx   r   r   r   @py_format1r   r   r   r   r   s
             r   Htest_mapping_selection_writes_audit_and_resolves_missing_provider_symbolr      sQ   <<DLL  h  i  i  i#^6GQXjs  D  OT  [i  }E  7F  7F  7F  6G  %H  I  IHx8888<< ^__hhjjkyzL)$\PefffJ::<<  N  O  O  X  X  Z  Z  [^  _  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                      } |                     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('fx1','kritisch','fx','instrument','inst1','missing_fx','missing','active','now')r   r   rm   z0.9rh   )base_currencyquote_currency	rate_daterater   zstatement sourcezESELECT COUNT(*) AS c FROM audit_log WHERE action='manual_fx_override'r   r   r   r   r   r   r   zOSELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_fx' AND status='active'r   )ry   rv   pytestraises
ValueErrorr   r   r   r   r   r   r5   r   r   s         r   6test_fx_override_requires_note_and_resolves_missing_fxr      s   <<DLL  S  T  T  T	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  Q  R  R  R  R<<_``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<<ijjssuuvyz~z~z~z~s   #A,,A03A0c                 f   t                      } t          | t                      d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 S )Nr      T)r   asset_classlimitdry_runr   r   )z6%(py2)s
{%(py2)s = %(py0)s.total_mappings
} == %(py5)sr   r   r   r   )z5%(py2)s
{%(py2)s = %(py0)s.updated_count
} == %(py5)s)ry   r   r0   total_mappingsr   r   r   r   r   r   r5   r   updated_count)rx   r   r   r   r   r   r   s          r   Jtest_market_price_dry_run_without_confirmed_mapping_does_not_call_providerr      s   <<D"42F2H2HV[cdnrsssF %A% A%%%%%%%%%% A%%%%%%%%%%%%6%%%%%6%%%%%% %%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%$1$1$$$$$$$$$$1$$$$$$$$$$$$6$$$$$6$$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r!   c                 d    t                      } t          j        t                      |            d S r   )ry   r   renderr@   rw   s    r   1test_dashboard_review_ui_renders_without_live_apir     s(    <<D 400000r!   c                 0   t                      } |                     d           |                     d           t          |           }d}||k    }|st          j        d|fd||f          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}}|                     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('mps1','warnung','market_data','instrument','inst1','missing_provider_symbol','missing','active','now')zINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES('mps2','warnung','market_data','instrument','inst1','missing_provider_symbol','missing','active','now')r   r   r   resolvedr   r   r   r   r   r   r   r   r   )ry   rv   r
   r   r   r   r   r   r   r5   r   r   )
rx   r  r   r   r   r   r   r   r   r   s
             r   8test_missing_provider_symbol_dedupes_per_instrument_onlyr     s   <<DLL  i  j  j  jLL  i  j  j  j4T::H8q=8q88q<<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t          ddddd          gi          }t          ||           | dz  }t	          ||	          }|                    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}||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}||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 )Nr}   r~   r   r   r   r   r   r(   r)   r%   r   zmapping_template.csv)output_pathzutf-8)encodinginstrument_countr   r   r   r   r   r   candidate_rowszcandidate_provider,candidate_provider_symbol,candidate_exchange,candidate_currency,confidence,ranking_score,ranking_reason,risk_flags,recommended_action,hedge_status_candidate,instrument_status_candidate,evidence_source)in)z%(py1)s in %(py3)stext)r   r   r   r   zreviewer_decision,reviewer_note)ry   r   r	   r   r   	read_textr   r   r   r5   r   r   r   r   )tmp_pathrx   r   outsummaryr  r   r   r   r   r   r   r   s                r   /test_mapping_template_contains_candidate_fieldsr     sR   <<D#^6GQXjs  D  OT  [i  7j  7j  7j  6k  %l  m  mHx8888
+
+C,TsCCCG=='=**D%&+!+&!++++++++++&!+++++&++++!+++++++++++++++++++++++++++#$))$))))))))))$)))))$))))))))))))))))))))))))))))))) i  q  i  mq  q  q  q  q  q  q  q  q  q  q  i  mq  q  q  q  q  q  i  q  q  q  q  q  q  q  q  q  q  q  mq  q  q  q  q  q  mq  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q,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44r!   c            
     &   t                      } t          dt          dddd          t          dddd          gi          }t          | |           d t	          j        |           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         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~   r   r   r   r   r   c                     i | ]}|d          |S )checkr.   )r]   r   s     r   
<dictcomp>zHtest_data_quality_center_shows_candidate_review_need.<locals>.<dictcomp>   s    GGGCc'lCGGGr!   u   Mapping-Kandidaten unbestätigtcount2r   r   r   r   r   z+Instrumente mit mehreren Mapping-Kandidaten1r   )ry   r   r	   r   r   get_data_qualityr   r   r   r5   r   )rx   r   checksr   r   r   r   r   s           r   4test_data_quality_center_shows_candidate_review_needr     s   <<D#^7IPU\jkkk7IPU\jkkk6 %  H  x8888GG4+@+F+FGGGF34W=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DDDDDDDDDDDDDDDDDDD?@IPSPISPPPPPPPPPPISPPPPPIPPPPS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./8?C?8C??????????8C?????8????C?????????????????????????????r!   c            
     <   t                      } t          | t          i                      |                     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
t          ddddd
          gi          }t          | |           |                     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         }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}}d S )Nr   r   r   r   r   r   r   r   r   r}   r~   r   r   r   r  r   r   r   r   r   )ry   r   r   rv   r   r   r   r   r5   r   r	   r   )rx   r   r   r   r   r   r   r   s           r   Ctest_missing_provider_symbol_not_resolved_until_candidate_confirmedr     sX   <<D/CB/G/GHHHH<<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#^6GQXjs  D  OT  [i  7j  7j  7j  6k  %l  m  mHx8888<<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<< ^__hhjjkyzLTCXYYYY<<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!   )rz   r{   )8
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   decimalr   r   jarvis_finance.dashboardr   jarvis_finance.dashboard.pagesr   jarvis_finance.fx.overridesr   %jarvis_finance.market_data.candidatesr   r	   r
   r   r   r   r   r   r   r   &jarvis_finance.market_data.instrumentsr   !jarvis_finance.market_data.pricesr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r0   r8   r@   ry   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r.   r!   r   <module>r-     sY   " " " " " "                      ) ) ) ) ) ) @ @ @ @ @ @ > > > > > >                        V U U U U U C C C C C C : : : : : : > > > > > >
; 
; 
; 
; 
; 
; 
; 
;_ _ _ _ _ _ _ _       4 4 4 4 4 4 4 4,     $9 9 9 9
P 
P 
P 
PM M M MO O O O	- 	- 	- 	-Q Q Q Q	M 	M 	M 	M@ @ @ @% % % %1 1 1 1
M M M M
5 
5 
5 
5
@ 
@ 
@ 
@	M 	M 	M 	M 	M 	Mr!   