| 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" |
|
|