# -*- 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
# Author: Aurelien Bompard
#
import datetime
from mock import Mock
import django.utils.simplejson as json
from django.test import TestCase
from django.test.client import Client, RequestFactory
from django.test.utils import override_settings
from django.contrib.auth.models import User, AnonymousUser
from django.core.urlresolvers import reverse
from mailman.email.message import Message
import django_assets.env
import kittystore
from kittystore.utils import get_message_id_hash
from kittystore.test import FakeList
from hyperkitty.models import Rating, LastView
@override_settings(USE_SSL=False, USE_INTERNAL_AUTH=True, DEBUG=True, ASSETS_DEBUG=True)
class AccountViewsTestCase(TestCase):
def setUp(self):
# Re-do the settings patching
# https://github.com/miracle2k/django-assets/issues/3
django_assets.env.reset()
django_assets.env.get_env()
self.client = Client()
def test_login(self):
# Try to access user profile (private data) without logging in
response = self.client.get(reverse('user_profile'))
self.assertRedirects(response, "%s?next=%s" % (reverse('user_login'), reverse('user_profile')))
def test_profile(self):
User.objects.create_user('testuser', 'test@example.com', 'testPass')
self.client.login(username='testuser', password='testPass')
response = self.client.get(reverse('user_profile'))
self.assertEqual(response.status_code, 200)
# Verify that user_profile is present in request context
self.assertTrue('user_profile' in response.context)
# Verify karma for newly created user is 1
self.assertEqual(response.context['user_profile'].karma, 1)
def test_registration(self):
User.objects.create_user('testuser', 'test@example.com', 'testPass')
self.client.login(username='testuser', password='testPass')
# If the user if already logged in, redirect to index page...
# Don't let him register again
response = self.client.get(reverse('user_registration'))
self.assertRedirects(response, reverse('root'))
self.client.logout()
# Access the user registration page after logging out and try to register now
response = self.client.get(reverse('user_registration'))
self.assertEqual(response.status_code, 200)
# @TODO: Try to register a user and verify its working
from hyperkitty.views.accounts import last_views
from hyperkitty.views.thread import thread_index
@override_settings(DEBUG=True, ASSETS_DEBUG=True)
class LastViewsTestCase(TestCase):
def setUp(self):
# Re-do the settings patching
# https://github.com/miracle2k/django-assets/issues/3
django_assets.env.reset()
django_assets.env.get_env()
self.user = User.objects.create_user('testuser', 'test@example.com', 'testPass')
self.client.login(username='testuser', password='testPass')
store = kittystore.get_store("sqlite:", debug=False)
ml = FakeList("list@example.com")
ml.subject_prefix = u"[example] "
# Create 3 threads
messages = []
for msgnum in range(3):
msg = Message()
msg["From"] = "dummy@example.com"
msg["Message-ID"] = "" % (msgnum+1)
msg["Subject"] = "Dummy message"
msg.set_payload("Dummy message")
store.add_to_list(ml, msg)
messages.append(msg)
# 1st is unread, 2nd is read, 3rd is updated
LastView.objects.create(list_address="list@example.com", user=self.user,
threadid=get_message_id_hash(""))
LastView.objects.create(list_address="list@example.com", user=self.user,
threadid=get_message_id_hash(""))
msg4 = Message()
msg4["From"] = "dummy@example.com"
msg4["Message-ID"] = ""
msg4["Subject"] = "Dummy message"
msg4["In-Reply-To"] = ""
msg4.set_payload("Dummy message")
store.add_to_list(ml, msg4)
# Factory
defaults = {"kittystore.store": store, "HTTP_USER_AGENT": "testbot"}
self.factory = RequestFactory(**defaults)
def test_profile(self):
request = self.factory.get(reverse('user_last_views'))
request.user = self.user
response = last_views(request)
self.assertContains(response, "dummy@example.com | ",
count=2, status_code=200, html=True)
def test_thread(self):
responses = []
for msgnum in range(3):
threadid = get_message_id_hash("" % (msgnum+1))
request = self.factory.get(reverse('thread',
args=["list@example.com", threadid]))
request.user = self.user
response = thread_index(request, "list@example.com", threadid)
responses.append(response)
self.assertContains(responses[0], "icon-eye-close", count=1, status_code=200)
self.assertNotContains(responses[1], "icon-eye-close", status_code=200)
self.assertContains(responses[2], "icon-eye-close", count=1, status_code=200)
from hyperkitty.views.message import vote
class MessageViewsTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user(
'testuser', 'test@example.com', 'testPass')
# Fake KittStore
class FakeMessage(object):
def __init__(self, h):
self.message_id_hash = h
self.store = Mock()
self.store.get_message_by_hash_from_list.side_effect = \
lambda l, h: FakeMessage(h)
defaults = {"kittystore.store": self.store}
self.factory = RequestFactory(**defaults)
def test_vote_up(self):
request = self.factory.post("/vote", {"vote": "1"})
request.user = self.user
resp = vote(request, 'list@example.com', '123')
self.assertEqual(resp.status_code, 200)
v = Rating.objects.get(user=self.user, messageid="123",
list_address='list@example.com')
self.assertEqual(v.vote, 1)
result = json.loads(resp.content)
self.assertEqual(result["like"], 1)
self.assertEqual(result["dislike"], 0)
def test_vote_down(self):
request = self.factory.post("/vote", {"vote": "-1"})
request.user = self.user
resp = vote(request, 'list@example.com', '123')
self.assertEqual(resp.status_code, 200)
v = Rating.objects.get(user=self.user, messageid="123",
list_address='list@example.com')
self.assertEqual(v.vote, -1)
result = json.loads(resp.content)
self.assertEqual(result["like"], 0)
self.assertEqual(result["dislike"], 1)
def test_vote_cancel(self):
v = Rating(list_address="list@example.com", messageid="m1", vote=1)
v.user = self.user
v.save()
v = Rating(list_address="list@example.com", messageid="m2", vote=-1)
v.user = self.user
v.save()
for msg in ["m1", "m2"]:
request = self.factory.post("/vote", {"vote": "0"})
request.user = self.user
resp = vote(request, 'list@example.com', msg)
self.assertEqual(resp.status_code, 200)
try:
Rating.objects.get(user=self.user, messageid=msg,
list_address='list@example.com')
except Rating.DoesNotExist:
pass
else:
self.fail("Vote for msg %s should have been deleted" % msg)
result = json.loads(resp.content)
self.assertEqual(result["like"], 0)
self.assertEqual(result["dislike"], 0)
def test_unauth_vote(self):
request = self.factory.post("/vote", {"vote": "1"})
request.user = AnonymousUser()
resp = vote(request, 'list@example.com', '123')
self.assertEqual(resp.status_code, 403)
from hyperkitty.views.list import archives
class ListArchivesTestCase(TestCase):
def setUp(self):
# self.store = Mock()
# self.store.get_threads.return_value = []
# self.store.get_list.side_effect = lambda n: FakeList(n)
# defaults = {"kittystore.store": self.store}
# self.factory = RequestFactory(**defaults)
self.factory = RequestFactory()
def test_no_date(self):
today = datetime.date.today()
request = self.factory.get("/archives")
response = archives(request, 'list@example.com')
final_url = reverse('archives_with_month',
kwargs={'mlist_fqdn': 'list@example.com',
'year': today.year,
'month': today.month,
})
self.assertEqual(response["location"], final_url)