
    :=j$                    ^   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Zd dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZ 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*  G d d          Z+d Z,d Z-d#dZ.d#dZ/d#dZ0d#dZ1d#dZ2d#dZ3d$dZ4d#dZ5d#dZ6d%d"Z7dS )&    )annotationsN)Decimal)Path)load_settings)data)load_synthetic_demo_data)	page_00_command_centerpage_01_portfoliopage_04_cryptopage_05_walletspage_06_ledgerpage_09_alertspage_10_auditpage_11_settings_data_qualitypage_12_crypto_manage)connect_memory)create_crypto_asset)create_initial_holding_snapshot)create_wallet)
PriceQuotestore_crypto_price)apply_migrationsc                  *    e Zd Zd
dZddZd Zd Zd	S )FakeStreamlitreturnNonec                "    g | _         | | _        d S N)callssidebarselfs    I/home/agent/.hermes/repos/FinanceManager/tests/unit/test_dashboard_mvp.py__init__zFakeStreamlit.__init__   s    NP
    namestrc                      fd}|S )Nc                    j                             | |f           dv rdS dv rdS dv rJt          |           dk    r| d         n|                    dg           }|rt	          |          d         nd S d	k    rfd
| r| d         ng D             S dk    rS dk    rJ| r| d         nd}t          |t                    rfdt          |          D             S fd|D             S d S )N>   buttoncheckboxF>   	text_area
date_input
text_input >   radio	selectbox   optionsr   tabsc                    g | ]}S  r6   .0_r"   s     r#   
<listcomp>z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>.   s    @@@@@@r%   expandercolumnsc                    g | ]}S r6   r6   r7   s     r#   r:   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>4   s    777QD777r%   c                    g | ]}S r6   r6   r7   s     r#   r:   z?FakeStreamlit.__getattr__.<locals>.recorder.<locals>.<listcomp>5   s    ,,,,,,r%   )r   appendlengetlist
isinstanceintrange)argskwargsr3   countr&   r"   s       r#   recorderz+FakeStreamlit.__getattr__.<locals>.recorder$   s@   JtT62333---u@@@r---%(YY]]$q''

9b8Q8Q+2<tG}}Q''<v~~@@@@$'>tAwwB@@@@z!!y  #'.QQeS)) 87777%,,7777,,,,e,,,,4r%   r6   )r"   r&   rI   s   `` r#   __getattr__zFakeStreamlit.__getattr__#   s)    	 	 	 	 	 	& r%   c                    | S r   r6   r!   s    r#   	__enter__zFakeStreamlit.__enter__9   s    r%   c                    dS )NFr6   )r"   rF   s     r#   __exit__zFakeStreamlit.__exit__<   s    ur%   Nr   r   )r&   r'   )__name__
__module____qualname__r$   rJ   rL   rN   r6   r%   r#   r   r      sZ              ,      r%   r   c                 ^    t                      } t          |            t          |            | S r   )r   r   r   )conns    r#   setup_demo_connrU   @   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)rk   quotez40000.00)r   r   r   r   r   r   r   r   )rT   w1w2ethbtcs        r#   setup_multi_wallet_crypto_connry   H   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%   r   r   c                 .   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}||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}t          |          }	d}
t          |
          }|	|z   }||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        |          dt          j
                    v st          j        t                    rt          j        t                    ndt          j        |          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}x}x}	x}
