bgneal@626: """
bgneal@626: Tests for the wiki integration application.
bgneal@626: 
bgneal@626: """
bgneal@626: import hashlib
bgneal@626: import datetime
bgneal@626: 
bgneal@626: from django.contrib.auth.models import User
bgneal@626: from django.test import TestCase
bgneal@626: from django.test.client import RequestFactory
bgneal@626: from django.http import HttpResponse
bgneal@626: from django.conf import settings
bgneal@626: 
bgneal@626: from core.services import get_redis_connection
bgneal@627: from wiki.middleware import WikiMiddleware
bgneal@629: from wiki.constants import SESSION_SET_MEMBER
bgneal@626: 
bgneal@626: 
bgneal@626: class MiddleWareTestCase(TestCase):
bgneal@626: 
bgneal@626:     def setUp(self):
bgneal@626:         self.factory = RequestFactory()
bgneal@626:         self.user = User.objects.create_user('test_user', 'test@example.com',
bgneal@626:                 'password')
bgneal@626:         self.conn = get_redis_connection()
bgneal@626:         self.mw = WikiMiddleware()
bgneal@626: 
bgneal@626:     def tearDown(self):
bgneal@626:         self.conn.delete(settings.WIKI_REDIS_SET)
bgneal@626: 
bgneal@629:     def create_request(self):
bgneal@626:         request = self.factory.get('/contact/')
bgneal@626:         request.session = {}
bgneal@626:         request.user = self.user
bgneal@629:         return request
bgneal@629: 
bgneal@629:     def test_middleware(self):
bgneal@629: 
bgneal@629:         request = self.create_request()
bgneal@626:         response = HttpResponse()
bgneal@626: 
bgneal@629:         request.wiki_set_cookie = True
bgneal@626:         response = self.mw.process_response(request, response)
bgneal@626: 
bgneal@626:         cookie = response.cookies.get(settings.WIKI_COOKIE_NAME)
bgneal@626:         cookie_val = ''
bgneal@626:         self.assertIsNotNone(cookie)
bgneal@626:         if cookie:
bgneal@626:             self.assertEqual(cookie['domain'], settings.WIKI_COOKIE_DOMAIN)
bgneal@626:             self.assertEqual(cookie['path'], '/')
bgneal@626:             self.assertEqual(cookie['max-age'], settings.WIKI_COOKIE_AGE)
bgneal@626: 
bgneal@626:             cookie_val = cookie.value
bgneal@626:             try:
bgneal@626:                 user, email, key = cookie_val.split('#')
bgneal@627:             except ValueError:
bgneal@626:                 self.fail('invalid cookie value')
bgneal@626:             else:
bgneal@626:                 self.assertEqual(user, self.user.username)
bgneal@626:                 self.assertEqual(email, self.user.email)
bgneal@626:                 self.assertEqual(len(key), 64)
bgneal@626: 
bgneal@626:         self.assertEqual(self.conn.zcard(settings.WIKI_REDIS_SET), 1)
bgneal@626: 
bgneal@626:         h = hashlib.sha256()
bgneal@626:         h.update(cookie_val)
bgneal@626:         member = h.hexdigest()
bgneal@626: 
bgneal@626:         score = self.conn.zscore(settings.WIKI_REDIS_SET, member)
bgneal@626:         now = datetime.datetime.utcnow()
bgneal@626:         session_start = datetime.datetime.fromtimestamp(score)
bgneal@626:         self.assertLess(now - session_start, datetime.timedelta(seconds=2))
bgneal@626: 
bgneal@627:         session_member = request.session.get(SESSION_SET_MEMBER)
bgneal@627:         self.assertTrue(session_member and session_member == member)
bgneal@626: 
bgneal@626:         # test the destroy session logic
bgneal@626: 
bgneal@629:         request = self.create_request()
bgneal@627:         request.wiki_delete_cookie = member
bgneal@626:         response = self.mw.process_response(request, response)
bgneal@626: 
bgneal@626:         cookie = response.cookies.get(settings.WIKI_COOKIE_NAME)
bgneal@626:         self.assertIsNotNone(cookie)
bgneal@626:         if cookie:
bgneal@626:             self.assertEqual(cookie.value, '')
bgneal@626:             self.assertEqual(cookie['domain'], settings.WIKI_COOKIE_DOMAIN)
bgneal@626:             self.assertEqual(cookie['path'], '/')
bgneal@626:             self.assertEqual(cookie['max-age'], 0)
bgneal@626:             self.assertEqual(cookie['expires'], 'Thu, 01-Jan-1970 00:00:00 GMT')
bgneal@626: 
bgneal@626:         self.assertEqual(self.conn.zcard(settings.WIKI_REDIS_SET), 0)