Day rule and accompanying tests
Signed-off-by: Jasper Berghoef <jasper.berghoef@gmail.com>
This commit is contained in:
2
setup.py
2
setup.py
@ -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(
|
||||
|
34
src/personalisation/migrations/0007_dayrule.py
Normal file
34
src/personalisation/migrations/0007_dayrule.py
Normal 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,
|
||||
},
|
||||
),
|
||||
]
|
@ -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"""
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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(
|
||||
|
Reference in New Issue
Block a user