x}}t          j        |           }t          d |D                       }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }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:ddt          j        |          iz  }t          t          j        |                    d }h d }t          |          }||z  }| }|sd!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  }t          t          j        |                    d x}x}x}}d S )%N
coin_countri   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6wallets_with_holdingsholding_count3total_value_chfz10000.00z0.0004)z~%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == (%(py10)s
{%(py10)s = %(py6)s(%(py8)s)
} + %(py15)s
{%(py15)s = %(py11)s(%(py13)s)
})r   )	py0py2r   r   py8py10py11py13py15zassert %(py18)spy18c              3  2   K   | ]}|d          dk    |V  dS rd   ra   Nr6   r8   rows     r#   	<genexpr>zPtest_crypto_summary_cards_and_coin_aggregation_across_wallets.<locals>.<genexpr>_   s0      ==sc(mu&<&<s&<&<&<&<==r%   coinr`   gesamtmenge4walletskurs_chfzCHF 2'500.00gesamtwert_chfzCHF 10'000.00anteilassert %(py1)sr   >   rk   	dedup_keyrl   candidate_countprovider_symbol_statusz<assert not (%(py1)s & %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
})setrw   )r   r   py3py5)ry   dashboard_dataget_crypto_summary_cards
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   @py_builtinslocals_should_repr_global_nameget_crypto_coin_summarynextr   )rT   summary@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert7@py_assert9@py_assert12@py_assert14@py_assert16@py_assert5@py_format17@py_format19rowsrw   @py_format2@py_assert4@py_assert6@py_format8s                         r#   =test_crypto_summary_cards_and_coin_aggregation_across_walletsr   W   s   )++D5d;;G< 'C' C'''''''''' C''''' ''''C'''''''''''''''''''''''''''*+2s2+s2222222222+s22222+2222s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?#*s*#s**********#s*****#****s***************************,-Y7-..Y*Y'*2E2EYPXYPXHYHYY2EHY2YY.2YYYYYYYYYYY.2YYYYYYYYYYYYY7YYYYY7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Y2EYYYYYYYYYYYYYYYYYYYYYYPXYYYYHY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1$77D
==d===
=
=Cv;$*$;*$$$$$$$$$$;*$$$$$;$$$$*$$$$$$$$$$$$$$$$$$$$$$$$$$$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$y> S >S          >S     >    S                           z?,n,?n,,,,,,,,,,?n,,,,,?,,,,n,,,,,,,,,,,,,,,,,,,,,,,,,,, 3O3 O3333333333 O33333 3333O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x===cccofijmfnfnocfnnonooooooocooooooooooofiooooofiooooooooooooojmooooojmoooooofn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%   c            	        t                      } t          d t          j        |           D                       }t          j        | |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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 |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             }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}}h d}|d         }t          |          }	||	z  }
|
 }|sdt          j        |          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}x}x}	x}
}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         }t!          |          }d}
t!          |
          }||k    }	|	s"t          j        d|	fd||f          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |          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}	x}
}t          j        |           }|d         d          }|s:d!d"t          j        |          iz  }t          t          j	        |                    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&}|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 ))Nc              3  2   K   | ]}|d          dk    |V  dS r   r6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>k   s4      ii3RUV^R_chRhRh3RhRhRhRhiir%   	_asset_idc                    g | ]
}|d          S )walletr6   r   s     r#   r:   zStest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<listcomp>m   s    ,,,cCM,,,r%   rW   r]   r|   r~   r   r   r   c                    h | ]
}|d          S )menger6   r   s     r#   	<setcomp>zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<setcomp>n   s    +++SCL+++r%   ri   c              3  .   K   | ]}|d          dk    V  dS )wert_chfzCHF 5'000.00Nr6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>o   s+      CCSs:.0CCCCCCr%   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr   r   r   c              3  .   K   | ]}|d          dk    V  dS )r   z50.00%Nr6   r   s     r#   r   zRtest_coin_wallet_drilldown_and_wallet_summary_are_user_friendly.<locals>.<genexpr>p   s+      ;;Ss8}(;;;;;;r%   >   rk   raw_jsonr   rl   r   z<assert not (%(py1)s & %(py6)s
{%(py6)s = %(py2)s(%(py4)s)
})r   )r   r   r   r   wallet_countr   10000)>=)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   r   r   r   r   r   r   assert %(py12)spy12rY   r   r   inz%(py1)s in %(py4)sr{   rl   not inz%(py1)s not in %(py4)s)ry   r   r   r   get_crypto_coin_wallet_detailsr   r   r   r   r   r   r   r   r   r   get_wallet_overview_cardsr   get_wallet_user_overview)rT   eth_rowdetailr   r   r   r   r   r   r   r   @py_assert8@py_format9r   r   @py_format11@py_format13wallet_rowsr   s                      r#   ?test_coin_wallet_drilldown_and_wallet_summary_are_user_friendlyr   i   s   )++Dii."H"N"NiiiiiG:4AUVVF,,V,,,SBR0SS,0SSSSSSSSSSS,0SSSSSS,SSSS0S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++F+++4u4+u4444444444+u4444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CCFCCCC3CCCCCCCCCCCCCCCC3CCCCC3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;;F;;;;3;;;;;;;;;;;;;;;;3;;;;;3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BBBTPQTS^^TB^STSTTTTTTTBTTTTTTTTTTTSTTTTTS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T6t<<G>")c)"c))))))))))"c)))))"))))c))))))))))))))))))))))))))),-B7-..B'B''2B2BB.2BBBBBBBBBBB.2BBBBBBBBBBBBB7BBBBB7BBBBBB-BBBB.BBBBBBBBBBB'BBBBB'BBBBBB'BBBB2BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 9$??Kq>-(((((((((((((((((((((((((.A...............................................);q>)<>))))))))))<>)))))<))))>))))))))))))))))))))))))))),k!n,;n,,,,,,,,,,;n,,,,,;,,,,n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r%   c                    t                      } t          j        | d          }t          j        | 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}|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 )NF)
admin_modeTrk   r   r   r   r   r   r   r   r   r   re   )ry   r   r   r   r   r   r   r   )rT   	user_rows
admin_rowsr   r   r   r   r   s           r#   Btest_user_mode_hides_technical_fields_and_admin_mode_can_show_themr   |   s   )++D6tNNNI7NNNJ)Yq\):\)))))))))):\))))):))))\)))))))))))))))))))))))))))&)A,&;,&&&&&&&&&&;,&&&&&;&&&&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&A&:&&&&&&&&&&:&&&&&:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*Z]*>]**********>]*****>****]*****************************r%   c                    t                      } t          j        |           }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 )Ntotal_portfolio_chfr   z%(py1)s in %(py3)sr   r   r   assert %(py5)sr   crypto_total_chfequity_etf_total_chfcash_total_chfcritical_alert_countlast_price_update_at)ry   r   get_command_center_summaryr   r   r   r   r   r   r   r   )rT   r   r   r   @py_format4@py_format6s         r#   9test_command_center_summary_includes_user_overview_fieldsr      s   )++D7==G + G++++++++++ G+++++ +++++++++++G+++++G+++++++++++++++++++++++++++(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((!,!W,,,,,,,,,,!W,,,,,!,,,,,,,,,,,W,,,,,W,,,,,,,,,,,,,,,,,,,,,,,,,,,&w&&&&&&&&&&w&&&&&&&&&&&&&&&&w&&&&&w&&&&&&&&&&&&&&&&&&&&&&&&&&&!,!W,,,,,,,,,,!W,,,,,!,,,,,,,,,,,W,,,,,W,,,,,,,,,,,,,,,,,,,,,,,,,,,!,!W,,,,,,,,,,!W,,,,,!,,,,,,,,,,,W,,,,,W,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r%   c            	     V   t                      } t                      }t          t          t          t
          t          t          t          t          t          f	D ]}|                    ||            d |j        D             }t          |          }|sddt          j                    v st!          j        t                    rt!          j        t                    ndt!          j        |          t!          j        |          dz  }t'          t!          j        |                    d x}}d S )Nc              3  *   K   | ]}|d          dv V  dS )r   >   titleheader	subheaderNr6   )r8   calls     r#   r   zFtest_dashboard_modules_import_and_page_render_smoke.<locals>.<genexpr>   s,      PPttAw::PPPPPPr%   r   anyr   )rU   r   r	   r
   r   r   r   r   r   r   r   renderr   r  r   r   r   r   r   r   r   )rT   stmoduler   r   r   s         r#   3test_dashboard_modules_import_and_page_render_smoker     s   D	B%
     	b$PPrxPPPP3PPPPPPPPPPPPPPPP3PPPPP3PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr%   c            	     f   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         }t          |          }d	}t          |          }	||	k    }
