aliyun_oss.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os
  2. import posixpath
  3. from unittest.mock import MagicMock
  4. import pytest
  5. from _pytest.monkeypatch import MonkeyPatch
  6. from oss2 import Bucket # type: ignore
  7. from oss2.models import GetObjectResult, PutObjectResult # 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. get_example_folder,
  14. )
  15. class MockResponse:
  16. def __init__(self, status, headers, request_id):
  17. self.status = status
  18. self.headers = headers
  19. self.request_id = request_id
  20. class MockAliyunOssClass:
  21. def __init__(
  22. self,
  23. auth,
  24. endpoint,
  25. bucket_name,
  26. is_cname=False,
  27. session=None,
  28. connect_timeout=None,
  29. app_name="",
  30. enable_crc=True,
  31. proxies=None,
  32. region=None,
  33. cloudbox_id=None,
  34. is_path_style=False,
  35. is_verify_object_strict=True,
  36. ):
  37. self.bucket_name = get_example_bucket()
  38. self.key = posixpath.join(get_example_folder(), get_example_filename())
  39. self.content = get_example_data()
  40. self.filepath = get_example_filepath()
  41. self.resp = MockResponse(
  42. 200,
  43. {
  44. "etag": "ee8de918d05640145b18f70f4c3aa602",
  45. "x-oss-version-id": "CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****",
  46. },
  47. "request_id",
  48. )
  49. def put_object(self, key, data, headers=None, progress_callback=None):
  50. assert key == self.key
  51. assert data == self.content
  52. return PutObjectResult(self.resp)
  53. def get_object(self, key, byte_range=None, headers=None, progress_callback=None, process=None, params=None):
  54. assert key == self.key
  55. get_object_output = MagicMock(GetObjectResult)
  56. get_object_output.read.return_value = self.content
  57. return get_object_output
  58. def get_object_to_file(
  59. self, key, filename, byte_range=None, headers=None, progress_callback=None, process=None, params=None
  60. ):
  61. assert key == self.key
  62. assert filename == self.filepath
  63. def object_exists(self, key, headers=None):
  64. assert key == self.key
  65. return True
  66. def delete_object(self, key, params=None, headers=None):
  67. assert key == self.key
  68. self.resp.headers["x-oss-delete-marker"] = True
  69. return self.resp
  70. MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
  71. @pytest.fixture
  72. def setup_aliyun_oss_mock(monkeypatch: MonkeyPatch):
  73. if MOCK:
  74. monkeypatch.setattr(Bucket, "__init__", MockAliyunOssClass.__init__)
  75. monkeypatch.setattr(Bucket, "put_object", MockAliyunOssClass.put_object)
  76. monkeypatch.setattr(Bucket, "get_object", MockAliyunOssClass.get_object)
  77. monkeypatch.setattr(Bucket, "get_object_to_file", MockAliyunOssClass.get_object_to_file)
  78. monkeypatch.setattr(Bucket, "object_exists", MockAliyunOssClass.object_exists)
  79. monkeypatch.setattr(Bucket, "delete_object", MockAliyunOssClass.delete_object)
  80. yield
  81. if MOCK:
  82. monkeypatch.undo()