diff --git a/NOTICE b/NOTICE index b9d5bad8d98f75a06c1faca788d87fb6a65c77b8..3f141ad10691f50d19f4764077a9b6fcb70c4ad6 100644 --- a/NOTICE +++ b/NOTICE @@ -9,7 +9,7 @@ Apache-2.0 The following software have components provided under the terms of this license: - aiobotocore (from https://github.com/aio-libs/aiobotocore) -- aiohttp (from https://github.com/aio-libs/aiohttp/) +- aiohttp (from https://github.com/aio-libs/aiohttp) - async-timeout (from https://github.com/aio-libs/async_timeout/) - boto3 (from https://github.com/boto/boto3) - botocore (from https://github.com/boto/botocore) @@ -226,9 +226,9 @@ MIT The following software have components provided under the terms of this license: - PyJWT (from http://github.com/jpadilla/pyjwt) -- PyYAML +- PyYAML (from http://pyyaml.org/wiki/PyYAML) - adal (from https://github.com/AzureAD/azure-activedirectory-library-for-python) -- aiohttp (from https://github.com/aio-libs/aiohttp/) +- aiohttp (from https://github.com/aio-libs/aiohttp) - aioitertools (from https://github.com/jreese/aioitertools) - aioredis (from https://github.com/aio-libs/aioredis) - anyio (from https://pypi.org/project/anyio/3.3.0/, https://pypi.org/project/anyio/3.4.0/) diff --git a/requirements.txt b/requirements.txt index 629b0ef97dd7627923bd109e7f2103872083db3f..bfae029945c0619db0e5f57e1985cbf062686571 100644 --- a/requirements.txt +++ b/requirements.txt @@ -192,7 +192,7 @@ idna==3.2 # requests # rfc3986 # yarl -importlib-metadata==4.8.1 +importlib-metadata==4.10.1 # via # click # jsonschema @@ -429,7 +429,7 @@ yarl==1.6.3 # via aiohttp zict==2.0.0 # via distributed -zipp==3.6.0 +zipp==3.7.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements_dev.in b/requirements_dev.in index 795d9f52ed481b95b82cfe9a51c19606ce422691..50d69bb0c72e66559089b8cf2cf593584b2e5fc7 100644 --- a/requirements_dev.in +++ b/requirements_dev.in @@ -15,7 +15,7 @@ openapi-spec-validator mockito~=1.2 # Note since 3.8 includes Mock 4.0+. -mock>=4.0 +mock>=4.0 # Should be removed after migration to python >= 3.8 requests # used by starlette.TestClient for testing cryptography diff --git a/requirements_dev.txt b/requirements_dev.txt index 8046fa5e7254029dbeead36edaa880b5d3c1a28a..2fb67f4f35f022db2eb19ad6ab40bac89348fde1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -61,7 +61,7 @@ idna==3.2 # anyio # requests # rfc3986 -importlib-metadata==4.8.1 +importlib-metadata==4.10.1 # via # -c requirements.txt # click @@ -205,7 +205,7 @@ urllib3==1.26.6 # requests wheel==0.36.2 # via pip-tools -zipp==3.6.0 +zipp==3.7.0 # via # -c requirements.txt # importlib-metadata diff --git a/tests/unit/app_conf_test.py b/tests/unit/app_conf_test.py index 91343e4fdcff9e8ebb8ff9007bad3fb70425af18..f6325a2b74233867adadd4e6bf1099d9a55100d2 100644 --- a/tests/unit/app_conf_test.py +++ b/tests/unit/app_conf_test.py @@ -17,28 +17,20 @@ import os import uuid import mock from app.utils import Context -from tests.unit.test_utils import NopeLogger + import app.conf as conf from app.helper.traces import create_exporter from app.conf import ConfigurationContainer, Config, check_environment, validator_path_must_exist, \ cloud_provider_additional_environment -@pytest.fixture -def testing_context(): - """ This is a basic Context initialized with empty logger to ensure tested methods can contains logging calls """ - ctx = Context(logger=NopeLogger(), request_id='this is a test') - Context.set_current(ctx) - return ctx - - @pytest.fixture def testing_config(): return Config @pytest.fixture() -def gcp_config_fixture(monkeypatch): +def gcp_config_fixture(): provider_name = "gcp" environment_dict = os.environ.copy() @@ -57,7 +49,7 @@ def gcp_config_fixture(monkeypatch): @pytest.fixture() -def azure_config_fixture(monkeypatch): +def azure_config_fixture(): provider_name = "az" environment_dict = os.environ.copy() diff --git a/tests/unit/bulk_persistence/dask_data_ipc_test.py b/tests/unit/bulk_persistence/dask_data_ipc_test.py index addd1c6e4e2019ef58c20476458e2903aa9a2b25..1bc499b65276e8129234de8d92b12950f41d2528 100644 --- a/tests/unit/bulk_persistence/dask_data_ipc_test.py +++ b/tests/unit/bulk_persistence/dask_data_ipc_test.py @@ -3,7 +3,7 @@ from mock import AsyncMock from unittest.mock import patch, mock_open from contextlib import suppress -from tests.unit.test_utils import temp_directory, nope_logger_fixture, side_effect_raise +from tests.unit.test_utils import nope_logger_fixture, side_effect_raise from dask.distributed import Client @@ -43,8 +43,8 @@ async def test_none_data_ipc_handle_async_generator_and_bytes(in_data): @pytest.mark.asyncio @pytest.mark.parametrize("in_data", [b"123456789", data_async_gen()]) -async def test_file_data_ipc_handle_async_generator_and_bytes(nope_logger_fixture, temp_directory, in_data): - ipc_obj = DaskLocalFileDataIPC(base_folder=temp_directory) +async def test_file_data_ipc_handle_async_generator_and_bytes(nope_logger_fixture, tmp_path, in_data): + ipc_obj = DaskLocalFileDataIPC(base_folder=tmp_path) await assert_ipc_forward_equal(ipc_obj, b"123456789") @@ -111,8 +111,8 @@ async def test_file_data_ipc_write_by_chunk(nope_logger_fixture, in_data): @pytest.mark.asyncio -async def test_file_data_ipc_track_file_count_and_size(nope_logger_fixture, temp_directory): - ipc_obj = DaskLocalFileDataIPC(base_folder=temp_directory) +async def test_file_data_ipc_track_file_count_and_size(nope_logger_fixture, tmp_path): + ipc_obj = DaskLocalFileDataIPC(base_folder=tmp_path) async with ipc_obj.set(b"0123456789"): assert DaskLocalFileDataIPC.total_size_in_file == 10 diff --git a/tests/unit/bulk_persistence/dask_worker_write_bulk_test.py b/tests/unit/bulk_persistence/dask_worker_write_bulk_test.py index 5948d2f598840d0e8466f02634d3df5e80900cb6..f0300fc402df7f8e33bbac60bbaf9e50bf0ef5a0 100644 --- a/tests/unit/bulk_persistence/dask_worker_write_bulk_test.py +++ b/tests/unit/bulk_persistence/dask_worker_write_bulk_test.py @@ -17,7 +17,7 @@ from app.bulk_persistence.dask.dask_worker_write_bulk import (basic_describe, from app.bulk_persistence.dask.errors import BulkNotProcessable, BulkSaveException from app.bulk_persistence.dataframe_validators import no_validation -from tests.unit.test_utils import temp_directory + def dataframe_to_format(df, data_format: str, as_stream=False): @@ -54,7 +54,7 @@ def test_basic_describe_truncates_columns(): # so far post_data and add_chunk takes same input, validate similarly and throw same exceptions @pytest.mark.parametrize("method_to_test", [write_bulk_without_session, add_chunk_in_session]) -def test_post_bulk_not_processable_cases(method_to_test, temp_directory): +def test_post_bulk_not_processable_cases(method_to_test, tmp_path): def as_bytes_io(content): return BytesIO(content) @@ -96,7 +96,7 @@ def test_post_bulk_not_processable_cases(method_to_test, temp_directory): data = pd.DataFrame({'A': [1], 'B': [4]}).to_parquet(engine='pyarrow', index=True) with patch.object(pd.DataFrame, 'to_parquet', side_effect=lambda *args, **kwargs: 0/0): with pytest.raises(BulkSaveException): - method_to_test(data, as_bytes_io, MimeTypes.PARQUET, no_validation, temp_directory, None) + method_to_test(data, as_bytes_io, MimeTypes.PARQUET, no_validation, tmp_path, None) @pytest.mark.parametrize("content_type", [ @@ -122,13 +122,13 @@ def test_write_bulk_without_session_success(content_type): MimeTypes.PARQUET, MimeTypes.JSON ]) -def test_write_chunk_in_session_success(content_type, temp_directory): +def test_write_chunk_in_session_success(content_type, tmp_path): # GIVEN df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) data = dataframe_to_format(df, content_type.type, True) # WHEN - result = add_chunk_in_session(data, lambda x: x, content_type, no_validation, temp_directory, None) + result = add_chunk_in_session(data, lambda x: x, content_type, no_validation, tmp_path, None) # THEN output basic describe matches assert result == DataframeBasicDescribe( @@ -141,13 +141,13 @@ def test_write_chunk_in_session_success(content_type, temp_directory): ) # and THEN meta file produced as a valid json - meta_files = [f for f in glob(temp_directory + '/*.meta')] + meta_files = [f for f in tmp_path.glob('*.meta')] assert len(meta_files) == 1 with open(meta_files[0]) as f: json.load(f) # and THEN dataframe saved as parquet format - parquet_files = [f for f in glob(temp_directory + '/*.parquet')] + parquet_files = [f for f in tmp_path.glob('*.parquet')] assert len(parquet_files) == 1 loaded_df = pd.read_parquet(parquet_files[0]) df.index.name = WDMS_INDEX_NAME diff --git a/tests/unit/bulk_persistence/dataframe_serializer_test.py b/tests/unit/bulk_persistence/dataframe_serializer_test.py index 13374ba9a9fca19f69acb5f469b85ac93432936e..f21c4a55f955fb4d2a906749c1c51667b2847279 100644 --- a/tests/unit/bulk_persistence/dataframe_serializer_test.py +++ b/tests/unit/bulk_persistence/dataframe_serializer_test.py @@ -15,7 +15,6 @@ from app.bulk_persistence.dataframe_serializer import (DataframeSerializerSync, DataframeSerializerAsync, JSONOrient) -from tests.unit.test_utils import temp_directory import pandas as pd import json import pytest @@ -25,7 +24,12 @@ from unittest.mock import patch from tempfile import SpooledTemporaryFile Reference_df = pd.DataFrame([[1., 10, 11], [2., 20, 21], [3., 30, 31]], columns=['ref', 'a', 'b']) -CONSTANT_DATA_JSON = '/data.json' + + +@pytest.fixture() +def data_path(tmp_path): + yield tmp_path / 'data.json' + # we're building it manually as we want to spot any change from anywhere that could occur (in pandas for instance) # we want format to be stable @@ -66,31 +70,31 @@ def test_load_from_str_various_orient(data_dict, orient): check_dataframe(df) -def test_load_from_path(temp_directory): +def test_load_from_path(data_path): orient = 'split' data_dict = dataframe_dict[orient] - path = temp_directory + CONSTANT_DATA_JSON - with open(path, 'w') as file: + + with open(data_path, 'w') as file: json.dump(data_dict, file) - df = DataframeSerializerSync.read_json(path, orient=orient) + df = DataframeSerializerSync.read_json(data_path, orient=orient) check_dataframe(df) -def test_load_from_file_like(temp_directory): +def test_load_from_file_like(data_path): orient = 'split' data_dict = dataframe_dict[orient] - path = temp_directory + CONSTANT_DATA_JSON - with open(path, 'w') as file: + + with open(data_path, 'w') as file: json.dump(data_dict, file) - with open(path, 'r') as file: + with open(data_path, 'r') as file: df = DataframeSerializerSync.read_json(file, orient=orient) check_dataframe(df) -def test_load_parquet_from_file_like(temp_directory): - path = temp_directory + '/data.parquet' +def test_load_parquet_from_file_like(tmp_path): + path = tmp_path / 'data.parquet' Reference_df.to_parquet(path) with open(path, 'rb') as file: @@ -144,29 +148,29 @@ async def test_back_forth_async_serializer(): check_dataframe(df) -def test_to_json_to_path(temp_directory): +def test_to_json_to_path(data_path): orient = 'split' data_dict = dataframe_dict[orient] - path = temp_directory + CONSTANT_DATA_JSON - result = DataframeSerializerSync.to_json(Reference_df, path_or_buf=path, orient=orient) + + result = DataframeSerializerSync.to_json(Reference_df, path_or_buf=data_path, orient=orient) assert result is None - with open(path, 'r') as file: + with open(data_path, 'r') as file: actual_dict = json.load(file) assert actual_dict == data_dict -def test_to_json_to_file(temp_directory): +def test_to_json_to_file(data_path): orient = 'split' data_dict = dataframe_dict[orient] - path = temp_directory + CONSTANT_DATA_JSON - with open(path, 'w') as file: + + with open(data_path, 'w') as file: result = DataframeSerializerSync.to_json(Reference_df, path_or_buf=file, orient=orient) assert result is None - with open(path, 'r') as file: + with open(data_path, 'r') as file: actual_dict = json.load(file) assert actual_dict == data_dict diff --git a/tests/unit/clients/client_factory_test.py b/tests/unit/clients/client_factory_test.py index ca8b31c5532d29562baa019c94d9a9fdf49afbf2..ac21c38234073bb74b68f883ba120060305f7db2 100755 --- a/tests/unit/clients/client_factory_test.py +++ b/tests/unit/clients/client_factory_test.py @@ -32,11 +32,11 @@ from app.utils import get_or_create_ctx from tests.unit.test_utils import make_record from odes_storage.exceptions import ResponseHandlingException from app.conf import Config -from tests.unit.test_utils import ctx_fixture as test_context +from tests.unit.test_utils import ctx_fixture @pytest.mark.asyncio -async def test_make_storage_client(httpx_mock: HTTPXMock, test_context): +async def test_make_storage_client(httpx_mock: HTTPXMock, ctx_fixture): host = 'http://my_host:81234' async with make_storage_record_client(host) as client: assert isinstance(client, StorageRecordServiceClient) @@ -54,7 +54,7 @@ async def test_make_storage_client(httpx_mock: HTTPXMock, test_context): @pytest.mark.asyncio -async def test_make_search_client(httpx_mock: HTTPXMock, test_context): +async def test_make_search_client(httpx_mock: HTTPXMock, ctx_fixture): host = 'http://my_host:81234' async with make_search_client(host) as client: assert isinstance(client, SearchServiceClient) diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index a118d4759cc217e1b7bdf657ba28a312a65292d7..90975193c12be5fa3fffb4f66e165313671d0bfc 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -14,14 +14,13 @@ import asyncio import os -from tempfile import TemporaryDirectory import app.conf as conf import pytest from app.conf import ConfigurationContainer from app.utils import Context, DaskClient from fastapi import Header -from tests.unit.test_utils import nope_logger_fixture + @pytest.fixture(autouse=True) def top_fixture(monkeypatch): @@ -68,11 +67,10 @@ def event_loop(): # all tests will share the same loop @pytest.fixture -def init_fixtures(nope_logger_fixture, monkeypatch): - with TemporaryDirectory() as tmp_dir: - monkeypatch.setenv(name="USE_LOCALFS_BLOB_STORAGE_WITH_PATH", value=tmp_dir) - conf.Config = conf.ConfigurationContainer.with_load_all() - yield +def init_fixtures(monkeypatch, tmp_path): + monkeypatch.setenv(name="USE_LOCALFS_BLOB_STORAGE_WITH_PATH", value=tmp_path) + conf.Config = conf.ConfigurationContainer.with_load_all() + yield async def do_nothing(): diff --git a/tests/unit/errors/error_handler_test.py b/tests/unit/errors/error_handler_test.py index 25350bc003b8bf9a1cbc7014aa463097c131161e..344b1727aa86a0589df0e3d4341778341c94a47b 100644 --- a/tests/unit/errors/error_handler_test.py +++ b/tests/unit/errors/error_handler_test.py @@ -29,7 +29,7 @@ from app.clients import * from app.helper import traces, logger from app.auth.auth import require_opendes_authorized_user -from tests.unit.test_utils import patch_async, create_mock_class, nope_logger_fixture +from tests.unit.test_utils import create_mock_class, nope_logger_fixture from odes_storage.exceptions import ( UnexpectedResponse as OSDUStorageUnexpectedResponse, ResponseValidationError as OSDUStorageResponseValidationError, diff --git a/tests/unit/middleware/client_test.py b/tests/unit/middleware/client_test.py index b21f23371d91b92403810794a80d3469d6cf3150..0156c5d36385a3662ca24e96a590fae247fe7688 100755 --- a/tests/unit/middleware/client_test.py +++ b/tests/unit/middleware/client_test.py @@ -4,7 +4,7 @@ from pytest_httpx import HTTPXMock, to_response from app.clients import make_storage_record_client, make_search_client -from tests.unit.test_utils import nope_logger_fixture, ctx_fixture +from tests.unit.test_utils import ctx_fixture import app.conf as conf from app.helper import traces from app.auth.auth import require_opendes_authorized_user @@ -43,7 +43,7 @@ async def test_fwd_correlation_id_to_outgoing_request_to_search(httpx_mock: HTTP @pytest.fixture() -async def wdms_app_mocked(nope_logger_fixture): +async def wdms_app_mocked(): from fastapi.testclient import TestClient from app.wdms_app import wdms_app, app_injector diff --git a/tests/unit/middleware/traces_middleware_test.py b/tests/unit/middleware/traces_middleware_test.py index da65e9de5318583b3c477368dc4fcd8bf36ea130..b18fbc5757cabbf9bf91e5ca51f7f499f06b5d59 100644 --- a/tests/unit/middleware/traces_middleware_test.py +++ b/tests/unit/middleware/traces_middleware_test.py @@ -24,8 +24,7 @@ from starlette.routing import Router, Route, Mount from app.clients import SearchServiceClient, StorageRecordServiceClient from app.wdms_app import wdms_app, base_app, DDMS_V2_PATH, app_injector from app.utils import get_or_create_ctx - -from tests.unit.test_utils import NopeLogger +from tests.unit.test_utils import ctx_fixture # Initialize traces exporter in app with a custom one to allow validating our traces @@ -45,11 +44,6 @@ class ExporterInTest(base_exporter.Exporter): return sd -@pytest.fixture() -def ctx_fixture(): - """Create context with a real tracer in it""" - ctx = get_or_create_ctx().set_current_with_value(logger=NopeLogger()) - yield ctx @pytest.fixture diff --git a/tests/unit/modules/log_recognition/log_recognition_test.py b/tests/unit/modules/log_recognition/log_recognition_test.py index 67a2b07206672841e1ed99f7740854e478295c95..50e9f5e959b86ca8bded62a374e0d549fc3ad1b0 100644 --- a/tests/unit/modules/log_recognition/log_recognition_test.py +++ b/tests/unit/modules/log_recognition/log_recognition_test.py @@ -30,14 +30,14 @@ from app.middleware import require_data_partition_id from app.modules.log_recognition.routers.log_recognition import family_processor_manager from app.utils import Context from app.wdms_app import wdms_app, add_modules_routers, remove_modules_routers -from tests.unit.test_utils import create_mock_class, nope_logger, nope_logger_fixture +from tests.unit.test_utils import create_mock_class StorageRecordServiceClientMock = create_mock_class(StorageRecordServiceClient) SearchServiceClientMock = create_mock_class(SearchServiceClient) @pytest.fixture -def client(nope_logger_fixture): +def client(): async def bypass_authorization(): pass @@ -370,8 +370,7 @@ def test_swagger_generation(): # Global module setup / teardown -def setup_module(): - nope_logger() +def setup_module(nope_logger_fixture): ConfigurationContainer.modules.value = "log_recognition.routers.log_recognition" add_modules_routers() diff --git a/tests/unit/persistence/dask_blob_storage_test.py b/tests/unit/persistence/dask_blob_storage_test.py index b99fa66655d618f4a4e26d1a14c320a1e1fee441..b408b592735142b83b46b79fe24dee564576679a 100644 --- a/tests/unit/persistence/dask_blob_storage_test.py +++ b/tests/unit/persistence/dask_blob_storage_test.py @@ -13,7 +13,6 @@ # limitations under the License. import asyncio from datetime import datetime, timedelta -from tempfile import TemporaryDirectory import dask.dataframe as dd import numpy as np import pandas as pd @@ -39,10 +38,9 @@ from app.bulk_persistence.dataframe_validators import no_validation @pytest.fixture() -async def dask_storage(nope_logger_fixture, ctx_fixture) -> DaskBulkStorage: - with TemporaryDirectory() as tmp_dir: - dask_storage = await make_local_dask_bulk_storage(base_directory=tmp_dir) - yield dask_storage +async def dask_storage(nope_logger_fixture, ctx_fixture, tmp_path) -> DaskBulkStorage: + dask_storage = await make_local_dask_bulk_storage(base_directory=tmp_path) + yield dask_storage @pytest.fixture() diff --git a/tests/unit/persistence/sessions_storage_test.py b/tests/unit/persistence/sessions_storage_test.py index ab7272ccbfa4ccf84eed1759c412c7b8b7974ce5..eff98098a704ff04cff5e08abbb5cb959f935716 100644 --- a/tests/unit/persistence/sessions_storage_test.py +++ b/tests/unit/persistence/sessions_storage_test.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from tempfile import TemporaryDirectory from datetime import datetime, timedelta import pytest @@ -31,15 +30,15 @@ from app.persistence.sessions_storage import (Session, from osdu.core.api.storage.blob_storage_local_fs import LocalFSBlobStorage from app.utils import Context -from tests.unit.test_utils import NopeLogger +from tests.unit.test_utils import ctx_fixture + + from unittest.mock import patch, PropertyMock @pytest.fixture -def sessions_storage(): - Context(logger=NopeLogger).set_current() - with TemporaryDirectory() as tmp_dir: - yield SessionsStorage(LocalFSBlobStorage(directory=tmp_dir)) +def sessions_storage(ctx_fixture, tmp_path): + yield SessionsStorage(LocalFSBlobStorage(directory=tmp_path)) @pytest.fixture diff --git a/tests/unit/routers/about_test.py b/tests/unit/routers/about_test.py index 1d64e83e803e24350754520141dc69adab8aa258..980bce42d30eb5ff24954f164f09e029429d3cba 100644 --- a/tests/unit/routers/about_test.py +++ b/tests/unit/routers/about_test.py @@ -77,7 +77,7 @@ def test_version_requires_authentication(client, path_prefix): @pytest.mark.parametrize("path_prefix", PathPrefixParams) -def test_version_properly_read_details(client_with_authenticated_user, monkeypatch, path_prefix): +def test_version_properly_read_details(client_with_authenticated_user, path_prefix): # override value of build details Config.build_details.value = 'key1=value1; key2=value2' diff --git a/tests/unit/routers/bulk_apis_dependencies_test.py b/tests/unit/routers/bulk_apis_dependencies_test.py index f6d958583855c80581f2c7a2fb8a1a9dfa6a8461..84fc8f21377567ef64721fd7960552492e55904c 100644 --- a/tests/unit/routers/bulk_apis_dependencies_test.py +++ b/tests/unit/routers/bulk_apis_dependencies_test.py @@ -4,6 +4,7 @@ from app.routers.ddms_v2 import log_ddms_v2 from app.routers.ddms_v3 import wellbore_trajectory_ddms_v3, welllog_ddms_v3 from app.wdms_app import ALPHA_APIS_PREFIX, DDMS_V2_PATH, DDMS_V3_PATH from fastapi.testclient import TestClient +from tests.unit.test_utils import nope_logger_fixture from tests.unit.routers.chunking_test import dasked_test_app base_paths = [ diff --git a/tests/unit/routers/chunking_test.py b/tests/unit/routers/chunking_test.py index 46ef930db2ff9e0b2266932d55da2bfb4e83bf4a..e8f91ac0816628f59d87e8087b7dd71480c1b4e0 100644 --- a/tests/unit/routers/chunking_test.py +++ b/tests/unit/routers/chunking_test.py @@ -1,6 +1,6 @@ import io import math -from tempfile import TemporaryDirectory +import platform import numpy as np import pandas as pd @@ -26,6 +26,8 @@ from pandas.testing import assert_frame_equal from tests.unit.conftest import do_nothing, set_default_partition from tests.unit.persistence.dask_blob_storage_test import generate_df +from tests.unit.test_utils import nope_logger_fixture + Definitions = { 'WellLog': { 'api_version': 'v3', @@ -122,36 +124,36 @@ def _cast_datetime_to_datetime64_ns(result_df): @pytest.fixture -def dasked_test_app(init_fixtures, event_loop): - with TemporaryDirectory() as tmp_dir: - local_blob_storage = LocalFSBlobStorage(directory=tmp_dir) +def dasked_test_app(init_fixtures, event_loop, tmp_path, nope_logger_fixture): + + local_blob_storage = LocalFSBlobStorage(directory=tmp_path) - async def storage_service_builder(*args, **kwargs): - return StorageRecordServiceBlobStorage(local_blob_storage, 'myProject', 'myContainer') + async def storage_service_builder(*args, **kwargs): + return StorageRecordServiceBlobStorage(local_blob_storage, 'myProject', 'myContainer') - async def blob_storage_builder(*args, **kwargs): - return local_blob_storage + async def blob_storage_builder(*args, **kwargs): + return local_blob_storage - async def sessions_storage_builder(*args, **kwargs): - return SessionsStorage(local_blob_storage) + async def sessions_storage_builder(*args, **kwargs): + return SessionsStorage(local_blob_storage) - async def dask_blob_storage_builder() -> DaskBulkStorage: - return await make_local_dask_bulk_storage(base_directory=tmp_dir) + async def dask_blob_storage_builder() -> DaskBulkStorage: + return await make_local_dask_bulk_storage(base_directory=tmp_path) - app_injector.register(DaskBulkStorage, dask_blob_storage_builder) - app_injector.register(BlobStorageBase, blob_storage_builder) - app_injector.register(SessionsStorage, sessions_storage_builder) - app_injector.register(StorageRecordServiceClient, storage_service_builder) + app_injector.register(DaskBulkStorage, dask_blob_storage_builder) + app_injector.register(BlobStorageBase, blob_storage_builder) + app_injector.register(SessionsStorage, sessions_storage_builder) + app_injector.register(StorageRecordServiceClient, storage_service_builder) - wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing - wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition + wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing + wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition - # Initialize traces exporter in app, like it is in app's startup decorator - wdms_app.trace_exporter = traces.CombinedExporter(service_name='tested-ddms') + # Initialize traces exporter in app, like it is in app's startup decorator + wdms_app.trace_exporter = traces.CombinedExporter(service_name='tested-ddms') - yield wdms_app - # clean up - wdms_app.dependency_overrides = {} + yield wdms_app + # clean up + wdms_app.dependency_overrides = {} @pytest.fixture @@ -936,7 +938,7 @@ def test_send_json_parquet_in_one_session(dasked_test_app_without_consistency_cl json={'state': 'commit'}) assert commit_session_response.status_code == 200 - + get_response = client.get(f'{chunking_url}/{record_id}/data') assert get_response.status_code == 200 diff --git a/tests/unit/routers/ddms_v2/common_ddms_v2_test.py b/tests/unit/routers/ddms_v2/common_ddms_v2_test.py index a339f0de6d0f780d51c31b2e708791eb43f3cd66..98870c997b8b7a822d503aa5d4d82c3a8e3cd0e7 100644 --- a/tests/unit/routers/ddms_v2/common_ddms_v2_test.py +++ b/tests/unit/routers/ddms_v2/common_ddms_v2_test.py @@ -33,7 +33,7 @@ from app.routers.ddms_v2.storage_helper import StorageHelper from app.routers.search.search_wrapper import SearchWrapper from app.utils import Context from app.wdms_app import wdms_app, app_injector -from tests.unit.test_utils import create_mock_class, make_record, nope_logger_fixture +from tests.unit.test_utils import create_mock_class, make_record """ Contains unified common tests for the different kind. Mainly CRUD test cases @@ -141,7 +141,7 @@ SearchWrapperMock = create_mock_class(SearchWrapper) @pytest.fixture -def client(nope_logger_fixture): +def client(): async def bypass_authorization(): # empty method pass diff --git a/tests/unit/routers/ddms_v2/log_data_test.py b/tests/unit/routers/ddms_v2/log_data_test.py index 6f44a654a23c9d136bb545644a19e2e02bda26c2..8a31fee9c610b5091ad4894e510568a549861a2b 100644 --- a/tests/unit/routers/ddms_v2/log_data_test.py +++ b/tests/unit/routers/ddms_v2/log_data_test.py @@ -14,9 +14,7 @@ import os -from tests.unit.test_utils import create_mock_class, nope_logger_fixture - -from tempfile import TemporaryDirectory +from tests.unit.test_utils import create_mock_class from fastapi import HTTPException, Header from fastapi.testclient import TestClient @@ -72,30 +70,30 @@ StorageRecordServiceClientMock = create_mock_class(StorageRecordServiceClient) @pytest.fixture -def client(nope_logger_fixture): - with TemporaryDirectory() as tmpdir: - async def storage_service_builder(*args, **kwargs): - return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmpdir), 'p1', 'c1') +def client(tmp_path): + + async def storage_service_builder(*args, **kwargs): + return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmp_path), 'p1', 'c1') - async def blob_storage_builder(*args, **kwargs): - return LocalFSBlobStorage(directory=tmpdir) + async def blob_storage_builder(*args, **kwargs): + return LocalFSBlobStorage(directory=tmp_path) - async def set_default_partition(data_partition_id: str = Header('opendes')): - Context.set_current_with_value(partition_id=data_partition_id) + async def set_default_partition(data_partition_id: str = Header('opendes')): + Context.set_current_with_value(partition_id=data_partition_id) - app_injector.register(BlobStorageBase, blob_storage_builder) - app_injector.register(StorageRecordServiceClient, storage_service_builder) + app_injector.register(BlobStorageBase, blob_storage_builder) + app_injector.register(StorageRecordServiceClient, storage_service_builder) - async def do_nothing(): - # empty method - pass + async def do_nothing(): + # empty method + pass - wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing - wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition + wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing + wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition - yield TestClient(wdms_app) + yield TestClient(wdms_app) - wdms_app.dependency_overrides = {} # clean up + wdms_app.dependency_overrides = {} # clean up @pytest.fixture diff --git a/tests/unit/routers/ddms_v2/log_ddms_v2_private_test.py b/tests/unit/routers/ddms_v2/log_ddms_v2_private_test.py index 9f99adcbd68c56f04936e563259a88298188cf66..fcfe3a184e16ceac81dd03bf40d182965993ff1b 100644 --- a/tests/unit/routers/ddms_v2/log_ddms_v2_private_test.py +++ b/tests/unit/routers/ddms_v2/log_ddms_v2_private_test.py @@ -34,7 +34,7 @@ from app.middleware import require_data_partition_id from app.wdms_app import wdms_app, app_injector from app.utils import Context from app.routers.record_utils import fetch_record, update_records -from tests.unit.test_utils import create_mock_class, nope_logger_fixture, ctx_fixture +from tests.unit.test_utils import create_mock_class, ctx_fixture from odes_storage.models import CreateUpdateRecordsResponse, Record diff --git a/tests/unit/routers/ddms_v2/log_ddms_v2_test.py b/tests/unit/routers/ddms_v2/log_ddms_v2_test.py index dc908c29e0575431e22da5790e828c5de6acafb0..8665706a058ad1cfadb3aa7c2546ae34fbc34b47 100644 --- a/tests/unit/routers/ddms_v2/log_ddms_v2_test.py +++ b/tests/unit/routers/ddms_v2/log_ddms_v2_test.py @@ -18,7 +18,7 @@ tests specific to logset APIs. Common tests implemented in common_ddms_v2_test import asyncio import json -from tempfile import TemporaryDirectory + from io import BytesIO import numpy as np @@ -42,7 +42,7 @@ from app.bulk_persistence import MimeTypes from app.utils import Context from app.wdms_app import wdms_app, app_injector from app.clients import * -from tests.unit.test_utils import assert_dict_contained, make_record, nope_logger_fixture +from tests.unit.test_utils import make_record, nope_logger_fixture # Initialize traces exporter in app, like it is in app's startup decorator wdms_app.trace_exporter = traces.CombinedExporter(service_name='tested-ddms') @@ -100,30 +100,29 @@ class TestHelper: @pytest.fixture -def client(nope_logger_fixture): - with TemporaryDirectory() as tmpdir: - async def storage_service_builder(*args, **kwargs): - return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmpdir), 'p1', 'c1') +def client(nope_logger_fixture, tmp_path): + async def storage_service_builder(*args, **kwargs): + return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmp_path), 'p1', 'c1') - async def blob_storage_builder(*args, **kwargs): - return LocalFSBlobStorage(directory=tmpdir) + async def blob_storage_builder(*args, **kwargs): + return LocalFSBlobStorage(directory=tmp_path) - async def set_default_partition(data_partition_id: str = Header('opendes')): - Context.set_current_with_value(partition_id=data_partition_id) + async def set_default_partition(data_partition_id: str = Header('opendes')): + Context.set_current_with_value(partition_id=data_partition_id) - app_injector.register(BlobStorageBase, blob_storage_builder) - app_injector.register(StorageRecordServiceClient, storage_service_builder) + app_injector.register(BlobStorageBase, blob_storage_builder) + app_injector.register(StorageRecordServiceClient, storage_service_builder) - async def do_nothing(): - # empty method - pass + async def do_nothing(): + # empty method + pass - wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing - wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition + wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing + wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition - yield TestClient(wdms_app) + yield TestClient(wdms_app) - wdms_app.dependency_overrides = {} # clean up + wdms_app.dependency_overrides = {} # clean up log_data = [ diff --git a/tests/unit/routers/ddms_v3/common_ddms_v3_test.py b/tests/unit/routers/ddms_v3/common_ddms_v3_test.py index cb5947c2b72e0458f949129189429f73442eda96..873466b3dbe02adb48e949f9714aeabcacefed49 100644 --- a/tests/unit/routers/ddms_v3/common_ddms_v3_test.py +++ b/tests/unit/routers/ddms_v3/common_ddms_v3_test.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from tempfile import TemporaryDirectory import json import os import mock @@ -75,42 +74,41 @@ SearchServiceClientMock = create_mock_class(SearchServiceClient) @pytest.fixture -def dasked_test_app_with_mocked_core_service(nope_logger_fixture, event_loop): +def dasked_test_app_with_mocked_core_service(event_loop, tmp_path): - with TemporaryDirectory() as tmp_dir: - local_blob_storage = LocalFSBlobStorage(directory=tmp_dir) + local_blob_storage = LocalFSBlobStorage(directory=tmp_path) - async def build_mock_storage(): - return StorageRecordServiceClientMock() + async def build_mock_storage(): + return StorageRecordServiceClientMock() - async def build_mock_search(): - return SearchServiceClientMock() + async def build_mock_search(): + return SearchServiceClientMock() - async def blob_storage_builder(*args, **kwargs): - return local_blob_storage + async def blob_storage_builder(*args, **kwargs): + return local_blob_storage - async def sessions_storage_builder(*args, **kwargs): - return SessionsStorage(local_blob_storage) + async def sessions_storage_builder(*args, **kwargs): + return SessionsStorage(local_blob_storage) - async def dask_blob_storage_builder() -> DaskBulkStorage: - return await make_local_dask_bulk_storage(base_directory=tmp_dir) + async def dask_blob_storage_builder() -> DaskBulkStorage: + return await make_local_dask_bulk_storage(base_directory=tmp_path) - app_injector.register(DaskBulkStorage, dask_blob_storage_builder) - app_injector.register(BlobStorageBase, blob_storage_builder) - app_injector.register(SessionsStorage, sessions_storage_builder) - app_injector.register(StorageRecordServiceClient, build_mock_storage) - app_injector.register(SearchServiceClient, build_mock_search) + app_injector.register(DaskBulkStorage, dask_blob_storage_builder) + app_injector.register(BlobStorageBase, blob_storage_builder) + app_injector.register(SessionsStorage, sessions_storage_builder) + app_injector.register(StorageRecordServiceClient, build_mock_storage) + app_injector.register(SearchServiceClient, build_mock_search) - # override authentication dependency - previous_overrides = wdms_app.dependency_overrides + # override authentication dependency + previous_overrides = wdms_app.dependency_overrides - try: - wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing - wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition - client = TestClient(wdms_app) - yield client - finally: - wdms_app.dependency_overrides = previous_overrides # clean up + try: + wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing + wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition + client = TestClient(wdms_app) + yield client + finally: + wdms_app.dependency_overrides = previous_overrides # clean up # Initialize traces exporter in app, like it is in app's startup decorator diff --git a/tests/unit/routers/ddms_v3/delete_ddms_v3_test.py b/tests/unit/routers/ddms_v3/delete_ddms_v3_test.py index ee63a7bb4c121cf5753b72ebb959ceb8b4c76323..e68b362a875c8a3c455202d7b4c5ca3fd109ecbe 100644 --- a/tests/unit/routers/ddms_v3/delete_ddms_v3_test.py +++ b/tests/unit/routers/ddms_v3/delete_ddms_v3_test.py @@ -32,7 +32,7 @@ from app.auth.auth import require_opendes_authorized_user from app.routers.delete import delete_bulk_data from app.utils import Context from app.wdms_app import wdms_app, app_injector -from tests.unit.test_utils import create_mock_class, nope_logger_fixture +from tests.unit.test_utils import create_mock_class StorageRecordServiceClientMock = mock.AsyncMock() BlobStorageMock = mock.AsyncMock() diff --git a/tests/unit/routers/ddms_v3/trajectory_constency_test.py b/tests/unit/routers/ddms_v3/trajectory_constency_test.py index 600d035529c817ccd79711b6fb68c55875c4d7f7..a35f8a82f3172a821a22b94a57867a48a8dad93e 100644 --- a/tests/unit/routers/ddms_v3/trajectory_constency_test.py +++ b/tests/unit/routers/ddms_v3/trajectory_constency_test.py @@ -8,14 +8,14 @@ from app.helper import traces from app.middleware import require_data_partition_id from app.utils import Context from app.wdms_app import app_injector, wdms_app -from tests.unit.test_utils import create_mock_class, nope_logger_fixture +from tests.unit.test_utils import create_mock_class StorageRecordServiceClientMock = create_mock_class(StorageRecordServiceClient) SearchServiceClientMock = create_mock_class(SearchServiceClient) @pytest.fixture -def client(nope_logger_fixture): +def client(): async def bypass_authorization(): # empty method pass diff --git a/tests/unit/routers/delete_recursive_test.py b/tests/unit/routers/delete_recursive_test.py index 4252d32b2feff2fff3124c1296a7dc5aee254e7d..424b042cb5419dad74e4692f8c6d808be7f579f4 100644 --- a/tests/unit/routers/delete_recursive_test.py +++ b/tests/unit/routers/delete_recursive_test.py @@ -25,7 +25,7 @@ from app.routers.ddms_v2.storage_helper import StorageHelper from app.model.entity_utils import Entity, get_kind, format_kind from app.utils import Context from tests.unit.test_utils import create_mock_class, make_record -from tests.unit.app_conf_test import testing_context +from tests.unit.test_utils import ctx_fixture StorageRecordServiceClientMock = create_mock_class(StorageRecordServiceClient) @@ -63,7 +63,7 @@ def with_patched_get_record(well_record): @pytest.mark.asyncio -async def test_delete_recursive_only_delete_entity_provided(testing_context, +async def test_delete_recursive_only_delete_entity_provided(ctx_fixture, authority, data_partition, entity_source, @@ -96,7 +96,7 @@ async def test_delete_recursive_only_delete_entity_provided(testing_context, wraps=StorageRecordServiceClientMock.delete_record) as moc_storage_delete_record: # when await StorageHelper.delete_recursively( - testing_context, + ctx_fixture, well_record.id, 'well', [Entity.LOGSET, Entity.MARKER], data_partition, @@ -110,7 +110,7 @@ async def test_delete_recursive_only_delete_entity_provided(testing_context, @pytest.mark.asyncio -async def test_delete_failure_on_parent_dont_delete_children(testing_context, +async def test_delete_failure_on_parent_dont_delete_children(ctx_fixture, authority, data_partition, entity_source, @@ -135,7 +135,7 @@ async def test_delete_failure_on_parent_dont_delete_children(testing_context, side_effect=RuntimeError('simulate error')) as moc_storage_delete_record: with pytest.raises(RuntimeError): # expect to raise await StorageHelper.delete_recursively( - testing_context, + ctx_fixture, well_record.id, 'well', [Entity.LOGSET], data_partition, @@ -150,7 +150,7 @@ async def test_delete_failure_on_parent_dont_delete_children(testing_context, @pytest.mark.asyncio async def test_delete_should_keep_delete_heterogeneous_failure( - testing_context, + ctx_fixture, authority, data_partition, entity_source, @@ -205,7 +205,7 @@ async def test_delete_should_keep_delete_heterogeneous_failure( @pytest.mark.asyncio async def test_delete_should_keep_delete_homogenous_failure( - testing_context, + ctx_fixture, authority, data_partition, entity_source, @@ -264,7 +264,7 @@ async def test_delete_should_keep_delete_homogenous_failure( reason_phrase='', content=b'', headers={})]) -async def test_delete_404_of_sub_delete_is_valid(testing_context, +async def test_delete_404_of_sub_delete_is_valid(ctx_fixture, data_partition, authority, entity_source, @@ -291,7 +291,7 @@ async def test_delete_404_of_sub_delete_is_valid(testing_context, side_effect=delete_success_only_well): # no exception raised await StorageHelper.delete_recursively( - testing_context, + ctx_fixture, well_record.id, 'well', [Entity.LOGSET], data_partition, @@ -305,7 +305,7 @@ async def test_delete_404_of_sub_delete_is_valid(testing_context, fastApiHTTPException(status_code=status.HTTP_404_NOT_FOUND), fastApiHTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR), RuntimeError()]) -async def test_delete_failure_get_record(testing_context, +async def test_delete_failure_get_record(ctx_fixture, data_partition, entity_source, well_record, @@ -313,6 +313,6 @@ async def test_delete_failure_get_record(testing_context, with StorageRecordServiceClientMock.set_throw('get_record', exception): with pytest.raises(exception.__class__): await StorageHelper.delete_recursively( - testing_context, + ctx_fixture, well_record.id, 'well', [], data_partition, None, StorageRecordServiceClientMock) diff --git a/tests/unit/routers/dipset/dip_ddms_v2.py b/tests/unit/routers/dipset/dip_ddms_v2.py index 7d5563e21acfd511fffd51c98914910a987f709f..fa61a69f515ed1401127e6650b8614616e23b069 100644 --- a/tests/unit/routers/dipset/dip_ddms_v2.py +++ b/tests/unit/routers/dipset/dip_ddms_v2.py @@ -15,7 +15,7 @@ from app.clients import * from app.auth.auth import require_opendes_authorized_user from tests.unit.errors.error_handler_test import StorageRecordServiceBlobStorageMock -from tests.unit.test_utils import patch_async, create_mock_class, nope_logger_fixture +from tests.unit.test_utils import create_mock_class from odes_storage.exceptions import UnexpectedResponse import pandas as pd @@ -27,7 +27,7 @@ tests_parameters = [ ] @pytest.fixture -def client(nope_logger_fixture): +def client(): async def bypass_authorization(): # empty method pass diff --git a/tests/unit/routers/trajectory/trajectory_ddms_v2_test.py b/tests/unit/routers/trajectory/trajectory_ddms_v2_test.py index 8be11e8ef88468ae59aaa9ca8a9cee8b9ea5a9c1..686eadcc25114a8deac993b07c30f777ca313a09 100644 --- a/tests/unit/routers/trajectory/trajectory_ddms_v2_test.py +++ b/tests/unit/routers/trajectory/trajectory_ddms_v2_test.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - -from tempfile import TemporaryDirectory - from fastapi.testclient import TestClient from fastapi import Header, status @@ -33,7 +30,6 @@ from app.middleware import require_data_partition_id from app.wdms_app import wdms_app, app_injector from app.utils import Context -from tests.unit.test_utils import nope_logger_fixture # Initialize traces exporter in app, like it is in app's startup decorator wdms_app.trace_exporter = traces.CombinedExporter(service_name='tested-ddms') @@ -79,30 +75,29 @@ prev_data = {"columns": ["col_100X"], "data": [[0], [1], [2]], 'index': [0, 1, 2 @pytest.fixture -def client(nope_logger_fixture): - with TemporaryDirectory() as tmpdir: - async def storage_service_builder(*args, **kwargs): - return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmpdir), 'p1', 'c1') +def client(tmp_path): + async def storage_service_builder(*args, **kwargs): + return StorageRecordServiceBlobStorage(LocalFSBlobStorage(directory=tmp_path), 'p1', 'c1') - async def blob_storage_builder(*args, **kwargs): - return LocalFSBlobStorage(directory=tmpdir) + async def blob_storage_builder(*args, **kwargs): + return LocalFSBlobStorage(directory=tmp_path) - async def set_default_partition(data_partition_id: str = Header('opendes')): - Context.set_current_with_value(partition_id=data_partition_id) + async def set_default_partition(data_partition_id: str = Header('opendes')): + Context.set_current_with_value(partition_id=data_partition_id) - app_injector.register(BlobStorageBase, blob_storage_builder) - app_injector.register(StorageRecordServiceClient, storage_service_builder) + app_injector.register(BlobStorageBase, blob_storage_builder) + app_injector.register(StorageRecordServiceClient, storage_service_builder) - async def do_nothing(): - # empty method - pass + async def do_nothing(): + # empty method + pass - wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing - wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition + wdms_app.dependency_overrides[require_opendes_authorized_user] = do_nothing + wdms_app.dependency_overrides[require_data_partition_id] = set_default_partition - yield TestClient(wdms_app) + yield TestClient(wdms_app) - wdms_app.dependency_overrides = {} # clean up + wdms_app.dependency_overrides = {} # clean up @pytest.fixture def client_with_log(client): diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index dea1160cfb22ebdd3712137bde1de57f7b9b1656..b20c604d0d2654fd09409e77f6c693218fda3784 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -14,100 +14,32 @@ import pytest import mock +from unittest.mock import patch import asyncio -from tempfile import TemporaryDirectory -from opencensus.trace.span_context import SpanContext +import logging from contextlib import contextmanager +from opencensus.trace.span_context import SpanContext from odes_storage.models import Record, StorageAcl, Legal from app.model.model_utils import record_to_dict from app.utils import get_or_create_ctx - -def from_env(key, default=None): - import os - result = os.environ.get(key, default) - # assert result, "Failed to get {} env variable".format(key) - return result - - - @pytest.fixture() def ctx_fixture(): """ Create context with a fake tracer in it """ mock_mock = mock.MagicMock() mock_mock.span_context = SpanContext(trace_id="trace-id", span_id="span_id") - ctx = get_or_create_ctx().set_current_with_value(tracer=mock_mock, logger=NopeLogger()) + ctx = get_or_create_ctx().set_current_with_value(tracer=mock_mock, logger=mock.NonCallableMock(spec_set=logging.Logger)) yield ctx @pytest.fixture -def nope_logger_fixture(): - nope_logger() - yield - -def nope_logger(): - from app.helper import logger - logger._LOGGER = NopeLogger() - -class NopeLogger: - def __init__(self): - # empty method - pass - - def debug(*arg, **kargs): - # empty method - pass - - def info(*arg, **kargs): - # empty method - pass - - def warning(*arg, **kargs): - # empty method - pass - - def error(*arg, **kargs): - # empty method - pass - - def exception(*arg, **kargs): - # empty method - pass - - def critical(*arg, **kargs): - # empty method - pass - - def log(*arg, **kargs): - # empty method - pass - - -class AsyncMock: - def __init__(self, *, return_value=None, forward_input_name: str = None, forward_input_index: int = 0): - self._return_value = return_value - self._from_input = forward_input_name - self._from_input_index = forward_input_index +def nope_logger_fixture(mocker): + yield mocker.patch('app.helper.logger._LOGGER', spec_set=logging.Logger, new_callable=mock.NonCallableMock) - async def __call__(self, *args, **kwargs): - if self._return_value is not None: - return self._return_value - if self._from_input: - return kwargs[self._from_input] - if self._from_input_index < 0: - return None - - return args[self._from_input_index] - - -def patch_async(target: str, return_value, mocker=mock): - future = asyncio.Future() - future.set_result(return_value) - return mocker.patch(target, return_value=future) def create_mock_class(cls_to_mock): @@ -184,28 +116,6 @@ def create_mock_class(cls_to_mock): return _new_class_ -def assert_dict_contained(dict_to_check: dict, ref_dict: dict, path=''): - """ - check actual dict contained ref_dict - path param use the default value - """ - for key, value in ref_dict.items(): - current_path = path + '.' + key if path else key - assert key in dict_to_check - sub_item = dict_to_check[key] - assert type(sub_item) == type(value), f'type of {current_path} ({type(sub_item)}) != ref {type(value)}' - if type(value) == dict: - assert_dict_contained(sub_item, value, current_path) - else: - assert sub_item == value, f'{current_path}: actual {sub_item} != ref {value}' - - -@pytest.fixture -async def temp_directory() -> str: - with TemporaryDirectory() as tmpdir: - yield tmpdir - - def make_record(as_dict=False, **kwargs): kwargs.setdefault('kind', 'opendes:osdu:raw:2.0.0') kwargs.setdefault('acl', StorageAcl( @@ -222,29 +132,6 @@ def basic_record(kind: str = None): return make_record() if kind is None else make_record(kind=kind) -def make_fn_return_value(value_to_return, as_coroutine: bool = False): - if not as_coroutine: - return lambda *args, **kwargs: value_to_return - - async def return_async_fn(*args, **kwargs): - return value_to_return - - return return_async_fn - - -def make_fn_do_nothing(as_coroutine: bool = False): - return make_fn_return_value(None, as_coroutine) - - -def make_async_return_value(value_to_return): - return make_fn_return_value(value_to_return, True) - - -def make_async_do_nothing(): - return make_fn_do_nothing(True) - - - # Format selected routes for spec generation def format_routes(app, prefix, tags): for route in app.routes: