1919
2020import unittest
2121# import requests_cache
22+ from unittest .mock import patch , MagicMock
2223from typing import Union , Any , get_args , _GenericAlias
2324# from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
2425
@@ -1235,6 +1236,54 @@ def test_sector_weightings(self):
12351236 sector_weightings = ticker .funds_data .sector_weightings
12361237 self .assertIsInstance (sector_weightings , dict )
12371238
1239+ class TestTickerValuationMeasures (unittest .TestCase ):
1240+
1241+ _MOCK_HTML = """<html><body>
1242+ <table>
1243+ <tr><td></td><td>Current</td><td>12/31/2025</td><td>9/30/2025</td></tr>
1244+ <tr><td>Market Cap</td><td>3.76T</td><td>4.00T</td><td>3.76T</td></tr>
1245+ <tr><td>Enterprise Value</td><td>3.78T</td><td>4.04T</td><td>3.81T</td></tr>
1246+ <tr><td>Trailing P/E</td><td>32.39</td><td>36.44</td><td>38.64</td></tr>
1247+ <tr><td>Forward P/E</td><td>29.76</td><td>32.79</td><td>31.65</td></tr>
1248+ <tr><td>PEG Ratio (5yr expected)</td><td>2.27</td><td>2.75</td><td>2.44</td></tr>
1249+ <tr><td>Price/Sales</td><td>8.77</td><td>9.80</td><td>9.41</td></tr>
1250+ <tr><td>Price/Book</td><td>42.60</td><td>54.21</td><td>57.14</td></tr>
1251+ <tr><td>Enterprise Value/Revenue</td><td>8.68</td><td>9.71</td><td>9.32</td></tr>
1252+ <tr><td>Enterprise Value/EBITDA</td><td>24.73</td><td>27.92</td><td>26.87</td></tr>
1253+ </table>
1254+ </body></html>"""
1255+
1256+ def _make_ticker_with_mock (self , html ):
1257+ mock_response = MagicMock ()
1258+ mock_response .text = html
1259+ with patch ("yfinance.data.YfData.cache_get" , return_value = mock_response ):
1260+ dat = yf .Ticker ("AAPL" )
1261+ data = dat .valuation_measures
1262+ return data
1263+
1264+ def test_valuation_measures (self ):
1265+ data = self ._make_ticker_with_mock (self ._MOCK_HTML )
1266+ self .assertEqual (data .shape , (9 , 3 ), "unexpected shape" )
1267+ self .assertListEqual (list (data .columns ), ["Current" , "12/31/2025" , "9/30/2025" ])
1268+ self .assertIn ("Market Cap" , data .index )
1269+ self .assertIn ("Trailing P/E" , data .index )
1270+ self .assertIn ("Enterprise Value/EBITDA" , data .index )
1271+ self .assertIsNone (data .index .name )
1272+ self .assertEqual (data .loc ["Market Cap" , "Current" ], "3.76T" )
1273+ self .assertEqual (data .loc ["Forward P/E" , "12/31/2025" ], "32.79" )
1274+
1275+ def test_valuation_measures_no_table (self ):
1276+ data = self ._make_ticker_with_mock ("<html><body><p>No tables here</p></body></html>" )
1277+ self .assertIsInstance (data , pd .DataFrame )
1278+ self .assertTrue (data .empty )
1279+
1280+ def test_valuation_measures_fetch_error (self ):
1281+ with patch ("yfinance.data.YfData.cache_get" , side_effect = Exception ("network error" )):
1282+ dat = yf .Ticker ("AAPL" )
1283+ data = dat .valuation_measures
1284+ self .assertIsInstance (data , pd .DataFrame )
1285+ self .assertTrue (data .empty )
1286+
12381287def suite ():
12391288 suite = unittest .TestSuite ()
12401289 suite .addTest (TestTicker ('Test ticker' ))
@@ -1244,6 +1293,7 @@ def suite():
12441293 suite .addTest (TestTickerMiscFinancials ('Test misc financials' ))
12451294 suite .addTest (TestTickerInfo ('Test info & fast_info' ))
12461295 suite .addTest (TestTickerFundsData ('Test Funds Data' ))
1296+ suite .addTest (TestTickerValuationMeasures ('Test valuation measures' ))
12471297 return suite
12481298
12491299
0 commit comments