Browse Source

Split tests suite into files

Rafał Pitoń 6 years ago
parent
commit
dddc75dae2

+ 7 - 5
misago/legal/context_processors.py

@@ -1,14 +1,18 @@
 from django.urls import reverse
 from django.urls import reverse
 
 
 from .models import Agreement
 from .models import Agreement
-from .utils import get_required_user_agreement, get_parsed_content
+from .utils import get_parsed_agreement_text, get_required_user_agreement
 
 
 
 
 # fixme: rename this context processor to more suitable name
 # fixme: rename this context processor to more suitable name
 def legal_links(request):
 def legal_links(request):
     agreements = Agreement.objects.get_agreements()
     agreements = Agreement.objects.get_agreements()
 
 
-    legal_context = {}
+    legal_context = {
+        'TERMS_OF_SERVICE_URL': None,
+        'PRIVACY_POLICY_URL': None,
+        'misago_agreement': None,
+    }
 
 
     terms_of_service = agreements.get(Agreement.TYPE_TOS)
     terms_of_service = agreements.get(Agreement.TYPE_TOS)
     if terms_of_service:
     if terms_of_service:
@@ -34,9 +38,7 @@ def legal_links(request):
         legal_context['misago_agreement'] = {
         legal_context['misago_agreement'] = {
             'title': required_agreement.get_final_title(),
             'title': required_agreement.get_final_title(),
             'link': required_agreement.link,
             'link': required_agreement.link,
-            'content': get_parsed_content(request, required_agreement)
+            'text': get_parsed_agreement_text(request, required_agreement)
         }
         }
-    else:
-        legal_context['misago_agreement'] = None
 
 
     return legal_context
     return legal_context

+ 166 - 0
misago/legal/tests/test_context_processors.py

@@ -0,0 +1,166 @@
+from django.urls import reverse
+
+from misago.legal.context_processors import legal_links
+from misago.legal.models import Agreement
+from misago.users.testutils import AuthenticatedUserTestCase
+
+
+class MockRequest(object):
+    def __init__(self, user):
+        self.user = user
+        self.frontend_context = {}
+
+    def get_host(self):
+        return 'testhost.com'
+
+
+class PrivacyPolicyTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super(PrivacyPolicyTests, self).setUp()
+
+        Agreement.objects.invalidate_cache()
+
+    def tearDown(self):
+        Agreement.objects.invalidate_cache()
+
+    def test_context_processor_no_policy(self):
+        """context processor has no TOS link"""
+        context_dict = legal_links(MockRequest(self.user))
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': None,
+            'PRIVACY_POLICY_URL': None,
+            'misago_agreement': None,
+        })
+
+    def test_context_processor_misago_policy(self):
+        """context processor has TOS link to Misago view"""
+        Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': None,
+            'PRIVACY_POLICY_URL': reverse('misago:privacy-policy'),
+            'misago_agreement': {
+                'title': 'Privacy policy',
+                'link': None,
+                'text': '<p>Lorem ipsum</p>',
+            },
+        })
+
+    def test_context_processor_remote_policy(self):
+        """context processor has TOS link to remote url"""
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='http://test.com',
+            is_active=True,
+        )
+
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': None,
+            'PRIVACY_POLICY_URL': 'http://test.com',
+            'misago_agreement': {
+                'title': 'Privacy policy',
+                'link': 'http://test.com',
+                'text': None,
+            },
+        })
+
+        # set misago view too
+        agreement.text = 'Lorem ipsum'
+        agreement.save()
+        
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': None,
+            'PRIVACY_POLICY_URL': 'http://test.com',
+            'misago_agreement': {
+                'title': 'Privacy policy',
+                'link': 'http://test.com',
+                'text': '<p>Lorem ipsum</p>',
+            },
+        })
+
+
+class TermsOfServiceTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super(TermsOfServiceTests, self).setUp()
+        
+        Agreement.objects.invalidate_cache()
+
+    def tearDown(self):
+        Agreement.objects.invalidate_cache()
+
+    def test_context_processor_no_tos(self):
+        """context processor has no TOS link"""
+        context_dict = legal_links(MockRequest(self.user))
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': None,
+            'PRIVACY_POLICY_URL': None,
+            'misago_agreement': None,
+        })
+
+    def test_context_processor_misago_tos(self):
+        """context processor has TOS link to Misago view"""
+        Agreement.objects.create(
+            type=Agreement.TYPE_TOS,
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(
+            context_dict, {
+                'TERMS_OF_SERVICE_URL': reverse('misago:terms-of-service'),
+                'PRIVACY_POLICY_URL': None,
+                'misago_agreement': {
+                    'title': 'Terms of service',
+                    'link': None,
+                    'text': '<p>Lorem ipsum</p>',
+                }
+            }
+        )
+
+    def test_context_processor_remote_tos(self):
+        """context processor has TOS link to remote url"""
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_TOS,
+            link='http://test.com',
+            is_active=True,
+        )
+
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': 'http://test.com',
+            'PRIVACY_POLICY_URL': None,
+            'misago_agreement': {
+                'title': 'Terms of service',
+                'link': 'http://test.com',
+                'text': None,
+            }
+        })
+
+        # set misago view too
+        agreement.text = 'Lorem ipsum'
+        agreement.save()
+
+        context_dict = legal_links(MockRequest(self.user))
+
+        self.assertEqual(context_dict, {
+            'TERMS_OF_SERVICE_URL': 'http://test.com',
+            'PRIVACY_POLICY_URL': None,
+            'misago_agreement': {
+                'title': 'Terms of service',
+                'link': 'http://test.com',
+                'text': '<p>Lorem ipsum</p>',
+            },
+        })

