4e54a53072
Adds a resource server API similar to the one that already exists for Drive.
146 lines
3.8 KiB
Python
146 lines
3.8 KiB
Python
"""Fixtures for tests in the impress core application"""
|
|
|
|
import base64
|
|
from unittest import mock
|
|
|
|
from django.core.cache import cache
|
|
|
|
import pytest
|
|
import responses
|
|
|
|
from core import factories
|
|
from core.tests.utils.urls import reload_urls
|
|
|
|
USER = "user"
|
|
TEAM = "team"
|
|
VIA = [USER, TEAM]
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clear_cache():
|
|
"""Fixture to clear the cache before each test."""
|
|
cache.clear()
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_user_teams():
|
|
"""Mock for the "teams" property on the User model."""
|
|
with mock.patch(
|
|
"core.models.User.teams", new_callable=mock.PropertyMock
|
|
) as mock_teams:
|
|
yield mock_teams
|
|
|
|
|
|
@pytest.fixture(name="indexer_settings")
|
|
def indexer_settings_fixture(settings):
|
|
"""
|
|
Setup valid settings for the document indexer. Clear the indexer cache.
|
|
"""
|
|
|
|
# pylint: disable-next=import-outside-toplevel
|
|
from core.services.search_indexers import ( # noqa: PLC0415
|
|
get_document_indexer,
|
|
)
|
|
|
|
get_document_indexer.cache_clear()
|
|
|
|
settings.SEARCH_INDEXER_CLASS = "core.services.search_indexers.FindDocumentIndexer"
|
|
settings.SEARCH_INDEXER_SECRET = "ThisIsAKeyForTest"
|
|
settings.INDEXING_URL = "http://localhost:8081/api/v1.0/documents/index/"
|
|
settings.SEARCH_URL = "http://localhost:8081/api/v1.0/documents/search/"
|
|
settings.SEARCH_INDEXER_COUNTDOWN = 1
|
|
|
|
yield settings
|
|
|
|
# clear cache to prevent issues with other tests
|
|
get_document_indexer.cache_clear()
|
|
|
|
|
|
def resource_server_backend_setup(settings):
|
|
"""
|
|
A fixture to create a user token for testing.
|
|
"""
|
|
assert (
|
|
settings.OIDC_RS_BACKEND_CLASS
|
|
== "lasuite.oidc_resource_server.backend.ResourceServerBackend"
|
|
)
|
|
|
|
settings.OIDC_RESOURCE_SERVER_ENABLED = True
|
|
settings.OIDC_RS_CLIENT_ID = "some_client_id"
|
|
settings.OIDC_RS_CLIENT_SECRET = "some_client_secret"
|
|
|
|
settings.OIDC_OP_URL = "https://oidc.example.com"
|
|
settings.OIDC_VERIFY_SSL = False
|
|
settings.OIDC_TIMEOUT = 5
|
|
settings.OIDC_PROXY = None
|
|
settings.OIDC_OP_JWKS_ENDPOINT = "https://oidc.example.com/jwks"
|
|
settings.OIDC_OP_INTROSPECTION_ENDPOINT = "https://oidc.example.com/introspect"
|
|
settings.OIDC_RS_SCOPES = ["openid", "groups"]
|
|
settings.OIDC_RS_ALLOWED_AUDIENCES = ["some_service_provider"]
|
|
|
|
|
|
@pytest.fixture
|
|
def resource_server_backend_conf(settings):
|
|
"""
|
|
A fixture to create a user token for testing.
|
|
"""
|
|
resource_server_backend_setup(settings)
|
|
reload_urls()
|
|
|
|
|
|
@pytest.fixture
|
|
def resource_server_backend(settings):
|
|
"""
|
|
A fixture to create a user token for testing.
|
|
Including a mocked introspection endpoint.
|
|
"""
|
|
resource_server_backend_setup(settings)
|
|
reload_urls()
|
|
|
|
with responses.RequestsMock() as rsps:
|
|
rsps.add(
|
|
responses.POST,
|
|
"https://oidc.example.com/introspect",
|
|
json={
|
|
"iss": "https://oidc.example.com",
|
|
"aud": "some_client_id", # settings.OIDC_RS_CLIENT_ID
|
|
"sub": "very-specific-sub",
|
|
"client_id": "some_service_provider",
|
|
"scope": "openid groups",
|
|
"active": True,
|
|
},
|
|
)
|
|
|
|
yield rsps
|
|
|
|
|
|
@pytest.fixture
|
|
def user_specific_sub():
|
|
"""
|
|
A fixture to create a user token for testing.
|
|
"""
|
|
user = factories.UserFactory(sub="very-specific-sub", full_name="External User")
|
|
|
|
yield user
|
|
|
|
|
|
def build_authorization_bearer(token):
|
|
"""
|
|
Build an Authorization Bearer header value from a token.
|
|
|
|
This can be used like this:
|
|
client.post(
|
|
...
|
|
HTTP_AUTHORIZATION=f"Bearer {build_authorization_bearer('some_token')}",
|
|
)
|
|
"""
|
|
return base64.b64encode(token.encode("utf-8")).decode("utf-8")
|
|
|
|
|
|
@pytest.fixture
|
|
def user_token():
|
|
"""
|
|
A fixture to create a user token for testing.
|
|
"""
|
|
return build_authorization_bearer("some_token")
|