passerelle/tests/utils.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

67 lines
2.0 KiB
Python
Raw Normal View History

2016-08-25 16:17:37 +02:00
import json
import httmock
2016-08-25 16:17:37 +02:00
import mock
from django.contrib.contenttypes.models import ContentType
2020-12-10 15:03:57 +01:00
from django.urls import reverse
2020-01-06 15:52:40 +01:00
from django.utils.six.moves.urllib import parse as urlparse
2016-08-25 16:17:37 +02:00
from passerelle.base.models import AccessRight, ApiUser
from passerelle.compat import json_loads
2016-08-25 16:17:37 +02:00
def generic_endpoint_url(connector, endpoint, slug='test'):
return reverse('generic-endpoint', kwargs={'connector': connector, 'slug': slug, 'endpoint': endpoint})
def setup_access_rights(obj):
api, created = ApiUser.objects.get_or_create(username='all', keytype='', key='')
2016-08-25 16:17:37 +02:00
obj_type = ContentType.objects.get_for_model(obj)
AccessRight.objects.create(codename='can_access', apiuser=api, resource_type=obj_type, resource_pk=obj.pk)
return obj
class FakedResponse(mock.Mock):
headers = {}
2016-08-25 16:17:37 +02:00
def json(self):
return json_loads(self.content)
def mock_url(url=None, response='', status_code=200, headers=None, reason=None, exception=None, qs=None):
urlmatch_kwargs = {}
if url:
parsed = urlparse.urlparse(url)
if parsed.netloc:
urlmatch_kwargs['netloc'] = parsed.netloc
if parsed.path:
urlmatch_kwargs['path'] = parsed.path
if not isinstance(response, str):
response = json.dumps(response)
@httmock.remember_called
@httmock.urlmatch(**urlmatch_kwargs)
def mocked(url, request):
if qs is not None:
qs.update(urlparse.parse_qsl(url.query))
2020-04-26 15:54:47 +02:00
if exception:
raise exception
return httmock.response(status_code, response, headers, reason, request=request)
2021-02-20 16:26:01 +01:00
return httmock.HTTMock(mocked)
def make_resource(model_class, **kwargs):
resource = model_class.objects.create(**kwargs)
setup_access_rights(resource)
return resource
def endpoint_get(expected_url, app, resource, endpoint, **kwargs):
url = generic_endpoint_url(
connector=resource.__class__.get_connector_slug(), endpoint=endpoint, slug=resource.slug
)
assert url == expected_url, 'endpoint URL has changed'
return app.get(url, **kwargs)