From 8bd8d402a1ed1ce1955bf0e5fe99372260b4f6ef Mon Sep 17 00:00:00 2001 From: def Date: Sat, 15 Oct 2022 18:38:25 +0300 Subject: [PATCH 1/5] add storage tests --- tests/test_graphql/test_api_storage.py | 342 +++++++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 tests/test_graphql/test_api_storage.py diff --git a/tests/test_graphql/test_api_storage.py b/tests/test_graphql/test_api_storage.py new file mode 100644 index 0000000..98c75f0 --- /dev/null +++ b/tests/test_graphql/test_api_storage.py @@ -0,0 +1,342 @@ +import pytest + + +class BlockDeviceMockReturnNone: + """Mock BlockDevices""" + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + def mount(self): + return None + + def unmount(self): + return None + + def resize(self): + return None + + returncode = 0 + + +class BlockDeviceMockReturnTrue: + """Mock BlockDevices""" + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + def mount(self): + return True + + def unmount(self): + return True + + def resize(self): + return True + + returncode = 0 + + +class BlockDeviceMockReturnFalse: + """Mock BlockDevices""" + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + def mount(self): + return False + + def unmount(self): + return False + + def resize(self): + return False + + returncode = 0 + + +class BlockDevicesMockReturnTrue: + def get_block_device(name: str): # type: ignore + return BlockDeviceMockReturnTrue() + + def __new__(cls, *args, **kwargs): + pass + + def __init__(self): + pass + + +class BlockDevicesMockReturnNone: + def get_block_device(name: str): # type: ignore + return None + + def __new__(cls, *args, **kwargs): + pass + + def __init__(self): + pass + + +@pytest.fixture +def mock_block_devices_return_true(mocker): + mock = mocker.patch( + "selfprivacy_api.graphql.mutations.storage_mutations.BlockDevices", + # "selfprivacy_api.utils.block_devices.BlockDevices", + autospec=True, + return_value=BlockDevicesMockReturnTrue, + ) + return mock + + +@pytest.fixture +def mock_block_devices_return_none(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevices", + autospec=True, + return_value=BlockDevicesMockReturnNone, + ) + return mock + + +@pytest.fixture +def mock_block_device_return_none(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevice", + autospec=True, + return_value=BlockDeviceMockReturnNone, + ) + return mock + + +@pytest.fixture +def mock_block_device_return_true(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevice", + autospec=True, + return_value=BlockDeviceMockReturnTrue, + ) + return mock + + +@pytest.fixture +def mock_block_device_return_false(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevice", + autospec=True, + return_value=BlockDeviceMockReturnFalse, + ) + return mock + + +API_RESIZE_VOLUME_MUTATION = """ +mutation resizeVolume($name: String!) { + resizeVolume(name: $name) { + success + message + code + } +} +""" + + +def test_graphql_resize_volumea_unathorized_client( + client, mock_block_devices_return_true +): + response = client.post( + "/graphql", + json={ + "query": API_RESIZE_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_resize_volume_nonexistent_block_device( + authorized_client, mock_block_devices_return_none +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_RESIZE_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["resizeVolume"]["code"] == 404 + assert response.json()["data"]["resizeVolume"]["message"] is not None + assert response.json()["data"]["resizeVolume"]["success"] is False + + +def test_graphql_resize_volume(authorized_client, mock_block_devices_return_true): + response = authorized_client.post( + "/graphql", + json={ + "query": API_RESIZE_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["resizeVolume"]["code"] == 200 + assert response.json()["data"]["resizeVolume"]["message"] is not None + assert response.json()["data"]["resizeVolume"]["success"] is True + + +API_MOUNT_VOLUME_MUTATION = """ +mutation mountVolume($name: String!) { + mountVolume(name: $name) { + success + message + code + } +} +""" + + +def test_graphql_mount_volume_unathorized_client(client, mock_block_device_return_true): + response = client.post( + "/graphql", + json={ + "query": API_MOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_mount_already_mounted_volume( + authorized_client, mock_block_devices_return_none +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["mountVolume"]["code"] == 404 + assert response.json()["data"]["mountVolume"]["message"] is not None + assert response.json()["data"]["mountVolume"]["success"] is False + + +def test_graphql_mount_not_found_volume( + authorized_client, mock_block_devices_return_none +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["mountVolume"]["code"] == 404 + assert response.json()["data"]["mountVolume"]["message"] is not None + assert response.json()["data"]["mountVolume"]["success"] is False + + +def test_graphql_mount_volume(authorized_client, mock_block_devices_return_true): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["mountVolume"]["code"] == 200 + assert response.json()["data"]["mountVolume"]["message"] is not None + assert response.json()["data"]["mountVolume"]["success"] is True + + +API_UNMOUNT_VOLUME_MUTATION = """ +mutation unmountVolume($name: String!) { + unmountVolume(name: $name) { + success + message + code + } +} +""" + + +def test_graphql_unmount_volume_unathorized_client( + client, mock_block_devices_return_true +): + response = client.post( + "/graphql", + json={ + "query": API_UNMOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_unmount_not_fount_volume( + authorized_client, mock_block_devices_return_true +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_UNMOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["unmountVolume"]["code"] == 404 + assert response.json()["data"]["unmountVolume"]["message"] is not None + assert response.json()["data"]["unmountVolume"]["success"] is False + + +def test_graphql_unmount_volume_false( + authorized_client, mock_block_devices_return_true +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_UNMOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["unmountVolume"]["code"] == 404 + assert response.json()["data"]["unmountVolume"]["message"] is not None + assert response.json()["data"]["unmountVolume"]["success"] is False + + +def test_graphql_unmount_volume(authorized_client, mock_block_devices_return_true): + response = authorized_client.post( + "/graphql", + json={ + "query": API_UNMOUNT_VOLUME_MUTATION, + "variables": {"name": "sdx"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["unmountVolume"]["code"] == 200 + assert response.json()["data"]["unmountVolume"]["message"] is not None + assert response.json()["data"]["unmountVolume"]["success"] is True -- 2.42.0 From d0c7c2eb284892c4d06a999a259cecccb220f018 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 15 Oct 2022 18:43:05 +0300 Subject: [PATCH 2/5] add test_api_services.py --- tests/test_graphql/test_api_services.py | 598 ++++++++++++++++++++++++ 1 file changed, 598 insertions(+) create mode 100644 tests/test_graphql/test_api_services.py diff --git a/tests/test_graphql/test_api_services.py b/tests/test_graphql/test_api_services.py new file mode 100644 index 0000000..47e6739 --- /dev/null +++ b/tests/test_graphql/test_api_services.py @@ -0,0 +1,598 @@ +import pytest + + +def get_service_by_id_return_none_mock(): + return None + + +def get_service_by_id_mock(): + return "nextcloud" + + +def service_to_graphql_service_mock(): + pass + + +class BlockDevicesMock: + def get_block_device(self, name: str): + pass + + +class BlockDevicesReturnNoneMock: + def get_block_device(self, name: str): + return None + + +class NextcloudMock: + def __init__(self, args, **kwargs): + self.args = args + self.kwargs = kwargs + + def enable(self): + pass + + def disable(self): + pass + + def stop(self): + pass + + def is_movable(self): + return True + + def move_to_volume(self): + pass + + returncode = 0 + + +class NextcloudReturnFalseMock: + def __init__(self, args, **kwargs): + self.args = args + self.kwargs = kwargs + + def enable(self): + pass + + def disable(self): + pass + + def stop(self): + pass + + def is_movable(self): + return False + + def move_to_volume(self): + pass + + returncode = 0 + + +@pytest.fixture +def mock_service_to_graphql_service(mocker): + mock = mocker.patch( + "selfprivacy_api.graphql.common_types.service.service_to_graphql_service", + autospec=True, + return_value=service_to_graphql_service_mock, + ) + return mock + + +@pytest.fixture +def mock_nextcloud(mocker): + mock = mocker.patch( + "selfprivacy_api.services.nextcloud.__init__.Nextcloud", + autospec=True, + return_value=NextcloudMock, + ) + return mock + + +@pytest.fixture +def mock_block_devices_return_none(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevices", + autospec=True, + return_value=BlockDevicesReturnNoneMock, + ) + return mock + + +@pytest.fixture +def mock_block_devices(mocker): + mock = mocker.patch( + "selfprivacy_api.utils.block_devices.BlockDevices", + autospec=True, + return_value=BlockDevicesMock, + ) + return mock + + +@pytest.fixture +def mock_nextcloud_return_false(mocker): + mock = mocker.patch( + "selfprivacy_api.services.nextcloud.__init__.Nextcloud", + autospec=True, + return_value=NextcloudReturnFalseMock, + ) + return mock + + +@pytest.fixture +def mock_get_service_by_id_return_none(mocker): + mock = mocker.patch( + "selfprivacy_api.services.__init__.get_service_by_id", + autospec=True, + return_value=mock_get_service_by_id_return_none, + ) + return mock + + +@pytest.fixture +def mock_get_service_by_id(mocker): + mock = mocker.patch( + "selfprivacy_api.services.__init__.get_service_by_id", + autospec=True, + return_value=mock_get_service_by_id, + ) + return mock + + +#################################################################### + + +API_ENABLE_SERVICE_MUTATION = """ +mutation enableService($service_id: String!) { + enableService(service_id: $service_id) { + success + message + code + } +} +""" + + +def test_graphql_enable_service_unathorized_client( + client, mock_get_service_by_id_return_none, mock_nextcloud +): + response = client.post( + "/graphql", + json={ + "query": API_ENABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_enable_not_found_service( + authorized_client, mock_get_service_by_id_return_none, mock_nextcloud +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_ENABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["enableService"]["code"] == 404 + assert response.json()["data"]["enableService"]["message"] is not None + assert response.json()["data"]["enableService"]["success"] is False + + +def test_graphql_enable_service( + authorized_client, mock_get_service_by_id, mock_nextcloud +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_ENABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["enableService"]["code"] == 200 + assert response.json()["data"]["enableService"]["message"] is not None + assert response.json()["data"]["enableService"]["success"] is True + + +API_DISABLE_SERVICE_MUTATION = """ +mutation disableService($service_id: String!) { + disableService(service_id: $service_id) { + success + message + code + } +} +""" + + +def test_graphql_disable_service_unathorized_client( + client, mock_get_service_by_id_return_none, mock_nextcloud +): + response = client.post( + "/graphql", + json={ + "query": API_DISABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_disable_not_found_service( + authorized_client, mock_get_service_by_id_return_none, mock_nextcloud +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_DISABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["disableService"]["code"] == 404 + assert response.json()["data"]["disableService"]["message"] is not None + assert response.json()["data"]["disableService"]["success"] is False + + +def test_graphql_disable_services( + authorized_client, mock_get_service_by_id, mock_nextcloud +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_DISABLE_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["disableService"]["code"] == 200 + assert response.json()["data"]["disableService"]["message"] is not None + assert response.json()["data"]["disableService"]["success"] is True + + +API_STOP_SERVICE_MUTATION = """ +mutation stopService($service_id: String!) { + stopService(service_id: $service_id) { + success + message + code + } +} +""" + + +def test_graphql_stop_service_unathorized_client( + client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = client.post( + "/graphql", + json={ + "query": API_STOP_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_stop_not_found_service( + authorized_client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_STOP_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["stopService"]["code"] == 404 + assert response.json()["data"]["stopService"]["message"] is not None + assert response.json()["data"]["stopService"]["success"] is False + + +def test_graphql_stop_services( + authorized_client, + mock_get_service_by_id, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_STOP_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["stopService"]["code"] == 200 + assert response.json()["data"]["stopService"]["message"] is not None + assert response.json()["data"]["stopService"]["success"] is True + + +API_START_SERVICE_MUTATION = """ +mutation startService($service_id: String!) { + startService(service_id: $service_id) { + success + message + code + } +} +""" + + +def test_graphql_start_service_unathorized_client( + client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = client.post( + "/graphql", + json={ + "query": API_START_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_start_not_found_service( + authorized_client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_START_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["startService"]["code"] == 404 + assert response.json()["data"]["startService"]["message"] is not None + assert response.json()["data"]["startService"]["success"] is False + + +def test_graphql_start_services( + authorized_client, + mock_get_service_by_id, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_START_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["startService"]["code"] == 200 + assert response.json()["data"]["startService"]["message"] is not None + assert response.json()["data"]["startService"]["success"] is True + + +API_RESTART_SERVICE_MUTATION = """ +mutation restartService($service_id: String!) { + restartService(service_id: $service_id) { + success + message + code + } +} +""" + + +def test_graphql_restart_service_unathorized_client( + client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = client.post( + "/graphql", + json={ + "query": API_RESTART_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_restart_not_found_service( + authorized_client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_RESTART_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["restartService"]["code"] == 404 + assert response.json()["data"]["restartService"]["message"] is not None + assert response.json()["data"]["restartService"]["success"] is False + + +def test_graphql_restart_service( + authorized_client, + mock_get_service_by_id, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_RESTART_SERVICE_MUTATION, + "variables": {"service_id": "nextcloud"}, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["restartService"]["code"] == 200 + assert response.json()["data"]["restartService"]["message"] is not None + assert response.json()["data"]["restartService"]["success"] is True + + +API_MOVE_SERVICE_MUTATION = """ +mutation moveService($input: MoveServiceInput!) { + moveService(input: $input) { + success + message + code + } +} +""" + + +def test_graphql_move_service_unathorized_client( + client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = client.post( + "/graphql", + json={ + "query": API_MOVE_SERVICE_MUTATION, + "variables": { + "input": {"service_id": "nextcloud", "location": "sdx"}, + }, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is None + + +def test_graphql_move_not_found_service( + authorized_client, + mock_get_service_by_id_return_none, + mock_nextcloud, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOVE_SERVICE_MUTATION, + "variables": { + "input": {"service_id": "nextcloud", "location": "sdx"}, + }, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["moveService"]["code"] == 404 + assert response.json()["data"]["moveService"]["message"] is not None + assert response.json()["data"]["moveService"]["success"] is False + + +def test_graphql_move_not_moveble_service( + authorized_client, + mock_get_service_by_id, + mock_nextcloud_return_false, + mock_service_to_graphql_service, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOVE_SERVICE_MUTATION, + "variables": { + "input": {"service_id": "nextcloud", "location": "sdx"}, + }, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["message"] is not None + assert response.json()["data"]["moveService"]["success"] is False + + +def test_graphql_move_service_volume_not_found( + authorized_client, + mock_get_service_by_id, + mock_nextcloud, + mock_service_to_graphql_service, + mock_block_devices_return_none, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOVE_SERVICE_MUTATION, + "variables": { + "input": {"service_id": "nextcloud", "location": "sdx"}, + }, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["message"] is not None + assert response.json()["data"]["moveService"]["success"] is False + + +def test_graphql_move_service( + authorized_client, + mock_get_service_by_id, + mock_nextcloud, + mock_service_to_graphql_service, + mock_block_devices, +): + response = authorized_client.post( + "/graphql", + json={ + "query": API_MOVE_SERVICE_MUTATION, + "variables": { + "input": {"service_id": "nextcloud", "location": "sdx"}, + }, + }, + ) + assert response.status_code == 200 + assert response.json().get("data") is not None + + assert response.json()["data"]["moveService"]["code"] == 200 + assert response.json()["data"]["moveService"]["message"] is not None + assert response.json()["data"]["moveService"]["success"] is True -- 2.42.0 From 4673054c0f4cc4348e7cbd6bbf5491bab6580dab Mon Sep 17 00:00:00 2001 From: def Date: Fri, 21 Oct 2022 20:37:32 +0400 Subject: [PATCH 3/5] fix all tests --- selfprivacy_api/migrations/__init__.py | 4 +- tests/test_graphql/test_api_services.py | 265 ++++++++++-------- .../test_api_services/one_user.json | 61 ++++ tests/test_graphql/test_api_storage.py | 4 +- 4 files changed, 211 insertions(+), 123 deletions(-) create mode 100644 tests/test_graphql/test_api_services/one_user.json diff --git a/selfprivacy_api/migrations/__init__.py b/selfprivacy_api/migrations/__init__.py index 8209198..b051f04 100644 --- a/selfprivacy_api/migrations/__init__.py +++ b/selfprivacy_api/migrations/__init__.py @@ -8,7 +8,9 @@ at api.skippedMigrations in userdata.json and populating it with IDs of the migrations to skip. Adding DISABLE_ALL to that array disables the migrations module entirely. """ -from selfprivacy_api.migrations.check_for_failed_binds_migration import CheckForFailedBindsMigration +from selfprivacy_api.migrations.check_for_failed_binds_migration import ( + CheckForFailedBindsMigration, +) from selfprivacy_api.utils import ReadUserData from selfprivacy_api.migrations.fix_nixos_config_branch import FixNixosConfigBranch from selfprivacy_api.migrations.create_tokens_json import CreateTokensJson diff --git a/tests/test_graphql/test_api_services.py b/tests/test_graphql/test_api_services.py index 47e6739..cc33070 100644 --- a/tests/test_graphql/test_api_services.py +++ b/tests/test_graphql/test_api_services.py @@ -1,100 +1,99 @@ +# pylint: disable=redefined-outer-name +# pylint: disable=unused-argument import pytest - -def get_service_by_id_return_none_mock(): - return None +from tests.common import read_json -def get_service_by_id_mock(): - return "nextcloud" - - -def service_to_graphql_service_mock(): - pass - - -class BlockDevicesMock: - def get_block_device(self, name: str): - pass - - -class BlockDevicesReturnNoneMock: - def get_block_device(self, name: str): - return None - - -class NextcloudMock: +class NextcloudMockReturnTrue: def __init__(self, args, **kwargs): self.args = args self.kwargs = kwargs - def enable(self): + def enable(): pass - def disable(self): + def disable(): pass - def stop(self): + def stop(): pass - def is_movable(self): + def is_movable(): return True - def move_to_volume(self): + def move_to_volume(what): + return None + + def start(): + pass + + def restart(): pass returncode = 0 -class NextcloudReturnFalseMock: +class BlockDevices: + def get_block_device(location): + return True + +class ProcessMock: + """Mock subprocess.Popen""" + def __init__(self, args, **kwargs): self.args = args self.kwargs = kwargs - def enable(self): - pass - - def disable(self): - pass - - def stop(self): - pass - - def is_movable(self): - return False - - def move_to_volume(self): - pass + def communicate(): # pylint: disable=no-method-argument + return (b"", None) returncode = 0 +@pytest.fixture +def mock_subprocess_popen(mocker): + mock = mocker.patch("subprocess.Popen", autospec=True, return_value=ProcessMock) + return mock + + +@pytest.fixture +def one_user(mocker, datadir): + mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "one_user.json") + assert read_json(datadir / "one_user.json")["users"] == [ + { + "username": "user1", + "hashedPassword": "HASHED_PASSWORD_1", + "sshKeys": ["ssh-rsa KEY user1@pc"], + } + ] + return datadir + + @pytest.fixture def mock_service_to_graphql_service(mocker): mock = mocker.patch( - "selfprivacy_api.graphql.common_types.service.service_to_graphql_service", + "selfprivacy_api.graphql.mutations.services_mutations.service_to_graphql_service", autospec=True, - return_value=service_to_graphql_service_mock, + return_value=None, ) return mock - @pytest.fixture -def mock_nextcloud(mocker): +def mock_job_to_api_job(mocker): mock = mocker.patch( - "selfprivacy_api.services.nextcloud.__init__.Nextcloud", + "selfprivacy_api.graphql.mutations.services_mutations.job_to_api_job", autospec=True, - return_value=NextcloudMock, + return_value=None, ) return mock - @pytest.fixture def mock_block_devices_return_none(mocker): mock = mocker.patch( "selfprivacy_api.utils.block_devices.BlockDevices", autospec=True, - return_value=BlockDevicesReturnNoneMock, + return_value=None, ) return mock @@ -102,19 +101,9 @@ def mock_block_devices_return_none(mocker): @pytest.fixture def mock_block_devices(mocker): mock = mocker.patch( - "selfprivacy_api.utils.block_devices.BlockDevices", + "selfprivacy_api.graphql.mutations.services_mutations.BlockDevices", autospec=True, - return_value=BlockDevicesMock, - ) - return mock - - -@pytest.fixture -def mock_nextcloud_return_false(mocker): - mock = mocker.patch( - "selfprivacy_api.services.nextcloud.__init__.Nextcloud", - autospec=True, - return_value=NextcloudReturnFalseMock, + return_value=BlockDevices, ) return mock @@ -122,9 +111,9 @@ def mock_nextcloud_return_false(mocker): @pytest.fixture def mock_get_service_by_id_return_none(mocker): mock = mocker.patch( - "selfprivacy_api.services.__init__.get_service_by_id", + "selfprivacy_api.graphql.mutations.services_mutations.get_service_by_id", autospec=True, - return_value=mock_get_service_by_id_return_none, + return_value=None, ) return mock @@ -132,9 +121,9 @@ def mock_get_service_by_id_return_none(mocker): @pytest.fixture def mock_get_service_by_id(mocker): mock = mocker.patch( - "selfprivacy_api.services.__init__.get_service_by_id", + "selfprivacy_api.graphql.mutations.services_mutations.get_service_by_id", autospec=True, - return_value=mock_get_service_by_id, + return_value=NextcloudMockReturnTrue, ) return mock @@ -143,8 +132,8 @@ def mock_get_service_by_id(mocker): API_ENABLE_SERVICE_MUTATION = """ -mutation enableService($service_id: String!) { - enableService(service_id: $service_id) { +mutation enableService($serviceId: String!) { + enableService(serviceId: $serviceId) { success message code @@ -154,13 +143,13 @@ mutation enableService($service_id: String!) { def test_graphql_enable_service_unathorized_client( - client, mock_get_service_by_id_return_none, mock_nextcloud + client, mock_get_service_by_id_return_none, mock_subprocess_popen ): response = client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -168,13 +157,17 @@ def test_graphql_enable_service_unathorized_client( def test_graphql_enable_not_found_service( - authorized_client, mock_get_service_by_id_return_none, mock_nextcloud + authorized_client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -186,13 +179,17 @@ def test_graphql_enable_not_found_service( def test_graphql_enable_service( - authorized_client, mock_get_service_by_id, mock_nextcloud + authorized_client, + mock_get_service_by_id, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -204,8 +201,8 @@ def test_graphql_enable_service( API_DISABLE_SERVICE_MUTATION = """ -mutation disableService($service_id: String!) { - disableService(service_id: $service_id) { +mutation disableService($serviceId: String!) { + disableService(serviceId: $serviceId) { success message code @@ -215,13 +212,17 @@ mutation disableService($service_id: String!) { def test_graphql_disable_service_unathorized_client( - client, mock_get_service_by_id_return_none, mock_nextcloud + client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -229,13 +230,17 @@ def test_graphql_disable_service_unathorized_client( def test_graphql_disable_not_found_service( - authorized_client, mock_get_service_by_id_return_none, mock_nextcloud + authorized_client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -247,13 +252,17 @@ def test_graphql_disable_not_found_service( def test_graphql_disable_services( - authorized_client, mock_get_service_by_id, mock_nextcloud + authorized_client, + mock_get_service_by_id, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -265,8 +274,8 @@ def test_graphql_disable_services( API_STOP_SERVICE_MUTATION = """ -mutation stopService($service_id: String!) { - stopService(service_id: $service_id) { +mutation stopService($serviceId: String!) { + stopService(serviceId: $serviceId) { success message code @@ -278,14 +287,15 @@ mutation stopService($service_id: String!) { def test_graphql_stop_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -295,14 +305,15 @@ def test_graphql_stop_service_unathorized_client( def test_graphql_stop_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -316,14 +327,15 @@ def test_graphql_stop_not_found_service( def test_graphql_stop_services( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -335,8 +347,8 @@ def test_graphql_stop_services( API_START_SERVICE_MUTATION = """ -mutation startService($service_id: String!) { - startService(service_id: $service_id) { +mutation startService($serviceId: String!) { + startService(serviceId: $serviceId) { success message code @@ -348,14 +360,15 @@ mutation startService($service_id: String!) { def test_graphql_start_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -365,14 +378,15 @@ def test_graphql_start_service_unathorized_client( def test_graphql_start_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -386,14 +400,15 @@ def test_graphql_start_not_found_service( def test_graphql_start_services( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -405,8 +420,8 @@ def test_graphql_start_services( API_RESTART_SERVICE_MUTATION = """ -mutation restartService($service_id: String!) { - restartService(service_id: $service_id) { +mutation restartService($serviceId: String!) { + restartService(serviceId: $serviceId) { success message code @@ -418,14 +433,15 @@ mutation restartService($service_id: String!) { def test_graphql_restart_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -435,14 +451,15 @@ def test_graphql_restart_service_unathorized_client( def test_graphql_restart_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -456,14 +473,15 @@ def test_graphql_restart_not_found_service( def test_graphql_restart_service( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -488,15 +506,16 @@ mutation moveService($input: MoveServiceInput!) { def test_graphql_move_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) @@ -507,15 +526,16 @@ def test_graphql_move_service_unathorized_client( def test_graphql_move_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) @@ -529,47 +549,50 @@ def test_graphql_move_not_found_service( def test_graphql_move_not_moveble_service( authorized_client, - mock_get_service_by_id, - mock_nextcloud_return_false, + mock_get_service_by_id_return_none, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) assert response.status_code == 200 assert response.json().get("data") is not None - assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["code"] == 404 assert response.json()["data"]["moveService"]["message"] is not None assert response.json()["data"]["moveService"]["success"] is False def test_graphql_move_service_volume_not_found( authorized_client, - mock_get_service_by_id, - mock_nextcloud, + mock_get_service_by_id_return_none, mock_service_to_graphql_service, mock_block_devices_return_none, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) + assert response.status_code == 200 assert response.json().get("data") is not None - assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["code"] == 404 assert response.json()["data"]["moveService"]["message"] is not None assert response.json()["data"]["moveService"]["success"] is False @@ -577,16 +600,18 @@ def test_graphql_move_service_volume_not_found( def test_graphql_move_service( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, mock_block_devices, + mock_subprocess_popen, + one_user, + mock_job_to_api_job, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) diff --git a/tests/test_graphql/test_api_services/one_user.json b/tests/test_graphql/test_api_services/one_user.json new file mode 100644 index 0000000..5df2108 --- /dev/null +++ b/tests/test_graphql/test_api_services/one_user.json @@ -0,0 +1,61 @@ +{ + "backblaze": { + "accountId": "ID", + "accountKey": "KEY", + "bucket": "selfprivacy" + }, + "api": { + "token": "TEST_TOKEN", + "enableSwagger": false + }, + "bitwarden": { + "enable": false + }, + "cloudflare": { + "apiKey": "TOKEN" + }, + "databasePassword": "PASSWORD", + "domain": "test.tld", + "hashedMasterPassword": "HASHED_PASSWORD", + "hostname": "test-instance", + "nextcloud": { + "adminPassword": "ADMIN", + "databasePassword": "ADMIN", + "enable": true + }, + "resticPassword": "PASS", + "ssh": { + "enable": true, + "passwordAuthentication": true, + "rootKeys": [ + "ssh-ed25519 KEY test@pc" + ] + }, + "username": "tester", + "gitea": { + "enable": false + }, + "ocserv": { + "enable": true + }, + "pleroma": { + "enable": true + }, + "autoUpgrade": { + "enable": true, + "allowReboot": true + }, + "timezone": "Europe/Moscow", + "sshKeys": [ + "ssh-rsa KEY test@pc" + ], + "users": [ + { + "username": "user1", + "hashedPassword": "HASHED_PASSWORD_1", + "sshKeys": [ + "ssh-rsa KEY user1@pc" + ] + } + ] +} \ No newline at end of file diff --git a/tests/test_graphql/test_api_storage.py b/tests/test_graphql/test_api_storage.py index 98c75f0..1fa2f78 100644 --- a/tests/test_graphql/test_api_storage.py +++ b/tests/test_graphql/test_api_storage.py @@ -291,7 +291,7 @@ def test_graphql_unmount_volume_unathorized_client( def test_graphql_unmount_not_fount_volume( - authorized_client, mock_block_devices_return_true + authorized_client, mock_block_devices_return_none ): response = authorized_client.post( "/graphql", @@ -309,7 +309,7 @@ def test_graphql_unmount_not_fount_volume( def test_graphql_unmount_volume_false( - authorized_client, mock_block_devices_return_true + authorized_client, mock_block_devices_return_none ): response = authorized_client.post( "/graphql", -- 2.42.0 From fbd408a491f144ab7908a421cec4cc43b4968321 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 21 Oct 2022 20:37:32 +0400 Subject: [PATCH 4/5] fix: service tests --- selfprivacy_api/migrations/__init__.py | 4 +- tests/test_graphql/test_api_services.py | 265 ++++++++++-------- .../test_api_services/one_user.json | 61 ++++ tests/test_graphql/test_api_storage.py | 4 +- 4 files changed, 211 insertions(+), 123 deletions(-) create mode 100644 tests/test_graphql/test_api_services/one_user.json diff --git a/selfprivacy_api/migrations/__init__.py b/selfprivacy_api/migrations/__init__.py index 8209198..b051f04 100644 --- a/selfprivacy_api/migrations/__init__.py +++ b/selfprivacy_api/migrations/__init__.py @@ -8,7 +8,9 @@ at api.skippedMigrations in userdata.json and populating it with IDs of the migrations to skip. Adding DISABLE_ALL to that array disables the migrations module entirely. """ -from selfprivacy_api.migrations.check_for_failed_binds_migration import CheckForFailedBindsMigration +from selfprivacy_api.migrations.check_for_failed_binds_migration import ( + CheckForFailedBindsMigration, +) from selfprivacy_api.utils import ReadUserData from selfprivacy_api.migrations.fix_nixos_config_branch import FixNixosConfigBranch from selfprivacy_api.migrations.create_tokens_json import CreateTokensJson diff --git a/tests/test_graphql/test_api_services.py b/tests/test_graphql/test_api_services.py index 47e6739..cc33070 100644 --- a/tests/test_graphql/test_api_services.py +++ b/tests/test_graphql/test_api_services.py @@ -1,100 +1,99 @@ +# pylint: disable=redefined-outer-name +# pylint: disable=unused-argument import pytest - -def get_service_by_id_return_none_mock(): - return None +from tests.common import read_json -def get_service_by_id_mock(): - return "nextcloud" - - -def service_to_graphql_service_mock(): - pass - - -class BlockDevicesMock: - def get_block_device(self, name: str): - pass - - -class BlockDevicesReturnNoneMock: - def get_block_device(self, name: str): - return None - - -class NextcloudMock: +class NextcloudMockReturnTrue: def __init__(self, args, **kwargs): self.args = args self.kwargs = kwargs - def enable(self): + def enable(): pass - def disable(self): + def disable(): pass - def stop(self): + def stop(): pass - def is_movable(self): + def is_movable(): return True - def move_to_volume(self): + def move_to_volume(what): + return None + + def start(): + pass + + def restart(): pass returncode = 0 -class NextcloudReturnFalseMock: +class BlockDevices: + def get_block_device(location): + return True + +class ProcessMock: + """Mock subprocess.Popen""" + def __init__(self, args, **kwargs): self.args = args self.kwargs = kwargs - def enable(self): - pass - - def disable(self): - pass - - def stop(self): - pass - - def is_movable(self): - return False - - def move_to_volume(self): - pass + def communicate(): # pylint: disable=no-method-argument + return (b"", None) returncode = 0 +@pytest.fixture +def mock_subprocess_popen(mocker): + mock = mocker.patch("subprocess.Popen", autospec=True, return_value=ProcessMock) + return mock + + +@pytest.fixture +def one_user(mocker, datadir): + mocker.patch("selfprivacy_api.utils.USERDATA_FILE", new=datadir / "one_user.json") + assert read_json(datadir / "one_user.json")["users"] == [ + { + "username": "user1", + "hashedPassword": "HASHED_PASSWORD_1", + "sshKeys": ["ssh-rsa KEY user1@pc"], + } + ] + return datadir + + @pytest.fixture def mock_service_to_graphql_service(mocker): mock = mocker.patch( - "selfprivacy_api.graphql.common_types.service.service_to_graphql_service", + "selfprivacy_api.graphql.mutations.services_mutations.service_to_graphql_service", autospec=True, - return_value=service_to_graphql_service_mock, + return_value=None, ) return mock - @pytest.fixture -def mock_nextcloud(mocker): +def mock_job_to_api_job(mocker): mock = mocker.patch( - "selfprivacy_api.services.nextcloud.__init__.Nextcloud", + "selfprivacy_api.graphql.mutations.services_mutations.job_to_api_job", autospec=True, - return_value=NextcloudMock, + return_value=None, ) return mock - @pytest.fixture def mock_block_devices_return_none(mocker): mock = mocker.patch( "selfprivacy_api.utils.block_devices.BlockDevices", autospec=True, - return_value=BlockDevicesReturnNoneMock, + return_value=None, ) return mock @@ -102,19 +101,9 @@ def mock_block_devices_return_none(mocker): @pytest.fixture def mock_block_devices(mocker): mock = mocker.patch( - "selfprivacy_api.utils.block_devices.BlockDevices", + "selfprivacy_api.graphql.mutations.services_mutations.BlockDevices", autospec=True, - return_value=BlockDevicesMock, - ) - return mock - - -@pytest.fixture -def mock_nextcloud_return_false(mocker): - mock = mocker.patch( - "selfprivacy_api.services.nextcloud.__init__.Nextcloud", - autospec=True, - return_value=NextcloudReturnFalseMock, + return_value=BlockDevices, ) return mock @@ -122,9 +111,9 @@ def mock_nextcloud_return_false(mocker): @pytest.fixture def mock_get_service_by_id_return_none(mocker): mock = mocker.patch( - "selfprivacy_api.services.__init__.get_service_by_id", + "selfprivacy_api.graphql.mutations.services_mutations.get_service_by_id", autospec=True, - return_value=mock_get_service_by_id_return_none, + return_value=None, ) return mock @@ -132,9 +121,9 @@ def mock_get_service_by_id_return_none(mocker): @pytest.fixture def mock_get_service_by_id(mocker): mock = mocker.patch( - "selfprivacy_api.services.__init__.get_service_by_id", + "selfprivacy_api.graphql.mutations.services_mutations.get_service_by_id", autospec=True, - return_value=mock_get_service_by_id, + return_value=NextcloudMockReturnTrue, ) return mock @@ -143,8 +132,8 @@ def mock_get_service_by_id(mocker): API_ENABLE_SERVICE_MUTATION = """ -mutation enableService($service_id: String!) { - enableService(service_id: $service_id) { +mutation enableService($serviceId: String!) { + enableService(serviceId: $serviceId) { success message code @@ -154,13 +143,13 @@ mutation enableService($service_id: String!) { def test_graphql_enable_service_unathorized_client( - client, mock_get_service_by_id_return_none, mock_nextcloud + client, mock_get_service_by_id_return_none, mock_subprocess_popen ): response = client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -168,13 +157,17 @@ def test_graphql_enable_service_unathorized_client( def test_graphql_enable_not_found_service( - authorized_client, mock_get_service_by_id_return_none, mock_nextcloud + authorized_client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -186,13 +179,17 @@ def test_graphql_enable_not_found_service( def test_graphql_enable_service( - authorized_client, mock_get_service_by_id, mock_nextcloud + authorized_client, + mock_get_service_by_id, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_ENABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -204,8 +201,8 @@ def test_graphql_enable_service( API_DISABLE_SERVICE_MUTATION = """ -mutation disableService($service_id: String!) { - disableService(service_id: $service_id) { +mutation disableService($serviceId: String!) { + disableService(serviceId: $serviceId) { success message code @@ -215,13 +212,17 @@ mutation disableService($service_id: String!) { def test_graphql_disable_service_unathorized_client( - client, mock_get_service_by_id_return_none, mock_nextcloud + client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -229,13 +230,17 @@ def test_graphql_disable_service_unathorized_client( def test_graphql_disable_not_found_service( - authorized_client, mock_get_service_by_id_return_none, mock_nextcloud + authorized_client, + mock_get_service_by_id_return_none, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -247,13 +252,17 @@ def test_graphql_disable_not_found_service( def test_graphql_disable_services( - authorized_client, mock_get_service_by_id, mock_nextcloud + authorized_client, + mock_get_service_by_id, + mock_subprocess_popen, + one_user, + mock_service_to_graphql_service, ): response = authorized_client.post( "/graphql", json={ "query": API_DISABLE_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -265,8 +274,8 @@ def test_graphql_disable_services( API_STOP_SERVICE_MUTATION = """ -mutation stopService($service_id: String!) { - stopService(service_id: $service_id) { +mutation stopService($serviceId: String!) { + stopService(serviceId: $serviceId) { success message code @@ -278,14 +287,15 @@ mutation stopService($service_id: String!) { def test_graphql_stop_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -295,14 +305,15 @@ def test_graphql_stop_service_unathorized_client( def test_graphql_stop_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -316,14 +327,15 @@ def test_graphql_stop_not_found_service( def test_graphql_stop_services( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_STOP_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -335,8 +347,8 @@ def test_graphql_stop_services( API_START_SERVICE_MUTATION = """ -mutation startService($service_id: String!) { - startService(service_id: $service_id) { +mutation startService($serviceId: String!) { + startService(serviceId: $serviceId) { success message code @@ -348,14 +360,15 @@ mutation startService($service_id: String!) { def test_graphql_start_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -365,14 +378,15 @@ def test_graphql_start_service_unathorized_client( def test_graphql_start_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -386,14 +400,15 @@ def test_graphql_start_not_found_service( def test_graphql_start_services( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_START_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -405,8 +420,8 @@ def test_graphql_start_services( API_RESTART_SERVICE_MUTATION = """ -mutation restartService($service_id: String!) { - restartService(service_id: $service_id) { +mutation restartService($serviceId: String!) { + restartService(serviceId: $serviceId) { success message code @@ -418,14 +433,15 @@ mutation restartService($service_id: String!) { def test_graphql_restart_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -435,14 +451,15 @@ def test_graphql_restart_service_unathorized_client( def test_graphql_restart_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -456,14 +473,15 @@ def test_graphql_restart_not_found_service( def test_graphql_restart_service( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_RESTART_SERVICE_MUTATION, - "variables": {"service_id": "nextcloud"}, + "variables": {"serviceId": "nextcloud"}, }, ) assert response.status_code == 200 @@ -488,15 +506,16 @@ mutation moveService($input: MoveServiceInput!) { def test_graphql_move_service_unathorized_client( client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) @@ -507,15 +526,16 @@ def test_graphql_move_service_unathorized_client( def test_graphql_move_not_found_service( authorized_client, mock_get_service_by_id_return_none, - mock_nextcloud, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) @@ -529,47 +549,50 @@ def test_graphql_move_not_found_service( def test_graphql_move_not_moveble_service( authorized_client, - mock_get_service_by_id, - mock_nextcloud_return_false, + mock_get_service_by_id_return_none, mock_service_to_graphql_service, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) assert response.status_code == 200 assert response.json().get("data") is not None - assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["code"] == 404 assert response.json()["data"]["moveService"]["message"] is not None assert response.json()["data"]["moveService"]["success"] is False def test_graphql_move_service_volume_not_found( authorized_client, - mock_get_service_by_id, - mock_nextcloud, + mock_get_service_by_id_return_none, mock_service_to_graphql_service, mock_block_devices_return_none, + mock_subprocess_popen, + one_user, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) + assert response.status_code == 200 assert response.json().get("data") is not None - assert response.json()["data"]["moveService"]["code"] == 400 + assert response.json()["data"]["moveService"]["code"] == 404 assert response.json()["data"]["moveService"]["message"] is not None assert response.json()["data"]["moveService"]["success"] is False @@ -577,16 +600,18 @@ def test_graphql_move_service_volume_not_found( def test_graphql_move_service( authorized_client, mock_get_service_by_id, - mock_nextcloud, mock_service_to_graphql_service, mock_block_devices, + mock_subprocess_popen, + one_user, + mock_job_to_api_job, ): response = authorized_client.post( "/graphql", json={ "query": API_MOVE_SERVICE_MUTATION, "variables": { - "input": {"service_id": "nextcloud", "location": "sdx"}, + "input": {"serviceId": "nextcloud", "location": "sdx"}, }, }, ) diff --git a/tests/test_graphql/test_api_services/one_user.json b/tests/test_graphql/test_api_services/one_user.json new file mode 100644 index 0000000..5df2108 --- /dev/null +++ b/tests/test_graphql/test_api_services/one_user.json @@ -0,0 +1,61 @@ +{ + "backblaze": { + "accountId": "ID", + "accountKey": "KEY", + "bucket": "selfprivacy" + }, + "api": { + "token": "TEST_TOKEN", + "enableSwagger": false + }, + "bitwarden": { + "enable": false + }, + "cloudflare": { + "apiKey": "TOKEN" + }, + "databasePassword": "PASSWORD", + "domain": "test.tld", + "hashedMasterPassword": "HASHED_PASSWORD", + "hostname": "test-instance", + "nextcloud": { + "adminPassword": "ADMIN", + "databasePassword": "ADMIN", + "enable": true + }, + "resticPassword": "PASS", + "ssh": { + "enable": true, + "passwordAuthentication": true, + "rootKeys": [ + "ssh-ed25519 KEY test@pc" + ] + }, + "username": "tester", + "gitea": { + "enable": false + }, + "ocserv": { + "enable": true + }, + "pleroma": { + "enable": true + }, + "autoUpgrade": { + "enable": true, + "allowReboot": true + }, + "timezone": "Europe/Moscow", + "sshKeys": [ + "ssh-rsa KEY test@pc" + ], + "users": [ + { + "username": "user1", + "hashedPassword": "HASHED_PASSWORD_1", + "sshKeys": [ + "ssh-rsa KEY user1@pc" + ] + } + ] +} \ No newline at end of file diff --git a/tests/test_graphql/test_api_storage.py b/tests/test_graphql/test_api_storage.py index 98c75f0..1fa2f78 100644 --- a/tests/test_graphql/test_api_storage.py +++ b/tests/test_graphql/test_api_storage.py @@ -291,7 +291,7 @@ def test_graphql_unmount_volume_unathorized_client( def test_graphql_unmount_not_fount_volume( - authorized_client, mock_block_devices_return_true + authorized_client, mock_block_devices_return_none ): response = authorized_client.post( "/graphql", @@ -309,7 +309,7 @@ def test_graphql_unmount_not_fount_volume( def test_graphql_unmount_volume_false( - authorized_client, mock_block_devices_return_true + authorized_client, mock_block_devices_return_none ): response = authorized_client.post( "/graphql", -- 2.42.0 From abcd0bde770dbf0f0300cd2b43f7652c01059e2e Mon Sep 17 00:00:00 2001 From: def Date: Sun, 23 Oct 2022 21:44:24 +0400 Subject: [PATCH 5/5] test: remove unused mocks, fix tests naming --- tests/test_graphql/test_api_services.py | 21 +++--- tests/test_graphql/test_api_storage.py | 86 ++----------------------- 2 files changed, 18 insertions(+), 89 deletions(-) diff --git a/tests/test_graphql/test_api_services.py b/tests/test_graphql/test_api_services.py index cc33070..ac6d217 100644 --- a/tests/test_graphql/test_api_services.py +++ b/tests/test_graphql/test_api_services.py @@ -38,6 +38,7 @@ class BlockDevices: def get_block_device(location): return True + class ProcessMock: """Mock subprocess.Popen""" @@ -79,6 +80,7 @@ def mock_service_to_graphql_service(mocker): ) return mock + @pytest.fixture def mock_job_to_api_job(mocker): mock = mocker.patch( @@ -88,6 +90,7 @@ def mock_job_to_api_job(mocker): ) return mock + @pytest.fixture def mock_block_devices_return_none(mocker): mock = mocker.patch( @@ -142,7 +145,7 @@ mutation enableService($serviceId: String!) { """ -def test_graphql_enable_service_unathorized_client( +def test_graphql_enable_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_subprocess_popen ): response = client.post( @@ -211,7 +214,7 @@ mutation disableService($serviceId: String!) { """ -def test_graphql_disable_service_unathorized_client( +def test_graphql_disable_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_subprocess_popen, @@ -284,7 +287,7 @@ mutation stopService($serviceId: String!) { """ -def test_graphql_stop_service_unathorized_client( +def test_graphql_stop_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_service_to_graphql_service, @@ -324,7 +327,7 @@ def test_graphql_stop_not_found_service( assert response.json()["data"]["stopService"]["success"] is False -def test_graphql_stop_services( +def test_graphql_stop_service( authorized_client, mock_get_service_by_id, mock_service_to_graphql_service, @@ -357,7 +360,7 @@ mutation startService($serviceId: String!) { """ -def test_graphql_start_service_unathorized_client( +def test_graphql_start_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_service_to_graphql_service, @@ -397,7 +400,7 @@ def test_graphql_start_not_found_service( assert response.json()["data"]["startService"]["success"] is False -def test_graphql_start_services( +def test_graphql_start_service( authorized_client, mock_get_service_by_id, mock_service_to_graphql_service, @@ -430,7 +433,7 @@ mutation restartService($serviceId: String!) { """ -def test_graphql_restart_service_unathorized_client( +def test_graphql_restart_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_service_to_graphql_service, @@ -503,7 +506,7 @@ mutation moveService($input: MoveServiceInput!) { """ -def test_graphql_move_service_unathorized_client( +def test_graphql_move_service_unauthorized_client( client, mock_get_service_by_id_return_none, mock_service_to_graphql_service, @@ -547,7 +550,7 @@ def test_graphql_move_not_found_service( assert response.json()["data"]["moveService"]["success"] is False -def test_graphql_move_not_moveble_service( +def test_graphql_move_not_movable_service( authorized_client, mock_get_service_by_id_return_none, mock_service_to_graphql_service, diff --git a/tests/test_graphql/test_api_storage.py b/tests/test_graphql/test_api_storage.py index 1fa2f78..f4acdaa 100644 --- a/tests/test_graphql/test_api_storage.py +++ b/tests/test_graphql/test_api_storage.py @@ -1,25 +1,6 @@ import pytest -class BlockDeviceMockReturnNone: - """Mock BlockDevices""" - - def __init__(self, *args, **kwargs): - self.args = args - self.kwargs = kwargs - - def mount(self): - return None - - def unmount(self): - return None - - def resize(self): - return None - - returncode = 0 - - class BlockDeviceMockReturnTrue: """Mock BlockDevices""" @@ -39,25 +20,6 @@ class BlockDeviceMockReturnTrue: returncode = 0 -class BlockDeviceMockReturnFalse: - """Mock BlockDevices""" - - def __init__(self, *args, **kwargs): - self.args = args - self.kwargs = kwargs - - def mount(self): - return False - - def unmount(self): - return False - - def resize(self): - return False - - returncode = 0 - - class BlockDevicesMockReturnTrue: def get_block_device(name: str): # type: ignore return BlockDeviceMockReturnTrue() @@ -101,16 +63,6 @@ def mock_block_devices_return_none(mocker): return mock -@pytest.fixture -def mock_block_device_return_none(mocker): - mock = mocker.patch( - "selfprivacy_api.utils.block_devices.BlockDevice", - autospec=True, - return_value=BlockDeviceMockReturnNone, - ) - return mock - - @pytest.fixture def mock_block_device_return_true(mocker): mock = mocker.patch( @@ -121,16 +73,6 @@ def mock_block_device_return_true(mocker): return mock -@pytest.fixture -def mock_block_device_return_false(mocker): - mock = mocker.patch( - "selfprivacy_api.utils.block_devices.BlockDevice", - autospec=True, - return_value=BlockDeviceMockReturnFalse, - ) - return mock - - API_RESIZE_VOLUME_MUTATION = """ mutation resizeVolume($name: String!) { resizeVolume(name: $name) { @@ -142,7 +84,7 @@ mutation resizeVolume($name: String!) { """ -def test_graphql_resize_volumea_unathorized_client( +def test_graphql_resize_volume_unauthorized_client( client, mock_block_devices_return_true ): response = client.post( @@ -201,7 +143,9 @@ mutation mountVolume($name: String!) { """ -def test_graphql_mount_volume_unathorized_client(client, mock_block_device_return_true): +def test_graphql_mount_volume_unauthorized_client( + client, mock_block_device_return_true +): response = client.post( "/graphql", json={ @@ -276,7 +220,7 @@ mutation unmountVolume($name: String!) { """ -def test_graphql_unmount_volume_unathorized_client( +def test_graphql_unmount_volume_unauthorized_client( client, mock_block_devices_return_true ): response = client.post( @@ -290,25 +234,7 @@ def test_graphql_unmount_volume_unathorized_client( assert response.json().get("data") is None -def test_graphql_unmount_not_fount_volume( - authorized_client, mock_block_devices_return_none -): - response = authorized_client.post( - "/graphql", - json={ - "query": API_UNMOUNT_VOLUME_MUTATION, - "variables": {"name": "sdx"}, - }, - ) - assert response.status_code == 200 - assert response.json().get("data") is not None - - assert response.json()["data"]["unmountVolume"]["code"] == 404 - assert response.json()["data"]["unmountVolume"]["message"] is not None - assert response.json()["data"]["unmountVolume"]["success"] is False - - -def test_graphql_unmount_volume_false( +def test_graphql_unmount_not_found_volume( authorized_client, mock_block_devices_return_none ): response = authorized_client.post( -- 2.42.0