
    `ji                    F   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Zd dlmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZmZ  G d	 d
          Z d Z!dddddddZ"dd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(d$Z-d)d'Z.dS )*    )annotationsN)Path)data)page_14_import_wizardpage_15_manual_review_queuepage_16_data_quality_center)DryRunInputassert_write_enabledconfirm_instrument_mappingcreate_broker_import_dry_runcreate_instrument_mappingcreate_platform_account_mappingget_manual_review_queue)connect_memory)apply_migrationsutc_nowc                  *    e Zd Zd
dZddZd Zd Zd	S )FakeStreamlitreturnNonec                "    g | _         | | _        d S N)callssidebarselfs    X/home/agent/.hermes/repos/FinanceManager/tests/unit/test_broker_mapping_import_wizard.py__init__zFakeStreamlit.__init__   s    NP
    namestrc                      fd}|S )Nc                    j                             | |f           dv rdS dv rJt          |           dk    r| d         n|                    dg           }|rt	          |          d         nd S dk    rfd| r| d         ng D             S d	k    rJ| r| d         nd}t          |t                    rfd
t          |          D             nfd|D             S d S )N>   buttoncheckboxF>   radio	selectbox   optionsr   tabsc                    g | ]}S  r,   .0_r   s     r   
<listcomp>z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>%   s    @@@@@@r   columnsc                    g | ]}S r,   r,   r-   s     r   r0   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>(   s    333333r   c                    g | ]}S r,   r,   r-   s     r   r0   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>(   s    ShShSh]^TXShShShr   )r   appendlengetlist
isinstanceintrange)argskwargsr)   countr    r   s       r   recorderz+FakeStreamlit.__getattr__.<locals>.recorder   s   JtT62333---u---%(YY]]$q''

9b8Q8Q+2<tG}}Q''<v~~@@@@$'>tAwwB@@@@y  #'.QQ7A%7M7Mh3333eEll3333ShShShShbgShShShh4r   r,   )r   r    r>   s   `` r   __getattr__zFakeStreamlit.__getattr__   s)    	 	 	 	 	 	 r   c                    | S r   r,   r   s    r   	__enter__zFakeStreamlit.__enter__,   s    r   c                    dS )NFr,   )r   r;   s     r   __exit__zFakeStreamlit.__exit__/   s    ur   Nr   r   )r    r!   )__name__
__module____qualname__r   r?   rA   rC   r,   r   r   r   r      sZ                     r   r   c                 @    t                      } t          |            | S r   )r   r   )cs    r   connrJ   3   s     AQHr   z	inst-demoCH0000000001DGASIXCHF)instrument_idisintickerexchangecurrencyc          
     V    |                      d|||||t                      f           |S )NzINSERT INTO instruments(instrument_id, asset_class, name, ticker, isin, exchange, currency, created_at) VALUES (?, 'etf', 'Demo ETF', ?, ?, ?, ?, ?))executer   )rI   rO   rP   rQ   rR   rS   s         r   seed_instrumentrV   9   s:    II 	_	h'))D   r   pfzpf-cashPostFinanceCashplatform_id
account_idplatformaccountc                   t                      }|                     d|||f           |                     d||||f           ||fS )NzuINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES (?, ?, 'bank', 'CHF', ?)zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES (?, ?, ?, 'cash', 'CHF', ?))r   rU   )rI   r[   r\   r]   r^   nows         r   seed_platform_accountra   A   s    
))CII  F  IT  V^  `c  Hd  e  e  eII  S  V`  bm  ov  x{  U|  }  }  }
""r   r   r   c                 &   t                      } t          |           }t          | ddddd          }|                     d|d         f                                          }|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          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 )NrX   Demo ETFetfrK   rN   )source_platformsource_labelasset_classrP   rS   z4SELECT * FROM instrument_mappings WHERE mapping_id=?
mapping_idmapping_statusmapped==z%(py1)s == %(py4)spy1py4assert %(py6)spy6rO   )z%(py1)s == %(py3)sro   py3assert %(py5)spy5)rJ   rV   r   rU   fetchone
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation@py_builtinslocals_should_repr_global_name)rI   rO   resultrow@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_format4@py_format6s              r   <test_instrument_mapping_can_be_created_and_auto_maps_by_isinr   H   s   A#A&&M&q-V`ns  {I  TY  Z  Z  ZF
))JVT`MaLc
d
d
m
m
o
oC ,H, H,,,,,,,,,, H,,,,, ,,,,H,,,,,,,,,,,,,,,,,,,,,,,,,,,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=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0000000r   c                 X   t                      } 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         }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )NrX   rc   rd   rL   rN   re   rf   rg   rQ   rS   ri   needs_manual_reviewrk   rm   rn   rq   rr   missing_isinquality_flagsinz%(py1)s in %(py4)srJ   r   rx   ry   rz   r{   r|   rI   r   r   r   r   r   r   s          r   -test_missing_isin_creates_needs_manual_reviewr   Q   s   A&q-V`ns  }B  MR  S  S  SF"#<'<<#'<<<<<<<<<<<#'<<<<<<#<<<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<4VO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                 Z   t                      } t          | 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 }||u }|slt          j        d|fd||f          t          j        |          t          j        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}d}|d         }||v }|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True WealthzGlobal Index Fundrd   USDre   rf   rg   rS   ri   r   rk   rm   rn   rq   rr   rO   )is)z%(py1)s is %(py4)sname_only_not_auto_mappedr   r   r   r   r   s          r   2test_name_without_isin_or_ticker_is_not_automappedr   X   s<   A&q-Viw|  HM  N  N  NF"#<'<<#'<<<<<<<<<<<#'<<<<<<#<<<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<</"*d*"d**********"d*****"****d***************************&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AAAAAAr   c            	        t                      } t          | dddd          \  }}t          | dddd||          }t          | d	d
dd          }t          | 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}||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         }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}d S )NrW   zpf-depotrX   DepotrZ   	brokeragerN   )re   source_account_labelaccount_typerS   internal_platform_idinternal_account_idr   zRobo Portfoliorobo_portfolio)re   r   r   rS   
RaiffeisenPrivatkontori   rj   rk   rm   rn   rq   rr   r   r   cash$raiffeisen_instrument_detail_missingr   r   r   )rJ   ra   r   rx   ry   rz   r{   r|   )rI   pf_platform
pf_accountrW   twrfr   r   r   r   r   s              r   Qtest_platform_account_mapping_for_postfinance_and_true_wealth_and_raiffeisen_cashr   `   s}   A3A4T^iv  AH  I  I  IK	(M`g  wB  MR  it  JT  
U  
U  
UB	(M`p  @P  [`  
a  
a  
aB	(L_l  |G  RW  
X  
X  
XB+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888n''''''''''''''''''''''''''''''''''''''''''''''''1HR5HH15HHHHHHHHHHH15HHHHHH1HHHH5H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Hr   c                 N   t                      } t          | t          dddddddddd	d
diddigdd                    }|                     d|f                                          }|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          j        }|d         } ||          }	ddi}
|	|
k    }|st          j        d|fd|	|
f          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |	          t          j        |
          dz  }dd|iz  }t          t          j	        |                    d x}x}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 )!NrX   docxzreal-file-redacted.docxmissing
         r(      r   	forbiddenraw	aggregate)rowssafe)re   source_file_typesource_filenamesnapshot_date_status
