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.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from 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. :param permissions: e.g. ['partner.dashboard_access']
  11. """
  12. for permission in permissions:
  13. app_label, _, codename = permission.partition('.')
  14. perm = Permission.objects.get(content_type__app_label=app_label,
  15. codename=codename)
  16. user.user_permissions.add(perm)
  17. class WebTestCase(WebTest):
  18. is_staff = False
  19. is_anonymous = False
  20. username = 'testuser'
  21. email = 'testuser@buymore.com'
  22. password = 'somefancypassword'
  23. is_superuser = False
  24. permissions = []
  25. def create_user(self, username=None, email=None, password=None):
  26. """
  27. Creates a user. But as usernames are optional in newer versions of
  28. Django, it only sets it if exists.
  29. """
  30. kwargs = {'email': email, 'password': password}
  31. if 'username' in User._meta.get_all_field_names():
  32. kwargs['username'] = username
  33. return User.objects.create_user(**kwargs)
  34. def setUp(self):
  35. self.user = None
  36. if not self.is_anonymous or self.is_staff:
  37. self.user = self.create_user(
  38. self.username, self.email, self.password)
  39. self.user.is_staff = self.is_staff
  40. perms = self.permissions
  41. add_permissions(self.user, perms)
  42. self.user.save()
  43. self.login()
  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. def login(self, username=None, password=None):
  51. username = username or self.username
  52. password = password or self.password
  53. result = self.client.login(email=self.email, password=password)
  54. if not result:
  55. self.fail("Unable to login")
  56. # Custom assertions
  57. def assertIsRedirect(self, response, expected_url=None):
  58. self.assertTrue(response.status_code in (
  59. http_client.FOUND, http_client.MOVED_PERMANENTLY))
  60. if expected_url:
  61. location = URL.from_string(response['Location'])
  62. self.assertEqual(expected_url, location.path())
  63. def assertRedirectsTo(self, response, url_name):
  64. self.assertTrue(str(response.status_code).startswith('3'))
  65. location = response.headers['Location']
  66. redirect_path = location.replace('http://localhost:80', '')
  67. self.assertEqual(reverse(url_name), redirect_path)
  68. def assertNoAccess(self, response):
  69. self.assertContext(response)
  70. self.assertTrue(response.status_code in (http_client.NOT_FOUND,
  71. http_client.FORBIDDEN))
  72. def assertRedirectUrlName(self, response, name, kwargs=None):
  73. self.assertIsRedirect(response)
  74. location = response['Location'].replace('http://testserver', '')
  75. self.assertEqual(location, reverse(name, kwargs=kwargs))
  76. def assertIsOk(self, response):
  77. self.assertEqual(http_client.OK, response.status_code)
  78. def assertContext(self, response):
  79. self.assertTrue(response.context is not None,
  80. 'No context was returned')
  81. def assertInContext(self, response, key):
  82. self.assertContext(response)
  83. self.assertTrue(key in response.context,
  84. "Context should contain a variable '%s'" % key)