test_utils.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. from django.test import TestCase
  2. from misago.legal.models import Agreement, UserAgreement
  3. from misago.legal.utils import (
  4. get_parsed_agreement_text, get_required_user_agreement, save_user_agreement_acceptance,
  5. set_agreement_as_active
  6. )
  7. from misago.users.testutils import UserTestCase
  8. class MockRequest(object):
  9. def __init__(self, user=None):
  10. self.user = user
  11. self.frontend_context = {}
  12. def get_host(self):
  13. return 'testhost.com'
  14. class GetParsedAgreementTextTests(TestCase):
  15. def test_agreement_no_text(self):
  16. agreement = Agreement.objects.create(
  17. type=Agreement.TYPE_PRIVACY,
  18. link='https://somewhre.com',
  19. is_active=True,
  20. )
  21. result = get_parsed_agreement_text(MockRequest(), agreement)
  22. self.assertIsNone(result)
  23. def test_agreement_link_and_text(self):
  24. agreement = Agreement.objects.create(
  25. type=Agreement.TYPE_PRIVACY,
  26. link='https://somewhre.com',
  27. text='Lorem ipsum',
  28. is_active=True,
  29. )
  30. result = get_parsed_agreement_text(MockRequest(), agreement)
  31. self.assertEqual(result, '<p>Lorem ipsum</p>')
  32. def test_agreement_text(self):
  33. agreement = Agreement.objects.create(
  34. type=Agreement.TYPE_PRIVACY,
  35. text='Lorem ipsum',
  36. is_active=True,
  37. )
  38. result = get_parsed_agreement_text(MockRequest(), agreement)
  39. self.assertEqual(result, '<p>Lorem ipsum</p>')
  40. class GetRequiredUserAgreementTests(UserTestCase):
  41. def setUp(self):
  42. self.agreement = Agreement.objects.create(
  43. type=Agreement.TYPE_PRIVACY,
  44. link='https://somewhre.com',
  45. text='Lorem ipsum',
  46. is_active=True,
  47. )
  48. self.agreements = Agreement.objects.get_agreements_from_db()
  49. def test_anonymous_user(self):
  50. anonymous_user = self.get_anonymous_user()
  51. result = get_required_user_agreement(anonymous_user, self.agreements)
  52. self.assertIsNone(result)
  53. def test_authenticated_user_no_agreements(self):
  54. authenticated_user = self.get_authenticated_user()
  55. result = get_required_user_agreement(authenticated_user, {})
  56. self.assertIsNone(result)
  57. def test_authenticated_user(self):
  58. authenticated_user = self.get_authenticated_user()
  59. result = get_required_user_agreement(authenticated_user, self.agreements)
  60. self.assertEqual(result, self.agreement)
  61. def test_authenticated_user_with_agreement(self):
  62. authenticated_user = self.get_authenticated_user()
  63. authenticated_user.agreements.append(self.agreement.pk)
  64. result = get_required_user_agreement(authenticated_user, self.agreements)
  65. self.assertIsNone(result)
  66. def test_prioritize_terms_of_service(self):
  67. terms_of_service = Agreement.objects.create(
  68. type=Agreement.TYPE_TOS,
  69. link='https://somewhre.com',
  70. text='Lorem ipsum',
  71. is_active=True,
  72. )
  73. agreements = Agreement.objects.get_agreements_from_db()
  74. agreements_in_wrong_order = {
  75. Agreement.TYPE_PRIVACY: agreements[Agreement.TYPE_PRIVACY],
  76. Agreement.TYPE_TOS: agreements[Agreement.TYPE_TOS],
  77. }
  78. authenticated_user = self.get_authenticated_user()
  79. result = get_required_user_agreement(authenticated_user, agreements_in_wrong_order)
  80. self.assertEqual(result, terms_of_service)
  81. class SaveUserAgreementAcceptance(UserTestCase):
  82. def test_no_commit(self):
  83. user = self.get_authenticated_user()
  84. agreement = Agreement.objects.create(
  85. type=Agreement.TYPE_PRIVACY,
  86. link='https://somewhre.com',
  87. text='Lorem ipsum',
  88. )
  89. save_user_agreement_acceptance(user, agreement)
  90. self.assertEqual(user.agreements, [agreement.id])
  91. user.refresh_from_db()
  92. self.assertEqual(user.agreements, [])
  93. UserAgreement.objects.get(user=user, agreement=agreement)
  94. self.assertEqual(UserAgreement.objects.count(), 1)
  95. def test_commit(self):
  96. user = self.get_authenticated_user()
  97. agreement = Agreement.objects.create(
  98. type=Agreement.TYPE_PRIVACY,
  99. link='https://somewhre.com',
  100. text='Lorem ipsum',
  101. )
  102. save_user_agreement_acceptance(user, agreement, commit=True)
  103. self.assertEqual(user.agreements, [agreement.id])
  104. user.refresh_from_db()
  105. self.assertEqual(user.agreements, [agreement.id])
  106. UserAgreement.objects.get(user=user, agreement=agreement)
  107. self.assertEqual(UserAgreement.objects.count(), 1)
  108. class SetAgreementAsActiveTests(TestCase):
  109. def test_inactive_agreement(self):
  110. agreement = Agreement.objects.create(
  111. type=Agreement.TYPE_PRIVACY,
  112. link='https://somewhre.com',
  113. text='Lorem ipsum',
  114. )
  115. set_agreement_as_active(agreement)
  116. self.assertTrue(agreement.is_active)
  117. agreement.refresh_from_db()
  118. self.assertFalse(agreement.is_active)
  119. def test_inactive_agreement_commit(self):
  120. agreement = Agreement.objects.create(
  121. type=Agreement.TYPE_PRIVACY,
  122. link='https://somewhre.com',
  123. text='Lorem ipsum',
  124. )
  125. set_agreement_as_active(agreement, commit=True)
  126. self.assertTrue(agreement.is_active)
  127. agreement.refresh_from_db()
  128. self.assertTrue(agreement.is_active)
  129. def test_change_active_agreement(self):
  130. old_agreement = Agreement.objects.create(
  131. type=Agreement.TYPE_PRIVACY,
  132. link='https://somewhre.com',
  133. text='Lorem ipsum',
  134. is_active=True,
  135. )
  136. new_agreement = Agreement.objects.create(
  137. type=Agreement.TYPE_PRIVACY,
  138. link='https://somewhre.com',
  139. text='Lorem ipsum',
  140. )
  141. other_type_agreement = Agreement.objects.create(
  142. type=Agreement.TYPE_TOS,
  143. link='https://somewhre.com',
  144. text='Lorem ipsum',
  145. is_active=True,
  146. )
  147. set_agreement_as_active(new_agreement, commit=True)
  148. old_agreement.refresh_from_db()
  149. new_agreement.refresh_from_db()
  150. other_type_agreement.refresh_from_db()
  151. self.assertFalse(old_agreement.is_active)
  152. self.assertTrue(new_agreement.is_active)
  153. self.assertTrue(other_type_agreement.is_active)