|
@@ -0,0 +1,81 @@
|
|
|
+import os
|
|
|
+from unittest.mock import MagicMock
|
|
|
+
|
|
|
+import pytest
|
|
|
+from _pytest.monkeypatch import MonkeyPatch
|
|
|
+from qcloud_cos import CosS3Client
|
|
|
+from qcloud_cos.streambody import StreamBody
|
|
|
+
|
|
|
+from tests.unit_tests.oss.__mock.base import (
|
|
|
+ get_example_bucket,
|
|
|
+ get_example_data,
|
|
|
+ get_example_filename,
|
|
|
+ get_example_filepath,
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+class MockTencentCosClass:
|
|
|
+ def __init__(self, conf, retry=1, session=None):
|
|
|
+ self.bucket_name = get_example_bucket()
|
|
|
+ self.key = get_example_filename()
|
|
|
+ self.content = get_example_data()
|
|
|
+ self.filepath = get_example_filepath()
|
|
|
+ self.resp = {
|
|
|
+ "ETag": "ee8de918d05640145b18f70f4c3aa602",
|
|
|
+ "Server": "tencent-cos",
|
|
|
+ "x-cos-hash-crc64ecma": 16749565679157681890,
|
|
|
+ "x-cos-request-id": "NWU5MDNkYzlfNjRiODJhMDlfMzFmYzhfMTFm****",
|
|
|
+ }
|
|
|
+
|
|
|
+ def put_object(self, Bucket, Body, Key, EnableMD5=False, **kwargs): # noqa: N803
|
|
|
+ assert Bucket == self.bucket_name
|
|
|
+ assert Key == self.key
|
|
|
+ assert Body == self.content
|
|
|
+ return self.resp
|
|
|
+
|
|
|
+ def get_object(self, Bucket, Key, KeySimplifyCheck=True, **kwargs): # noqa: N803
|
|
|
+ assert Bucket == self.bucket_name
|
|
|
+ assert Key == self.key
|
|
|
+
|
|
|
+ mock_stream_body = MagicMock(StreamBody)
|
|
|
+ mock_raw_stream = MagicMock()
|
|
|
+ mock_stream_body.get_raw_stream.return_value = mock_raw_stream
|
|
|
+ mock_raw_stream.read.return_value = self.content
|
|
|
+
|
|
|
+ mock_stream_body.get_stream_to_file = MagicMock()
|
|
|
+
|
|
|
+ def chunk_generator(chunk_size=2):
|
|
|
+ for i in range(0, len(self.content), chunk_size):
|
|
|
+ yield self.content[i : i + chunk_size]
|
|
|
+
|
|
|
+ mock_stream_body.get_stream.return_value = chunk_generator(chunk_size=4096)
|
|
|
+ return {"Body": mock_stream_body}
|
|
|
+
|
|
|
+ def object_exists(self, Bucket, Key): # noqa: N803
|
|
|
+ assert Bucket == self.bucket_name
|
|
|
+ assert Key == self.key
|
|
|
+ return True
|
|
|
+
|
|
|
+ def delete_object(self, Bucket, Key, **kwargs): # noqa: N803
|
|
|
+ assert Bucket == self.bucket_name
|
|
|
+ assert Key == self.key
|
|
|
+ self.resp.update({"x-cos-delete-marker": True})
|
|
|
+ return self.resp
|
|
|
+
|
|
|
+
|
|
|
+MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
|
|
|
+
|
|
|
+
|
|
|
+@pytest.fixture
|
|
|
+def setup_tencent_cos_mock(monkeypatch: MonkeyPatch):
|
|
|
+ if MOCK:
|
|
|
+ monkeypatch.setattr(CosS3Client, "__init__", MockTencentCosClass.__init__)
|
|
|
+ monkeypatch.setattr(CosS3Client, "put_object", MockTencentCosClass.put_object)
|
|
|
+ monkeypatch.setattr(CosS3Client, "get_object", MockTencentCosClass.get_object)
|
|
|
+ monkeypatch.setattr(CosS3Client, "object_exists", MockTencentCosClass.object_exists)
|
|
|
+ monkeypatch.setattr(CosS3Client, "delete_object", MockTencentCosClass.delete_object)
|
|
|
+
|
|
|
+ yield
|
|
|
+
|
|
|
+ if MOCK:
|
|
|
+ monkeypatch.undo()
|