No Description
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.

tests_user.py 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #-*- coding: utf-8 -*-
  2. import unittest
  3. import unittest.mock
  4. from unittest.mock import Mock
  5. from Lodel.user import authentication_method, identification_method, UserIdentity, UserContext
  6. class AuthIdMethodTestCase(unittest.TestCase):
  7. def test_authentication_method_registration(self):
  8. before = set(authentication_method.list_methods())
  9. def test_method(self):
  10. pass
  11. authentication_method(test_method) # faking test_method decoration
  12. after = set(authentication_method.list_methods())
  13. self.assertEqual(after - before, set([test_method]))
  14. def test_identification_method_registration(self):
  15. before = set(identification_method.list_methods())
  16. def test_method(self):
  17. pass
  18. identification_method(test_method) # faking test_method decoration
  19. after = set(identification_method.list_methods())
  20. self.assertEqual(after - before, set([test_method]))
  21. def test_authentication_method_calls(self):
  22. mock_list = list()
  23. for i in range(5):
  24. auth_mock = Mock(return_value = False)
  25. mock_list.append(auth_mock)
  26. authentication_method(auth_mock)
  27. ret = authentication_method.authenticate('login', 'password')
  28. self.assertFalse(ret)
  29. for mock in mock_list:
  30. mock.assert_called_once_with('login', 'password')
  31. # Adding a mock that will fake a successfull auth
  32. user_id = UserIdentity(42, 'superlogin', authenticated = True)
  33. authentication_method( Mock(return_value = user_id) )
  34. ret = authentication_method.authenticate('login', 'password')
  35. self.assertEqual(ret, user_id)
  36. def test_identificatio_method_calls(self):
  37. mock_list = list()
  38. for i in range(5):
  39. id_mock = Mock(return_value = False)
  40. mock_list.append(id_mock)
  41. identification_method(id_mock)
  42. client_infos = {'ip':'127.0.0.1', 'user-agent': 'bla bla'}
  43. ret = identification_method.identify(client_infos)
  44. self.assertFalse(ret)
  45. for mock in mock_list:
  46. mock.assert_called_once_with(client_infos)
  47. # Adding a mock that will fake a successfull identification
  48. user_id = UserIdentity(42, 'login', identified = True)
  49. identification_method( Mock(return_value = user_id) )
  50. ret = identification_method.identify(client_infos)
  51. self.assertEqual(ret, user_id)
  52. class UserIdentityTestCase(unittest.TestCase):
  53. def test_init(self):
  54. """ Testing UserIdentity constructor """
  55. uid = UserIdentity(42, 'login', 'anonymous login')
  56. self.assertEqual(uid.user_id, 42)
  57. self.assertEqual(uid.username, 'login')
  58. self.assertEqual(uid.fullname, 'anonymous login')
  59. self.assertFalse(uid.is_authenticated)
  60. self.assertFalse(uid.is_identified)
  61. self.assertEqual(str(uid), uid.fullname)
  62. def test_identified(self):
  63. """ Testing identified flag relation with authenticated flag """
  64. uid = UserIdentity(42, 'login', identified = True)
  65. self.assertTrue(uid.is_identified)
  66. self.assertFalse(uid.is_authenticated)
  67. def test_authentified(self):
  68. """ Testing identified flag relation with authenticated flag """
  69. uid = UserIdentity(42, 'login', authenticated = True)
  70. self.assertTrue(uid.is_identified)
  71. self.assertTrue(uid.is_authenticated)
  72. def test_anonymous(self):
  73. """ Testing the anonymous UserIdentity """
  74. anon = UserIdentity.anonymous()
  75. self.assertEqual(anon, UserIdentity.anonymous())
  76. self.assertFalse(anon.is_authenticated)
  77. self.assertFalse(anon.is_identified)
  78. class UserContextTestCase(unittest.TestCase):
  79. def test_static(self):
  80. """ Testing that the class is static """
  81. with self.assertRaises(NotImplementedError):
  82. UserContext()
  83. def test_not_init(self):
  84. """ Testing method call with a non initialised class """
  85. UserContext.__reset__()
  86. with self.assertRaises(AssertionError):
  87. UserContext.identity()
  88. with self.assertRaises(AssertionError):
  89. UserContext.authenticate('login', 'foobar')
  90. def test_anon_init(self):
  91. """ Testing class initialisation """
  92. identification_method.__reset__()
  93. authentication_method.__reset__()
  94. UserContext.__reset__()
  95. auth_id = UserIdentity(43, 'loggedlogin', authenticated = True)
  96. # Add a fake authentication method
  97. auth_mock = Mock(return_value = auth_id)
  98. authentication_method(auth_mock)
  99. # Are we anonymous ?
  100. UserContext.init('localhost')
  101. self.assertEqual(UserContext.identity(), UserIdentity.anonymous())
  102. # Can we authenticate ourself ?
  103. UserContext.authenticate('login', 'pass')
  104. auth_mock.assert_called_once_with('login', 'pass')
  105. self.assertEqual(auth_id, UserContext.identity())
  106. def test_init(self):
  107. """ Testing class initialisation being identified by client_infos"""
  108. identification_method.__reset__()
  109. authentication_method.__reset__()
  110. UserContext.__reset__()
  111. user_id = UserIdentity(42, 'login', identified = True)
  112. auth_id = UserIdentity(43, 'loggedlogin', authenticated = True)
  113. # Add a fake id method
  114. id_mock = Mock(return_value = user_id)
  115. identification_method(id_mock)
  116. # Add a fake authentication method
  117. auth_mock = Mock(return_value = auth_id)
  118. authentication_method(auth_mock)
  119. # testing lazy identification
  120. UserContext.init('localhost')
  121. id_mock.assert_not_called()
  122. auth_mock.assert_not_called() # should really not be called yet
  123. # triggering identification
  124. ret_id = UserContext.identity()
  125. id_mock.assert_called_once_with('localhost')
  126. self.assertEqual(ret_id, user_id)
  127. auth_mock.assert_not_called() # should really not be called yet
  128. id_mock.reset_mock()
  129. # Trying to auth
  130. UserContext.authenticate('identifier', 'superproof')
  131. id_mock.assert_not_called()
  132. auth_mock.assert_called_once_with('identifier', 'superproof')
  133. self.assertEqual(UserContext.identity(), auth_id)