
    Yaj$                       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mZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlmZm 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dZ-dS )    )annotationsNDecimal)Path)RuntimePathsSettings)adjust_crypto_positiontransfer_crypto_position)data)main)page_00_command_centerpage_04_cryptopage_05_walletspage_08_reports)export_crypto_inventory_report)FakeStreamlitsetup_multi_wallet_crypto_connreturnNonec                    t          d          } t          d |                     d          D                       }g }||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd	|iz  }t          t          j
        |                    d x}}t          j        } |            }g 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}t          j        } |            }||v}|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}}d S )Nz"src/jarvis_finance/dashboard/pagesc              3  $   K   | ]}|j         V  d S N)name).0ps     s/home/agent/.hermes/worktrees/FinanceManager-test-baseline/tests/unit/test_dashboard_functional_ux_stabilization.py	<genexpr>zAtest_auto_streamlit_page_stubs_are_not_present.<locals>.<genexpr>   s$      MMa16MMMMMM    z[0-9][0-9]_*.py==)z%(py0)s == %(py3)snumeric_pages)py0py3assert %(py5)spy5)zCommand Center	PortfolioCryptoWallets   Position hinzufügenReports)zY%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_user_navigation_titles
}()
} == %(py7)sdashboard_main)r"   py2py4py7assert %(py9)spy9	Watchlistnot inz]%(py1)s not in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_user_navigation_titles
}()
}py1r#   r%   r.   )r   sortedglob
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr+   get_user_navigation_titles)	pages_dirr!   @py_assert2@py_assert1@py_format4@py_format6@py_assert3@py_assert6@py_assert5@py_format8@py_format10@py_assert0@py_assert4s                r   .test_auto_streamlit_page_stubs_are_not_presentrN      s   9::IMM9>>:K+L+LMMMMMM=B=B==B4  R4466  R  ;R  ;R  ;R  R6  ;R  R  R  R  R  R  R  R  R  R  R6  ;R  R  R  R  R  R  R  R  R  R  R  R  R>  R  R  R  R  R>  R  R  R  R  R  R4  R  R  R  R6  R  R  R  R  ;R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  RInGIGG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InIIIIInIIIIIIG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Ir   c            	        t                      } t          dh          }t          j        ||            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}}|j        }|j        }d
}	 ||	          }
d}|
|k    }|st          j        d|fd|
|f          dt          j	                    v st          j
        |          rt          j        |          ndt          j        |          t          j        |          t          j        |	          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}	x}
