testing.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import logging
  2. from contextlib import contextmanager
  3. from django.contrib.auth.models import Permission, User
  4. from rest_framework.test import APITestCase as _APITestCase
  5. from users.models import Token
  6. class APITestCase(_APITestCase):
  7. def setUp(self):
  8. """
  9. Create a superuser and token for API calls.
  10. """
  11. self.user = User.objects.create(username='testuser', is_superuser=True)
  12. self.token = Token.objects.create(user=self.user)
  13. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(self.token.key)}
  14. def assertHttpStatus(self, response, expected_status):
  15. """
  16. Provide more detail in the event of an unexpected HTTP response.
  17. """
  18. err_message = "Expected HTTP status {}; received {}: {}"
  19. self.assertEqual(response.status_code, expected_status, err_message.format(
  20. expected_status, response.status_code, getattr(response, 'data', 'No data')
  21. ))
  22. def create_test_user(username='testuser', permissions=list()):
  23. """
  24. Create a User with the given permissions.
  25. """
  26. user = User.objects.create_user(username=username)
  27. for perm_name in permissions:
  28. app, codename = perm_name.split('.')
  29. perm = Permission.objects.get(content_type__app_label=app, codename=codename)
  30. user.user_permissions.add(perm)
  31. return user
  32. def choices_to_dict(choices_list):
  33. """
  34. Convert a list of field choices to a dictionary suitable for direct comparison with a ChoiceSet. For example:
  35. [
  36. {
  37. "value": "choice-1",
  38. "label": "First Choice"
  39. },
  40. {
  41. "value": "choice-2",
  42. "label": "Second Choice"
  43. }
  44. ]
  45. Becomes:
  46. {
  47. "choice-1": "First Choice",
  48. "choice-2": "Second Choice
  49. }
  50. """
  51. return {
  52. choice['value']: choice['label'] for choice in choices_list
  53. }
  54. @contextmanager
  55. def disable_warnings(logger_name):
  56. """
  57. Temporarily suppress expected warning messages to keep the test output clean.
  58. """
  59. logger = logging.getLogger(logger_name)
  60. current_level = logger.level
  61. logger.setLevel(logging.ERROR)
  62. yield
  63. logger.setLevel(current_level)