
    mjc                       d dl mZ d dlZd dlmc mZ dZd dl	Z	d dl
mZ d dlZd dlmZmZ d dlZd dl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mZmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'  ee(          j)        d         dz  dz  Z*dZ+d)dZ,d*d+dZ-d*d,dZ.d-dZ/d.dZ0d.dZ1d.d Z2d.d!Z3d.d"Z4d.d#Z5d.d$Z6d.d%Z7d.d&Z8d.d'Z9d.d(Z:dS )/    )annotationsNF)Path)ZIP_DEFLATEDZipFile)
create_app)IngestionConfirmRequestIngestionPreviewRequest) confirm_instrument_price_mapping)ensure_canonical_cash_accountsget_cash_summary)build_portfolio_reconciliationconfirm_ingestion'confirm_postfinance_instrument_mappingspreview_ingestion)build_portfolio_performance)$set_performance_scope_classification)connect)apply_migrations   fixturesz$postfinance_portfolio_synthetic.docxz2026-07-25T23:59:59+00:00returnsqlite3.Connectionc            	        t          d          } t          |            |                     dt          f           |                     dt          f           t	          | dddddt          	           |                                  | S )
Nz:memory:zfINSERT INTO platforms(platform_id,name,platform_type,created_at) VALUES('pf','PostFinance','broker',?)zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,
             performance_included,is_active,created_at)
             VALUES('pf-depot','pf','PostFinance E-Trading','brokerage','CHF',0,1,?)pf-depotTpostfinance_etrading_depottestz(synthetic PostFinance investment account)
account_idincludedclassification_rolesourcenoteclassified_at)r   r   executeNOWr   commit)conns    X/home/agent/.hermes/repos/FinanceManager/tests/unit/test_postfinance_portfolio_source.pydatabaser(      s    :DTLLp	   	LL	X 
	   )87    	KKMMMK    contentbytes | Nonedict[str, object]c           
         | t                                           n| }ddd ddt          dt          j        |                              d          dS )Npostfinance_etrading	portfolio
2026-05-14portfolio.docxascii)
source_key
scope_kindr   period_from	period_todata_cutoff	file_namecontent_base64)FIXTURE
read_bytesr$   base64	b64encodedecode)r*   raws     r'   requestr@   9   s\    ")/'




wC,!#!% *3//66w??	 	 	r)   previewc                N     t          |          }i | fddD             ddiS )Nc                "    i | ]}||         S  rD   .0keyrA   s     r'   
<dictcomp>z#confirm_payload.<locals>.<dictcomp>K   s/     

 

 

 

 

 

r)   
preview_idconfirmation_idpreview_created_atsource_revisioninput_fingerprintpayload_hashconfirmT)r@   )rA   r*   r    s   `  r'   confirm_payloadrQ   G   s`    WF


 

 

 



 

 

 	4  r)   c                     t                      } |                     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

gd           | S )NTSynthetic Alpine AGCH0000000001stockCHFunknownfmpzALP.SWSIX)
source_symbolinstrument_nameisinasset_classsource_currencysource_venueprovidervaluation_symbolvaluation_venuevaluation_currencySynthetic Lake CorpUS0000000002USDLAKENYSEzSynthetic World ETFIE0000000003etfEURzWORLD.DEXETRAzSynthetic Bond ETFIE0000000004zBOND.DE)"allow_manual_baseline_supersessioninstrument_mappings)r@   update)payloads    r'   mapped_requestrr   Z   s    iiGNN.23H]#GPU&Ex %UD D 4H]#GPU&Ev &eE E 4H]#Ee&Ez 'uF F 3G[#Ee&Ey 'uF F 
    * Nr)   Nonec            
     p   t                      } | j        }t          | t                                }| j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |           rt	          j	        |           nd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         }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    }d}
|	|
k    }|r|st	          j        d||fd||	|
f          t	          j	        |          t	          j	        |	          t	          j	        |
          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}	}