|
s"t          j        d
|
fd||	f          dt          j
                    v st          j        t                    rt          j        t                    ndt          j        |          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}
x}}	|d         }t          |          }d	}t          |          }	||	k    }
|
s"t          j        d
|
fd||	f          dt          j
                    v st          j        t                    rt          j        t                    ndt          j        |          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}
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        } ||           }|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        } ||           }|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 )Nbase_currencyrq   r|   r~   r   r   r   r   0)>)zO%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   r   r   r   r   zWassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_platform_overview
}(%(py3)s)
}r   rT   )r   r   r   r   zYassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_ledger_transactions
}(%(py3)s)
}zRassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_audit_events
}(%(py3)s)
})rU   r   r   r   r   r   r   r   r   r   r   r   get_platform_overviewget_ledger_transactionsget_audit_events)rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r#   :test_dashboard_reader_functions_return_expected_dummy_datar     sD   D7==G?#,u,#u,,,,,,,,,,#u,,,,,#,,,,u,,,,,,,,,,,,,,,,,,,,,,,,,,,+,<7,--<<<-<<<<<<<<<<-<<<<<<<<<<<<7<<<<<7<<<<<<,<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-.>7.//>#>'#,,>/,>>>>>>>>>>/,>>>>>>>>>>>>7>>>>>7>>>>>>.>>>>/>>>>>>>>>>>'>>>>>'>>>>>>#>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/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1711$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177777777777$77777$77777777777777777777777777*0**4000000000000000>00000>000000*0000000000040000040000000000000000000000000000r%   monkeypatchpytest.MonkeyPatchc                   d }|                      d|           t                      }t                      }t          j        ||           t          j        |          }|sedddt          j                    v st          j
        |          rt          j        |          ndiz  }t          t          j        |                    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 )
