7

Make VisitCountRule.test_user actually test with only a user

This commit is contained in:
Kaitlyn Crawford
2018-02-21 18:48:44 +02:00
parent aa917dee9c
commit 330557be8d
2 changed files with 57 additions and 6 deletions

View File

@ -2,17 +2,23 @@ from __future__ import absolute_import, unicode_literals
import re import re
from datetime import datetime from datetime import datetime
from importlib import import_module
from django.apps import apps from django.apps import apps
from django.conf import settings
from django.contrib.sessions.models import Session
from django.db import models from django.db import models
from django.template.defaultfilters import slugify from django.template.defaultfilters import slugify
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.test.client import RequestFactory
from modelcluster.fields import ParentalKey from modelcluster.fields import ParentalKey
from user_agents import parse from user_agents import parse
from wagtail.wagtailadmin.edit_handlers import ( from wagtail.wagtailadmin.edit_handlers import (
FieldPanel, FieldRowPanel, PageChooserPanel) FieldPanel, FieldRowPanel, PageChooserPanel)
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
@python_2_unicode_compatible @python_2_unicode_compatible
class AbstractBaseRule(models.Model): class AbstractBaseRule(models.Model):
@ -221,17 +227,33 @@ class VisitCountRule(AbstractBaseRule):
verbose_name = _('Visit count Rule') verbose_name = _('Visit count Rule')
def test_user(self, request, user=None): def test_user(self, request, user=None):
# Local import for cyclic import
from wagtail_personalisation.adapters import (
get_segment_adapter, SessionSegmentsAdapter, SEGMENT_ADAPTER_CLASS)
if user: if user:
# This rule currently does not support testing a user directly # Create a fake request so we can use the adapter
# TODO: Make this test a user directly when the rule uses request = RequestFactory().get('/')
# historical data request.session = SessionStore()
# If we're using the session adapter check for an active session
if SEGMENT_ADAPTER_CLASS == SessionSegmentsAdapter:
sessions = Session.objects.iterator()
for session in sessions:
session_data = session.get_decoded()
if session_data.get('_auth_user_id') == str(user.id):
request.session = SessionStore(
session_key=session.session_key)
break
request.user = user
elif not request:
# Return false if we don't have a user or a request
return False return False
operator = self.operator operator = self.operator
segment_count = self.count segment_count = self.count
# Local import for cyclic import
from wagtail_personalisation.adapters import get_segment_adapter
adapter = get_segment_adapter(request) adapter = get_segment_adapter(request)
visit_count = adapter.get_visit_count(self.counted_page) visit_count = adapter.get_visit_count(self.counted_page)

View File

@ -1,5 +1,8 @@
import pytest import pytest
from tests.factories.rule import VisitCountRuleFactory
from tests.factories.segment import SegmentFactory
@pytest.mark.django_db @pytest.mark.django_db
def test_visit_count(site, client): def test_visit_count(site, client):
@ -20,3 +23,29 @@ def test_visit_count(site, client):
visit_count = client.session['visit_count'] visit_count = client.session['visit_count']
assert visit_count[0]['count'] == 2 assert visit_count[0]['count'] == 2
assert visit_count[1]['count'] == 1 assert visit_count[1]['count'] == 1
@pytest.mark.django_db
def test_visit_count_call_test_user_with_user(site, client, user):
segment = SegmentFactory(name='VisitCount')
rule = VisitCountRuleFactory(counted_page=site.root_page, segment=segment)
session = client.session
session['visit_count'] = [{'path': '/', 'count': 2}]
session.save()
client.force_login(user)
assert rule.test_user(None, user)
@pytest.mark.django_db
def test_visit_count_call_test_user_with_user_or_request_fails(site, client, user):
segment = SegmentFactory(name='VisitCount')
rule = VisitCountRuleFactory(counted_page=site.root_page, segment=segment)
session = client.session
session['visit_count'] = [{'path': '/', 'count': 2}]
session.save()
client.force_login(user)
assert not rule.test_user(None)