feat: add WikiData Component and depeciates the WikiData API tool component (#5872)
* update * [autofix.ci] apply automated fixes * Update test_wikidata_api.py * [autofix.ci] apply automated fixes * Update wikidata.py --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
dcd68c5f4e
commit
229ba19a66
4 changed files with 252 additions and 136 deletions
|
|
@ -3,104 +3,117 @@ from unittest.mock import MagicMock, patch
|
|||
import httpx
|
||||
import pytest
|
||||
from langchain_core.tools import ToolException
|
||||
from langflow.components.tools import WikidataAPIComponent
|
||||
from langflow.components.tools import WikidataComponent
|
||||
from langflow.custom import Component
|
||||
from langflow.custom.utils import build_custom_component_template
|
||||
from langflow.schema import Data
|
||||
from langflow.schema.message import Message
|
||||
|
||||
|
||||
def test_wikidata_initialization():
|
||||
component = WikidataAPIComponent()
|
||||
assert component.display_name == "Wikidata API"
|
||||
assert component.description == "Performs a search using the Wikidata API."
|
||||
assert component.icon == "Wikipedia"
|
||||
# Import the base test class
|
||||
from tests.base import ComponentTestBaseWithoutClient
|
||||
|
||||
|
||||
def test_wikidata_template():
|
||||
wikidata = WikidataAPIComponent()
|
||||
component = Component(_code=wikidata._code)
|
||||
frontend_node, _ = build_custom_component_template(component)
|
||||
class TestWikidataComponent(ComponentTestBaseWithoutClient):
|
||||
@pytest.fixture
|
||||
def component_class(self):
|
||||
"""Fixture to create a WikidataComponent instance."""
|
||||
return WikidataComponent
|
||||
|
||||
# Verify basic structure
|
||||
assert isinstance(frontend_node, dict)
|
||||
@pytest.fixture
|
||||
def file_names_mapping(self):
|
||||
"""Return an empty list since this component doesn't have version-specific files."""
|
||||
return []
|
||||
|
||||
# Verify inputs
|
||||
assert "template" in frontend_node
|
||||
input_names = [input_["name"] for input_ in frontend_node["template"].values() if isinstance(input_, dict)]
|
||||
assert "query" in input_names
|
||||
@pytest.fixture
|
||||
def mock_query(self):
|
||||
"""Fixture to provide a default query."""
|
||||
return "test query"
|
||||
|
||||
def test_wikidata_initialization(self, component_class):
|
||||
component = component_class()
|
||||
assert component.display_name == "Wikidata"
|
||||
assert component.description == "Performs a search using the Wikidata API."
|
||||
assert component.icon == "Wikipedia"
|
||||
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_success(mock_httpx):
|
||||
component = WikidataAPIComponent()
|
||||
component.query = "test query"
|
||||
def test_wikidata_template(self, component_class):
|
||||
component = component_class()
|
||||
frontend_node, _ = build_custom_component_template(Component(_code=component._code))
|
||||
|
||||
# Mock successful API response
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {
|
||||
"search": [
|
||||
{
|
||||
"label": "Test Label",
|
||||
"id": "Q123",
|
||||
"url": "https://test.com",
|
||||
"description": "Test Description",
|
||||
"concepturi": "https://test.com/concept",
|
||||
}
|
||||
]
|
||||
}
|
||||
mock_httpx.return_value = mock_response
|
||||
# Verify basic structure
|
||||
assert isinstance(frontend_node, dict)
|
||||
|
||||
result = component.fetch_content()
|
||||
# Verify inputs
|
||||
assert "template" in frontend_node
|
||||
input_names = [input_["name"] for input_ in frontend_node["template"].values() if isinstance(input_, dict)]
|
||||
assert "query" in input_names
|
||||
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 1
|
||||
assert result[0].text == "Test Label: Test Description"
|
||||
assert result[0].data["label"] == "Test Label"
|
||||
assert result[0].data["id"] == "Q123"
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_success(self, mock_httpx, component_class, mock_query):
|
||||
component = component_class()
|
||||
component.query = mock_query
|
||||
|
||||
# Mock successful API response
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {
|
||||
"search": [
|
||||
{
|
||||
"label": "Test Label",
|
||||
"id": "Q123",
|
||||
"url": "https://test.com",
|
||||
"description": "Test Description",
|
||||
"concepturi": "https://test.com/concept",
|
||||
}
|
||||
]
|
||||
}
|
||||
mock_httpx.return_value = mock_response
|
||||
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_empty_response(mock_httpx):
|
||||
component = WikidataAPIComponent()
|
||||
component.query = "test query"
|
||||
result = component.fetch_content()
|
||||
|
||||
# Mock empty API response
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {"search": []}
|
||||
mock_httpx.return_value = mock_response
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 1
|
||||
assert result[0].text == "Test Label: Test Description"
|
||||
assert result[0].data["label"] == "Test Label"
|
||||
assert result[0].data["id"] == "Q123"
|
||||
|
||||
result = component.fetch_content()
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_empty_response(self, mock_httpx, component_class, mock_query):
|
||||
component = component_class()
|
||||
component.query = mock_query
|
||||
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 1
|
||||
assert "error" in result[0].data
|
||||
assert "No search results found" in result[0].data["error"]
|
||||
# Mock empty API response
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {"search": []}
|
||||
mock_httpx.return_value = mock_response
|
||||
|
||||
result = component.fetch_content()
|
||||
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_error_handling(mock_httpx):
|
||||
component = WikidataAPIComponent()
|
||||
component.query = "test query"
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 1
|
||||
assert "error" in result[0].data
|
||||
assert "No search results found" in result[0].data["error"]
|
||||
|
||||
# Mock HTTP error
|
||||
mock_httpx.side_effect = httpx.HTTPError("API Error")
|
||||
@patch("langflow.components.tools.wikidata_api.httpx.get")
|
||||
def test_fetch_content_error_handling(self, mock_httpx, component_class, mock_query):
|
||||
component = component_class()
|
||||
component.query = mock_query
|
||||
|
||||
with pytest.raises(ToolException):
|
||||
component.fetch_content()
|
||||
# Mock HTTP error
|
||||
mock_httpx.side_effect = httpx.HTTPError("API Error")
|
||||
|
||||
with pytest.raises(ToolException):
|
||||
component.fetch_content()
|
||||
|
||||
def test_fetch_content_text():
|
||||
component = WikidataAPIComponent()
|
||||
component.fetch_content = MagicMock(
|
||||
return_value=[
|
||||
Data(text="First result", data={"label": "Label 1"}),
|
||||
Data(text="Second result", data={"label": "Label 2"}),
|
||||
]
|
||||
)
|
||||
def test_fetch_content_text(self, component_class):
|
||||
component = component_class()
|
||||
component.fetch_content = MagicMock(
|
||||
return_value=[
|
||||
Data(text="First result", data={"label": "Label 1"}),
|
||||
Data(text="Second result", data={"label": "Label 2"}),
|
||||
]
|
||||
)
|
||||
|
||||
result = component.fetch_content_text()
|
||||
result = component.fetch_content_text()
|
||||
|
||||
assert isinstance(result, Message)
|
||||
assert "First result" in result.text
|
||||
assert "Second result" in result.text
|
||||
assert isinstance(result, Message)
|
||||
assert "First result" in result.text
|
||||
assert "Second result" in result.text
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue