volcengine_tos.py 3.2 KB

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