x}}d S )Nu   + Position hinzufügenbutton_pressesc                6    g | ]\  }}}|d k    ||d         S )buttonr    r   r   args_s       r   
<listcomp>zGtest_command_center_has_visible_add_position_action.<locals>.<listcomp>   s1    RRR=4q8H8HT8HtAw8H8H8Hr   inz%(py1)s in %(py3)sbuttonsr6   r#   r$   r%   jarvis_requested_pager)   r   )zm%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.session_state
}.get
}(%(py6)s)
} == %(py11)sst)r"   r,   r-   py6py8py11zassert %(py13)spy13)r   r   r   rendercallsr9   r:   r>   r;   r<   r=   r?   r@   session_stateget)connr_   r\   rL   rC   rE   rF   rD   rG   rI   @py_assert7@py_assert10@py_assert9@py_format12@py_format14s                  r   3test_command_center_has_visible_add_position_actionrn      sY   )++D	'?&@	A	A	AB!"d+++RRBHRRRG#.#w..........#w.....#...........w.....w...........................RR 7R 788R<RR8<RRRRRRRRRRR8<RRRRRRRRRRRRR2RRRRR2RRRRRRRRRRRRRR 7RRRR8RRRR<RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRr   c                 b   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 S )Nr   )page_17_position_add
c              3  F   K   | ]\  }}}|D ]}t          |          V  d S r   str)r   _namerV   _kwargsargs        r   r   zStest_position_add_page_is_user_mode_wizard_without_technical_ids.<locals>.<genexpr>&   s<      SS"6%wdSSsSXXSSSSSSSr   r)   rY   r[   textr]   r$   r%   u   Assetklasse wählenzInstrument sucheninstrument_idr2   )z%(py1)s not in %(py3)scatalog_entry_id	source_id)jarvis_finance.dashboard.pagesrp   r   r   rd   joinre   r9   r:   r>   r;   r<   r=   r?   r@   )rp   rh   r_   rx   rL   rC   rE   rF   s           r   @test_position_add_page_is_user_mode_wizard_without_technical_idsr~       s   CCCCCC)++D	BD)))99SS"(SSSSSD!)!T))))))))))!T)))))!)))))))))))T)))))T))))))))))))))))))))))))))) ( D(((((((((( D((((( (((((((((((D(((((D(((((((((((((((((((((((((((&$&&&&&&&&&&$&&&&&&&&&&&&&&&&$&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&&?$&&&&&&&&&&?$&&&&&?&&&&&&&&&&&$&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&)T))))))))))T))))))))))))))))T)))))T)))))))))))))))))))))))))))";d"""""""""";d""""";"""""""""""d"""""d"""""""""""""""""""""""""""""r   c                    t                      } t                      }d|j        d<   t          j        ||            d |j        D             }g }|}|r$|d         }|j        }d} ||          }d}	||	u }
|
}|s4ddd	t          j                    v st          j
        |          rt          j        |          nd	iz  }|                    |           |rt          j        d
|
fd||	f          t          j        |          t          j        |          t          j        |          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 |j        D             }t#          |          }|sddt          j                    v st          j
        t"                    rt          j        t"                    ndt          j        |          t          j        |          dz  }t          t          j        |                    d x}}t                      }d|j        d<   t          j        ||            d |j        D             }g }|}|r$|d         }|j        }d} ||          }d}	||	u }
|
}|s4dddt          j                    v st          j
        |          rt          j        |          ndiz  }|                    |           |rt          j        d
|
fd||	f          t          j        |          t          j        |          t          j        |          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}
}	t                      }d|j        d<   t%          j        ||            d |j        D             }g }|}|r$|d         }|j        }d} ||          }d}	||	u }
|
}|s4dddt          j                    v st          j
        |          rt          j        |          ndiz  }|                    |           |rt          j        d
|
fd||	f          t          j        |          t          j        |          t          j        |          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 S )NFjarvis_edit_modec                B    g | ]\  }}}|d k    ||d         dk    |S rS   r   u   Bestand hinzufügenrT   r   r   rV   kwargss       r   rX   z`test_read_only_disables_coin_and_wallet_action_buttons_but_edit_mode_enables.<locals>.<listcomp>4   sb      C  C  C!3tV48CSCSX\CSaefgah  mB  bB  bBf  bB  bB  bBr   r   disabledTz%(py2)sr,   action_buttons)is)zL%(py11)s
{%(py11)s = %(py7)s
{%(py7)s = %(py5)s.get
}(%(py9)s)
} is %(py14)s)r%   r.   r0   rb   py14%(py16)spy16assert %(py19)spy19c              3  X   K   | ]%\  }}}|d v 
|dt          |d                   v V  &dS )>   infocaptionwarningzBearbeiten aktivierenr   Nrs   rU   s       r   r   z_test_read_only_disables_coin_and_wallet_action_buttons_but_edit_mode_enables.<locals>.<genexpr>6   sZ        I  I=4qX\`~X~X~  DHX~&#d1g,,6X~X~X~X~  I  Ir   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr"   r,   r-   c                B    g | ]\  }}}|d k    ||d         dk    |S r   rT   r   s       r   rX   z`test_read_only_disables_coin_and_wallet_action_buttons_but_edit_mode_enables.<locals>.<listcomp>;   sb      E  E  E"4$fTXEUEUZ^EUcghicj  oD  dD  dDv  dD  dD  dDr   action_buttons2c                B    g | ]\  }}}|d k    ||d         dk    |S )rS   r   u   Coin in Wallet hinzufügenrT   r   s       r   rX   z`test_read_only_disables_coin_and_wallet_action_buttons_but_edit_mode_enables.<locals>.<listcomp>A   sb      K  K  K!3tVDHDTDTY]DTbfghbi  nJ  cJ  cJf  cJ  cJ  cJr   wallet_buttons)r   r   rf   r   rd   re   rg   r;   r<   r9   r=   r>   appendr:   _format_boolopr?   r@   r   r   )rh   r_   r   rD   rL   rM   rH   @py_assert8rj   @py_assert13@py_assert12@py_format3@py_format15@py_format17@py_format18@py_format20rG   @py_format5st2r   st3r   s                         r   Ltest_read_only_disables_coin_and_wallet_action_buttons_but_edit_mode_enablesr   /   s   )++D	B+0B'("d### C  Crx  C  C  CNGG>G>GnQ/G/3GJG33J??G4G?4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?4GGGGG/GGGG3GGGGJGGGG?GGGG4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 I  IBH  I  I  I  I3  I  I  I  I  I  I  I  I  I  I  I  I  I  I  I  I3  I  I  I  I  I3  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
//C,0C()#t$$$ E  E	  E  E  EOJJ?J?Jq1J15JjJ55jAAJUJAU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JJJJ?JJJJJJJAUJJJJJ1JJJJ5JJJJjJJJJAJJJJU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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
//C,1C()3%%% K  Ksy  K  K  KNGG>G>GnQ/G/3GJG33J??G4G?4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?4GGGGG/GGGG3GGGGJGGGG?GGGG4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Gr   c                 R   t                      } t          dh          }d|j        d<   t          j        ||            |j        d         }|s:ddt          j        |          iz  }t          t          j        |                    d }|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}}|j        d         }|j        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Bestand korrigierenrP   Tr   selected_crypto_asset_idzassert %(py1)sr6   crypto_manage_actionr   z%(py1)s == %(py4)sr6   r-   assert %(py6)sr`   crypto_manage_asset_id)
r   r   rf   r   rd   r9   r>   r?   r@   r:   )rh   r_   rL   @py_format2rG   rC   r   @py_format7s           r   Atest_crypto_selection_is_saved_and_actions_prefill_manage_contextr   E   s   )++D	'<&=	>	>	>B+/B'("d###6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23L7LL37LLLLLLLLLLL37LLLLLL3LLLL7LLLLLLLLLLLLLLLLLLLLLLLLLLLL45e9IJd9ee59eeeeeeeeeee59eeeeee5eeee9e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                 B   t                      } t          d t          j        |           D                       }t          j        | |d                   }t          | |d         |d         d         dddd	          }|j        }|sxd
dt          j                    v st          j
        |          rt          j        |          ndt          j        |          dz  }t          t          j        |                    d }t          | |d         |d         d         |d         d         ddddd	  	        }|j        }|sxd
dt          j                    v st          j
        |          rt          j        |          ndt          j        |          dz  }t          t          j        |                    d }d t          j        | 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 S )Nc              3  2   K   | ]}|d          dk    |V  dS symbolETHNrT   r   rows     r   r   zHtest_correction_and_transfer_flows_write_audit_events.<locals>.<genexpr>Q   2      eescRZm_dNdNdsNdNdNdNdeer   	_asset_idr   
_wallet_idz2.5z
2026-02-02zmanual review correctionT)asset_id	wallet_idnew_quantity_texteffective_datenoteconfirmz2assert %(py2)s
{%(py2)s = %(py0)s.transaction_id
}adjust)r"   r,      z0.50z
2026-02-03zrebalance wallets)r   from_wallet_idto_wallet_idquantity_textfee_quantity_textr   r   r   transferc                    h | ]
}|d          S )actionrT   )r   rs     r   	<setcomp>zHtest_correction_and_transfer_flows_write_audit_events.<locals>.<setcomp>i   s    ZZZQQx[ZZZr      limitcrypto_manual_adjustmentrY   r[   audit_actionsr]   r$   r%   crypto_transfer)r   nextdashboard_dataget_crypto_coin_summaryget_crypto_coin_wallet_detailsr	   transaction_idr;   r<   r9   r=   r>   r?   r@   r
   get_audit_eventsr:   )rh   ethwalletsr   rD   r   r   r   rL   rC   rE   rF   s               r   5test_correction_and_transfer_flows_write_audit_eventsr   O   s   )++D
eenDTJJeee
e
eC;D#kBRSSG#[!!*\*#'  F               6     6                        '[!qz,/QZ-# 
 
 
H """"""""""""""8"""""8""""""""""""""""""""""""ZZ.*I$VX*Y*Y*YZZZM%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-------------------------------------------------------------r   tmp_pathr   c                   t                      }t          dt          j        |                     }t	          ||dd           }|d         }t          |          }|j        } |            }|sddt          j                    v st          j
        t
                    rt          j        t
                    ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}x}}|d         }t          |          }|j        }t          |           }	 ||	          }