|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}||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         }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#         }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*         }|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,}t          |          }||v}|st	          j        d-|fd.||f          t	          j	        |          d/t          j                    v st	          j        t                    rt	          j	        t                    nd/d0t          j                    v st	          j        |          rt	          j	        |          nd0t	          j	        |          d1z  }d2d3|iz  }t          t	          j        |                    d x}x}}d4}t          |          }||v}|st	          j        d-|fd.||f          t	          j	        |          d/t          j                    v st	          j        t                    rt	          j	        t                    nd/d0t          j                    v st	          j        |          rt	          j	        |          nd0t	          j	        |          d1z  }d2d3|iz  }t          t	          j        |                    d x}x}}d S )5N==)z5%(py2)s
{%(py2)s = %(py0)s.total_changes
} == %(py4)sr&   beforepy0py2py4assert %(py6)spy6document_typePostFinance Portfolio-Bewertungz%(py1)s == %(py4)spy1r{   r5   r6   r0   rv   rv   z%(py1)s == %(py5)sz%(py5)s == %(py7)sr   py5py7assert %(py9)spy9operation_countsr         )	buyssellsdistributionsfeestaxesdepositswithdrawals	positionscash_balancesbaseline_onlyTisz%(py1)s is %(py4)sperformance_impacthistory_beforeunavailablecounts	ambiguousblockedexpected_changes   r   )recordsr   cashcash_componentsaccount_valuationsmanual_supersessionscash_reconciliationsource_total_identity_chf23609.69	file_hashrM   r9   not in)z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}strrA   )r   py3r{   r}   zassert %(py8)spy8r1   )r(   total_changesr   r@   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   )r&   rw   rA   @py_assert1@py_assert3@py_format5@py_format7@py_assert0@py_assert2@py_assert4@py_assert6@py_format8@py_format10@py_assert5@py_format9s                  r'   Mtest_postfinance_docx_preview_is_storage_free_and_describes_baseline_coverager   t   sc   ::DFgii00G'''''''''''''''''''''''4'''''4'''''''''''''''''''''''''''''''''''''''''''''''''?#H'HH#'HHHHHHHHHHH#'HHHHHH#HHHH'HHHHHHHHHHHHHHHHHHHHHHHHHHHH=!IW[%9I!%9II\I%9\IIIIIIIIIIIII!%9\IIIII!IIII%9IIII\IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII%& 

+ 
+ 
& 
+ 
 
 
 
 

 
 
 
& 
+ 
 
 
 
 ' 
 
 

+ 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 ?#+t+#t++++++++++#t+++++#++++t+++++++++++++++++++++++++++'()9:KmK:mKKKKKKKKKK:mKKKKK:KKKKm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8[).Q.)Q..........)Q.....)....Q...........................8Y',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,%& AqQ+ + & +        & +     '   +                          ()*EFT*TF*TTTTTTTTTTF*TTTTTFTTTT*TTTTTTTTTTTTTTTTTTTTTTTTTTT;=7+<#==#===========#==========#============================/3w<</<//////////<////////////////3/////3/////////////w/////w//////<////////////////////////////3w<</<//////////<////////////////3/////3/////////////w/////w//////</////////////////////////////r)   c                 J   t                      } t          | t                                }t          | t	          |                    }t          | t	          |                    }|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}||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	         }||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                                          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                                          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                                          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	         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          | 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         }|	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          | t	          |	                    }
|
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	         }||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
idempotentFr   r   r   r|   r}   Tbatch_idru   r   zSSELECT COUNT(*) FROM transactions WHERE source_type='postfinance_etrading_snapshot'r   r   zSELECT COUNT(*) FROM transactions
           WHERE source_type='postfinance_etrading_snapshot' AND currency_original!='CHF'
             AND fx_rate_to_chf IS NOT NULL AND fx_source='postfinance_statement' AND fx_status='ok'   zHSELECT COUNT(*) FROM positions_snapshot WHERE snapshot_date='2026-05-14'zOSELECT COUNT(*) FROM cash_account_snapshots WHERE source='postfinance_etrading'r   zKSELECT COUNT(*) FROM cash_balances WHERE source_type='postfinance_etrading'r   zMSELECT COUNT(*) FROM positions_snapshot WHERE cost_basis_original IS NOT NULLzUSELECT COUNT(*) FROM account_value_snapshots WHERE source_type='postfinance_etrading'z`SELECT COUNT(*) FROM portfolio_valuation_snapshots WHERE source='ingestion:postfinance_etrading'0SELECT COUNT(*) FROM portfolio_ingestion_batchesz0SELECT COUNT(*) FROM audit_log WHERE entity_id=?r   new	unchanged
discovered)r(   r   r@   r   rQ   r   r   r   r   r   r#   fetchone)r&   rA   firstreplayr   r   r   r   r   freshduplicate_files              r'   >test_postfinance_confirm_is_atomic_audited_and_file_idempotentr      sG   ::Dgii00GdOG$<$<==Et_W%=%=>>F'%'%''''''''''%'''''''''%''''''''''''''''''''''''''','4'4''''''''''4'''''''''4'''''''''''''''''''''''''''*2z!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22222222222222<<mnnwwyyz{|  B  AB  B|  AB  B  B  B  B  B  B  B  B  B  B|  AB  B  B  B  B  B|  B  B  B  B  AB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B<<	h  hjj	  	  	     	     	    	    q	              	           
 <<bccllnnopqvuvvquvvvvvvvvvvvquvvvvvvqvvvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvv<<ijjssuuvwx}|}}x|}}}}}}}}}}}x|}}}}}}x}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}<<effooqqrs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<<ghhqqsstuv{z{{vz{{{{{{{{{{{vz{{{{{{v{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{<<oppyy{{|}~  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<<z{{  E  E  G  G  H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<<JKKTTVVWXY^]^^Y]^^^^^^^^^^^Y]^^^^^^Y^^^^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^<<JUS]M^L`aajjllmnotsttostttttttttttosttttttottttsttttttttttttttttttttttttttttdGII..E?5!&Q&!Q&&&&&&&&&&!Q&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&?;'H5?<+HH'+HHHHHHHHHHH'+HHHHHH'HHHH+HHHHHHHHHHHHHHHHHHHHHHHHHHHH&t_U-C-CDDN,'/4/'4//////////'4/////'////4///////////////////////////*%:z)::%):::::::::::%)::::::%::::)::::::::::::::::::::::::::::<<JKKTTVVWXY^]^^Y]^^^^^^^^^^^Y]^^^^^^Y^^^^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^r)   c                 0   t                      } t          | t                                }t          | t	          |                     t          | dd          }|d         }t          |          }d}||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        |          d	z  }d
