More unit tests

This commit is contained in:
Karl Hobley 2014-02-11 13:02:25 +00:00
parent e7174e75a0
commit dacdacfc0d
2 changed files with 85 additions and 3 deletions

View file

@ -16,8 +16,10 @@ class Query(models.Model):
super(Query, self).save(*args, **kwargs)
def add_hit(self):
daily_hits, created = QueryDailyHits.objects.get_or_create(query=self, date=timezone.now().date())
def add_hit(self, date=None):
if date is None:
date = timezone.now().date()
daily_hits, created = QueryDailyHits.objects.get_or_create(query=self, date=date)
daily_hits.hits = models.F('hits') + 1
daily_hits.save()
@ -41,6 +43,7 @@ class Query(models.Model):
@classmethod
def get_most_popular(cls, date_since=None):
# TODO: Implement date_since
return cls.objects.filter(daily_hits__isnull=False).annotate(_hits=models.Sum('daily_hits__hits')).distinct().order_by('-_hits')
@staticmethod

View file

@ -1,4 +1,7 @@
from django.test import TestCase
from django.utils import timezone
import datetime
import unittest
import models
from wagtail.wagtailsearch.backends import get_search_backend
@ -49,6 +52,9 @@ class TestSearch(TestCase):
results = models.SearchTestChild.title_search("Hello")
self.assertEqual(len(results), 1)
def test_backend_loader(self):
pass
def test_hit_counter(self):
# Add 10 hits to hello query
for i in range(10):
@ -73,7 +79,80 @@ class TestSearch(TestCase):
self.assertNotEqual(query, models.Query.get("Hello"))
def test_popularity(self):
pass
# Add 3 hits to unpopular query
for i in range(3):
models.Query.get("unpopular query").add_hit()
# Add 10 hits to popular query
for i in range(10):
models.Query.get("popular query").add_hit()
# Get most popular queries
popular_queries = models.Query.get_most_popular()
# Check list
self.assertEqual(popular_queries.count(), 2)
self.assertEqual(popular_queries[0], models.Query.get("popular query"))
self.assertEqual(popular_queries[1], models.Query.get("unpopular query"))
# Add 5 hits to little popular query
for i in range(5):
models.Query.get("little popular query").add_hit()
# Check list again, little popular query should be in the middle
self.assertEqual(popular_queries.count(), 3)
self.assertEqual(popular_queries[0], models.Query.get("popular query"))
self.assertEqual(popular_queries[1], models.Query.get("little popular query"))
self.assertEqual(popular_queries[2], models.Query.get("unpopular query"))
# Unpopular query goes viral!
for i in range(20):
models.Query.get("unpopular query").add_hit()
# Unpopular query should be most popular now
self.assertEqual(popular_queries.count(), 3)
self.assertEqual(popular_queries[0], models.Query.get("unpopular query"))
self.assertEqual(popular_queries[1], models.Query.get("popular query"))
self.assertEqual(popular_queries[2], models.Query.get("little popular query"))
@unittest.expectedFailure # Time based popularity isn't implemented yet
def test_popularity_over_time(self):
today = timezone.now().date()
two_days_ago = today - datetime.timedelta(days=2)
a_week_ago = today - datetime.timedelta(days=7)
a_month_ago = today - datetime.timedelta(days=30)
# Add 10 hits to a query that was very popular query a month ago
for i in range(10):
models.Query.get("old popular query").add_hit(date=a_month_ago)
# Add 5 hits to a query that is was popular 2 days ago
for i in range(5):
models.Query.get("new popular query").add_hit(date=two_days_ago)
# Get most popular queries
popular_queries = models.Query.get_most_popular()
# Old popular query should be most popular
self.assertEqual(popular_queries.count(), 2)
self.assertEqual(popular_queries[0], models.Query.get("old popular query"))
self.assertEqual(popular_queries[1], models.Query.get("new popular query"))
# Get most popular queries for past week
past_week_popular_queries = models.Query.get_most_popular(date_since=a_week_ago)
# Only new popular query should be in this list
self.assertEqual(past_week_popular_queries.count(), 1)
self.assertEqual(past_week_popular_queries[0], models.Query.get("new popular query"))
# Old popular query gets a couple more hits!
for i in range(2):
models.Query.get("old popular query").add_hit()
# Old popular query should now be in the most popular queries
self.assertEqual(past_week_popular_queries.count(), 2)
self.assertEqual(past_week_popular_queries[0], models.Query.get("new popular query"))
self.assertEqual(past_week_popular_queries[1], models.Query.get("old popular query"))
def test_editors_picks(self):
pass