You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_clickzetta_volume.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. """Integration tests for ClickZetta Volume Storage."""
  2. import os
  3. import tempfile
  4. import unittest
  5. import pytest
  6. from extensions.storage.clickzetta_volume.clickzetta_volume_storage import (
  7. ClickZettaVolumeConfig,
  8. ClickZettaVolumeStorage,
  9. )
  10. class TestClickZettaVolumeStorage(unittest.TestCase):
  11. """Test cases for ClickZetta Volume Storage."""
  12. def setUp(self):
  13. """Set up test environment."""
  14. self.config = ClickZettaVolumeConfig(
  15. username=os.getenv("CLICKZETTA_USERNAME", "test_user"),
  16. password=os.getenv("CLICKZETTA_PASSWORD", "test_pass"),
  17. instance=os.getenv("CLICKZETTA_INSTANCE", "test_instance"),
  18. service=os.getenv("CLICKZETTA_SERVICE", "uat-api.clickzetta.com"),
  19. workspace=os.getenv("CLICKZETTA_WORKSPACE", "quick_start"),
  20. vcluster=os.getenv("CLICKZETTA_VCLUSTER", "default_ap"),
  21. schema_name=os.getenv("CLICKZETTA_SCHEMA", "dify"),
  22. volume_type="table",
  23. table_prefix="test_dataset_",
  24. )
  25. @pytest.mark.skipif(not os.getenv("CLICKZETTA_USERNAME"), reason="ClickZetta credentials not provided")
  26. def test_user_volume_operations(self):
  27. """Test basic operations with User Volume."""
  28. config = self.config
  29. config.volume_type = "user"
  30. storage = ClickZettaVolumeStorage(config)
  31. # Test file operations
  32. test_filename = "test_file.txt"
  33. test_content = b"Hello, ClickZetta Volume!"
  34. # Save file
  35. storage.save(test_filename, test_content)
  36. # Check if file exists
  37. assert storage.exists(test_filename)
  38. # Load file
  39. loaded_content = storage.load_once(test_filename)
  40. assert loaded_content == test_content
  41. # Test streaming
  42. stream_content = b""
  43. for chunk in storage.load_stream(test_filename):
  44. stream_content += chunk
  45. assert stream_content == test_content
  46. # Test download
  47. with tempfile.NamedTemporaryFile() as temp_file:
  48. storage.download(test_filename, temp_file.name)
  49. with open(temp_file.name, "rb") as f:
  50. downloaded_content = f.read()
  51. assert downloaded_content == test_content
  52. # Test scan
  53. files = storage.scan("", files=True, directories=False)
  54. assert test_filename in files
  55. # Delete file
  56. storage.delete(test_filename)
  57. assert not storage.exists(test_filename)
  58. @pytest.mark.skipif(not os.getenv("CLICKZETTA_USERNAME"), reason="ClickZetta credentials not provided")
  59. def test_table_volume_operations(self):
  60. """Test basic operations with Table Volume."""
  61. config = self.config
  62. config.volume_type = "table"
  63. storage = ClickZettaVolumeStorage(config)
  64. # Test file operations with dataset_id
  65. dataset_id = "12345"
  66. test_filename = f"{dataset_id}/test_file.txt"
  67. test_content = b"Hello, Table Volume!"
  68. # Save file
  69. storage.save(test_filename, test_content)
  70. # Check if file exists
  71. assert storage.exists(test_filename)
  72. # Load file
  73. loaded_content = storage.load_once(test_filename)
  74. assert loaded_content == test_content
  75. # Test scan for dataset
  76. files = storage.scan(dataset_id, files=True, directories=False)
  77. assert "test_file.txt" in files
  78. # Delete file
  79. storage.delete(test_filename)
  80. assert not storage.exists(test_filename)
  81. def test_config_validation(self):
  82. """Test configuration validation."""
  83. # Test missing required fields
  84. with pytest.raises(ValueError):
  85. ClickZettaVolumeConfig(
  86. username="", # Empty username should fail
  87. password="pass",
  88. instance="instance",
  89. )
  90. # Test invalid volume type
  91. with pytest.raises(ValueError):
  92. ClickZettaVolumeConfig(username="user", password="pass", instance="instance", volume_type="invalid_type")
  93. # Test external volume without volume_name
  94. with pytest.raises(ValueError):
  95. ClickZettaVolumeConfig(
  96. username="user",
  97. password="pass",
  98. instance="instance",
  99. volume_type="external",
  100. # Missing volume_name
  101. )
  102. def test_volume_path_generation(self):
  103. """Test volume path generation for different types."""
  104. storage = ClickZettaVolumeStorage(self.config)
  105. # Test table volume path
  106. path = storage._get_volume_path("test.txt", "12345")
  107. assert path == "test_dataset_12345/test.txt"
  108. # Test path with existing dataset_id prefix
  109. path = storage._get_volume_path("12345/test.txt")
  110. assert path == "12345/test.txt"
  111. # Test user volume
  112. storage._config.volume_type = "user"
  113. path = storage._get_volume_path("test.txt")
  114. assert path == "test.txt"
  115. def test_sql_prefix_generation(self):
  116. """Test SQL prefix generation for different volume types."""
  117. storage = ClickZettaVolumeStorage(self.config)
  118. # Test table volume SQL prefix
  119. prefix = storage._get_volume_sql_prefix("12345")
  120. assert prefix == "TABLE VOLUME test_dataset_12345"
  121. # Test user volume SQL prefix
  122. storage._config.volume_type = "user"
  123. prefix = storage._get_volume_sql_prefix()
  124. assert prefix == "USER VOLUME"
  125. # Test external volume SQL prefix
  126. storage._config.volume_type = "external"
  127. storage._config.volume_name = "my_external_volume"
  128. prefix = storage._get_volume_sql_prefix()
  129. assert prefix == "VOLUME my_external_volume"
  130. if __name__ == "__main__":
  131. unittest.main()