Spaces:
Running
Running
from pathlib import Path | |
from unittest import mock | |
import pytest | |
from langflow.utils.validate import ( | |
create_class, | |
create_function, | |
execute_function, | |
extract_function_name, | |
validate_code, | |
) | |
from requests.exceptions import MissingSchema | |
def test_create_function(): | |
code = """ | |
from pathlib import Path | |
def my_function(x: str) -> Path: | |
return Path(x) | |
""" | |
function_name = extract_function_name(code) | |
function = create_function(code, function_name) | |
result = function("test") | |
assert result == Path("test") | |
def test_validate_code(): | |
# Test case with a valid import and function | |
code1 = """ | |
import math | |
def square(x): | |
return x ** 2 | |
""" | |
errors1 = validate_code(code1) | |
assert errors1 == {"imports": {"errors": []}, "function": {"errors": []}} | |
# Test case with an invalid import and valid function | |
code2 = """ | |
import non_existent_module | |
def square(x): | |
return x ** 2 | |
""" | |
errors2 = validate_code(code2) | |
assert errors2 == { | |
"imports": {"errors": ["No module named 'non_existent_module'"]}, | |
"function": {"errors": []}, | |
} | |
# Test case with a valid import and invalid function syntax | |
code3 = """ | |
import math | |
def square(x) | |
return x ** 2 | |
""" | |
errors3 = validate_code(code3) | |
assert errors3 == { | |
"imports": {"errors": []}, | |
"function": {"errors": ["expected ':' (<unknown>, line 4)"]}, | |
} | |
def test_execute_function_success(): | |
code = """ | |
import math | |
def my_function(x): | |
return math.sin(x) + 1 | |
""" | |
result = execute_function(code, "my_function", 0.5) | |
assert result == 1.479425538604203 | |
def test_execute_function_missing_module(): | |
code = """ | |
import some_missing_module | |
def my_function(x): | |
return some_missing_module.some_function(x) | |
""" | |
with pytest.raises(ModuleNotFoundError): | |
execute_function(code, "my_function", 0.5) | |
def test_execute_function_missing_function(): | |
code = """ | |
import math | |
def my_function(x): | |
return math.some_missing_function(x) | |
""" | |
with pytest.raises(AttributeError): | |
execute_function(code, "my_function", 0.5) | |
def test_execute_function_missing_schema(): | |
code = """ | |
import requests | |
def my_function(x): | |
return requests.get(x).text | |
""" | |
with mock.patch("requests.get", side_effect=MissingSchema), pytest.raises(MissingSchema): | |
execute_function(code, "my_function", "invalid_url") | |
def test_create_class(): | |
code = """ | |
from langflow.custom import CustomComponent | |
class ExternalClass: | |
def __init__(self, value): | |
self.value = value | |
class MyComponent(CustomComponent): | |
def build(self): | |
return ExternalClass("test") | |
""" | |
class_name = "MyComponent" | |
created_class = create_class(code, class_name) | |
instance = created_class() | |
result = instance.build() | |
assert result.value == "test" | |
def test_create_class_with_multiple_external_classes(): | |
code = """ | |
from langflow.custom import CustomComponent | |
class ExternalClass1: | |
def __init__(self, value): | |
self.value = value | |
class ExternalClass2: | |
def __init__(self, value): | |
self.value = value | |
class MyComponent(CustomComponent): | |
def build(self): | |
return ExternalClass1("test1"), ExternalClass2("test2") | |
""" | |
class_name = "MyComponent" | |
created_class = create_class(code, class_name) | |
instance = created_class() | |
result1, result2 = instance.build() | |
assert result1.value == "test1" | |
assert result2.value == "test2" | |
def test_create_class_with_external_variables_and_functions(): | |
code = """ | |
from langflow.custom import CustomComponent | |
external_variable = "external_value" | |
def external_function(): | |
return "external_function_value" | |
class MyComponent(CustomComponent): | |
def build(self): | |
return external_variable, external_function() | |
""" | |
class_name = "MyComponent" | |
created_class = create_class(code, class_name) | |
instance = created_class() | |
result_variable, result_function = instance.build() | |
assert result_variable == "external_value" | |
assert result_function == "external_function_value" | |