d|iz  }t          t          j        |                    d x}x}x}}d |d         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}}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}||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         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          }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 }||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*         }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,         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,         d"         d         }d0}||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 )1Nr0   z2099-12-31T23:59:59+00:00)as_ofr7   differencesr   ru   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)ry   rz   r{   r   r   r   c              3  :   K   | ]}|d          d         dk    V  dS )quantitystatusmatchedNrD   rF   items     r'   	<genexpr>zztest_postfinance_reconciliation_matches_quantities_and_total_but_performance_has_no_prebaseline_history.<locals>.<genexpr>   s1      aa4tJ)Y6aaaaaar)   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allrx   c              3  2   K   | ]}|d          dk    |V  dS )account_labelzPostFinance E-TradingNrD   r   s     r'   r   zztest_postfinance_reconciliation_matches_quantities_and_total_but_performance_has_no_prebaseline_history.<locals>.<genexpr>   s\        D  DdRVWfRg  lC  SC  SCT  SC  SC  SC  SC  D  Dr)   account_totalsr   r   r   r   r|   r}   positions_valuez20909.69
cash_value2700reported_totalr   coverageinstrumentsratio1
cost_basis0z
2026-01-01)	from_dateto_dater7   summarytwrr   r   mwrmissing_opening_valuationqualityreason_codesinz%(py1)s in %(py4)sr   )r(   r   r@   r   rQ   r   r   r   r   r   r   r   r   r   r   r   nextr   )r&   rA   reconciliationr   r   r   r   r   r   r   postfinance_totalr   r   r   performances                  r'   gtest_postfinance_reconciliation_matches_quantities_and_total_but_performance_has_no_prebaseline_historyr      sH	   ::Dgii00GdOG445553/  N
 m,23,--22-2222222222-2222222222223222223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222222aa>R_C`aaaa3aaaaaaaaaaaaaaaa3aaaaa3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  D  Dn=M.N  D  D  D  D  DX&3)3&)3333333333&)33333&3333)333333333333333333333333333./=:=/:==========/:=====/====:===========================\*4f4*f4444444444*f44444*4444f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-.<*<.*<<<<<<<<<<.*<<<<<.<<<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<*%m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*%l3G<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-/	  K y!%(0D0(D0000000000(D00000(0000D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y!%(0D0(D0000000000(D00000(0000D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&W+i*@*G*WW&*WWWWWWWWWWW&*WWWWWW&WWWW*WWWWWWWWWWWWWWWWWWWWWWWWWWWWy!,/9J]J9]JJJJJJJJJJ9]JJJJJ9JJJJ]JJJJJJJJJJJJJJJJJJJJJJJJJJJJJr)   c            	     2   t          t                    5 } |                     d                              d          }|                    dd          }ddlm}  |            }t          |dt                    5 }|                                 D ]3}|	                    ||dk    r|n|                     |                     4	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t                      }t          |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}
}	t'          j        t*          d          5  t-          |t/          ||                                                     d d d            n# 1 swxY w Y   |                    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 )Nzword/document.xmlzutf-8rd   rS   r   )BytesIOwr   r   )>)z%(py1)s > %(py4)sr   r|   r}   u   Prüfung|unklar|ungültig)matchr   ru   r   z!SELECT COUNT(*) FROM transactionsz'SELECT COUNT(*) FROM positions_snapshot)r   r:   readr>   replaceior   r   namelistwritestrr(   r   r@   getvaluer   r   r   r   r   pytestraises
ValueErrorr   rQ   r#   r   )r    xmlr   buffertargetnamer&   rA   r   r   r   r   r   s                r'   Dtest_postfinance_invalid_or_ambiguous_batch_cannot_partially_confirmr     s[   			 aVkk-..55g>>kk/1FGGVS,// 	a6)) a aT5H-H-HccfkkZ^N_N_````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 ::Dgfoo.?.?&@&@AAG8Y'+!+'!++++++++++'!+++++'++++!+++++++++++++++++++++++++++	z)D	E	E	E M M$9J9J K KLLLM M M M M M M M M M M M M M M<<JKKTTVVWXY^]^^Y]^^^^^^^^^^^Y]^^^^^^Y^^^^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^<<;<<EEGGJOaOJaOOOOOOOOOOJaOOOOOJOOOOa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<<ABBKKMMa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UUsI   A%C':A	CC'C	C'C	C''C+.C+1HHHc                    t                      } t          j        t                                }t	          | |                                          }|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}}t          j        t          |                    }
t!          | |
                                          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}}t#          d          }d}|                                d         d         d         d         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 )Nr~   r   ru   r   r   r|   r}   r9   r   )z%(py1)s not in %(py3)srq   )r   r   assert %(py5)sr   r   Fr   r   r   )
write_moder.   
componentsschemasr	   
propertiesr3   enumr   r   )r(   r	   model_validater@   r   
model_dumpr   r   r   r   r   r   r   r   r   rQ   r   r   openapi)r&   preview_requestrq   r   r   r   r   r   @py_format4@py_format6confirmationapps               r'   Ftest_postfinance_api_contract_accepts_file_payload_without_exposing_itr     s   ::D-<WYYGGOo&@&@&B&BCCG?#H'HH#'HHHHHHHHHHH#'HHHHHH#HHHH'HHHHHHHHHHHHHHHHHHHHHHHHHHHH*7**********7****************7*****7****************************9/':R:RSSLT<#:#:#<#<==lKTuTKuTTTTTTTTTTKuTTTTTKTTTTuTTTTTTTTTTTTTTTTTTTTTTTTTTT

'
'
'C!  KS[[]]<%@%KLe%fgs%t  vB  &C  D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  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                    t                      } |                     dt          f           |                                  t	          | 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}}t          | t          |                     |                     d
                                          }d }||u}|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}||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 )NzINSERT INTO instruments(
             instrument_id,asset_class,name,currency,is_active,instrument_status,valuation_policy,created_at)
           VALUES('wrong-instrument','crypto','Synthetic Alpine AG','USD',1,'active','live_price',?)r   r   r   ru   r   r   r|   r}   zSELECT p.instrument_id,i.asset_class,i.currency
           FROM positions_snapshot p JOIN instruments i ON i.instrument_id=p.instrument_id
           WHERE i.name='Synthetic Alpine AG' AND p.snapshot_date='2026-05-14'is notz%(py0)s is not %(py3)simportedry   r   r  r   instrument_idzwrong-instrument)!=)z%(py1)s != %(py4)sr]   rU   currencyrV   )r(   r#   r$   r%   r   r@   r   r   r   r   r   r   rQ   r   r   r   r   )r&   rA   r   r   r   r   r   r$  r   r  r  s              r'   Jtest_same_name_with_wrong_asset_class_or_currency_is_never_silently_reusedr)     s   ::DLL	h 
	   	KKMMMgii00G8[).Q.)Q..........)Q.....)....Q...........................dOG44555||	R  hjj	 
  8484884O$:(::$(:::::::::::$(::::::$::::(::::::::::::::::::::::::::::M"-g-"g----------"g-----"----g---------------------------J(5(5((((((((((5(((((((((5(((((((((((((((((((((((((((((r)   c                    t                      } t          |            |                     d           |                                  d |                     d          D             }t	          |            d |                     d          D             }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          nddt          j                    v st          j	        |          rt          j
        |          ndd	z  }d
d|iz  }t          t          j        |                    d }d S )Nz5UPDATE accounts SET updated_at='2020-01-01T00:00:00Z'c                ,    g | ]}t          |          S rD   tuplerF   rows     r'   
<listcomp>zLtest_portfolio_read_does_not_refresh_accounts_updated_at.<locals>.<listcomp>  s    sssSeCjjsssr)   z>SELECT account_id,updated_at FROM accounts ORDER BY account_idc                ,    g | ]}t          |          S rD   r,  r.  s     r'   r0  zLtest_portfolio_read_does_not_refresh_accounts_updated_at.<locals>.<listcomp>  s    rrrCU3ZZrrrr)   ru   )z%(py0)s == %(py2)safterrw   )ry   rz   zassert %(py4)sr{   )r(   r   r#   r%   r   r   r   r   r   r   r   r   r   )r&   rw   r2  r   @py_format3r   s         r'   8test_portfolio_read_does_not_refresh_accounts_updated_atr4  
  so   ::D"4(((LLHIIIKKMMMssDLL1q$r$rsssFTrr4<<0p#q#qrrrEF?5F55FFr)   c                 D   t                      } |                     dt          f           |                     dt          f           |                                  t	                      }t          | |          }|d         }|d         }||k    }d}||k    }|r|st          j        d||fd|||f          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                                          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}||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}}i |fddD             ddi}t          | |          }|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                                          }g }|d         }d}||k    }|}|rd }|d!         }||v }|}|st          j        d|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }|                    |           |r`t          j        d&|fd'||f          t          j        |          t          j        |          d(z  }d)d*|iz  }|                    |           t          j        |d          i z  }d+d,|iz  }t          t          j
        |                    d x}x}x}x}x}x}x}}|                     d-                                          }d }||u}|st          j        d.|fd/||f          d0t!          j                    v st          j        |          rt          j        |          nd0t          j        |          d1z  }d2d3|iz  }t          t          j
        |                    d x}}|d4         }d5}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}g }|d6         }d }||u }|}|r|d7         }d }||u }|}|st          j        d8|fd9||f          t          j        |          t          j        |          d#z  }d$d%|iz  }|                    |           |r`t          j        d8|fd:||f          t          j        |          t          j        |          d(z  }d)d*|iz  }|                    |           t          j        |d          i z  }d+d,|iz  }t          t          j
        |                    d x}x}x}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<                                          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}||u }|slt          j        d8|fd>||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}t                      }|                    d?t          f           |                    d@t          f           |                                 t          ||           t          ||          }|d         d         }d}||k    }|slt          j        dA|fdB||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}dC}|dD         dE         }||v }|slt          j        d&|fdF||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}d S )GN)  INSERT INTO instruments(
             instrument_id,asset_class,name,ticker,isin,currency,is_active,instrument_status,
             valuation_policy,created_at)
           VALUES('manual-alpine','stock','Synthetic Alpine AG','ALP','CH0000000001','CHF',1,
                  'active','live_price',?)a2  INSERT INTO transactions(
             transaction_id,transaction_type,activity_kind,account_id,instrument_id,trade_date,
             event_timestamp,quantity,gross_amount_original,currency_original,
             source_type,source_id,is_confirmed,quality_status,notes,created_at)
           VALUES('manual-placeholder','initial_position_snapshot','initial_position_snapshot',
                  'pf-depot','manual-alpine','2026-05-16','2026-05-16',12,0,'CHF',
                  'initial_snapshot','original-entry-alpine',1,'complete','Initial snapshot entry',?)mapping_countinstrument_countr   r   r   r   r   r   zSELECT COUNT(*) FROM instrument_price_mappings
           WHERE provider='fmp' AND source_venue='unknown'
             AND source_symbol IS NOT NULL AND provider_symbol IS NOT NULL
             AND source_currency=currencyr   ru   r   r   r|   r}   zCSELECT COUNT(DISTINCT isin) FROM instruments WHERE isin IS NOT NULLr   r   r   r   r   c                "    i | ]}||         S rD   rD   rE   s     r'   rH   z`test_confirmed_identity_mapping_supersedes_only_exact_unlineaged_placeholder.<locals>.<dictcomp>;  +       3   r)   rI   rP   Twritten_recordsr   zXSELECT is_voided,void_reason FROM transactions WHERE transaction_id='manual-placeholder'	is_voided
