| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- """
- Unit tests for App description validation functions.
- This test module validates the 400-character limit enforcement
- for App descriptions across all creation and editing endpoints.
- """
- import os
- import sys
- import pytest
- # Add the API root to Python path for imports
- sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..", ".."))
- class TestAppDescriptionValidationUnit:
- """Unit tests for description validation function"""
- def test_validate_description_length_function(self):
- """Test the _validate_description_length function directly"""
- from controllers.console.app.app import _validate_description_length
- # Test valid descriptions
- assert _validate_description_length("") == ""
- assert _validate_description_length("x" * 400) == "x" * 400
- assert _validate_description_length(None) is None
- # Test invalid descriptions
- with pytest.raises(ValueError) as exc_info:
- _validate_description_length("x" * 401)
- assert "Description cannot exceed 400 characters." in str(exc_info.value)
- with pytest.raises(ValueError) as exc_info:
- _validate_description_length("x" * 500)
- assert "Description cannot exceed 400 characters." in str(exc_info.value)
- with pytest.raises(ValueError) as exc_info:
- _validate_description_length("x" * 1000)
- assert "Description cannot exceed 400 characters." in str(exc_info.value)
- def test_validation_consistency_with_dataset(self):
- """Test that App and Dataset validation functions are consistent"""
- from controllers.console.app.app import _validate_description_length as app_validate
- from controllers.console.datasets.datasets import _validate_description_length as dataset_validate
- from controllers.service_api.dataset.dataset import _validate_description_length as service_dataset_validate
- # Test same valid inputs
- valid_desc = "x" * 400
- assert app_validate(valid_desc) == dataset_validate(valid_desc) == service_dataset_validate(valid_desc)
- assert app_validate("") == dataset_validate("") == service_dataset_validate("")
- assert app_validate(None) == dataset_validate(None) == service_dataset_validate(None)
- # Test same invalid inputs produce same error
- invalid_desc = "x" * 401
- app_error = None
- dataset_error = None
- service_dataset_error = None
- try:
- app_validate(invalid_desc)
- except ValueError as e:
- app_error = str(e)
- try:
- dataset_validate(invalid_desc)
- except ValueError as e:
- dataset_error = str(e)
- try:
- service_dataset_validate(invalid_desc)
- except ValueError as e:
- service_dataset_error = str(e)
- assert app_error == dataset_error == service_dataset_error
- assert app_error == "Description cannot exceed 400 characters."
- def test_boundary_values(self):
- """Test boundary values for description validation"""
- from controllers.console.app.app import _validate_description_length
- # Test exact boundary
- exactly_400 = "x" * 400
- assert _validate_description_length(exactly_400) == exactly_400
- # Test just over boundary
- just_over_400 = "x" * 401
- with pytest.raises(ValueError):
- _validate_description_length(just_over_400)
- # Test just under boundary
- just_under_400 = "x" * 399
- assert _validate_description_length(just_under_400) == just_under_400
- def test_edge_cases(self):
- """Test edge cases for description validation"""
- from controllers.console.app.app import _validate_description_length
- # Test None input
- assert _validate_description_length(None) is None
- # Test empty string
- assert _validate_description_length("") == ""
- # Test single character
- assert _validate_description_length("a") == "a"
- # Test unicode characters
- unicode_desc = "测试" * 200 # 400 characters in Chinese
- assert _validate_description_length(unicode_desc) == unicode_desc
- # Test unicode over limit
- unicode_over = "测试" * 201 # 402 characters
- with pytest.raises(ValueError):
- _validate_description_length(unicode_over)
- def test_whitespace_handling(self):
- """Test how validation handles whitespace"""
- from controllers.console.app.app import _validate_description_length
- # Test description with spaces
- spaces_400 = " " * 400
- assert _validate_description_length(spaces_400) == spaces_400
- # Test description with spaces over limit
- spaces_401 = " " * 401
- with pytest.raises(ValueError):
- _validate_description_length(spaces_401)
- # Test mixed content
- mixed_400 = "a" * 200 + " " * 200
- assert _validate_description_length(mixed_400) == mixed_400
- # Test mixed over limit
- mixed_401 = "a" * 200 + " " * 201
- with pytest.raises(ValueError):
- _validate_description_length(mixed_401)
- if __name__ == "__main__":
- # Run tests directly
- import traceback
- test_instance = TestAppDescriptionValidationUnit()
- test_methods = [method for method in dir(test_instance) if method.startswith("test_")]
- passed = 0
- failed = 0
- for test_method in test_methods:
- try:
- print(f"Running {test_method}...")
- getattr(test_instance, test_method)()
- print(f"✅ {test_method} PASSED")
- passed += 1
- except Exception as e:
- print(f"❌ {test_method} FAILED: {str(e)}")
- traceback.print_exc()
- failed += 1
- print(f"\n📊 Test Results: {passed} passed, {failed} failed")
- if failed == 0:
- print("🎉 All tests passed!")
- else:
- print("💥 Some tests failed!")
- sys.exit(1)
|