feat: add unit tests and validation for aliyun tracing (#22012)
Signed-off-by: neatguycoding <15627489+NeatGuyCoding@users.noreply.github.com>
This commit is contained in:
@@ -176,6 +176,23 @@ class AliyunConfig(BaseTracingConfig):
|
|||||||
license_key: str
|
license_key: str
|
||||||
endpoint: str
|
endpoint: str
|
||||||
|
|
||||||
|
@field_validator("app_name")
|
||||||
|
@classmethod
|
||||||
|
def app_name_validator(cls, v, info: ValidationInfo):
|
||||||
|
return cls.validate_project_field(v, "dify_app")
|
||||||
|
|
||||||
|
@field_validator("license_key")
|
||||||
|
@classmethod
|
||||||
|
def license_key_validator(cls, v, info: ValidationInfo):
|
||||||
|
if not v or v.strip() == "":
|
||||||
|
raise ValueError("License key cannot be empty")
|
||||||
|
return v
|
||||||
|
|
||||||
|
@field_validator("endpoint")
|
||||||
|
@classmethod
|
||||||
|
def endpoint_validator(cls, v, info: ValidationInfo):
|
||||||
|
return cls.validate_endpoint_url(v, "https://tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
|
||||||
|
|
||||||
OPS_FILE_PATH = "ops_trace/"
|
OPS_FILE_PATH = "ops_trace/"
|
||||||
OPS_TRACE_FAILED_KEY = "FAILED_OPS_TRACE"
|
OPS_TRACE_FAILED_KEY = "FAILED_OPS_TRACE"
|
||||||
|
@@ -2,6 +2,7 @@ import pytest
|
|||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
|
|
||||||
from core.ops.entities.config_entity import (
|
from core.ops.entities.config_entity import (
|
||||||
|
AliyunConfig,
|
||||||
ArizeConfig,
|
ArizeConfig,
|
||||||
LangfuseConfig,
|
LangfuseConfig,
|
||||||
LangSmithConfig,
|
LangSmithConfig,
|
||||||
@@ -23,6 +24,7 @@ class TestTracingProviderEnum:
|
|||||||
assert TracingProviderEnum.LANGSMITH == "langsmith"
|
assert TracingProviderEnum.LANGSMITH == "langsmith"
|
||||||
assert TracingProviderEnum.OPIK == "opik"
|
assert TracingProviderEnum.OPIK == "opik"
|
||||||
assert TracingProviderEnum.WEAVE == "weave"
|
assert TracingProviderEnum.WEAVE == "weave"
|
||||||
|
assert TracingProviderEnum.ALIYUN == "aliyun"
|
||||||
|
|
||||||
|
|
||||||
class TestArizeConfig:
|
class TestArizeConfig:
|
||||||
@@ -272,6 +274,71 @@ class TestWeaveConfig:
|
|||||||
WeaveConfig(api_key="key", project="project", host="ftp://invalid.host.com")
|
WeaveConfig(api_key="key", project="project", host="ftp://invalid.host.com")
|
||||||
|
|
||||||
|
|
||||||
|
class TestAliyunConfig:
|
||||||
|
"""Test cases for AliyunConfig"""
|
||||||
|
|
||||||
|
def test_valid_config(self):
|
||||||
|
"""Test valid Aliyun configuration"""
|
||||||
|
config = AliyunConfig(
|
||||||
|
app_name="test_app",
|
||||||
|
license_key="test_license_key",
|
||||||
|
endpoint="https://custom.tracing-analysis-dc-hz.aliyuncs.com",
|
||||||
|
)
|
||||||
|
assert config.app_name == "test_app"
|
||||||
|
assert config.license_key == "test_license_key"
|
||||||
|
assert config.endpoint == "https://custom.tracing-analysis-dc-hz.aliyuncs.com"
|
||||||
|
|
||||||
|
def test_default_values(self):
|
||||||
|
"""Test default values are set correctly"""
|
||||||
|
config = AliyunConfig(license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
assert config.app_name == "dify_app"
|
||||||
|
|
||||||
|
def test_missing_required_fields(self):
|
||||||
|
"""Test that required fields are enforced"""
|
||||||
|
with pytest.raises(ValidationError):
|
||||||
|
AliyunConfig()
|
||||||
|
|
||||||
|
with pytest.raises(ValidationError):
|
||||||
|
AliyunConfig(license_key="test_license")
|
||||||
|
|
||||||
|
with pytest.raises(ValidationError):
|
||||||
|
AliyunConfig(endpoint="https://tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
|
||||||
|
def test_app_name_validation_empty(self):
|
||||||
|
"""Test app_name validation with empty value"""
|
||||||
|
config = AliyunConfig(
|
||||||
|
license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com", app_name=""
|
||||||
|
)
|
||||||
|
assert config.app_name == "dify_app"
|
||||||
|
|
||||||
|
def test_endpoint_validation_empty(self):
|
||||||
|
"""Test endpoint validation with empty value"""
|
||||||
|
config = AliyunConfig(license_key="test_license", endpoint="")
|
||||||
|
assert config.endpoint == "https://tracing-analysis-dc-hz.aliyuncs.com"
|
||||||
|
|
||||||
|
def test_endpoint_validation_with_path(self):
|
||||||
|
"""Test endpoint validation normalizes URL by removing path"""
|
||||||
|
config = AliyunConfig(
|
||||||
|
license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com/api/v1/traces"
|
||||||
|
)
|
||||||
|
assert config.endpoint == "https://tracing-analysis-dc-hz.aliyuncs.com"
|
||||||
|
|
||||||
|
def test_endpoint_validation_invalid_scheme(self):
|
||||||
|
"""Test endpoint validation rejects invalid schemes"""
|
||||||
|
with pytest.raises(ValidationError, match="URL scheme must be one of"):
|
||||||
|
AliyunConfig(license_key="test_license", endpoint="ftp://invalid.tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
|
||||||
|
def test_endpoint_validation_no_scheme(self):
|
||||||
|
"""Test endpoint validation rejects URLs without scheme"""
|
||||||
|
with pytest.raises(ValidationError, match="URL scheme must be one of"):
|
||||||
|
AliyunConfig(license_key="test_license", endpoint="invalid.tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
|
||||||
|
def test_license_key_required(self):
|
||||||
|
"""Test that license_key is required and cannot be empty"""
|
||||||
|
with pytest.raises(ValidationError):
|
||||||
|
AliyunConfig(license_key="", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com")
|
||||||
|
|
||||||
|
|
||||||
class TestConfigIntegration:
|
class TestConfigIntegration:
|
||||||
"""Integration tests for configuration classes"""
|
"""Integration tests for configuration classes"""
|
||||||
|
|
||||||
@@ -284,6 +351,7 @@ class TestConfigIntegration:
|
|||||||
LangSmithConfig(api_key="key", project="project"),
|
LangSmithConfig(api_key="key", project="project"),
|
||||||
OpikConfig(api_key="key"),
|
OpikConfig(api_key="key"),
|
||||||
WeaveConfig(api_key="key", project="project"),
|
WeaveConfig(api_key="key", project="project"),
|
||||||
|
AliyunConfig(license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com"),
|
||||||
]
|
]
|
||||||
|
|
||||||
for config in configs:
|
for config in configs:
|
||||||
@@ -294,16 +362,24 @@ class TestConfigIntegration:
|
|||||||
# Test that paths are removed from endpoints
|
# Test that paths are removed from endpoints
|
||||||
arize_config = ArizeConfig(endpoint="https://arize.com/api/v1/test")
|
arize_config = ArizeConfig(endpoint="https://arize.com/api/v1/test")
|
||||||
phoenix_config = PhoenixConfig(endpoint="https://phoenix.com/api/v2/")
|
phoenix_config = PhoenixConfig(endpoint="https://phoenix.com/api/v2/")
|
||||||
|
aliyun_config = AliyunConfig(
|
||||||
|
license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com/api/v1/traces"
|
||||||
|
)
|
||||||
|
|
||||||
assert arize_config.endpoint == "https://arize.com"
|
assert arize_config.endpoint == "https://arize.com"
|
||||||
assert phoenix_config.endpoint == "https://phoenix.com"
|
assert phoenix_config.endpoint == "https://phoenix.com"
|
||||||
|
assert aliyun_config.endpoint == "https://tracing-analysis-dc-hz.aliyuncs.com"
|
||||||
|
|
||||||
def test_project_default_values(self):
|
def test_project_default_values(self):
|
||||||
"""Test that project default values are set correctly"""
|
"""Test that project default values are set correctly"""
|
||||||
arize_config = ArizeConfig(project="")
|
arize_config = ArizeConfig(project="")
|
||||||
phoenix_config = PhoenixConfig(project="")
|
phoenix_config = PhoenixConfig(project="")
|
||||||
opik_config = OpikConfig(project="")
|
opik_config = OpikConfig(project="")
|
||||||
|
aliyun_config = AliyunConfig(
|
||||||
|
license_key="test_license", endpoint="https://tracing-analysis-dc-hz.aliyuncs.com", app_name=""
|
||||||
|
)
|
||||||
|
|
||||||
assert arize_config.project == "default"
|
assert arize_config.project == "default"
|
||||||
assert phoenix_config.project == "default"
|
assert phoenix_config.project == "default"
|
||||||
assert opik_config.project == "Default Project"
|
assert opik_config.project == "Default Project"
|
||||||
|
assert aliyun_config.app_name == "dify_app"
|
||||||
|
Reference in New Issue
Block a user