feat/PRWLR-4014 Implement SDK integration for POST /providers/{provider_id}/connection (#30)

* chore(deps): PRWLR-4014 include prowler library in python deps

* feat(Backend,API): PRWLR-4014 add AWS provider test_connection through celery tasks

* fix(Backend,API): PRWLR-4014 fix model handling in celery tasks

* test(Tasks): PRWLR-4014 add unit tests for celery tasks

* docs(API): PRWLR-4014 update endpoint tag

* feat(Backend): PRWLR-4014 add decorator for tenant dependant Celery tasks

* chore(Backend): PRWLR-4014 remove TODOs and improve docstrings

* feat(Backend): PRWLR-4014 replace timezone.now for datetime.now(timezone.utc)

* feat(Backend): PRWLR-4014 use SET LOCAL for api.tenant_id setting

* feat(Backend, Tasks): PRWLR-4014 refactor tasks module to abstract business logic

* fix(Backend): PRWLR-4014 use set_config for RLS config and set transaction at request dispatch level

* fix(Tasks): PRWLR-4014 fix tasks tenant decorator
This commit is contained in:
Víctor Fernández Poyatos authored and GitHub committed 2024-08-29 09:53:07 -04:00
1 parent 8f2bd45872
commit 8183207802
15 files changed
+2696 -166

No files matched your search

+34
View File
@@ -0,0 +1,34 @@
from unittest.mock import patch, call
import pytest
from api.decorators import set_tenant
@pytest.mark.django_db
class TestSetTenantDecorator:
@patch("api.decorators.connection.cursor")
def test_set_tenant(self, mock_cursor):
mock_cursor.return_value.__enter__.return_value = mock_cursor
@set_tenant
def random_func(arg):
return arg
tenant_id = "1234-abcd-5678"
result = random_func("test_arg", tenant_id=tenant_id)
assert (
call(f"SELECT set_config('api.tenant_id', '{tenant_id}', TRUE);")
in mock_cursor.execute.mock_calls
)
assert result == "test_arg"
def test_set_tenant_exception(self):
@set_tenant
def random_func(arg):
return arg
with pytest.raises(KeyError):
random_func("test_arg")
+14 -7
View File
@@ -1,4 +1,4 @@
from datetime import datetime
from unittest.mock import Mock, patch
import pytest
from django.urls import reverse
@@ -433,7 +433,15 @@ class TestProviderViewSet:
)
assert response.status_code == status.HTTP_404_NOT_FOUND
def test_providers_connection(self, client, providers, tenant_header):
@patch("tasks.tasks.check_provider_connection_task.delay")
def test_providers_connection(
self, mock_provider_connection, client, providers, tenant_header
):
task_mock = Mock()
task_mock.id = "12345"
task_mock.status = "PENDING"
mock_provider_connection.return_value = task_mock
provider1, *_ = providers
assert provider1.connected is None
assert provider1.connection_last_checked_at is None
@@ -443,12 +451,11 @@ class TestProviderViewSet:
headers=tenant_header,
)
assert response.status_code == status.HTTP_202_ACCEPTED
mock_provider_connection.assert_called_once_with(
provider_id=str(provider1.id), tenant_id=tenant_header["X-Tenant-ID"]
)
assert "Content-Location" in response.headers
# TODO Assert a task is returned when they are implemented
provider1.refresh_from_db()
assert provider1.connected is True
assert isinstance(provider1.connection_last_checked_at, datetime)
assert response.headers["Content-Location"] == f"api/v1/tasks/{task_mock.id}"
def test_providers_connection_invalid_provider(
self, client, providers, tenant_header