+ 147 - 0
misago/legal/tests/test_utils.py

@@ -0,0 +1,147 @@
+from django.test import TestCase
+
+from misago.legal.models import Agreement
+from misago.legal.utils import (
+    get_parsed_agreement_text, get_required_user_agreement, set_agreement_as_active
+)
+from misago.users.testutils import UserTestCase
+
+
+class MockRequest(object):
+    def __init__(self, user=None):
+        self.user = user
+        self.frontend_context = {}
+
+    def get_host(self):
+        return 'testhost.com'
+
+
+class GetParsedAgreementTextTests(TestCase):
+    def test_agreement_no_text(self):
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            is_active=True,
+        )
+
+        result = get_parsed_agreement_text(MockRequest(), agreement)
+        self.assertIsNone(result)
+
+    def test_agreement_link_and_text(self):
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        result = get_parsed_agreement_text(MockRequest(), agreement)
+        self.assertEqual(result, '<p>Lorem ipsum</p>')
+
+    def test_agreement_text(self):
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        result = get_parsed_agreement_text(MockRequest(), agreement)
+        self.assertEqual(result, '<p>Lorem ipsum</p>')
+
+
+class GetRequiredUserAgreementTests(UserTestCase):
+    def setUp(self):
+        Agreement.objects.invalidate_cache()
+
+        self.agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        self.agreements = Agreement.objects.get_agreements()
+
+    def tearDown(self):
+        Agreement.objects.invalidate_cache()
+
+    def test_anonymous_user(self):
+        anonymous_user = self.get_anonymous_user()
+        result = get_required_user_agreement(anonymous_user, self.agreements)
+        self.assertIsNone(result)
+
+    def test_authenticated_user_no_agreements(self):
+        authenticated_user = self.get_authenticated_user()
+        result = get_required_user_agreement(authenticated_user, {})
+        self.assertIsNone(result)
+
+    def test_authenticated_user(self):
+        authenticated_user = self.get_authenticated_user()
+        result = get_required_user_agreement(authenticated_user, self.agreements)
+        self.assertEqual(result, self.agreement)
+
+    def test_authenticated_user_with_agreement(self):
+        authenticated_user = self.get_authenticated_user()
+        authenticated_user.agreements.append(self.agreement.pk)
+
+        result = get_required_user_agreement(authenticated_user, self.agreements)
+        self.assertIsNone(result)
+
+
+class SetAgreementAsActiveTests(TestCase):
+     def test_inactive_agreement(self):
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+        )
+
+        set_agreement_as_active(agreement)
+        self.assertTrue(agreement.is_active)
+
+        agreement.refresh_from_db()
+        self.assertFalse(agreement.is_active)
+
+     def test_inactive_agreement_commit(self):
+        agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+        )
+
+        set_agreement_as_active(agreement, commit=True)
+        self.assertTrue(agreement.is_active)
+
+        agreement.refresh_from_db()
+        self.assertTrue(agreement.is_active)
+        
+     def test_change_active_agreement(self):
+        old_agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        new_agreement = Agreement.objects.create(
+            type=Agreement.TYPE_PRIVACY,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+        )
+
+        other_type_agreement = Agreement.objects.create(
+            type=Agreement.TYPE_TOS,
+            link='https://somewhre.com',
+            text='Lorem ipsum',
+            is_active=True,
+        )
+
+        set_agreement_as_active(new_agreement, commit=True)
+
+        old_agreement.refresh_from_db()
+        new_agreement.refresh_from_db()
+        other_type_agreement.refresh_from_db()
+
+        self.assertFalse(old_agreement.is_active)
+        self.assertTrue(new_agreement.is_active)
+        self.assertTrue(other_type_agreement.is_active)

