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-django==3.0.0',
|
||||||
'pytest-sugar==0.7.1',
|
'pytest-sugar==0.7.1',
|
||||||
'freezegun==0.3.8',
|
'freezegun==0.3.8',
|
||||||
'factory_boy==2.7.0',
|
'factory_boy==2.8.1',
|
||||||
]
|
]
|
||||||
|
|
||||||
setup(
|
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')
|
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
|
@python_2_unicode_compatible
|
||||||
class ReferralRule(AbstractBaseRule):
|
class ReferralRule(AbstractBaseRule):
|
||||||
"""Referral rule to segment users based on a regex test"""
|
"""Referral rule to segment users based on a regex test"""
|
||||||
|
@ -22,12 +22,20 @@ class TimeRuleFactory(factory.DjangoModelFactory):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = models.TimeRule
|
model = models.TimeRule
|
||||||
|
|
||||||
|
|
||||||
|
class DayRuleFactory(factory.DjangoModelFactory):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.DayRule
|
||||||
|
|
||||||
|
|
||||||
class ReferralRuleFactory(factory.DjangoModelFactory):
|
class ReferralRuleFactory(factory.DjangoModelFactory):
|
||||||
regex_string = "test.test"
|
regex_string = "test.test"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.ReferralRule
|
model = models.ReferralRule
|
||||||
|
|
||||||
|
|
||||||
class VisitCountRuleFactory(factory.DjangoModelFactory):
|
class VisitCountRuleFactory(factory.DjangoModelFactory):
|
||||||
operator = "more_than"
|
operator = "more_than"
|
||||||
count = 0
|
count = 0
|
||||||
|
@ -6,7 +6,7 @@ import pytest
|
|||||||
|
|
||||||
from personalisation.models import Segment, TimeRule
|
from personalisation.models import Segment, TimeRule
|
||||||
from tests.factories.segment import (
|
from tests.factories.segment import (
|
||||||
ReferralRuleFactory, SegmentFactory, TimeRuleFactory)
|
ReferralRuleFactory, SegmentFactory, TimeRuleFactory, DayRuleFactory)
|
||||||
|
|
||||||
"""Factory tests"""
|
"""Factory tests"""
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@ -18,6 +18,7 @@ def test_create_segment_factory():
|
|||||||
assert factoried_segment.name == segment.name
|
assert factoried_segment.name == segment.name
|
||||||
assert factoried_segment.status == segment.status
|
assert factoried_segment.status == segment.status
|
||||||
|
|
||||||
|
|
||||||
"""TimeRuleFactory tests"""
|
"""TimeRuleFactory tests"""
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_create_segment_with_time_rule():
|
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)
|
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"""
|
"""ReferralRuleFactory tests"""
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_create_segment_with_referral_rule():
|
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'
|
assert referral_rule.regex_string == 'test.test'
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_create_segment_with_new_referral_rule():
|
def test_create_segment_with_new_referral_rule():
|
||||||
segment = SegmentFactory()
|
segment = SegmentFactory()
|
||||||
|
@ -9,7 +9,7 @@ from wagtail.wagtailcore.models import Page
|
|||||||
|
|
||||||
from tests.factories.segment import (
|
from tests.factories.segment import (
|
||||||
QueryRuleFactory, ReferralRuleFactory, SegmentFactory, TimeRuleFactory,
|
QueryRuleFactory, ReferralRuleFactory, SegmentFactory, TimeRuleFactory,
|
||||||
VisitCountRuleFactory)
|
DayRuleFactory, VisitCountRuleFactory)
|
||||||
from tests.factories.site import SiteFactory
|
from tests.factories.site import SiteFactory
|
||||||
|
|
||||||
|
|
||||||
@ -39,6 +39,19 @@ class TestUserSegmenting(object):
|
|||||||
|
|
||||||
assert client.session['segments'][0]['encoded_name'] == 'time-only'
|
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):
|
def test_referral_segment(self, client):
|
||||||
referral_segment = SegmentFactory(name='Referral')
|
referral_segment = SegmentFactory(name='Referral')
|
||||||
referral_rule = ReferralRuleFactory(
|
referral_rule = ReferralRuleFactory(
|
||||||
|
Reference in New Issue
Block a user