"""Tests for web/utils/vite_helper.py.""" import json from unittest.mock import Mock, patch, mock_open class TestViteHelperInit: """Tests for ViteHelper initialization.""" def test_init_without_app(self): """Test initialization without Flask app.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() assert helper.app is None assert helper.manifest is None assert helper.is_dev is False def test_init_with_app_calls_init_app(self): """Test that initialization with app calls init_app.""" from local_deep_research.web.utils.vite_helper import ViteHelper mock_app = Mock() mock_app.debug = False mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} with patch.object(ViteHelper, "_load_manifest"): helper = ViteHelper(app=mock_app) assert helper.app is mock_app class TestViteHelperInitApp: """Tests for ViteHelper.init_app method.""" def test_init_app_sets_app_attribute(self): """Test that init_app sets the app attribute.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = False mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} with patch.object(helper, "_load_manifest"): helper.init_app(mock_app) assert helper.app is mock_app def test_init_app_sets_dev_mode_from_debug(self): """Test that is_dev is set from app.debug.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = True mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} helper.init_app(mock_app) assert helper.is_dev is True def test_init_app_sets_dev_mode_from_config(self): """Test that is_dev can be set from VITE_DEV_MODE config.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = False mock_app.config = {"VITE_DEV_MODE": True} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} helper.init_app(mock_app) assert helper.is_dev is True def test_init_app_registers_vite_asset_global(self): """Test that vite_asset is registered as Jinja global.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = True mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} helper.init_app(mock_app) assert "vite_asset" in mock_app.jinja_env.globals assert mock_app.jinja_env.globals["vite_asset"] == helper.vite_asset def test_init_app_registers_vite_hmr_global(self): """Test that vite_hmr is registered as Jinja global.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = True mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} helper.init_app(mock_app) assert "vite_hmr" in mock_app.jinja_env.globals assert mock_app.jinja_env.globals["vite_hmr"] == helper.vite_hmr def test_init_app_loads_manifest_in_production(self): """Test that manifest is loaded in production mode.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = False mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} with patch.object(helper, "_load_manifest") as mock_load: helper.init_app(mock_app) mock_load.assert_called_once() def test_init_app_skips_manifest_in_dev(self): """Test that manifest loading is skipped in dev mode.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() mock_app = Mock() mock_app.debug = True mock_app.config = {} mock_app.jinja_env = Mock() mock_app.jinja_env.globals = {} with patch.object(helper, "_load_manifest") as mock_load: helper.init_app(mock_app) mock_load.assert_not_called() class TestViteHelperLoadManifest: """Tests for ViteHelper._load_manifest method.""" def test_load_manifest_reads_json_file(self): """Test that manifest JSON is loaded from file.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() helper.app = Mock() helper.app.config = {"STATIC_DIR": "/app/static"} manifest_data = {"js/app.js": {"file": "assets/app-abc123.js"}} with patch("pathlib.Path.exists", return_value=True): with patch( "builtins.open", mock_open(read_data=json.dumps(manifest_data)) ): helper._load_manifest() assert helper.manifest == manifest_data def test_load_manifest_uses_default_static_dir(self): """Test that default static directory is used when not configured.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() helper.app = Mock() helper.app.config = {} with patch("pathlib.Path.exists", return_value=False): helper._load_manifest() assert helper.manifest == {} def test_load_manifest_handles_missing_file(self): """Test that missing manifest file results in empty dict.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() helper.app = Mock() helper.app.config = {"STATIC_DIR": "/app/static"} with patch("pathlib.Path.exists", return_value=False): helper._load_manifest() assert helper.manifest == {} class TestViteHelperViteHmr: """Tests for ViteHelper.vite_hmr method.""" def test_vite_hmr_returns_script_in_dev_mode(self): """Test that HMR script is returned in development mode.""" from local_deep_research.web.utils.vite_helper import ViteHelper helper = ViteHelper() helper.is_dev = True result = helper.vite_hmr() assert "localhost:5173" in str(result) assert "@vite/client" in str(result) assert '