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.

139 lines
4.9 KiB

  1. import unittest
  2. import time
  3. from app import create_app, db
  4. from app.models import User, AnonymousUser, Role, Permission
  5. class UserModelTestCase(unittest.TestCase):
  6. def setUp(self):
  7. self.app = create_app('testing')
  8. self.app_context = self.app.app_context()
  9. self.app_context.push()
  10. db.create_all()
  11. Role.insert_roles()
  12. def tearDown(self):
  13. db.session.remove()
  14. db.drop_all()
  15. self.app_context.pop()
  16. def test_password_setter(self):
  17. u = User(password='cat')
  18. self.assertTrue(u.password_hash is not None)
  19. def test_no_password_getter(self):
  20. u = User(password='cat')
  21. with self.assertRaises(AttributeError):
  22. u.password
  23. def test_password_verification(self):
  24. u = User(password='cat')
  25. self.assertTrue(u.verify_password('cat'))
  26. self.assertFalse(u.verify_password('dog'))
  27. def test_password_salts_are_random(self):
  28. u = User(password='cat')
  29. u2 = User(password='cat')
  30. self.assertTrue(u.password_hash != u2.password_hash)
  31. def test_valid_confirmation_token(self):
  32. u = User(password='cat')
  33. db.session.add(u)
  34. db.session.commit()
  35. token = u.generate_confirmation_token()
  36. self.assertTrue(u.confirm(token))
  37. def test_invalid_confirmation_token(self):
  38. u1 = User(password='cat')
  39. u2 = User(password='dog')
  40. db.session.add(u1)
  41. db.session.add(u2)
  42. db.session.commit()
  43. token = u1.generate_confirmation_token()
  44. self.assertFalse(u2.confirm(token))
  45. def test_expired_confirmation_token(self):
  46. u = User(password='cat')
  47. db.session.add(u)
  48. db.session.commit()
  49. token = u.generate_confirmation_token(1)
  50. time.sleep(2)
  51. self.assertFalse(u.confirm(token))
  52. def test_valid_reset_token(self):
  53. u = User(password='cat')
  54. db.session.add(u)
  55. db.session.commit()
  56. token = u.generate_reset_token()
  57. self.assertTrue(User.reset_password(token, 'dog'))
  58. self.assertTrue(u.verify_password('dog'))
  59. def test_invalid_reset_token(self):
  60. u = User(password='cat')
  61. db.session.add(u)
  62. db.session.commit()
  63. token = u.generate_reset_token()
  64. self.assertFalse(User.reset_password(token+'a', 'horse'))
  65. self.assertTrue(u.verify_password('cat'))
  66. def test_valid_email_change_token(self):
  67. u = User(email='max@mustermann.de', password='cat')
  68. db.session.add(u)
  69. db.session.commit()
  70. token = u.generate_email_change_token('foo@bar.de')
  71. self.assertTrue(u.change_email(token))
  72. self.assertTrue(u.email == 'foo@bar.de')
  73. def test_invalid_email_change_token(self):
  74. u1 = User(email='max@mustermann.de', password='cat')
  75. u2 = User(email='dirk@mustermann.de', password='dog')
  76. db.session.add(u1)
  77. db.session.add(u2)
  78. db.session.commit()
  79. token = u1.generate_email_change_token('foo@bar.de')
  80. self.assertFalse(u2.change_email(token))
  81. self.assertTrue(u2.email == 'dirk@mustermann.de')
  82. def test_duplicate_email_change_token(self):
  83. u1 = User(email='max@mustermann.de', password='cat')
  84. u2 = User(email='dirk@mustermann.de', password='dog')
  85. db.session.add(u1)
  86. db.session.add(u2)
  87. db.session.commit()
  88. token = u2.generate_email_change_token(u1.email)
  89. self.assertFalse(u2.change_email(token))
  90. self.assertTrue(u2.email == 'dirk@mustermann.de')
  91. def test_user_role(self):
  92. u = User(email='max@mustermann.de', password='cat')
  93. self.assertTrue(u.can(Permission.FOLLOW))
  94. self.assertTrue(u.can(Permission.COMMENT))
  95. self.assertTrue(u.can(Permission.WRITE))
  96. self.assertFalse(u.can(Permission.MODERATE))
  97. self.assertFalse(u.can(Permission.ADMIN))
  98. def test_moderator_role(self):
  99. r = Role.query.filter_by(name='Moderator').first()
  100. u = User(email='max@mustermann.de', password='cat', role=r)
  101. self.assertTrue(u.can(Permission.FOLLOW))
  102. self.assertTrue(u.can(Permission.COMMENT))
  103. self.assertTrue(u.can(Permission.WRITE))
  104. self.assertTrue(u.can(Permission.MODERATE))
  105. self.assertFalse(u.can(Permission.ADMIN))
  106. def test_administrator_role(self):
  107. r = Role.query.filter_by(name='Administrator').first()
  108. u = User(email='max@mustermann.de', password='cat', role=r)
  109. self.assertTrue(u.can(Permission.FOLLOW))
  110. self.assertTrue(u.can(Permission.COMMENT))
  111. self.assertTrue(u.can(Permission.WRITE))
  112. self.assertTrue(u.can(Permission.MODERATE))
  113. self.assertTrue(u.can(Permission.ADMIN))
  114. def test_anonymous_user(self):
  115. u = AnonymousUser()
  116. self.assertFalse(u.can(Permission.FOLLOW))
  117. self.assertFalse(u.can(Permission.COMMENT))
  118. self.assertFalse(u.can(Permission.WRITE))
  119. self.assertFalse(u.can(Permission.MODERATE))
  120. self.assertFalse(u.can(Permission.ADMIN))