|
sTd	d
t          j                    v st          j
        t                    rt          j        t                    nd
t          j        |          t          j        |          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        |	          t          j        |
          dz  }t          t          j        |                    d x}x}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 )NCHF)base_currencyruntime_pathshtml)settingspreferred_formatrenderer	file_pathz_assert %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.exists
}()
}r   )r"   r,   r-   r`   ra   zassert %(py12)s
{%(py12)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.startswith
}(%(py10)s
{%(py10)s = %(py7)s(%(py8)s)
})
}rt   r   )r"   r,   r-   r`   r.   ra   py10py12formatr   r   r   r   r`   )r   r   r   	from_baser   r   existsr;   r<   r9   r=   r>   r?   r@   rt   
startswithr:   )r   rh   r   resultrD   rG   rI   ri   @py_format9rk   @py_assert11@py_format13rL   rC   r   r   s                   r   +test_report_button_generates_runtime_reportr   n   sn   )++D",X66  H ,D8V\gklllF{#-4#$$-$+-++---------------4-----4------#----$----+----------------------------k"=3"##=#.=s8}}=..}===============3=====3======"====#====.===========s=====s=============8=====8======}==============================(%v%v%%%%%%%%%%v%%%%%%%%%v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r   c                d   t                      }t          dh          }t          |           |j        d<   t	          j        ||           d |j        D             }t          |          }|sddt          j	                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }t          t          j        |                    d x}}|                    d                                          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Crypto-Report erzeugenrP   jarvis_reports_runtime_dirc              3  *   K   | ]\  }}}|d k    V  dS )successNrT   )r   r   _argsrv   s       r   r   zRtest_reports_page_has_real_crypto_report_action_not_dead_button.<locals>.<genexpr>   s.      FF%9T5'ty FFFFFFr   r   r   r   z!SELECT COUNT(*) AS c FROM reportscr   r   r   r   r   r`   )r   r   rt   rf   r   rd   re   r   r;   r<   r9   r=   r>   r?   r@   executefetchoner:   )	r   rh   r_   rD   rG   r   rL   rC   r   s	            r   ?test_reports_page_has_real_crypto_report_action_not_dead_buttonr   z   s   )++D	'?&@	A	A	AB58]]B122t$$$FFRX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<<;<<EEGGLQPQQLPQQQQQQQQQQQLPQQQQQQLQQQQPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQr   c                "   t                      }ddi G fdd          }|                     t          d|           t                      }t          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                                          d         }	|
                    d|	f           t          dh          }
