169 lines
5.2 KiB
Python
169 lines
5.2 KiB
Python
import os
|
|
from pathlib import Path
|
|
from unittest.mock import Mock, patch
|
|
|
|
import httpx
|
|
import pytest
|
|
import respx
|
|
from httpx import Response
|
|
|
|
from langflow.components import (
|
|
data,
|
|
) # Adjust the import according to your project structure
|
|
|
|
|
|
@pytest.fixture
|
|
def api_request():
|
|
# This fixture provides an instance of APIRequest for each test case
|
|
return data.APIRequest()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@respx.mock
|
|
async def test_successful_get_request(api_request):
|
|
# Mocking a successful GET request
|
|
url = "https://example.com/api/test"
|
|
method = "GET"
|
|
mock_response = {"success": True}
|
|
respx.get(url).mock(return_value=Response(200, json=mock_response))
|
|
|
|
# Making the request
|
|
result = await api_request.make_request(
|
|
client=httpx.AsyncClient(), method=method, url=url
|
|
)
|
|
|
|
# Assertions
|
|
assert result.data["status_code"] == 200
|
|
assert result.data["result"] == mock_response
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@respx.mock
|
|
async def test_failed_request(api_request):
|
|
# Mocking a failed GET request
|
|
url = "https://example.com/api/test"
|
|
method = "GET"
|
|
respx.get(url).mock(return_value=Response(404))
|
|
|
|
# Making the request
|
|
result = await api_request.make_request(
|
|
client=httpx.AsyncClient(), method=method, url=url
|
|
)
|
|
|
|
# Assertions
|
|
assert result.data["status_code"] == 404
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@respx.mock
|
|
async def test_timeout(api_request):
|
|
# Mocking a timeout
|
|
url = "https://example.com/api/timeout"
|
|
method = "GET"
|
|
respx.get(url).mock(
|
|
side_effect=httpx.TimeoutException(message="Timeout", request=None)
|
|
)
|
|
|
|
# Making the request
|
|
result = await api_request.make_request(
|
|
client=httpx.AsyncClient(), method=method, url=url, timeout=1
|
|
)
|
|
|
|
# Assertions
|
|
assert result.data["status_code"] == 408
|
|
assert result.data["error"] == "Request timed out"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@respx.mock
|
|
async def test_build_with_multiple_urls(api_request):
|
|
# This test depends on having a working internet connection and accessible URLs
|
|
# It's better to mock these requests using respx or a similar library
|
|
|
|
# Setup for multiple URLs
|
|
method = "GET"
|
|
urls = ["https://example.com/api/one", "https://example.com/api/two"]
|
|
# You would mock these requests similarly to the single request tests
|
|
for url in urls:
|
|
respx.get(url).mock(return_value=Response(200, json={"success": True}))
|
|
|
|
# Do I have to mock the async client?
|
|
#
|
|
|
|
# Execute the build method
|
|
results = await api_request.build(method=method, urls=urls)
|
|
|
|
# Assertions
|
|
assert len(results) == len(urls)
|
|
|
|
|
|
@patch("langflow.components.data.Directory.parallel_load_records")
|
|
@patch("langflow.components.data.Directory.retrieve_file_paths")
|
|
@patch("langflow.components.data.DirectoryComponent.resolve_path")
|
|
def test_directory_component_build_with_multithreading(
|
|
mock_resolve_path, mock_retrieve_file_paths, mock_parallel_load_records
|
|
):
|
|
# Arrange
|
|
directory_component = data.DirectoryComponent()
|
|
path = os.path.dirname(os.path.abspath(__file__))
|
|
types = ["py"]
|
|
depth = 1
|
|
max_concurrency = 2
|
|
load_hidden = False
|
|
recursive = True
|
|
silent_errors = False
|
|
use_multithreading = True
|
|
|
|
mock_resolve_path.return_value = path
|
|
mock_retrieve_file_paths.return_value = [
|
|
os.path.join(path, file) for file in os.listdir(path) if file.endswith(".py")
|
|
]
|
|
mock_parallel_load_records.return_value = [Mock()]
|
|
|
|
# Act
|
|
result = directory_component.build(
|
|
path,
|
|
types,
|
|
depth,
|
|
max_concurrency,
|
|
load_hidden,
|
|
recursive,
|
|
silent_errors,
|
|
use_multithreading,
|
|
)
|
|
|
|
# Assert
|
|
mock_resolve_path.assert_called_once_with(path)
|
|
mock_retrieve_file_paths.assert_called_once_with(
|
|
path, types, load_hidden, recursive, depth
|
|
)
|
|
mock_parallel_load_records.assert_called_once_with(
|
|
mock_retrieve_file_paths.return_value, silent_errors, max_concurrency
|
|
)
|
|
|
|
|
|
def test_directory_without_mocks():
|
|
directory_component = data.DirectoryComponent()
|
|
from langflow.initial_setup import setup
|
|
from langflow.initial_setup.setup import load_starter_projects
|
|
|
|
projects = load_starter_projects()
|
|
# the setup module has a folder where the projects are stored
|
|
# the contents of that folder are in the projects variable
|
|
# the directory component can be used to load the projects
|
|
# and we can validate if the contents are the same as the projects variable
|
|
setup_path = Path(setup.__file__).parent / "starter_projects"
|
|
results = directory_component.build(str(setup_path), use_multithreading=False)
|
|
assert len(results) == len(projects)
|
|
# each result is a Record that contains the content attribute
|
|
# each are dict that are exactly the same as one of the projects
|
|
for result in results:
|
|
assert result.text in projects
|
|
|
|
# in ../docs/docs/components there are many mdx files
|
|
# check if the directory component can load them
|
|
# just check if the number of results is the same as the number of files
|
|
docs_path = Path(__file__).parent.parent / "docs" / "docs" / "components"
|
|
results = directory_component.build(str(docs_path), use_multithreading=False)
|
|
docs_files = list(docs_path.glob("*.mdx"))
|
|
assert len(results) == len(docs_files)
|