+ 0 - 94
misago/legal/tests/test_views.py

@@ -1,15 +1,9 @@
 from django.test import TestCase
 from django.test import TestCase
 from django.urls import reverse
 from django.urls import reverse
 
 
-from misago.legal.context_processors import legal_links
 from misago.legal.models import Agreement
 from misago.legal.models import Agreement
 
 
 
 
-class MockRequest(object):
-    def __init__(self):
-        self.frontend_context = {}
-
-
 class PrivacyPolicyTests(TestCase):
 class PrivacyPolicyTests(TestCase):
     def setUp(self):
     def setUp(self):
         Agreement.objects.invalidate_cache()
         Agreement.objects.invalidate_cache()
@@ -49,49 +43,6 @@ class PrivacyPolicyTests(TestCase):
         self.assertContains(response, 'Test Policy')
         self.assertContains(response, 'Test Policy')
         self.assertContains(response, 'Lorem ipsum dolor')
         self.assertContains(response, 'Lorem ipsum dolor')
 
 
-    def test_context_processor_no_policy(self):
-        """context processor has no TOS link"""
-        context_dict = legal_links(MockRequest())
-        self.assertFalse(context_dict)
-
-    def test_context_processor_misago_policy(self):
-        """context processor has TOS link to Misago view"""
-        Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY,
-            text='Lorem ipsum',
-            is_active=True,
-        )
-
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': reverse('misago:privacy-policy'),
-        })
-
-    def test_context_processor_remote_policy(self):
-        """context processor has TOS link to remote url"""
-        agreement = Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY,
-            link='http://test.com',
-            is_active=True,
-        )
-
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com',
-        })
-
-        # set misago view too
-        agreement.text = 'Lorem ipsum'
-        agreement.save()
-        
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com',
-        })
-
 
 
 class TermsOfServiceTests(TestCase):
 class TermsOfServiceTests(TestCase):
     def setUp(self):
     def setUp(self):
@@ -131,48 +82,3 @@ class TermsOfServiceTests(TestCase):
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, 'Test ToS')
         self.assertContains(response, 'Test ToS')
         self.assertContains(response, 'Lorem ipsum dolor')
         self.assertContains(response, 'Lorem ipsum dolor')
-
-    def test_context_processor_no_tos(self):
-        """context processor has no TOS link"""
-        context_dict = legal_links(MockRequest())
-        self.assertFalse(context_dict)
-
-    def test_context_processor_misago_tos(self):
-        """context processor has TOS link to Misago view"""
-        Agreement.objects.create(
-            type=Agreement.TYPE_TOS,
-            text='Lorem ipsum',
-            is_active=True,
-        )
-
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(
-            context_dict, {
-                'TERMS_OF_SERVICE_URL': reverse('misago:terms-of-service'),
-            }
-        )
-
-    def test_context_processor_remote_tos(self):
-        """context processor has TOS link to remote url"""
-        agreement = Agreement.objects.create(
-            type=Agreement.TYPE_TOS,
-            link='http://test.com',
-            is_active=True,
-        )
-
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com',
-        })
-
-        # set misago view too
-        agreement.text = 'Lorem ipsum'
-        agreement.save()
-
-        context_dict = legal_links(MockRequest())
-
-        self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com',
-        })

+ 8 - 3
misago/legal/utils.py

@@ -13,8 +13,10 @@ def set_agreement_as_active(agreement, commit=False):
     agreement.is_active = True
     agreement.is_active = True
     queryset = Agreement.objects.filter(type=agreement.type).exclude(pk=agreement.pk)
     queryset = Agreement.objects.filter(type=agreement.type).exclude(pk=agreement.pk)
     queryset.update(is_active=False)
     queryset.update(is_active=False)
-    agreement.save(update_fields=['is_active'])
-    Agreement.objects.invalidate_cache()
+    
+    if commit:
+        agreement.save(update_fields=['is_active'])
+        Agreement.objects.invalidate_cache()
 
 
 
 
 def get_required_user_agreement(user, agreements):
 def get_required_user_agreement(user, agreements):
@@ -32,7 +34,10 @@ def get_required_user_agreement(user, agreements):
     return None
     return None
 
 
 
 
