|
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() |
|
|