volcengine_tos.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import os
  2. from typing import Union
  3. from unittest.mock import MagicMock
  4. import pytest
  5. from _pytest.monkeypatch import MonkeyPatch
  6. from tos import TosClientV2
  7. from tos.clientv2 import DeleteObjectOutput, GetObjectOutput, HeadObjectOutput, PutObjectOutput
  8. class AttrDict(dict):
  9. def __getattr__(self, item):
  10. return self.get(item)
  11. def get_example_bucket() -> str:
  12. return "dify"
  13. def get_example_filename() -> str:
  14. return "test.txt"
  15. def get_example_data() -> bytes:
  16. return b"test"
  17. def get_example_filepath() -> str:
  18. return "/test"
  19. class MockVolcengineTosClass:
  20. def __init__(self, ak="", sk="", endpoint="", region=""):
  21. self.bucket_name = get_example_bucket()
  22. self.key = get_example_filename()
  23. self.content = get_example_data()
  24. self.filepath = get_example_filepath()
  25. self.resp = AttrDict(
  26. {
  27. "x-tos-server-side-encryption": "kms",
  28. "x-tos-server-side-encryption-kms-key-id": "trn:kms:cn-beijing:****:keyrings/ring-test/keys/key-test",
  29. "x-tos-server-side-encryption-customer-algorithm": "AES256",
  30. "x-tos-version-id": "test",
  31. "x-tos-hash-crc64ecma": 123456,
  32. "request_id": "test",
  33. "headers": {
  34. "x-tos-id-2": "test",
  35. "ETag": "123456",
  36. },
  37. "status": 200,
  38. }
  39. )
  40. def put_object(self, bucket: str, key: str, content=None) -> PutObjectOutput:
  41. assert bucket == self.bucket_name
  42. assert key == self.key
  43. assert content == self.content
  44. return PutObjectOutput(self.resp)
  45. def get_object(self, bucket: str, key: str) -> GetObjectOutput:
  46. assert bucket == self.bucket_name
  47. assert key == self.key
  48. get_object_output = MagicMock(GetObjectOutput)
  49. get_object_output.read.return_value = self.content
  50. return get_object_output
  51. def get_object_to_file(self, bucket: str, key: str, file_path: str):
  52. assert bucket == self.bucket_name
  53. assert key == self.key
  54. assert file_path == self.filepath
  55. def head_object(self, bucket: str, key: str) -> HeadObjectOutput:
  56. assert bucket == self.bucket_name
  57. assert key == self.key
  58. return HeadObjectOutput(self.resp)
  59. def delete_object(self, bucket: str, key: str):
  60. assert bucket == self.bucket_name
  61. assert key == self.key
  62. return DeleteObjectOutput(self.resp)
  63. MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
  64. @pytest.fixture
  65. def setup_volcengine_tos_mock(monkeypatch: MonkeyPatch):
  66. if MOCK:
  67. monkeypatch.setattr(TosClientV2, "__init__", MockVolcengineTosClass.__init__)
  68. monkeypatch.setattr(TosClientV2, "put_object", MockVolcengineTosClass.put_object)
  69. monkeypatch.setattr(TosClientV2, "get_object", MockVolcengineTosClass.get_object)
  70. monkeypatch.setattr(TosClientV2, "get_object_to_file", MockVolcengineTosClass.get_object_to_file)
  71. monkeypatch.setattr(TosClientV2, "head_object", MockVolcengineTosClass.head_object)
  72. monkeypatch.setattr(TosClientV2, "delete_object", MockVolcengineTosClass.delete_object)
  73. yield
  74. if MOCK:
  75. monkeypatch.undo()