# -*- coding: utf-8 -*-
# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
#
# This file is part of HyperKitty.
#
# HyperKitty is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# HyperKitty is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# HyperKitty. If not, see .
#
# Author: Aamir Khan
#
import datetime
from django.contrib.auth.models import User, AnonymousUser
from django.core.cache import cache
from django.http import HttpRequest
from hyperkitty.models import Rating
from hyperkitty.lib.view_helpers import get_display_dates, show_mlist
from hyperkitty.lib.voting import set_thread_votes
from hyperkitty.lib.paginator import paginate
from hyperkitty.tests.utils import TestCase
class GetDisplayDatesTestCase(TestCase):
def test_month(self):
begin_date, end_date = get_display_dates('2012', '6', None)
self.assertEqual(begin_date, datetime.datetime(2012, 6, 1))
self.assertEqual(end_date, datetime.datetime(2012, 7, 1))
def test_month_december(self):
try:
begin_date, end_date = get_display_dates('2012', '12', None)
except ValueError, e:
self.fail(e)
self.assertEqual(begin_date, datetime.datetime(2012, 12, 1))
self.assertEqual(end_date, datetime.datetime(2013, 1, 1))
def test_day(self):
begin_date, end_date = get_display_dates('2012', '4', '2')
self.assertEqual(begin_date, datetime.datetime(2012, 4, 2))
self.assertEqual(end_date, datetime.datetime(2012, 4, 3))
class PaginateTestCase(TestCase):
def test_page_range(self):
objects = range(1000)
self.assertEqual(paginate(objects, 1).page_range,
[1, 2, 3, 4, '...', 100])
self.assertEqual(paginate(objects, 2).page_range,
[1, 2, 3, 4, 5, '...', 100])
self.assertEqual(paginate(objects, 3).page_range,
[1, 2, 3, 4, 5, 6, '...', 100])
self.assertEqual(paginate(objects, 4).page_range,
[1, 2, 3, 4, 5, 6, 7, '...', 100])
self.assertEqual(paginate(objects, 5).page_range,
[1, 2, 3, 4, 5, 6, 7, 8, '...', 100])
self.assertEqual(paginate(objects, 6).page_range,
[1, 2, 3, 4, 5, 6, 7, 8, 9, '...', 100])
self.assertEqual(paginate(objects, 7).page_range,
[1, '...', 4, 5, 6, 7, 8, 9, 10, '...', 100])
self.assertEqual(paginate(objects, 8).page_range,
[1, '...', 5, 6, 7, 8, 9, 10, 11, '...', 100])
self.assertEqual(paginate(objects, 9).page_range,
[1, '...', 6, 7, 8, 9, 10, 11, 12, '...', 100])
self.assertEqual(paginate(objects, 10).page_range,
[1, '...', 7, 8, 9, 10, 11, 12, 13, '...', 100])
self.assertEqual(paginate(objects, 40).page_range,
[1, '...', 37, 38, 39, 40, 41, 42, 43, '...', 100])
self.assertEqual(paginate(objects, 90).page_range,
[1, '...', 87, 88, 89, 90, 91, 92, 93, '...', 100])
self.assertEqual(paginate(objects, 91).page_range,
[1, '...', 88, 89, 90, 91, 92, 93, 94, '...', 100])
self.assertEqual(paginate(objects, 92).page_range,
[1, '...', 89, 90, 91, 92, 93, 94, 95, '...', 100])
self.assertEqual(paginate(objects, 93).page_range,
[1, '...', 90, 91, 92, 93, 94, 95, 96, '...', 100])
self.assertEqual(paginate(objects, 94).page_range,
[1, '...', 91, 92, 93, 94, 95, 96, 97, '...', 100])
self.assertEqual(paginate(objects, 95).page_range,
[1, '...', 92, 93, 94, 95, 96, 97, 98, 99, 100])
self.assertEqual(paginate(objects, 96).page_range,
[1, '...', 93, 94, 95, 96, 97, 98, 99, 100])
self.assertEqual(paginate(objects, 97).page_range,
[1, '...', 94, 95, 96, 97, 98, 99, 100])
self.assertEqual(paginate(objects, 98).page_range,
[1, '...', 95, 96, 97, 98, 99, 100])
self.assertEqual(paginate(objects, 99).page_range,
[1, '...', 96, 97, 98, 99, 100])
self.assertEqual(paginate(objects, 100).page_range,
[1, '...', 97, 98, 99, 100])
#
# Voting
#
class DummyThread(object):
thread_id = "dummy"
list_name = "test@example.com"
email_id_hashes = []
@property
def emails_count(self):
return len(email_id_hashes)
class VotingTestCase(TestCase):
def setUp(self):
self.thread = DummyThread()
self.user = User.objects.create_user('testuser', 'test@example.com', 'testPass')
def tearDown(self):
cache.clear()
def test_msg1(self):
# First message in thread is voted for
self.thread.email_id_hashes = ["msg1", "msg2", "msg3"]
Rating(list_address=self.thread.list_name, messageid="msg1",
user=self.user, vote=1).save()
set_thread_votes(self.thread)
self.assertEqual(self.thread.likes, 1)
self.assertEqual(self.thread.dislikes, 0)
self.assertEqual(self.thread.likestatus, "like")
def test_msg2(self):
# Second message in thread is voted against
self.thread.email_id_hashes = ["msg1", "msg2", "msg3"]
Rating(list_address=self.thread.list_name, messageid="msg2",
user=self.user, vote=-1).save()
set_thread_votes(self.thread)
self.assertEqual(self.thread.likes, 0)
self.assertEqual(self.thread.dislikes, 1)
self.assertEqual(self.thread.likestatus, "neutral")
def test_likealot(self):
# All messages in thread are voted for
self.thread.email_id_hashes = [ "msg%s" % num for num in range(1, 11) ]
for msgid in self.thread.email_id_hashes:
Rating(list_address=self.thread.list_name, messageid=msgid,
user=self.user, vote=1).save()
set_thread_votes(self.thread)
self.assertEqual(self.thread.likes, 10)
self.assertEqual(self.thread.dislikes, 0)
self.assertEqual(self.thread.likestatus, "likealot")
def test_same_msgid_different_lists(self):
thread_1 = DummyThread()
thread_1.list_name = "test1@example.com"
thread_2 = DummyThread()
thread_2.list_name = "test2@example.com"
thread_1.email_id_hashes = thread_2.email_id_hashes = ["msgid"]
Rating(list_address="test1@example.com", messageid="msgid",
user=self.user, vote=1).save()
Rating(list_address="test2@example.com", messageid="msgid",
user=self.user, vote=1).save()
set_thread_votes(thread_1)
self.assertEqual(thread_1.likes, 1)
self.assertEqual(thread_1.dislikes, 0)
set_thread_votes(thread_2)
self.assertEqual(thread_2.likes, 1)
self.assertEqual(thread_2.dislikes, 0)
#
# view_helpers.show_mlist()
#
class FakeKSList(object):
def __init__(self, name):
self.name = name
class ShowMlistTestCase(TestCase):
def _do_test(self, listdomain, vhost, expected):
mlist = FakeKSList("test@%s" % listdomain)
req = HttpRequest()
req.META["HTTP_HOST"] = vhost
self.assertEqual(show_mlist(mlist, req), expected)
def test_same_domain(self):
self._do_test("example.com", "example.com", True)
self._do_test("lists.example.com", "lists.example.com", True)
def test_web_subdomain(self):
self._do_test("example.com", "www.example.com", True)
self._do_test("example.com", "lists.example.com", True)
def test_mail_subdomain(self):
self._do_test("lists.example.com", "example.com", True)
def test_different_subdomains(self):
self._do_test("lists.example.com", "archives.example.com", True)
def test_different_domains(self):
self._do_test("example.com", "another-example.com", False)
self._do_test("lists.example.com", "archives.another-example.com", False)
def test_single_component_domain(self):
self._do_test("intranet", "intranet", True)
def test_different_single_component_domain(self):
self._do_test("intranet", "extranet", False)