Skip to content

Commit b68864d

Browse files
committed
Ensure that bots are always served the control page on live experiments
1 parent 553dff7 commit b68864d

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

experiments/wagtail_hooks.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
from django.contrib.admin.utils import quote
55
from django.core.urlresolvers import reverse
66
from django.utils.translation import ugettext_lazy as _
7-
from experiments import admin_urls
7+
import user_agents
88
from wagtail.contrib.modeladmin.helpers import ButtonHelper
99
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
1010
from wagtail.contrib.modeladmin.views import CreateView, EditView
1111
from wagtail.wagtailcore import hooks
1212

13+
from experiments import admin_urls
1314
from .models import Experiment
1415
from .utils import get_user_id, impersonate_other_page
1516

@@ -91,6 +92,13 @@ def check_experiments(page, request, serve_args, serve_kwargs):
9192
if experiment.status == 'completed' and experiment.winning_variation is not None:
9293
variation = experiment.winning_variation
9394
else:
95+
# always serve bots the control page
96+
ua_string = request.META.get('HTTP_USER_AGENT')
97+
if ua_string:
98+
ua = user_agents.parse(ua_string)
99+
if ua.is_bot:
100+
return
101+
94102
user_id = get_user_id(request)
95103
variation = experiment.start_experiment_for_user(user_id, request)
96104

setup.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
author_email='[email protected]',
1111
url='https://github.com/torchbox/wagtail-experiments',
1212
packages=find_packages(),
13+
install_requires=[
14+
'user-agents>=1.0,<2.0',
15+
],
1316
license='BSD',
1417
long_description=open('README.rst').read(),
1518
classifiers=[

tests/tests.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,27 @@ def test_selected_variation_depends_on_user_id(self):
5151
self.assertEqual(response.status_code, 200)
5252
self.assertContains(response, '<p>Welcome to our site! It&#39;s lovely to meet you.</p>')
5353

54+
def test_bot_user_agent_gets_control_page(self):
55+
session = self.client.session
56+
57+
# non-bot user agent string
58+
for x in range(0, 5):
59+
session.clear()
60+
session['experiment_user_id'] = '33333333-3333-3333-3333-333333333333'
61+
session.save()
62+
response = self.client.get('/', HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
63+
self.assertEqual(response.status_code, 200)
64+
self.assertContains(response, '<p>Welcome to our site! It&#39;s lovely to meet you.</p>')
65+
66+
# bot user agent string
67+
for x in range(0, 5):
68+
session.clear()
69+
session['experiment_user_id'] = '33333333-3333-3333-3333-333333333333'
70+
session.save()
71+
response = self.client.get('/', HTTP_USER_AGENT="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
72+
self.assertEqual(response.status_code, 200)
73+
self.assertContains(response, '<p>Welcome to our site!</p>')
74+
5475
def test_participant_is_logged(self):
5576
# initially there should be no experiment history
5677
self.assertEqual(ExperimentHistory.objects.filter(experiment=self.experiment).count(), 0)

0 commit comments

Comments
 (0)