You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

testcases.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from django.utils.six.moves import http_client
  2. from django.core.urlresolvers import reverse
  3. from django.contrib.auth.models import Permission
  4. from django_webtest import WebTest
  5. from purl import URL
  6. from oscar.core.compat import get_user_model
  7. User = get_user_model()
  8. def add_permissions(user, permissions):
  9. """
  10. Grant permissions to the passed user
  11. :param permissions: e.g. ['partner.dashboard_access']
  12. """
  13. for permission in permissions:
  14. app_label, __, codename = permission.partition('.')
  15. perm = Permission.objects.get(content_type__app_label=app_label,
  16. codename=codename)
  17. user.user_permissions.add(perm)
  18. class WebTestCase(WebTest):
  19. is_staff = False
  20. is_anonymous = False
  21. is_superuser = False
  22. username = 'testuser'
  23. email = 'testuser@buymore.com'
  24. password = 'somefancypassword'
  25. permissions = []
  26. def setUp(self):
  27. self.user = None
  28. if not self.is_anonymous:
  29. self.user = self.create_user(
  30. self.username, self.email, self.password)
  31. self.user.is_staff = self.is_staff
  32. add_permissions(self.user, self.permissions)
  33. self.user.save()
  34. def create_user(self, username=None, email=None, password=None):
  35. """
  36. Create a user for use in a test.
  37. As usernames are optional in newer versions of Django, it only sets it
  38. if exists.
  39. """
  40. kwargs = {'email': email, 'password': password}
  41. if 'username' in User._meta.get_all_field_names():
  42. kwargs['username'] = username
  43. return User.objects.create_user(**kwargs)
  44. def get(self, url, **kwargs):
  45. kwargs.setdefault('user', self.user)
  46. return self.app.get(url, **kwargs)
  47. def post(self, url, **kwargs):
  48. kwargs.setdefault('user', self.user)
  49. return self.app.post(url, **kwargs)
  50. # Custom assertions
  51. def assertIsRedirect(self, response, expected_url=None):
  52. self.assertTrue(response.status_code in (
  53. http_client.FOUND, http_client.MOVED_PERMANENTLY))
  54. if expected_url:
  55. location = URL.from_string(response['Location'])
  56. self.assertEqual(expected_url, location.path())
  57. def assertRedirectsTo(self, response, url_name):
  58. self.assertTrue(str(response.status_code).startswith('3'))
  59. location = response.headers['Location']
  60. redirect_path = location.replace('http://localhost:80', '')
  61. self.assertEqual(reverse(url_name), redirect_path)
  62. def assertNoAccess(self, response):
  63. self.assertContext(response)
  64. self.assertTrue(response.status_code in (http_client.NOT_FOUND,
  65. http_client.FORBIDDEN))
  66. def assertRedirectUrlName(self, response, name, kwargs=None):
  67. self.assertIsRedirect(response)
  68. location = response['Location'].replace('http://testserver', '')
  69. self.assertEqual(location, reverse(name, kwargs=kwargs))
  70. def assertIsOk(self, response):
  71. self.assertEqual(http_client.OK, response.status_code)
  72. def assertContext(self, response):
  73. self.assertTrue(response.context is not None,
  74. 'No context was returned')
  75. def assertInContext(self, response, key):
  76. self.assertContext(response)
  77. self.assertTrue(key in response.context,
  78. "Context should contain a variable '%s'" % key)