tests.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from itsdangerous.timed import TimestampSigner
  2. from requests import Response
  3. from requests.sessions import Session
  4. from urllib.parse import urlparse
  5. from django.contrib.auth import get_user_model
  6. from django.shortcuts import reverse
  7. from django.test import override_settings, TestCase
  8. from django.utils.timezone import now
  9. User = get_user_model()
  10. class ConnectionMock:
  11. def __init__(self):
  12. self.Session = Session
  13. def __enter__(self):
  14. self.origin_post = Session.post
  15. def mocked_post(*args, **kwargs):
  16. mocked_response = Response()
  17. requested_url = args[1]
  18. if "/server/request-token/" == urlparse(requested_url).path:
  19. # token generated for private key settings.SSO_PRIVATE_KEY = 'priv1'
  20. mocked_response._content = (
  21. b'{"request_token": "XcHtuemqcjnIT6J2WHTFswLQP0W07nI96XfxqGkm6b1zFToF0YGEoIYu3'
  22. b'7QOajkc"}.XTd9sA.quRsXFxqMk-ufwSc79q-_YLDNzg'
  23. )
  24. elif "/server/verify/" == urlparse(requested_url).path:
  25. mocked_response._content = (
  26. b'{"username": "jkowalski", "email": "jkowalski@example.com", "first_name": '
  27. b'"Jan", "last_name": "Kowalski", "is_staff": false, "is_superuser": false, '
  28. b'"is_active": true}.XTg4IQ._cANZR5jHvtwhNzcnNYDfE1nLHE'
  29. )
  30. mocked_response.status_code = 200
  31. return mocked_response
  32. setattr(self.Session, "post", mocked_post)
  33. return self.Session
  34. def __exit__(self, type, value, traceback):
  35. setattr(self.Session, "post", self.origin_post)
  36. class TimestampSignerMock:
  37. def __init__(self):
  38. self.TimestampSigner = TimestampSigner
  39. def __enter__(self):
  40. self.origin_unsign = TimestampSigner.unsign
  41. def mocked_unsign(*args, **kwargs):
  42. s = args[1]
  43. if b'"username": "jkowalski"' in s:
  44. value = s[:166] # {...}
  45. timestamp_to_datetime = now()
  46. return value, timestamp_to_datetime
  47. else:
  48. return self.origin_unsign(*args, **kwargs)
  49. setattr(self.TimestampSigner, "unsign", mocked_unsign)
  50. return self.TimestampSigner
  51. def __exit__(self, type, value, traceback):
  52. setattr(self.TimestampSigner, "unsign", self.origin_unsign)
  53. class SsoModuleTestCase(TestCase):
  54. def test_sso_client(self):
  55. url_to_external_logging = reverse("simple-sso-login")
  56. self.assertEqual("/sso/client/", url_to_external_logging)
  57. with ConnectionMock():
  58. response = self.client.get(url_to_external_logging)
  59. self.assertEqual(302, response.status_code)
  60. url_parsed = urlparse(response.url)
  61. self.assertEqual("/server/authorize/", url_parsed.path)
  62. self.assertEqual(
  63. "token=XcHtuemqcjnIT6J2WHTFswLQP0W07nI96XfxqGkm6b1zFToF0YGEoIYu37QOajkc",
  64. url_parsed.query,
  65. )
  66. def test_sso_client_authenticate(self):
  67. url_to_authenticate = reverse("simple-sso-authenticate")
  68. self.assertEqual("/sso/client/authenticate/", url_to_authenticate)
  69. query = (
  70. "next=%2F&access_token=InBBMjllMlNla2ZWdDdJMnR0c3R3QWIxcjQwRzV6TmphZDRSaEprbjlMbnR0TnF"
  71. "Ka3Q2d1dNR1lVYkhzVThvZU0i.XTeRVQ.3XiIMg0AFcJKDFCekse6s43uNLI"
  72. )
  73. url_to_authenticate += "?" + query
  74. with ConnectionMock():
  75. with TimestampSignerMock():
  76. response = self.client.get(url_to_authenticate)
  77. self.assertEqual(302, response.status_code)
  78. self.assertEqual("/", response.url)
  79. u = User.objects.first()
  80. self.assertEqual("jkowalski", u.username)