Nc                      t          d          )Nz8dashboard must not call CoinGecko/API provider on render)r   )rF   rG   s     r#   explodezOtest_crypto_dashboard_reads_cached_db_prices_without_api_calls.<locals>.explode   s    WXXXr%   z@jarvis_finance.market.providers.CoinGeckoClient.get_crypto_priceassert %(py0)sr   r   c              3  &   K   | ]}|d          V  dS )latest_price_chfNr6   r   s     r#   r   zQtest_crypto_dashboard_reads_cached_db_prices_without_api_calls.<locals>.<genexpr>   s(      773s%&777777r%   r   r  r   )setattrrU   r   r   r  r   get_crypto_overviewr   r   r   r   r   r   r   r  )	r  r  rT   r  r   @py_format1r   r   r   s	            r#   >test_crypto_dashboard_reads_cached_db_prices_without_api_callsr     sj   Y Y Y Z\cdddD	B"d###-d33DKKKKKKKKKKKK4KKKKK4KKKKKKKKKKKKKKKK77$7777377777777777777773777773777777777777777777777777777777777r%   c                 ,   t                      } 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 ]}d	}|d
         }|j        }	 |	            }
||
v}|st          j        d|fd||
f          t          j        |          t          j        |          t          j        |	          t          j        |
          dz  }dd|iz  }t          t          j
        |                    d x}x}x}x}	}
d S )Nc                    h | ]
}|d          S )rm   r6   r   s     r#   r   zJtest_dashboard_preserves_decimal_crypto_quantity_format.<locals>.<setcomp>   s    999c#j/999r%   z0.0899r   r   
quantitiesr   r   r   Erm   r   )zH%(py1)s not in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.upper
}()
})r   r   r   r   zassert %(py10)sr   )rU   r   get_crypto_by_walletr   r   r   r   r   r   r   r   upper)rT   r   r  r   r   r   r   r   r   r   r   r   r   s                r#   7test_dashboard_preserves_decimal_crypto_quantity_formatr"     s   D 5d;;K99[999J!8z!!!!!!!!!!8z!!!!!8!!!!!!!!!!!z!!!!!z!!!!!!!!!!!!!!!!!!!!!!!!!!! 2 21#j/1//1//111s11111111111s111111s1111/1111/11111111111111111111111111111111111112 2r%   c                    t                      } t          j        |           }|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}}d S )Nr  r   alerts>   statuspriorityr   fingerprintlast_seen_atoccurrence_countr   )<=)z0%(py1)s <= %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r   )r   r   r   py7zassert %(py9)spy9)rU   r   
get_alertsr   r   r   r   r   r   r   r   r   )	rT   r$  r  r   r   r   r   r   @py_format10s	            r#   )test_alert_lifecycle_data_loaded_readablyr/     s   D&t,,FMMMMMMMMMMMM6MMMMM6MMMMMMMMMMMMMMMMaaasiopqirsehiresessaesssssssssssaessssssasssssssssssehsssssehssssssirsssses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sr%   tmp_pathr   c           	        | dz  }|                                  |dz                      d           t          j        t          d          5  t          |dt          |dz            i           d d d            d S # 1 swxY w Y   d S )	Nrepozpyproject.tomlz[project]
name='demo'
z!Runtime directory must be outside)matchJARVIS_FINANCE_RUNTIME_DIRruntime)	repo_rootenviron)mkdir
write_textpytestraises
ValueErrorr   r'   )r0  r2  s     r#   7test_dashboard_runtime_path_inside_repo_remains_blockedr=     s    fDJJLLL	(()CDDD	z)L	M	M	M e e/KSQUXaQaMbMb.cdddde e e e e e e e e e e e e e e e e es   $A>>BBrO   )r  r  r   r   )r0  r   r   r   )8
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   decimalr   pathlibr   r:  jarvis_finance.config.settingsr   jarvis_finance.dashboardr   r   "jarvis_finance.dashboard.demo_datar   jarvis_finance.dashboard.pagesr	   r
   r   r   r   r   r   r   r   jarvis_finance.storage.databaser   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   jarvis_finance.crypto.walletsr   jarvis_finance.market.providersr   r   !jarvis_finance.storage.migrationsr   r   rU   ry   r   r   r   r   r  r  r  r"  r/  r=  r6   r%   r#   <module>rO     s   " " " " " "                            8 8 8 8 8 8 ; ; ; ; ; ; G G G G G G
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ; : : : : : < < < < < < J J J J J J 7 7 7 7 7 7 J J J J J J J J > > > > > >       D    p p p p$- - - -&+ + + +- - - -Q Q Q Q$1 1 1 1
8 
8 
8 
82 2 2 2t t t te e e e e er%   