11"""Tests for optopsy/data/cli.py — additional coverage for download and cache commands."""
22
33import argparse
4+ import sys
45
56import pytest
67
@@ -32,13 +33,19 @@ def test_format_bytes_gb():
3233# ---------------------------------------------------------------------------
3334
3435
35- @patch ("dotenv.find_dotenv" , return_value = "" )
36- @patch ("dotenv.load_dotenv" )
37- def test_load_env_fallback (mock_load , mock_find ):
36+ def test_load_env_fallback ():
3837 """When find_dotenv returns empty string, should use fallback path."""
39- _load_env ()
40- mock_load .assert_called_once ()
41- call_path = mock_load .call_args [0 ][0 ]
38+ mock_dotenv = MagicMock ()
39+ mock_dotenv .find_dotenv .return_value = ""
40+
41+ with patch (
42+ "optopsy.data._compat.import_optional_dependency" ,
43+ return_value = mock_dotenv ,
44+ ):
45+ _load_env ()
46+
47+ mock_dotenv .load_dotenv .assert_called_once ()
48+ call_path = mock_dotenv .load_dotenv .call_args [0 ][0 ]
4249 assert call_path .endswith (".env" )
4350 assert len (call_path ) > 4
4451
@@ -48,28 +55,45 @@ def test_load_env_fallback(mock_load, mock_find):
4855# ---------------------------------------------------------------------------
4956
5057
51- @patch ("optopsy.data.cli._load_env" )
52- @patch ("optopsy.data.providers.get_provider_for_tool" , return_value = None )
53- def test_cmd_download_no_provider (mock_get_provider , mock_env , capsys ):
58+ def test_cmd_download_no_provider (capsys ):
5459 """When no provider is configured, should print an error."""
60+ mock_eodhd = MagicMock ()
5561 args = argparse .Namespace (symbols = ["SPY" ], verbose = False )
56- _cmd_download (args )
62+
63+ with (
64+ patch ("optopsy.data._compat.import_optional_dependency" ),
65+ patch ("optopsy.data.cli._load_env" ),
66+ patch .dict (sys .modules , {"optopsy.data.providers.eodhd" : mock_eodhd }),
67+ patch ("optopsy.data.providers.get_provider_for_tool" , return_value = None ),
68+ ):
69+ _cmd_download (args )
70+
5771 captured = capsys .readouterr ()
5872 assert "No data provider" in captured .out
5973
6074
61- @patch ("optopsy.data.cli._load_env" )
62- @patch ("optopsy.data.providers.get_provider_for_tool" )
63- def test_cmd_download_generic_provider (mock_get_provider , mock_env , capsys ):
75+ def test_cmd_download_generic_provider (capsys ):
6476 """Non-EODHD provider should use the generic download path."""
77+ mock_eodhd = MagicMock ()
78+ # Provide a real class so isinstance() works in _cmd_download
79+ mock_eodhd .EODHDProvider = type ("EODHDProvider" , (), {})
6580 mock_provider = MagicMock (
6681 spec = []
6782 ) # empty spec so isinstance(EODHDProvider) is False
6883 mock_provider .execute = MagicMock (return_value = ("Downloaded 100 rows" , None ))
69- mock_get_provider .return_value = mock_provider
7084
7185 args = argparse .Namespace (symbols = ["SPY" , "AAPL" ], verbose = False )
72- _cmd_download (args )
86+
87+ with (
88+ patch ("optopsy.data._compat.import_optional_dependency" ),
89+ patch ("optopsy.data.cli._load_env" ),
90+ patch .dict (sys .modules , {"optopsy.data.providers.eodhd" : mock_eodhd }),
91+ patch (
92+ "optopsy.data.providers.get_provider_for_tool" ,
93+ return_value = mock_provider ,
94+ ),
95+ ):
96+ _cmd_download (args )
7397
7498 assert mock_provider .execute .call_count == 2
7599 captured = capsys .readouterr ()
0 commit comments