
    mvj2                    6   d dl mZ d dlZd dlmc mZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ  G d d          Zd Zd Z h 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$d#Z-dS )&    )annotationsN)Decimal)create_crypto_asset)create_initial_holding_snapshot)create_wallet)data)load_synthetic_demo_data)page_12_crypto_manage)
PriceQuotestore_crypto_price)connect_memory)apply_migrationsc                  4    e Zd Zdddddd
ZddZd Zd ZdS )FakeStreamlitN)inputs
checkboxesbutton_pressesset[str] | Noner   dict[str, object] | Noner   returnNonec                   g | _         | | _        i | _        |pt                      | _        |pi | _        |pt                      | _        d S N)callssidebarsession_statesetr   r   r   )selfr   r   r   s       P/home/agent/.hermes/repos/FinanceManager/tests/unit/test_dashboard_ux_sprint2.py__init__zFakeStreamlit.__init__   sH    NP
,5l$-    namestrc                      fd}|S )Nc                    	j                             | |f           dk    r| rt          | d                   n"t          |                    dd                    }|	j        v o#t          |                    dd                     }|rXt          |                    d                    r6 |d         |                    dd	          i |                    d
i            |S dk    r| rt          | d                   n"t          |                    dd                    }t          |                    d|                    }t          	j                            ||	j        v                     S dk    r#t          |                    dd                    S dv rEt          |                    d| r| d         nd                    }|	j        v r	j        |         S dS dv rt          |           dk    r| d         n|                    dg           }t          |                    d| r| d         nd                    }|	j        v r	j        |         S |rt          |          d         nd S dv rM| r| d         ng }t          |t                    r|nt          |          }	fdt          |          D             S dk    r	S d S )Nbuttonr   label disabledFon_clickargs kwargscheckboxkeytogglevalue>   	text_area
date_input
text_input>   pillsradio	selectbox   options>   tabscolumnsc                    g | ]}S r,   r,   ).0_r   s     r   
<listcomp>z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>6   s    333333r!   expander)r   appendr#   getr   boolcallabler   r   lenlist
isinstanceintrange)
r+   r-   r'   pressedr/   r9   valuescountr"   r   s
           r   recorderz+FakeStreamlit.__getattr__.<locals>.recorder   s   JtT62333x(,NDG#fjj"6M6M2N2N4#66btFJJz[`DaDa?b?b;b \x

:(>(>?? \&F:&

62(>(>[&**XWYBZBZ[[[z!!(,NDG#fjj"6M6M2N2N&**UE2233DKOOC$/1IJJKKKxFJJw66777@@@&**Ut,CDGGDDEE$+%%;s++r666%(YY]]$q''

9b8Q8Q&**Ut,CDGGDDEE$+%%;s+++2<tG}}Q''<***$(0ab",VS"9"9Js6{{3333eEll3333z!!4r!   r,   )r   r"   rM   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!   r   )r   r   r   r   r   r   r   r   )r"   r#   )__name__
__module____qualname__r    rN   rP   rR   r,   r!   r   r   r      st        .ei  JN . . . . . .! ! ! !F      r!   r   c                 ^    t                      } t          |            t          |            | S r   )r   r   r	   )conns    r   setup_demo_connrX   C   s.    DTT"""Kr!   c                 r   t                      } t          |            t          | dddd          }t          | dddd	          }t          | d
dd          }t          | ddd          }t	          | ||t          d          ddd           t	          | ||t          d          dd	d           t	          | ||t          d          ddd           t          | |t          ddt          d          dd                     t          | |t          ddt          d          dd                     | S ) NMetaMask DemozSoftware WalletMetaMaskz2026-01-31T10:00:00Z)wallet_namewallet_typeplatform_providerlast_verified_atSwissBorg DemoExchange	SwissBorgz2026-01-31T11:00:00ZEthereumETHethereum)	coin_namesymbolcoingecko_idBitcoinBTCbitcoin2verifiedzsynthetic eth split)asset_id	wallet_idquantityverification_statusr_   notez
0.00000001stalez2026-01-01T00:00:00Zzsynthetic btc tinyCHFz2500.00zsynthetic-cachez2026-02-01T00:00:00Z)providerprovider_timestamp)rn   quotez40000.00)r   r   r   r   r   r   r   r   )rW   w1w2ethbtcs        r   setup_multi_wallet_crypto_connr|   J   s   DT	tFWku  I_  
`  
`  
`B	t)9zep  DZ  
[  
[  
[B
djU_
`
`
`C
diT]
^
^
^C#D3"wWZ||q{  Oe  lA  B  B  B  B#D3"wWZ||q{  Oe  lA  B  B  B  B#D3"wWcOdOd  {B  Uk  rF  G  G  G  GtcJwW`OaOal}  Si  2j  2j  2j  k  k  k  ktcIugV`NaNal}  Si  2j  2j  2j  k  k  k  kKr!   >   rule_idrn   	dedup_key	entity_id	source_idro   
account_idfingerprinthedge_statusinstrument_idprovider_symbol_statusr   r   c            
     r   t                      } t          j        |           }|sedddt          j                    v st          j        |          rt          j        |          ndiz  }t          t          j	        |                    t          j
        |d                   }t          |          }d}||k    }|st          j        d|fd||f          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        |          d
z  }dd|iz  }t          t          j	        |                    d x}x}}t          j        }	 |	|          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |	          d	t          j                    v st          j        |          rt          j        |          nd	t          j        |          dz  }
t          t          j	        |
                    d x}	}|d         d         }|j        }d} ||          }|ssdt          j        |          t          j        |          t          j        |          t          j        |          dz  }t          t          j	        |                    d x}x}x}}d}t          j        }d}t#          |          } ||          }||v }|s5t          j        d|fd||f          t          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          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}x}x}}t          j        }	d} |	|          }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        |          t          j        |          d!z  }d"d#|iz  }t          t          j	        |                    d x}	x}x}x}}t          j        }	d$} |	|          }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        |          t          j        |          d!z  }d"d#|iz  }t          t          j	        |                    d x}	x}x}x}}t          j        |           }g }	g }||k    }|}|s!t          j        }|d         } ||          }|}|sit          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  }|	                    |           |sd+dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          d,z  }|	                    |           t          j        |	d-          i z  }d.d/|iz  }t          t          j	        |                    d x}x}	x}x}x}x}}d0 |D             }	t-          |	          }|sd1d2t          j                    v st          j        t,                    rt          j        t,                    nd2t          j        |	          t          j        |          d3z  }t          t          j	        |                    d x}	}d S )4Nassert %(py0)spy0crypto_rowsr      <=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)srE   visible_cryptor   py1py3py6assert %(py8)spy8Lassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.isdisjoint
}(%(py3)s)
}TECHNICAL_FIELDSr   py2r   py5kurs_chfzCHF zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
}r   r   r   py7'z12345.67in)zp%(py1)s in %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.chf_text
}(%(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
}dashboard_datar   )r   r   r   r   r   py10py12zassert %(py14)spy14missing_market_pricezPreis fehlt==)zV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.translate_status
}(%(py4)s)
} == %(py9)sr   r   py4r   py9assert %(py11)spy11freshAktuell)z%(py2)s == %(py5)s	portfolio)r   r   z%(py7)sr   zJ%(py15)s
{%(py15)s = %(py11)s
{%(py11)s = %(py9)s.isdisjoint
}(%(py13)s)
})r   r   py13py15r8   zassert %(py18)spy18c              3  <   K   | ]}t          |          d k    V  dS )r   N)rE   r=   rows     r   	<genexpr>zUtest_user_mode_crypto_and_portfolio_tables_are_clean_and_formatted.<locals>.<genexpr>u   s,      22s3xx1}222222r!   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr   r   r   )r|   r   get_crypto_coin_summary@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationvisible_user_columnsrE   _call_reprcomparer   
isdisjoint
startswithchf_textr   translate_statusget_portfolio_positions_userrA   _format_boolopr   )rW   r   @py_format1r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9@py_assert1@py_format6@py_assert0@py_assert6@py_format8@py_assert7@py_assert9@py_assert11@py_format13@py_format15@py_assert3@py_assert8@py_format10@py_format12r   @py_assert10@py_assert12@py_assert14@py_format16@py_format17@py_format19@py_format5s                                  r   Btest_user_mode_crypto_and_portfolio_tables_are_clean_and_formattedr   g   s	   )++D 8>>K;;#8QHHN~#!#!##########!############3#####3#############~#####~##########!###########################&6&&~66666666666666666666666666&66666666666~66666~66666666666666666666666666q>*%8%0880088888888%88880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>.)>*>'**=*=>))*=>>>3>>>>>>>>>>>3>>>>>>3>>>>>>>>>>>.>>>>>.>>>>>>)>>>>>>>>>>>'>>>>>'>>>>>>*>>>>*=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*S+AS**+ABBSmSBmSSSSSSSSSSBmSSSSSSSSSSSS>SSSSS>SSSSSS*SSSS+ASSSSBSSSSmSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS*@7@**733@y@3y@@@@@@@@@@3y@@@@@@@@@@@@>@@@@@>@@@@@@*@@@@7@@@@3@@@@y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;DAAIGGG9?GGGGG.9G)A,G99,GGGGGGGGGGGGG9GGGGGGGGGGGG9GGGGG9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9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G22	22223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2r!   c                 0   t                      } t          j        |           }t          j        |           }d |D             d d         }ddg}||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h}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          dz  }dd	|iz  }t          t	          j        |                    d x}x}}d ||z   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 )Nc                    g | ]
}|d          S r'   r,   r   s     r   r?   zVtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<listcomp>|   s    ///SCL///r!      rc   ri   r   z%(py1)s == %(py4)sr   r   assert %(py6)sr   r   	value_chfz10000.00c                    h | ]
}|d          S r   r,   r   s     r   	<setcomp>zUtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<setcomp>~   s    111SCL111r!   rZ   r`   c              3  &   K   | ]}d |vod|vV  dS )rn   ro   Nr,   r   s     r   r   zUtest_chart_data_for_crypto_coin_and_wallet_distribution_is_correct.<locals>.<genexpr>   s1      eeCz$?C)?eeeeeer!   r   r   r   )r|   r    get_crypto_coin_allocation_chart"get_crypto_wallet_allocation_chartr   r   r   r   r   r   r   r   r   )	rW   
coin_chartwallet_chartr   r   r   r   r   r   s	            r   Btest_chart_data_for_crypto_coin_and_wallet_distribution_is_correctr   x   s   )++D@FFJ!DTJJL//J///3N
I7NN37NNNNNNNNNNN37NNNNNN3NNNN7NNNNNNNNNNNNNNNNNNNNNNNNNNNNa=%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11L111XoGW5XX15XXXXXXXXXXX15XXXXXX1XXXX5XXXXXXXXXXXXXXXXXXXXXXXXXXXXee:XdKdeeee3eeeeeeeeeeeeeeee3eeeee3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eer!   c                 ^   t                      } t          d t          j        |           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}||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          |          }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}
}	h d}|d         }t          |          }	||	k    }|st          j        d|fd||	f          t          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |	          dz  }dd|iz  }t          t          j	        |                    d x}x}x}}	t          j        } ||          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dt          j                    v st          j        |          rt          j        |          ndt          j        |          d z  }t          t          j	        |                    d x}}t          j        }|d         d!         } ||          }
|
sd"dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |
          d#z  }t          t          j	        |                    d x}x}}
t          j        |           d!         }t          j        | |d$                   }|d%         }|s:d&d't          j        |          iz  }t          t          j	        |                    d }|d(         }|s:d&d't          j        |          iz  }t          t          j	        |                    d }h d)}|d         }t          |          }	||	k    }|st          j        d|fd||	f          t          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |	          dz  }dd|iz  }t          t          j	        |                    d x}x}x}}	t          j        } ||          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |          d*t          j                    v st          j        |          rt          j        |          nd*t          j        |          d z  }t          t          j	        |                    d x}}d S )+Nc              3  2   K   | ]}|d          dk    |V  dS )rg   rd   Nr,   r   s     r   r   zPtest_coin_detail_and_wallet_detail_are_selectable_read_models.<locals>.<genexpr>   s2      eescRZm_dNdNdsNdNdNdNdeer!   	_asset_idiɚ;)price_max_age_secondscoinrc   r   r   r   r   r   gesamtwert_chfzCHF 10'000.00preisstatusr   walletsr   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srE   r   r   r   r   assert %(py9)sr   >      Bestand hinzufügenBestand auf 0 setzenAudit / Verlauf anzeigenTransferBestand korrigierenactionsr   z0%(py1)s <= %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r   r   r   r   detailr   r   Lassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.isdisjoint
}(%(py4)s)
}r   r   r   r   
_wallet_idr\   zassert %(py1)sr   coins>      Coin in Wallet hinzufügenWallet bearbeitenTransfer aus WalletWallet deaktivierenWallet verifizierenr  wallet_detail)r|   nextr   r   get_crypto_coin_detailr   r   r   r   r   rE   r   r   r   r   r   r   get_wallet_user_overviewget_wallet_detail)rW   rz   r  r   r   r   r   r   r   r   r   r   r   r   r   walletr  @py_format2s                     r   =test_coin_detail_and_wallet_detail_are_selectable_read_modelsr     s"   )++D
eenDTJJeee
e
eC24[9IajkkkF&>'Z'>Z''''''''''>Z'''''>''''Z'''''''''''''''''''''''''''"#66#6666666666#66666#6666666666666666666666666666666- -I- I---------- I----- ----I---------------------------i &3 !!&Q&!Q&&&&&&&&&&!Q&&&&&&&&&&&&3&&&&&3&&&&&& &&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&yyy  T  BH  IR  BS  T  ~A  BS  ~T  ~T  Ty  ~T  T  T  T  T  T  T  T  T  T  Ty  ~T  T  T  T  T  Ty  T  T  T  T  T  T  T  T  T  T  T  ~A  T  T  T  T  T  ~A  T  T  T  T  T  T  BS  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  T  T  T&.&&v..........................&...........v.....v..........................&<vi'8';<&&';<<<<<<<<<<<<<<<<<<<<<<<<<<&<<<<';<<<<<<<<<<<<<<<<<<<<<<<<<<4T::1=F"4T6,;OPPM'''''''''''''''''''''''''!!!!!!!!!!!!!!!!!!!!!!!!! [  [  [  |  cp  qz  c{  |  _b  c{  _|  _|  |  [  _|  |  |  |  |  |  |  |  |  |  |  [  _|  |  |  |  |  |  [  |  |  |  |  |  |  |  |  |  |  |  _b  |  |  |  |  |  _b  |  |  |  |  |  |  c{  |  |  |  |  _|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |&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&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55555555555555555r!   c                 4   t                      } t          j        | d          }t          j        |           }h d}t	          |          }||k    }|st          j        d|fd||f          t          j        |          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        |          dz  }d	d
|iz  }t          t          j        |                    d x}x}}|sedddt          j	                    v st          j
        |          rt          j        |          ndiz  }t          t          j        |                    h d}|d         }	t	          |	          }
||
k    }|st          j        d|fd||
f          t          j        |          dt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |	          t          j        |
          dz  }dd|iz  }t          t          j        |                    d x}x}x}	}
t          j        }|d         } ||          }|sddt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}}|d         d         }|j        }d}	 ||	          }
|
 }|ssdt          j        |          t          j        |          t          j        |	          t          j        |
          dz  }t          t          j        |                    d x}x}x}	x}
}d S )N   )limit>   infowichtigkritischr   z0%(py1)s <= %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   summaryr   r   r   r   r   r   r   r   cards>   titler  affectedseveritydescriptionr   r  r   r   r   r  r   r  r"  missing_zPassert not %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})rX   r   get_alert_cardsget_alert_summary_cardsr   r   r   r   r   r   r   r   r   r   r   r   )rW   r!  r  r   r   r   r   r   r   r   r   r   r   r   r   r   s                   r   8test_alert_cards_are_readable_and_do_not_expose_rule_idsr)     s:   D*4q999E4T::G***:c'll:*l::::::::::*l:::::*:::::::::::c:::::c:::::::::::::':::::'::::::l:::::::::::::::::::::::::::LLLLLLLLLLLL5LLLLL5LLLLLLLLLLLLLLLLFFFWeTUhW#h--WF-WWWWWWWWWWF-WWWWWFWWWWWWWWWWW#WWWWW#WWWWWWh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&0uQx0&&x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0x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Qx 7 +7J7++J77777777777 7777+7777J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                    t                      } t                      }t          j        ||            d |j        D             }d |j        D             }h d}t          |          }||k    }|st          j        d|fd||f          t          j        |          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        |          dz  }d	d
|iz  }t          t          j        |                    d x}x}}t          |          }d}||k    }	|	st          j        d|	fd||f          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        |          dz  }d	d
|iz  }t          t          j        |                    d x}x}	}d S )Nc                6    g | ]\  }}}|d k    ||d         S )r&   r   r,   r=   r"   r+   _kwargss       r   r?   zTtest_crypto_manage_renders_action_cards_not_all_forms_by_default.<locals>.<listcomp>   s3    XXX.4wdh>N>NSW>NtAw>N>N>Nr!   c                6    g | ]\  }}}|d k    ||d         S )r4   r   r,   r,  s       r   r?   zTtest_crypto_manage_renders_action_cards_not_all_forms_by_default.<locals>.<listcomp>   s3    ```2tT7$,BVBV[_BV47BVBVBVr!   >      Coin hinzufügenNeues WalletVerlauf ansehenTransfer zwischen Wallets Bestand entfernen / auf 0 setzenr  r   r  r   buttonsr   r   r      r   rE   text_inputsr   )r|   r   r
   renderr   r   r   r   r   r   r   r   r   r   rE   )
rW   str4  r6  r   r   r   r   r   r   s
             r   @test_crypto_manage_renders_action_cards_not_all_forms_by_defaultr9     s   )++D	B T***XX"(XXXG``bh```K [  [  [  k  _b  c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  _b  k  k  k  k  k  _b  k  k  k  k  k  k  k  k  k  k  k  k  k  cj  k  k  k  k  k  c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{ q q          q            3     3             {     {          q                             r!   c                 z   t                      } d}t          j        | 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
}t          j        | 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 )Nrn   T)
admin_moder   r   )z%(py1)s in %(py4)sr   r   r   ro   )	r|   r   r   r   r   r   r   r   r  )rW   r   r   r   r   r   s         r   1test_admin_mode_can_still_access_technical_fieldsr<     s   )++DY?QUVVVWX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YYYYYYYYYYYYYYYYYYYYYYY[.A$SWXXXYZ[[;[[[[[[[[[[[;[[[[[[;[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[r!   r8  r"   r#   list[tuple[object, ...]]c                *    fd| j         D             S )Nc                (    g | ]\  }}}|k    |S r,   r,   )r=   	call_namer+   r-  r"   s       r   r?   z_call_args.<locals>.<listcomp>   s*    OOO-YgY$=N=ND=N=N=Nr!   )r   )r8  r"   s    `r   
_call_argsrA     s    OOOOOOOOr!   c                    ddl m}  t                      }t                      }|                     ||           d                    d |j        D                       }d}||v }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        |          rt          j	        |          ndd	z  }d
d|iz  }t          t          j        |                    d x}}d}||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}||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}||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 t          |d          D             }|sedddt          j                    v st          j        |          rt          j	        |          ndiz  }	t          t          j        |	                    d |D             }
|
sedddt          j                    v st          j        |
          rt          j	        |
          ndiz  }	t          t          j        |	                    d |
D             }t           j        } ||          }|sddt          j                    v st          j        t                     rt          j	        t                     ndt          j	        |          dt          j                    v st          j        |          rt          j	        |          ndt          j	        |          dz  }t          t          j        |                    d x}}h 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  t          |d!          D             }d"}||v }|st          j        d|fd||f          t          j	        |          d#t          j                    v st          j        |          rt          j	        |          nd#d	z  }d
d|iz  }t          t          j        |                    d x}}d}||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$ |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 )(Nr   )page_03_equities_etfs
c              3  F   K   | ]\  }}}|D ]}t          |          V  d S r   r#   r=   _namer+   r-  args        r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   <      TT#75$tTTc#hhTTTTTTTr!   zGesamtwert CHFr   z%(py1)s in %(py3)stextsr   r   assert %(py5)sr   zCash CHFz
Ohne Preisu   Position aus Liste öffnenDetailpanelu   Position hinzufügenc                X    g | ]'}|t          |d          t                    |d          (S r   rG   rF   r=   r+   s     r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   9    lll$lR\]abc]dfjRkRkld1glllr!   	dataframer   r   table_payloadsc                F    g | ]}|D ]}t          |t                    |S r,   )rG   dict)r=   payloadr   s      r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   s6    dddg7ddCjY\^bNcNcdcddddr!   flattened_rowsc                    h | ]	}|D ]}|
S r,   r,   r=   r   r/   s      r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<setcomp>   s%    AAACSAAcCAAAAr!   r   r   visible_keysr   >   Marktwert CHFStatusAssettypr   )z%(py1)s <= %(py3)sc                "    g | ]}||d          S rQ  r,   rS  s     r   r?   zWtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<listcomp>   s!    DDD4tDtAwDDDr!   r&   zBewertung aktualisierenr4  c              3  Z   K   | ]&}t          |                              d           V  'dS )u   Öffnen:N)r#   r   )r=   r'   s     r   r   zVtest_user_mode_portfolio_page_groups_cash_equities_etfs_without_ids.<locals>.<genexpr>   s6      FFUs5zz$$Z00FFFFFFr!   r   anyr   )jarvis_finance.dashboard.pagesrC  rX   r   r7  joinr   r   r   r   r   r   r   r   r   rA  r   r   rc  )rC  rW   r8  rL  r   r   @py_format4r   rV  r   rZ  r]  r   r   r4  r   r   s                    r   Ctest_user_mode_portfolio_page_groups_cash_equities_etfs_without_idsrg     s$
   DDDDDDD	B  T***IITT28TTTTTE$u$$$$$$$$$$u$$$$$$$$$$$$$$$$u$$$$$u$$$$$$$$$$$$$$$$$$$$$$$$$$$::: <5          <5     <           5     5                           '0'50000000000'500000'000000000005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!=E!!!!!!!!!!=E!!!!!=!!!!!!!!!!!E!!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!U**********!U*****!***********U*****U***************************ll*R*E*ElllN>>dddddN>>AA>AAAL&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444444444222B2lBBBBBBBBBB2lBBBBB2BBBBBBBBBBBlBBBBBl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DD:b(#;#;DDDG$/$//////////$/////$///////////////////////////////////////////!,!W,,,,,,,,,,!W,,,,,!,,,,,,,,,,,W,,,,,W,,,,,,,,,,,,,,,,,,,,,,,,,,,FFgFFFF3FFFFFFFFFFFFFFFF3FFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFr!   c                    t                      } t          j        |           }h d}t          |          }||k    }|st	          j        d|fd||f          t	          j        |          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        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}t          j        }|d	         } ||          }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        |          t	          j        |	          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}
}	t          j        }|d         } ||          }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        |          t	          j        |	          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}
}	|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 S )N>   etf_total_chfcash_total_chfstock_total_chfcrypto_total_chfmissing_fx_countmissing_price_countequity_price_data_as_ofunvalued_position_countr   r  r   r  r   r   r   rj  r   )>=)zG%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.d
}(%(py4)s)
} >= %(py9)sr   r   r   r   rl  rn  )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)srH   r   r   r   )rX   r   get_command_center_summaryr   r   r   r   r   r   r   r   r   drH   )rW   r  r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r   Itest_command_center_summary_has_separate_asset_totals_and_unvalued_countsrt     sW   D7==G	 	 	 	 
W	 	 
	 	 	 	 	 	 	 	 	 	 
	 	 	 	 	 	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	W	 	 	 	 W	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ;G$45;566;!;6!;;;;;;;;;;6!;;;;;;;;;;;;>;;;;;>;;;;;;;;;;5;;;;6;;;;!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=G$67=788=A=8A==========8A============>=====>==========7====8====A===============================,-33-..3!3.!3333333333.!3333333333333333333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3r!   c                 	   ddl m}  t                      }t                      }|                     ||           d                    d |j        D                       }d}||v }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        |          rt          j	        |          ndd	z  }d
d|iz  }t          t          j        |                    d x}}d}||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}||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}||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   )page_00_command_centerrD  c              3  F   K   | ]\  }}}|D ]}t          |          V  d S r   rF  rG  s        r   r   z]test_command_center_renders_clear_price_update_labels_without_internal_ids.<locals>.<genexpr>   rJ  r!   zGesamtportfolio CHFr   rK  rL  rM  rN  r   z
Aktien CHFzETFs CHFzUnbewertete PositionenzTop 5 Crypto-Positionenrn   not inz%(py1)s not in %(py3)sr   )rd  rv  rX   r   r7  re  r   r   r   r   r   r   r   r   r   )rv  rW   r8  rL  r   r   rf  r   s           r   Jtest_command_center_renders_clear_price_update_labels_without_internal_idsr{     s   EEEEEED	B!!"d+++IITT28TTTTTE ) E)))))))))) E))))) )))))))))))E)))))E))))))))))))))))))))))))))) <5          <5     <           5     5                           :::#,#u,,,,,,,,,,#u,,,,,#,,,,,,,,,,,u,,,,,u,,,,,,,,,,,,,,,,,,,,,,,,,,,$-$----------$-----$-------------------------------------------":U"""""""""":U""""":"""""""""""U"""""U"""""""""""""""""""""""""""'?%''''''''''?%'''''?'''''''''''%'''''%'''''''''''''''''''''''''''''r!   c                    ddl m}  d}| j        }||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd	|iz  }t          t          j
        |                    d x}x}}d
}| j        }||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd	|iz  }t          t          j
        |                    d x}x}}d
}| j        }||v}|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd	|iz  }t          t          j
        |                    d x}x}}| j        d         }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   )main	Portfolior   )z8%(py1)s in %(py5)s
{%(py5)s = %(py3)s.USER_PAGE_TITLES
}r}  )r   r   r   zassert %(py7)sr   u   Portfolio Übersicht)z9%(py1)s in %(py5)s
{%(py5)s = %(py3)s.ADMIN_PAGE_TITLES
}rx  )z<%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.USER_PAGE_TITLES
}zEquities/ETFsr   r   r   r   r   )jarvis_finance.dashboardr}  USER_PAGE_TITLESr   r   r   r   r   r   r   r   ADMIN_PAGE_TITLESTITLE_ALIASES)	r}  r   r   r   r   r   r   r   r   s	            r   Jtest_user_mode_navigation_uses_new_portfolio_page_and_admin_keeps_overviewr     so   ------/$//;///////////;//////;///////////$/////$//////////////////////////////////!;T%;;!%;;;;;;;;;;;!%;;;;;;!;;;;;;;;;;;T;;;;;T;;;;;;%;;;;;;;;;;;;;;;;;;;;;;;;;;;;!>)>>!)>>>>>>>>>>>!)>>>>>>!>>>>>>>>>>>>>>>>>>>>>>)>>>>>>>>>>>>>>>>>>>>>>>>>>>>o.=+=.+==========.+=====.====+=============================r!   c                    ddl m}  t                      }|                    d           |                                 t                      }|                     ||           d                    d |j        D                       }d}||v }|st          j
        d|fd||f          t          j        |          d	t          j                    v st          j        |          rt          j        |          nd	d
z  }dd|iz  }t          t          j        |                    d x}}d}||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 t#          |d          D             }|sedddt          j                    v st          j        |          rt          j        |          ndiz  }	t          t          j        |	                    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   )page_08_reportsaE  
        INSERT INTO reports(report_id, report_type, title, file_path, format, generated_at, data_quality_status, created_at)
        VALUES ('report-demo', 'crypto_inventory', 'Demo Report', '/home/agent/jarvis_runtime/finance-system/reports/demo.html', 'html', '2026-02-01T00:00:00Z', 'ok', '2026-02-01T00:00:00Z')
        rD  c              3  F   K   | ]\  }}}|D ]}t          |          V  d S r   rF  rG  s        r   r   zBtest_reports_user_mode_hides_runtime_file_paths.<locals>.<genexpr>  rJ  r!   zRuntime-Reports-Ordnerr   rK  rL  rM  rN  r   	file_pathrx  rz  z/home/agent/jarvis_runtimec                X    g | ]'}|t          |d          t                    |d          (S rQ  rR  rS  s     r   r?   zCtest_reports_user_mode_hides_runtime_file_paths.<locals>.<listcomp>  rT  r!   rU  r   r   rV  c                    h | ]	}|D ]}|
S r,   r,   r\  s      r   r   zBtest_reports_user_mode_hides_runtime_file_paths.<locals>.<setcomp>  s%    OOOs3OOCsOOOOr!   )z%(py1)s not in %(py4)sr   r   r   )rd  r  rX   executecommitr   r7  re  r   r   r   r   r   r   r   r   r   rA  )r  rW   r8  rL  r   r   rf  r   rV  r   r   r   r   s                r   /test_reports_user_mode_hides_runtime_file_pathsr     s   >>>>>>DLL	   	KKMMM	B2t$$$IITT28TTTTTE#,#u,,,,,,,,,,#u,,,,,#,,,,,,,,,,,u,,,,,u,,,,,,,,,,,,,,,,,,,,,,,,,,,#;e##########;e#####;###########e#####e###########################'4'u4444444444'u44444'44444444444u44444u444444444444444444444444444ll*R*E*ElllN>>OOOnQ.?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OOOOOOOOOOOOOOOOOOOOOOOOOr!   )r   r   )r8  r   r"   r#   r   r=  ).
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   decimalr   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   jarvis_finance.crypto.walletsr   r  r   r   "jarvis_finance.dashboard.demo_datar	   rd  r
   jarvis_finance.market.providersr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   rX   r|   r   r   r   r  r)  r9  r<  rA  rg  rt  r{  r  r  r,   r!   r   <module>r     sU   " " " " " "                     < < < < < < J J J J J J 7 7 7 7 7 7 ; ; ; ; ; ; G G G G G G @ @ @ @ @ @ J J J J J J J J : : : : : : > > > > > >0 0 0 0 0 0 0 0f       3 3 3 3"f f f f6 6 6 6(8 8 8 8! ! ! !\ \ \ \P P P PG G G G:4 4 4 4$( ( ( ("> > > >P P P P P Pr!   