rows_totalcandidate_positionscandidate_cash_rowsmapped_positionsblocked_positionswarnings_countr   summaryz7SELECT * FROM broker_import_dry_runs WHERE dry_run_id=?r   rk   rm   rn   rq   rr   summary_jsonr   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.loads
}(%(py4)s)
} == %(py9)sjson)py0py2rp   rr   py9zassert %(py11)spy11z,SELECT COUNT(*) AS n FROM positions_snapshotnr   )rJ   r   r	   rU   rw   rx   ry   rz   r{   r|   r   loadsr}   r~   r   )rI   
dry_run_idr   r   r   r   r   r   @py_assert1@py_assert5@py_assert8@py_assert7@py_format10@py_format12s                 r   Ftest_broker_import_dry_run_stores_summary_without_productive_positionsr   l   sz   A-a]ms  F_  v  LN  de  {|  OP  de  vw  HV  XY  GZ  oz  |A  nB  mC  MX  dY  dY  2Z  2Z  2Z  [  [J
))MPZ}
]
]
f
f
h
hC$%**%**********%*****%*******************************:Cc.)C::)**Cv{.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C4CCCCC4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99CDDMMOOPSTYXYYTXYYYYYYYYYYYTXYYYYYYTYYYYXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYr   c                 6   t                      } t          | dddd           t                      }t          t          t
          fD ]}|                    ||            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 S )