-def get_parsed_content(request, agreement):
+def get_parsed_agreement_text(request, agreement):
+    if not agreement.text:
+        return None
+
     cache_name = 'misago_legal_%s_%s' % (agreement.pk, agreement.last_modified_on or '')
     cache_name = 'misago_legal_%s_%s' % (agreement.pk, agreement.last_modified_on or '')
     cached_content = cache.get(cache_name)
     cached_content = cache.get(cache_name)
 
 

+ 1 - 1
misago/legal/views/admin.py

@@ -80,7 +80,7 @@ class DeleteAgreement(AgreementAdmin, generic.ButtonView):
 
 
 class SetAgreementAsActive(AgreementAdmin, generic.ButtonView):
 class SetAgreementAsActive(AgreementAdmin, generic.ButtonView):
     def button_action(self, request, target):
     def button_action(self, request, target):
-        set_agreement_as_active(target)
+        set_agreement_as_active(target, commit=True)
 
 
         message = _('Agreement "%(title)s" has been set as active for type "%(type)s".')
         message = _('Agreement "%(title)s" has been set as active for type "%(type)s".')
         targets_names = {'title': target.get_final_title(), 'type': target.get_type_display()}
         targets_names = {'title': target.get_final_title(), 'type': target.get_type_display()}

+ 3 - 6
misago/legal/views/legal.py

@@ -1,8 +1,7 @@
 from django.shortcuts import get_object_or_404, redirect, render
 from django.shortcuts import get_object_or_404, redirect, render
-from django.utils.text import slugify
 
 
 from misago.legal.models import Agreement
 from misago.legal.models import Agreement
-from misago.legal.utils import get_parsed_content
+from misago.legal.utils import get_parsed_agreement_text
 
 
 
 
 def legal_view(request, agreement_type):
 def legal_view(request, agreement_type):
@@ -14,17 +13,15 @@ def legal_view(request, agreement_type):
         return redirect(agreement.link)
         return redirect(agreement.link)
 
 
     template_name = 'misago/{}.html'.format(agreement_type)
     template_name = 'misago/{}.html'.format(agreement_type)
-    parsed_content = get_parsed_content(request, agreement)
+    agreement_text = get_parsed_agreement_text(request, agreement)
 
 
     return render(
     return render(
         request,
         request,
         template_name,
         template_name,
         {
         {
-            'id': slugify(agreement_type),
             'title': agreement.get_final_title(),
             'title': agreement.get_final_title(),
             'link': agreement.link,
             'link': agreement.link,
-            'body': parsed_content,
-            'hide_misago_agreement': True,
+            'text': agreement_text,
         }
         }
     )
     )
 
 

+ 1 - 1
misago/templates/misago/base.html

@@ -42,7 +42,7 @@
     <div class="modal fade" id="modal-mount" tabindex="-1" role="dialog" aria-labelledby="misago-modal-label"></div>
     <div class="modal fade" id="modal-mount" tabindex="-1" role="dialog" aria-labelledby="misago-modal-label"></div>
 
 
     {% if misago_agreement %}
     {% if misago_agreement %}
-      {% include "misago/agreement-overlay.html" %}
+      {% include "misago/required_agreement.html" %}
     {% endif %}
     {% endif %}
 
 
     <script src="{% url 'django-i18n' %}?{{ LANGUAGE_CODE }}"></script>
     <script src="{% url 'django-i18n' %}?{{ LANGUAGE_CODE }}"></script>

+ 1 - 1
misago/templates/misago/privacy_policy.html

@@ -23,7 +23,7 @@
 
 
   <div class="legal-body container">
   <div class="legal-body container">
     <article class="misago-markup">
     <article class="misago-markup">
-      {{ body|safe }}
+      {{ text|safe }}
     </article>
     </article>
   </div>
   </div>
 </div>
 </div>

+ 1 - 1
misago/templates/misago/agreement-overlay.html → misago/templates/misago/required_adreement.html

@@ -7,7 +7,7 @@
       </div>
       </div>
       <div class="agreement-body">
       <div class="agreement-body">
         <article class="misago-markup">
         <article class="misago-markup">
-          {{ misago_agreement.content|safe }}
+          {{ misago_agreement.text|safe }}
         </article>
         </article>
       </div>
       </div>
       <div id="agreement-actions" class="agreement-footer">
       <div id="agreement-actions" class="agreement-footer">

+ 1 - 1
misago/templates/misago/terms_of_service.html

@@ -23,7 +23,7 @@
 
 
   <div class="legal-body container">
   <div class="legal-body container">
     <article class="misago-markup">
     <article class="misago-markup">
-      {{ body|safe }}
+      {{ text|safe }}
     </article>
     </article>
   </div>
   </div>
 </div>
 </div>