import os import posixpath from unittest.mock import MagicMock import pytest from _pytest.monkeypatch import MonkeyPatch from oss2 import Bucket from oss2.models import GetObjectResult, PutObjectResult from tests.unit_tests.oss.__mock.base import ( get_example_bucket, get_example_data, get_example_filename, get_example_filepath, get_example_folder, ) class MockResponse: def __init__(self, status, headers, request_id): self.status = status self.headers = headers self.request_id = request_id class MockAliyunOssClass: def __init__( self, auth, endpoint, bucket_name, is_cname=False, session=None, connect_timeout=None, app_name="", enable_crc=True, proxies=None, region=None, cloudbox_id=None, is_path_style=False, is_verify_object_strict=True, ): self.bucket_name = get_example_bucket() self.key = posixpath.join(get_example_folder(), get_example_filename()) self.content = get_example_data() self.filepath = get_example_filepath() self.resp = MockResponse( 200, { "etag": "ee8de918d05640145b18f70f4c3aa602", "x-oss-version-id": "CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****", }, "request_id", ) def put_object(self, key, data, headers=None, progress_callback=None): assert key == self.key assert data == self.content return PutObjectResult(self.resp) def get_object(self, key, byte_range=None, headers=None, progress_callback=None, process=None, params=None): assert key == self.key get_object_output = MagicMock(GetObjectResult) get_object_output.read.return_value = self.content return get_object_output def get_object_to_file( self, key, filename, byte_range=None, headers=None, progress_callback=None, process=None, params=None ): assert key == self.key assert filename == self.filepath def object_exists(self, key, headers=None): assert key == self.key return True def delete_object(self, key, params=None, headers=None): assert key == self.key self.resp.headers["x-oss-delete-marker"] = True return self.resp MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true" @pytest.fixture def setup_aliyun_oss_mock(monkeypatch: MonkeyPatch): if MOCK: monkeypatch.setattr(Bucket, "__init__", MockAliyunOssClass.__init__) monkeypatch.setattr(Bucket, "put_object", MockAliyunOssClass.put_object) monkeypatch.setattr(Bucket, "get_object", MockAliyunOssClass.get_object) monkeypatch.setattr(Bucket, "get_object_to_file", MockAliyunOssClass.get_object_to_file) monkeypatch.setattr(Bucket, "object_exists", MockAliyunOssClass.object_exists) monkeypatch.setattr(Bucket, "delete_object", MockAliyunOssClass.delete_object) yield if MOCK: monkeypatch.undo()