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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import httplib
  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 setUp(self):
  26. self.user = None
  27. if not self.is_anonymous or self.is_staff:
  28. self.user = User.objects.create_user(self.username, self.email,
  29. self.password)
  30. self.user.is_staff = self.is_staff
  31. perms = self.permissions
  32. add_permissions(self.user, perms)
  33. self.user.save()
  34. self.login()
  35. def get(self, url, **kwargs):
  36. kwargs.setdefault('user', self.user)
  37. return self.app.get(url, **kwargs)
  38. def post(self, url, **kwargs):
  39. kwargs.setdefault('user', self.user)
  40. return self.app.post(url, **kwargs)
  41. def login(self, username=None, password=None):
  42. username = username or self.username
  43. password = password or self.password
  44. self.client.login(username=username, password=password)
  45. # Custom assertions
  46. def assertIsRedirect(self, response, expected_url=None):
  47. self.assertTrue(response.status_code in (httplib.FOUND,
  48. httplib.MOVED_PERMANENTLY))
  49. if expected_url:
  50. location = URL.from_string(response['Location'])
  51. self.assertEqual(expected_url, location.path())
  52. def assertRedirectsTo(self, response, url_name):
  53. self.assertTrue(str(response.status_code).startswith('3'))
  54. location = response.headers['Location']
  55. redirect_path = location.replace('http://localhost:80', '')
  56. self.assertEqual(reverse(url_name), redirect_path)
  57. def assertNoAccess(self, response):
  58. self.assertContext(response)
  59. self.assertTrue(response.status_code in (httplib.NOT_FOUND,
  60. httplib.FORBIDDEN))
  61. def assertRedirectUrlName(self, response, name, kwargs=None):
  62. self.assertIsRedirect(response)
  63. location = response['Location'].replace('http://testserver', '')
  64. self.assertEqual(location, reverse(name, kwargs=kwargs))
  65. def assertIsOk(self, response):
  66. self.assertEqual(httplib.OK, response.status_code)
  67. def assertContext(self, response):
  68. self.assertTrue(response.context is not None,
  69. 'No context was returned')
  70. def assertInContext(self, response, key):
  71. self.assertContext(response)
  72. self.assertTrue(key in response.context,
  73. "Context should contain a variable '%s'" % key)