mcp-dbutils

"""Test SQLite configuration functionality""" from pathlib import Path import pytest import yaml from mcp_dbutils.sqlite.config import SQLiteConfig, parse_jdbc_url def test_parse_jdbc_url(): """Test JDBC URL parsing""" # Test basic URL url = "jdbc:sqlite:/path/to/test.db" params = parse_jdbc_url(url) assert params["path"] == "/path/to/test.db" assert params["parameters"] == {} # Test URL with file: prefix url = "jdbc:sqlite:file:/path/to/test.db" params = parse_jdbc_url(url) assert params["path"] == "/path/to/test.db" assert params["parameters"] == {} # Test URL with parameters url = "jdbc:sqlite:/path/to/test.db?mode=ro&cache=shared" params = parse_jdbc_url(url) assert params["path"] == "/path/to/test.db" assert params["parameters"] == {"mode": "ro", "cache": "shared"} # Test invalid format with pytest.raises(ValueError, match="Invalid SQLite JDBC URL format"): parse_jdbc_url("sqlite:/path/to/test.db") # Test missing path with pytest.raises(ValueError, match="SQLite file path must be specified"): parse_jdbc_url("jdbc:sqlite:") def test_from_jdbc_url(): """Test SQLiteConfig creation from JDBC URL""" url = "jdbc:sqlite:/path/to/test.db" config = SQLiteConfig.from_jdbc_url(url) assert str(Path(config.path)) == str(Path("/path/to/test.db")) assert config.password is None assert config.uri is True assert config.type == "sqlite" # Test with password config = SQLiteConfig.from_jdbc_url(url, password="test_pass") assert config.password == "test_pass" assert config.uri is True def test_from_yaml_with_jdbc_url(tmp_path): """Test SQLiteConfig creation from YAML with JDBC URL""" config_data = { "connections": { "test_db": { "type": "sqlite", "jdbc_url": "jdbc:sqlite:/path/to/test.db", "password": "test_pass" } } } config_file = tmp_path / "config.yaml" with open(config_file, "w") as f: yaml.dump(config_data, f) config = SQLiteConfig.from_yaml(str(config_file), "test_db") assert str(Path(config.path)) == str(Path("/path/to/test.db")) assert config.password == "test_pass" assert config.uri is True assert config.type == "sqlite" def test_required_fields_validation(tmp_path): """Test validation of required configuration fields""" # Missing type config_data = { "connections": { "test_db": { "jdbc_url": "jdbc:sqlite:/path/to/test.db" } } } config_file = tmp_path / "config.yaml" with open(config_file, "w") as f: yaml.dump(config_data, f) with pytest.raises(ValueError, match="missing required 'type' field"): SQLiteConfig.from_yaml(str(config_file), "test_db") # Wrong type config_data["connections"]["test_db"]["type"] = "postgres" with open(config_file, "w") as f: yaml.dump(config_data, f) with pytest.raises(ValueError, match="Configuration is not SQLite type"): SQLiteConfig.from_yaml(str(config_file), "test_db") # Standard config (non-JDBC) missing path config_data["connections"]["test_db"] = { "type": "sqlite" } with open(config_file, "w") as f: yaml.dump(config_data, f) with pytest.raises(ValueError, match="must include 'path' field"): SQLiteConfig.from_yaml(str(config_file), "test_db")