supersedesvoid_reasonz%(py3)s == %(py6)sr   r}   %(py8)sr   r   )z%(py11)s in %(py14)spy11py14%(py16)spy16assert %(py19)spy19zSELECT quantity,price_original,gross_amount_original,correction_of_transaction_id
           FROM transactions WHERE correction_of_transaction_id='manual-placeholder'r!  r#  replacementr%  r  r   r   12price_originalgross_amount_originalr   z%(py3)s is %(py6)sz%(py11)s is %(py14)szSELECT COUNT(*) FROM audit_log
           WHERE action='postfinance_manual_placeholder_superseded'
             AND entity_id='manual-placeholder'zSELECT COUNT(*) FROM transactions
           WHERE account_id='pf-depot' AND COALESCE(is_voided,0)=0
             AND transaction_type='initial_position_snapshot'r   r   a  INSERT INTO instruments(
             instrument_id,asset_class,name,isin,currency,is_active,instrument_status,valuation_policy,created_at)
           VALUES('evidenced-alpine','stock','Synthetic Alpine AG','CH0000000001','CHF',1,
                  'active','live_price',?)a7  INSERT INTO transactions(
             transaction_id,transaction_type,activity_kind,account_id,instrument_id,trade_date,
             event_timestamp,quantity,currency_original,source_type,source_id,external_transaction_id,
             is_confirmed,quality_status,notes,created_at)
           VALUES('evidenced','initial_position_snapshot','initial_position_snapshot','pf-depot',
                  'evidenced-alpine','2026-05-14','2026-05-14',12,'CHF','broker_import',
                  'broker-batch','broker-transaction-1',1,'complete','Initial snapshot entry',?)>=z%(py1)s >= %(py4)s'evidenced_cost_basis_or_lineage_presentquality_impactr   r   )r(   r#   r$   r%   rr   r   r   r   r   r   r   r   r   r   append_format_boolopr   r   r   ) r&   r    mappedr   r   r   r   r   r   r   r   r   r  resultoldr   r   @py_assert10@py_assert13@py_assert12r   @py_format15@py_format17@py_format18@py_format20rI  r  r  r   conflictr   rA   s                                   @r'   Ltest_confirmed_identity_mapping_supersedes_only_exact_unlineaged_placeholderra    sr   ::DLL	.
 
   	LL	i 
	 	 	 	KKMMMF4T6BBF/"Ef-?&@E"&@EEAE&@AEEEEEEEEEEEEE"&@AEEEEE"EEEE&@EEEEA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E<<	- 
 hjj 
  
     
     
    
    
 q             
             <<M hjj                q                          f--G8Y',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,%&'=>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
    )
    	4 L t\22F#$**$**********$*****$*******************************
