1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
import contextlib
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.test import TestCase, TransactionTestCase
from django.urls import reverse
from rest_framework.test import APIClient
from rest_framework_simplejwt.settings import api_settings
def client_action_wrapper(action):
def wrapper_method(self, *args, **kwargs):
if self.view_name is None:
raise ValueError("Must give value for `view_name` property")
reverse_args = kwargs.pop("reverse_args", tuple())
reverse_kwargs = kwargs.pop("reverse_kwargs", dict())
query_string = kwargs.pop("query_string", None)
url = reverse(self.view_name, args=reverse_args, kwargs=reverse_kwargs)
if query_string is not None:
url = url + f"?{query_string}"
return getattr(self.client, action)(url, *args, **kwargs)
return wrapper_method
class APIViewTestCase(TestCase):
client_class = APIClient
def authenticate_with_token(self, type, token):
"""
Authenticates requests with the given token.
"""
self.client.credentials(HTTP_AUTHORIZATION=f"{type} {token}")
view_name = None
view_post = client_action_wrapper("post")
view_get = client_action_wrapper("get")
@contextlib.contextmanager
def override_api_settings(**settings):
old_settings = {}
for k, v in settings.items():
# Save settings
try:
old_settings[k] = api_settings.user_settings[k]
except KeyError:
pass
# Install temporary settings
api_settings.user_settings[k] = v
# Delete any cached settings
try:
delattr(api_settings, k)
except AttributeError:
pass
try:
yield
finally:
for k in settings.keys():
# Delete temporary settings
api_settings.user_settings.pop(k)
# Restore saved settings
try:
api_settings.user_settings[k] = old_settings[k]
except KeyError:
pass
# Delete any cached settings
try:
delattr(api_settings, k)
except AttributeError:
pass
class MigrationTestCase(TransactionTestCase):
migrate_from = None
migrate_to = None
def setUp(self):
self.migrate_from = [self.migrate_from]
self.migrate_to = [self.migrate_to]
# Reverse to the original migration
executor = MigrationExecutor(connection)
executor.migrate(self.migrate_from)
old_apps = executor.loader.project_state(self.migrate_from).apps
self.setUpBeforeMigration(old_apps)
# Run the migration to test
executor.loader.build_graph()
executor.migrate(self.migrate_to)
self.apps = executor.loader.project_state(self.migrate_to).apps
def setUpBeforeMigration(self, apps):
pass
|