NrX   Unknown ETFrd   r   r   c              3  .   K   | ]}|d          dk    V  dS )r   titleNr,   )r.   calls     r   	<genexpr>z\test_import_wizard_manual_review_and_data_quality_pages_import_and_render.<locals>.<genexpr>{   s+      77dtAw'!777777r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r   r   rp   )rJ   r   r   r   r   r   renderr   r   r}   r~   rx   r   rz   r{   r|   )rI   stmoduler   r   r   s         r   Itest_import_wizard_manual_review_and_data_quality_pages_import_and_renderr   u   s   Aa]hmx}~~~~	B(*EGbc  b!77bh7777377777777777777773777773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7r   c                 H   t                      } t          | ddd           t          |           }|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 S )NrX   r   rd   )re   rf   rg   assert %(py0)sr   r   r   	item_typeinstrument_mappingrk   rm   rn   rq   rr   )rJ   r   r   r}   r~   rx   r   rz   r{   r|   ry   )rI   r   @py_format1r   r   r   r   r   s           r   4test_manual_review_queue_loads_open_mapping_problemsr   ~   s0   Aa]hmnnnn"1%%DKKKKKKKKKKKK4KKKKK4KKKKKKKKKKKKKKKK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7777777r   c                 6   t                      } t          | dddd           |                     dt          j        g d          f           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
}||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 S )Nr   zUnknown USD ETFrd   r   r   z3UPDATE instrument_mappings SET quality_flags_json=?)
missing_fxsnapshot_onlycost_basis_uncertainc                ,    i | ]}|d          |d         S )checkr=   r,   )r.   r   s     r   
<dictcomp>zOtest_data_quality_center_reports_missing_isin_fx_and_prices.<locals>.<dictcomp>   s"    999Sc'lCL999r   zfehlende ISIN1rk   rm   rn   rq   rr   zfehlende FX in Import-Reviewszfehlende Crypto-Preiser   )z%(py1)s in %(py3)schecksrs   ru   rv   )rJ   r   rU   r   dumpsdashboard_dataget_data_qualityrx   ry   rz   r{   r|   r}   r~   r   )
rI   r   r   r   r   r   r   r   r   r   s
             r   ;test_data_quality_center_reports_missing_isin_fx_and_pricesr      s   AaM^lq  }B  C  C  C  CIICdj  RI  RI  RI  GJ  GJ  FL  M  M  M*1--D99D999F/")c)"c))))))))))"c)))))"))))c)))))))))))))))))))))))))))129c92c99999999992c9999929999c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#-#v----------#v-----#-----------v-----v-----------------------------r   c                     t          j        t                    5  t          d           d d d            d S # 1 swxY w Y   d S )NF)write_enabled)pytestraisesPermissionErrorr
   r,   r   r   )test_read_only_mode_blocks_commit_actionsr      s    		'	' 2 2511112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   8<<c                    t                      } t          |           }t          | ddddd          }t          | |d         |d	          }|sed
ddt	          j                    v st          j        |          rt          j        |          ndiz  }t          t          j
        |                    |                     d|d         f                                          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 )NrX   z
Manual ETFrd   MANrN   r   rh   zSynthetic manual confirmation)rh   rO   noter   r   audit_idz5SELECT COUNT(*) AS n FROM audit_log WHERE entity_id=?r   r(   rk   rm   rn   rq   rr   )rJ   rV   r   r   r}   r~   rx   r   rz   r{   r|   rU   rw   ry   )
rI   rO   r   r   r   r   r   r   r   r   s
             r   4test_audit_log_created_when_manual_mapping_confirmedr      s   A#A&&M&q-Vbpu  D  OT  U  U  UF)!|8L\i  qP  Q  Q  QHOOOOOOOOOOOO8OOOOO8OOOOOOOOOOOOOOOO99LvVbOcNeffooqqruv{z{{vz{{{{{{{{{{{vz{{{{{{v{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{r   tmp_pathr   c           	        t                      }t          |t          dddd                     | j        }d} ||          }t	          |          }| }|sddt          j                    v st          j        t                    rt          j	        t                    ndd	t          j                    v st          j        |           rt          j	        |           nd	t          j	        |          t          j	        |          t          j	        |          t          j	        |          d
z  }t          t          j        |                    d x}x}x}x}}d S )Nr   xlsxzredacted.xlsxr(   )re   r   r   r   z*.xlsxziassert not %(py9)s
{%(py9)s = %(py0)s(%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.rglob
}(%(py5)s)
})
}r   r   )r   ro   rt   rv   py7r   )rJ   r   r	   rglobr   r}   r~   rx   r   rz   r{   r|   )r   rI   r   @py_assert4@py_assert6r   @py_assert10@py_format11s           r   "test_no_real_files_created_in_repor     s~   A K_e  xG  TU  %V  %V  %V  W  W  W>,(,>>(++,s+,,,,,,,,,,,,,,,,,,s,,,,,s,,,,,,,,,,,,,8,,,,,8,,,,,,>,,,,(,,,,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   rD   )r   r   r   r   )/
__future__r   builtinsr}   _pytest.assertion.rewrite	assertionrewriterx   r   pathlibr   r   jarvis_finance.dashboardr   r   jarvis_finance.dashboard.pagesr   r   r   %jarvis_finance.imports.broker_mappingr	   r
   r   r   r   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   rJ   rV   ra   r   r   r   r   r   r   r   r   r   r   r  r,   r   r   <module>r     s   " " " " " "                      ; ; ; ; ; ; z z z z z z z z z z                  ; : : : : : G G G G G G G G       8   )4.QVafqv      -1YQ^hn # # # # #1 1 1 15 5 5 5B B B B	I 	I 	I 	IZ Z Z Z8 8 8 88 8 8 8. . . .2 2 2 2
| | | |- - - - - -r   