,,b hjj  HG3{GqGq GGGGG\GS5GG\5G%GGGGGGGGGGGGqGGGGGGGGGqGGGGGGGGGGGGGGGGGGGGGGGGGGG\5GGGGGG\GGGG5GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG,,	X  hjj  #";d"""""""""";d"""""""""""";""""";""""""d"""""""""""""""""""""""""z"*d*"d**********"d*****"****d***************************aa;'(aDa(D0aaaaa[AX5Ya]aa5Y]a5aaaaaaaaaaaa(Daaaaa(aaaaD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a5Y]aaaaaa5Y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aaaaaaaaaaa<<	3  hjj	  	  	     	     	    	    q	              	           
 <<	A  hjj	  	  	     	     	    	    q	              	           
 t\22F,'4'4''''''''''4'''''''''4'''''''''''''''''''''''''''zzH	. 
   	d 
	 	 	 OO+Hf===&11G8Y',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,4a@P8QR`8aa48aaaaaaaaaaa48aaaaaa4aaaa8a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                      } |                     dt          f           |                     dt          f           |                     dt          f           |                     dt          f           |                                  t	                      }t          | |           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         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ddddddddg|d<   |                     d           |                                  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         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           |                                  d|d         d          d!<   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         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|d         d          d!<   t          j        |                                          }
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&         }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         }||v }|slt          j        d|fd||f          t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}i |
fd'd(D             d)d*i}t          j        |                                          }t!          | |          }t!          | |          }|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*}||u }|slt          j        d-|fd.||f          t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}|                     d/                                          }g }|d0         }d}||k    }|}|r|d1         }d}||k    }|}|st          j        d#|fd2||f          t          j	        |          t          j	        |          d3z  }d4d5|iz  }|                    |           |r`t          j        d#|fd6||f          t          j	        |          t          j	        |          d7z  }d8d9|iz  }|                    |           t          j        |d           i z  }d:d;|iz  }t          t          j        |                    d x}x}x}x}x}x}x}}|                     d<                                          }d }||u}|st          j        d=|fd>||f          d?t)          j                    v st          j        |          rt          j	        |          nd?t          j	        |          d@z  }dAdB|iz  }t          t          j        |                    d x}}g }|d0         }d}||k    }|}|r|dC         }d}||k    }|}|st          j        d#|fd2||f          t          j	        |          t          j	        |          d3z  }d4d5|iz  }|                    |           |r`t          j        d#|fd6||f          t          j	        |          t          j	        |          d7z  }d8d9|iz  }|                    |           t          j        |d           i z  }d:d;|iz  }t          t          j        |                    d x}x}x}x}x}x}x}}g }|dD         }d }||u }|}|r|dE         }d }||u }|}|st          j        d-|fdF||f          t          j	        |          t          j	        |          d3z  }d4d5|iz  }|                    |           |r`t          j        d-|fdG||f          t          j	        |          t          j	        |          d7z  }d8d9|iz  }|                    |           t          j        |d           i z  }d:d;|iz  }t          t          j        |                    d x}x}x}x}x}x}x}}|                     dH                                          }d }||u}|st          j        d=|fd>||f          dIt)          j                    v st          j        |          rt          j	        |          ndIt          j	        |          d@z  }dAdB|iz  }t          t          j        |                    d x}}d}|dJ         }||v }|slt          j        d|fd||f          t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}dK}|dJ         }||v }|slt          j        d|fd||f          t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}|                     dL                                          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 )MNzcINSERT INTO platforms(platform_id,name,platform_type,created_at) VALUES('other','Other','broker',?)zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,
             performance_included,is_active,created_at)
           VALUES('other-depot','other','Wrong account','brokerage','CHF',0,1,?)r6  a@  INSERT INTO transactions(
             transaction_id,transaction_type,activity_kind,account_id,instrument_id,trade_date,
             event_timestamp,quantity,gross_amount_original,currency_original,
             source_type,source_id,is_confirmed,quality_status,notes,created_at)
           VALUES('wrong-account-placeholder','initial_position_snapshot','initial_position_snapshot',
                  'other-depot','manual-alpine','2026-05-16','2026-05-16',12,0,'CHF',
                  'manual_dashboard','wrong-account-placeholder',1,'complete','Initial snapshot entry',?)r   r   r   rO  rQ  r   r|   r}   )manual_placeholder_other_account_conflictrS  r   r   r   zwrong-account-placeholderzother-depotr   rT   rJ  3manual_placeholder_wrong_account_confirmed_by_ownerz2026-07-26T12:00:00+02:00zHOwner confirms this exact placeholder was assigned to the wrong account.)manual_transaction_idexpected_source_account_idtarget_account_idexpected_isinexpected_quantityreason_codeowner_confirmed_atowner_confirmation_note.owner_confirmed_manual_placeholder_resolutionszUPDATE transactions SET source_id='broker-batch',external_transaction_id='broker-transaction'
           WHERE transaction_id='wrong-account-placeholder'rR  zUPDATE transactions SET source_id=transaction_id,external_transaction_id=NULL
           WHERE transaction_id='wrong-account-placeholder'z2099-01-01T00:00:00+00:00r   rk  'owner_confirmed_resolution_future_datedru   r   r   r   c                "    i | ]}||         S rD   rD   rE   s     r'   rH   zatest_owner_confirmed_wrong_account_resolution_is_exact_audited_and_idempotent.<locals>.<dictcomp>  r:  r)   rI   rP   Tr   Fr   r   z^SELECT account_id,is_voided FROM transactions WHERE transaction_id='wrong-account-placeholder'r   r<  r?  r@  rA  r   )z%(py11)s == %(py14)srB  rE  rF  rG  rH  zSELECT account_id,quantity,price_original,gross_amount_original
           FROM transactions WHERE correction_of_transaction_id='wrong-account-placeholder'r!  r#  rI  r%  r  r   r   rK  rL  rM  rN  zSELECT new_values_json FROM audit_log
           WHERE action='postfinance_manual_placeholder_superseded'
             AND entity_id='wrong-account-placeholder'auditnew_values_jsonz2026-07-26T10:00:00+00:00zSELECT COUNT(*) FROM audit_log
           WHERE action='postfinance_manual_placeholder_superseded'
             AND entity_id='wrong-account-placeholder')r(   r#   r$   r%   rr   r   r   r   r   r   r   r   r	   r  r  r   r   r   rT  rU  r   r   r   ) r&   r    r   r   r   r   r   r   	evidencedfuture_datedvalidated_sourcer  validated_confirmationr   r   rX  r   r   r   rY  rZ  r[  r   r\  r]  r^  r_  rI  r  r  rp  rA   s                                   @r'   Mtest_owner_confirmed_wrong_account_resolution_is_exact_audited_and_idempotentrv  t  s   ::DLLm	   	LL	T 
	   	LL	.
 
   	LL	m 
	 	 	 	KKMMMF+D&999f--G8Y',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,6c'BR:STb:cc6:ccccccccccc6:cccccc6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 "=&3''!L9#m	A 	A 	@F;< 	LL	?   	KKMMM!$//IXy).Q.)Q..........)Q.....)....Q...........................4c	BR8STb8cc48ccccccccccc48cccccc4cccc8c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LL	?   	KKMMMXsF;<Q?@TU$T622L!),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111111111114fEU8VWe8ff48fffffffffff48ffffff4ffff8f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# ;<Q?@TU /=fEEPPRR&677G8Y',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,%&'=>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@mGL\D]^lDmm@Dmmmmmmmmmmm@Dmmmmmm@mmmmDm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
    )
    	4 L 5CLQQ\\^^d$:;;Et%;<<F'%'%''''''''''%'''''''''%''''''''''''''''''''''''''','4'4''''''''''4'''''''''4'''''''''''''''''''''''''''
,,h hjj  HG3|GG-GGGGG#k2BGaG2Ba2GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG2BaGGGGG2BGGGGaGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG,,	_  hjj  #";d"""""""""";d"""""""""""";""""";""""""d"""""""""""""""""""""""""VV;|$V
V$
2VVVVV{:7NVRVV7NRV7VVVVVVVVVVVV$
VVVVV$VVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVV7NRVVVVVV7NVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaa;'(aDa(D0aaaaa[AX5Ya]aa5Y]a5aaaaaaaaaaaa(Daaaaa(aaaaD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a5Y]aaaaaa5Y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aaaaaaaaaaaLL	:  hjj	 

 5555@\EJ[D\\@D\\\\\\\\\\\@D\\\\\\@\\\\D\\\\\\\\\\\\\\\\\\\\\\\\\\\\&B%0A*BB&*BBBBBBBBBBB&*BBBBBB&BBBB*BBBBBBBBBBBBBBBBBBBBBBBBBBBB<<	:  hjj	  	  	     	     	    	    q	              	             r)   c                    t                      } |                     dt          f           |                                  |                     d           t	          | dd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t          f           t          d          # t          j        $ r Y d S w xY w)NzINSERT INTO instruments(
             instrument_id,asset_class,name,isin,currency,is_active,instrument_status,valuation_policy,created_at)
           VALUES('atomic-instrument','stock','Atomic','US0000000001','USD',1,'active','live_price',?)zBEGIN IMMEDIATEzatomic-instrumentrX   ATOMNASDAQr   zatomic testrW   rf   F)
r&  r`   provider_symbolprovider_market
confidencer!   rZ   r_   r^   r%   zVSELECT COUNT(*) FROM instrument_price_mappings WHERE instrument_id='atomic-instrument'r   ru   r   r   r|   r}   zINSERT INTO instruments(
                 instrument_id,asset_class,name,isin,currency,is_active,instrument_status,valuation_policy,created_at)
               VALUES('case-duplicate','stock','Duplicate','us0000000001','USD',1,'active','live_price',?)z2canonical ISIN uniqueness must be case-insensitive)r(   r#   r$   r%   r
   rollbackr   r   r   r   r   r   sqlite3IntegrityError)r&   r   r   r   r   r   s         r'   Ktest_mapping_batch_primitives_are_atomic_and_isin_unique_case_insensitivelyr    s   ::DLL	j 
	   	KKMMMLL"###$)     	MMOOO<<` hjj                q                        
Sn F		
 	
 	
 QRRR !   s   ,E E*)E*c                    t                       t                       t                       t                       t	                       t                       t                       t                       t                       t                       dS )zQRun the complete PostFinance contract inside the existing ingestion CI test item.N)
r   r   r   r  r  r)  r4  ra  rv  r  rD   r)   r'   run_postfinance_source_contractr    s    QSSSBDDDkmmmHJJJJLLLNPPP<>>>PRRRQSSSOQQQQQr)   )r   r   )N)r*   r+   r   r,   )rA   r,   r*   r+   r   r,   )r   r,   )r   rs   );
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   __test__r<   pathlibr   r~  zipfiler   r   r  jarvis_finance.api.mainr   )jarvis_finance.api.schemas.portfolio_datar   r	   #jarvis_finance.market_data.mappingsr
   $jarvis_finance.services.cash_servicer   r   &jarvis_finance.services.portfolio_datar   r   r   r   -jarvis_finance.services.portfolio_performancer   )jarvis_finance.services.performance_scoper   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   __file__parentsr:   r$   r(   r@   rQ   rr   r   r   r   r  r  r)  r4  ra  rv  r  r  rD   r)   r'   <module>r     s   " " " " " "              5         ) ) ) ) ) ) ) )  . . . . . . f f f f f f f f P P P P P P a a a a a a a a            V U U U U U Z Z Z Z Z Z 3 3 3 3 3 3 > > > > > >
$x..
 
#j
03Y
Y!   4        &   40 0 0 0@_ _ _ _@K K K K>V V V V(	K 	K 	K 	K) ) ) ).   \b \b \b \b~l l l l^%S %S %S %SPR R R R R Rr)   