t          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 |
j        D             }t          |          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }t          t          j	        |                    d x}}d S )Nnr   c                  $    e Zd ZddZd fd	ZdS )	Ntest_price_update_button_uses_provider_service_only_on_click.<locals>.Providerr   r   c                    d S r   rT   )selfr   s     r   __init__zWtest_price_update_button_uses_provider_service_only_on_click.<locals>.Provider.__init__   s    Dr   r   c                B    dxx         dz  cc<   fd|D             S )Nr   r   c           
     z    i | ]7}|t          d dg                              |t          d                    8S )zjarvis_finance.market.providers
PriceQuote)fromlist1)
__import__r  r   )r   cidcurrencys     r   
<dictcomp>zttest_price_update_button_uses_provider_service_only_on_click.<locals>.Provider.get_crypto_prices.<locals>.<dictcomp>   sx      b  b  b  MPC$EQ]P^___jjknpx  {B  CF  {G  {G  H  H  b  b  br   rT   )r   coingecko_idsr  re   s     `r   get_crypto_pricesz`test_price_update_button_uses_provider_service_only_on_click.<locals>.Provider.get_crypto_prices   sP    #JJJ!OJJJ b  b  b  b  Ta  b  b  b  br   Nr   r   )r   )__name__
__module____qualname__r   r
  )re   s   r   Providerr      sO        	 	 	 		b 	b 	b 	b 	b 	b 	b 	br   r  CoinGeckoClientr   r   r   r   r`   z5SELECT asset_id FROM crypto_assets WHERE symbol='BTC'r   z*DELETE FROM crypto_prices WHERE asset_id=?zPreise aktualisierenrP   r   c              3  B   K   | ]\  }}}||d k    o	d|d         v V  dS )r   zPreisupdate abgeschlossenr   NrT   rU   s       r   r   zOtest_price_update_button_uses_provider_service_only_on_click.<locals>.<genexpr>   sF      xxP]PTVZ\]swxty K%@DG%Kxxxxxxr   r   r   r   )r   setattrr   r   rd   r9   r:   r>   r?   r@   r   r   re   r   r;   r<   r=   )monkeypatchrh   r  r_   rL   rG   rC   r   r   oldst_clickrD   re   s               @r   <test_price_update_button_uses_provider_service_only_on_clickr     s   )++D!HEb b b b b b b b b b (98DDD	B"d###::?::
,,N
O
O
X
X
Z
Z[e
fCLL=vFFF-C,DEEEH(D)))::?::xxaiaoxxxx3xxxxxxxxxxxxxxxx3xxxxx3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xxxxxxr   c                    t                      } t          j        | d          }d |D             }d}t          ||          }||k    }|s0t	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          nd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 t          j        |           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}
}	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 t          j        | 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}}	d S ) NzWert absteigend)sort_byc                8    g | ]}t          |d                    S )_sort_value_chfr   r   s     r   rX   z;test_crypto_sort_filter_and_chart_order.<locals>.<listcomp>   s&    >>>#gc+,-->>>r   T)reverser   )zA%(py0)s == %(py7)s
{%(py7)s = %(py2)s(%(py3)s, reverse=%(py5)s)
}valuesr7   )r"   r,   r#   r%   r.   r/   r0   c                    g | ]
}|d          S )labelrT   r   s     r   rX   z;test_crypto_sort_filter_and_chart_order.<locals>.<listcomp>   s    ZZZSCLZZZr   EthereumBitcoinr   r   r   r`   bit)searchr   r   BTCc              3  .   K   | ]}|d          dk    V  dS )statusAktuellNrT   r   s     r   r   z:test_crypto_sort_filter_and_chart_order.<locals>.<genexpr>   sC        ]  ]cs8}	)  ]  ]  ]  ]  ]  ]r   r&  iɚ;)status_filterprice_max_age_secondsr   allr   )r   r   r   r7   r9   r:   r;   r<   r=   r>   r?   r@    get_crypto_coin_allocation_chartr)  )rh   rowsr  rM   rH   rD   rJ   rK   rL   rG   rC   r   r   s                r   'test_crypto_sort_filter_and_chart_orderr,     s   )++D1$@QRRRD>>>>>F,01VFD11116111111111116111111111111161111161111111111111V11111V1111111111111F11111F111111D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ZZN$STX$Y$YZZZu_ikt^uuZ^uuuuuuuuuuuZ^uuuuuuZ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uuuu1$uEEEaHR[V[[RV[[[[[[[[[[[RV[[[[[[R[[[[V[[[[[[[[[[[[[[[[[[[[[[[[[[[[ ]  ]^5[\`py  R[  6\  6\  6\  ]  ]  ]  ]3  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]3  ]  ]  ]  ]  ]3  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]r   c                    t                      } t          d t          j        |           D                       }|                     dd           t          j        | |d                   }g }d}|d         }||v}|}|s|d         d         }d}	||	k    }
|
}|st          j        d|fd	||f          t          j        |          t          j        |          d
z  }dd|iz  }|	                    |           |s`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}
}	t          j        |d                   }g }d}||v}|}|rd}||v}|}|sXt          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  }|	                    |           |rt          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          j
        |d          i z  }dd |iz  }t          t          j        |                    d x}x}x}x}x}}d S )!Nc              3  2   K   | ]}|d          dk    |V  dS r   rT   r   s     r   r   zEtest_user_mode_hides_internal_ids_and_import_notes.<locals>.<genexpr>   r   r   z!UPDATE crypto_wallets SET notes=?)zQproductive initial crypto snapshot import 2025-12-31; no wallet address from XLSXr   notizr    r2   )z%(py3)s not in %(py6)s)r#   r`   z%(py8)sra   r   )z%(py11)s == %(py14)s)rb   r   r   r   r   r   r   r   )z%(py3)s not in %(py5)svisible)r#   r%   z%(py7)sr.   )z%(py10)s not in %(py12)s)r   r   z%(py14)sr   zassert %(py17)spy17)r   r   r   r   r   r   r9   r:   r>   r   r   r?   r@   visible_user_columnsr;   r<   r=   )rh   r   detailrD   rC   rI   rM   rL   rj   r   r   r   r   r   r   r   r   r1  rk   r   rF   rJ   r   @py_format16s                           r   2test_user_mode_hides_internal_ids_and_import_notesr6     s   )++D
