# -*- 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 import urllib from mock import Mock, patch 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 import django_assets.env from hyperkitty.models import Rating @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') user = 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') user = 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.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)