|
|
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(): |
|
|
|
|
|
code1 = """ |
|
|
import math |
|
|
|
|
|
def square(x): |
|
|
return x ** 2 |
|
|
""" |
|
|
errors1 = validate_code(code1) |
|
|
assert errors1 == {"imports": {"errors": []}, "function": {"errors": []}} |
|
|
|
|
|
|
|
|
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": []}, |
|
|
} |
|
|
|
|
|
|
|
|
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" |
|
|
|