eenDTJJeee
e
eCLL4  7M  N  N  N:4[AQRRF??7?&)?7)#?????vay'9?R?'9R'????????????7)?????7????)???????????????????????????'9R?????'9????R???????????????????????????????????????????????????????????1&)<<GEE;E;g%EEEEE,E,g*EEEEEEEEEEEE;gEEEEE;EEEEEEEEEEEgEEEEEg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,gEEEEE,EEEEEEEEEEEgEEEEEg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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                      } |                     d           |                     d           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}|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 )NzINSERT INTO instruments(instrument_id, asset_class, name, ticker, isin, currency, created_at) VALUES ('instrument-US9229087690','etf','Vanguard US Total Stock Market ETF','VTI','US9229087690','USD','now')a#  INSERT INTO alerts(alert_id, priority, category, entity_type, entity_id, rule_id, message, status, created_at, last_seen_at, occurrence_count, dedup_key, fingerprint) VALUES ('a1','warnung','fx','instrument','instrument-US9229087690','missing_fx','missing_fx','active','now','now',1,'d','f')r   r   r   z(Vanguard US Total Stock Market ETF (VTI)titlerY   )z%(py1)s in %(py4)sr   r   r`   zinstrument-USr2   )z%(py1)s not in %(py4)s)	r   r   r   get_alert_cardsr9   r:   r>   r?   r@   )rh   cardrL   rG   rC   r   r   s          r   3test_alert_text_resolves_instrument_name_and_tickerr;     s   )++DLL 	W   	LL 	n   )$a888;D5FgF5FFFFFFFFFF5FFFFF5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/$w-/?-//////////?-/////?////-/////////////////////////////r   c                    d} t           j        } |            }| |v}|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}}d S )Nr1   r2   r4   r+   r5   r/   r0   )
r+   rA   r9   r:   r>   r;   r<   r=   r?   r@   )rL   rM   rH   rC   rJ   rK   s         r   5test_watchlist_hidden_from_user_mode_until_functionalr=     s   InGIGG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InIIIIInIIIIIIG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Ir   r  )r   r   r   r   ).
__future__r   builtinsr;   _pytest.assertion.rewrite	assertionrewriter9   decimalr   pathlibr   jarvis_finance.config.settingsr   r   jarvis_finance.crypto.manager	   r
   jarvis_finance.dashboardr   r   r   r+   r|   r   r   r   r   'jarvis_finance.reports.crypto_inventoryr   test_dashboard_ux_sprint2r   r   rN   rn   r~   r   r   r   r   r   r  r,  r6  r;  r=  rT   r   r   <module>rJ     s,   " " " " " "                           A A A A A A A A Y Y Y Y Y Y Y Y ; ; ; ; ; ; ; ; ; ; ; ; s s s s s s s s s s s s R R R R R R S S S S S S S SJ J J JS S S S# # # #H H H H,f f f f. . . .>	& 	& 	& 	&R R R Ry y y y0] ] ] ]F F F F
0 
0 
0 
0J J J J J Jr   