7

Day rule and accompanying tests

Signed-off-by: Jasper Berghoef <jasper.berghoef@gmail.com>
This commit is contained in:
Jasper Berghoef
2017-01-10 15:36:25 +01:00
parent 9b90551e3b
commit a7b477d71f
6 changed files with 122 additions and 5 deletions

View File

@ -12,7 +12,7 @@ tests_require = [
'pytest-django==3.0.0',
'pytest-sugar==0.7.1',
'freezegun==0.3.8',
'factory_boy==2.7.0',
'factory_boy==2.8.1',
]
setup(

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-01-10 14:35
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import modelcluster.fields
class Migration(migrations.Migration):
dependencies = [
('personalisation', '0006_segment_match_any'),
]
operations = [
migrations.CreateModel(
name='DayRule',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('mon', models.BooleanField(default=False, verbose_name='Monday')),
('tue', models.BooleanField(default=False, verbose_name='Tuesday')),
('wed', models.BooleanField(default=False, verbose_name='Wednesday')),
('thu', models.BooleanField(default=False, verbose_name='Thursday')),
('fri', models.BooleanField(default=False, verbose_name='Friday')),
('sat', models.BooleanField(default=False, verbose_name='Saturday')),
('sun', models.BooleanField(default=False, verbose_name='Sunday')),
('segment', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='personalisation_dayrule_related', related_query_name='personalisation_dayrules', to='personalisation.Segment')),
],
options={
'abstract': False,
},
),
]

View File

@ -67,6 +67,54 @@ class TimeRule(AbstractBaseRule):
return _('Time Rule')
@python_2_unicode_compatible
class DayRule(AbstractBaseRule):
"""Day rule to segment users based on day(s) of visit"""
mon = models.BooleanField(_("Monday"), default=False)
tue = models.BooleanField(_("Tuesday"), default=False)
wed = models.BooleanField(_("Wednesday"), default=False)
thu = models.BooleanField(_("Thursday"), default=False)
fri = models.BooleanField(_("Friday"), default=False)
sat = models.BooleanField(_("Saturday"), default=False)
sun = models.BooleanField(_("Sunday"), default=False)
panels = [
FieldPanel('mon'),
FieldPanel('tue'),
FieldPanel('wed'),
FieldPanel('thu'),
FieldPanel('fri'),
FieldPanel('sat'),
FieldPanel('sun'),
]
def __init__(self, *args, **kwargs):
super(DayRule, self).__init__(*args, **kwargs)
def test_user(self, request=None):
current_day = datetime.today().weekday()
if current_day == 0:
return self.mon
elif current_day == 1:
return self.tue
elif current_day == 2:
return self.wed
elif current_day == 3:
return self.thu
elif current_day == 4:
return self.fri
elif current_day == 5:
return self.sat
elif current_day == 6:
return self.sun
else:
return False
def __str__(self):
return _('Day Rule')
@python_2_unicode_compatible
class ReferralRule(AbstractBaseRule):
"""Referral rule to segment users based on a regex test"""

View File

@ -22,12 +22,20 @@ class TimeRuleFactory(factory.DjangoModelFactory):
class Meta:
model = models.TimeRule
class DayRuleFactory(factory.DjangoModelFactory):
class Meta:
model = models.DayRule
class ReferralRuleFactory(factory.DjangoModelFactory):
regex_string = "test.test"
class Meta:
model = models.ReferralRule
class VisitCountRuleFactory(factory.DjangoModelFactory):
operator = "more_than"
count = 0

View File

@ -6,7 +6,7 @@ import pytest
from personalisation.models import Segment, TimeRule
from tests.factories.segment import (
ReferralRuleFactory, SegmentFactory, TimeRuleFactory)
ReferralRuleFactory, SegmentFactory, TimeRuleFactory, DayRuleFactory)
"""Factory tests"""
@pytest.mark.django_db
@ -18,6 +18,7 @@ def test_create_segment_factory():
assert factoried_segment.name == segment.name
assert factoried_segment.status == segment.status
"""TimeRuleFactory tests"""
@pytest.mark.django_db
def test_create_segment_with_time_rule():
@ -26,6 +27,18 @@ def test_create_segment_with_time_rule():
assert time_rule.start_time == datetime.time(8,0,0)
"""TimeRuleFactory tests"""
@pytest.mark.django_db
def test_create_segment_with_day_rule():
segment = SegmentFactory(name='DaySegment')
day_rule = DayRuleFactory(mon=True, thu=True, segment=segment)
assert day_rule.mon is True
assert day_rule.thu is True
assert day_rule.sun is False
"""ReferralRuleFactory tests"""
@pytest.mark.django_db
def test_create_segment_with_referral_rule():
@ -34,6 +47,7 @@ def test_create_segment_with_referral_rule():
assert referral_rule.regex_string == 'test.test'
@pytest.mark.django_db
def test_create_segment_with_new_referral_rule():
segment = SegmentFactory()

View File

@ -9,7 +9,7 @@ from wagtail.wagtailcore.models import Page
from tests.factories.segment import (
QueryRuleFactory, ReferralRuleFactory, SegmentFactory, TimeRuleFactory,
VisitCountRuleFactory)
DayRuleFactory, VisitCountRuleFactory)
from tests.factories.site import SiteFactory
@ -39,6 +39,19 @@ class TestUserSegmenting(object):
assert client.session['segments'][0]['encoded_name'] == 'time-only'
@freeze_time("2017-01-01")
def test_day_segment(self, client):
day_only_segment = SegmentFactory(name='Day only')
day_rule = DayRuleFactory(
sun=True,
segment=day_only_segment)
request = client.get('/')
assert client.session['segments'][0]['encoded_name'] == 'day-only'
def test_referral_segment(self, client):
referral_segment = SegmentFactory(name='Referral')
referral_rule = ReferralRuleFactory(