3 # Copyright (C) 2013 FinalsClub Foundation
5 from django.contrib.sessions.backends.db import SessionStore
6 from django.core.exceptions import ObjectDoesNotExist
7 from django.http import HttpRequest
8 from django.test import TestCase
10 from django.contrib.auth.models import User
11 from karmaworld.apps.courses.views import flag_course
12 from karmaworld.apps.notes.models import Note
13 from karmaworld.apps.courses.models import Course
14 from karmaworld.apps.courses.models import School
15 from karmaworld.apps.notes.search import SearchIndex
16 from karmaworld.apps.notes.views import thank_note, flag_note, downloaded_note
17 from karmaworld.apps.users.models import NoteKarmaEvent, GenericKarmaEvent, CourseKarmaEvent, give_email_confirm_karma
20 class TestUsers(TestCase):
23 # create base values to test db representations
24 self.now = datetime.datetime.utcnow()
26 # create a school to satisfy course requirements
27 self.school = School()
28 self.school.name = 'Marshall College'
31 # create a course to test relationships
32 self.course = Course()
33 self.course.school = self.school
34 self.course.name = u'Archaeology 101'
36 # override Course.save() appending an ID to the slug
37 self.course.slug = u'archaeology-101'
40 self.user1 = User(username='Alice')
43 self.user2 = User(username='Bob')
46 # create a note to test against
48 self.note.course = self.course
49 self.note.name = u"Lecture notes concerning the use of therefore ∴"
50 self.note.text = "This is the plaintext version of a note. It's pretty cool."
51 self.note.user = self.user1
54 self.request1 = HttpRequest()
55 self.request1.user = self.user1
56 self.request1.method = 'POST'
57 self.request1.META = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
58 self.request1.session = SessionStore()
60 self.request2 = HttpRequest()
61 self.request2.user = self.user2
62 self.request2.method = 'POST'
63 self.request2.META = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
64 self.request2.session = SessionStore()
68 index = SearchIndex(testing=True)
69 index.setup(testing=True)
72 def tearDownClass(cls):
73 """Delete the test index that was automatically
74 created by notes/search.py"""
78 def test_thank_own_note_karma(self):
79 """Make sure you don't get karma for thanking your own note"""
80 thank_note(self.request1, self.note.pk)
82 NoteKarmaEvent.objects.get(note=self.note)
83 self.fail("You can't thank your own note")
84 except ObjectDoesNotExist:
87 def test_thank_anothers_note_karma(self):
88 """Get karma for having your note thanked"""
89 thank_note(self.request2, self.note.pk)
91 NoteKarmaEvent.objects.get(note=self.note)
92 except ObjectDoesNotExist:
93 self.fail("Karma event not created")
95 def test_note_deleted_karma(self):
96 """Lose karma if your note is deleted"""
97 thank_note(self.request2, self.note.pk)
100 GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.NOTE_DELETED)
101 except ObjectDoesNotExist:
102 self.fail("Karma event not created")
104 NoteKarmaEvent.objects.get(note=self.note)
105 self.fail("Karma event not deleted")
106 except ObjectDoesNotExist:
109 def test_note_give_flag_karma(self):
110 """Lose karma for flagging a note"""
111 flag_note(self.request2, self.note.pk)
113 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GIVE_FLAG, user=self.user2)
114 except ObjectDoesNotExist:
115 self.fail("Karma event not created")
117 def test_course_give_flag_karma(self):
118 """Lose karma for flagging a course"""
119 flag_course(self.request2, self.course.pk)
121 CourseKarmaEvent.objects.get(event_type=CourseKarmaEvent.GIVE_FLAG, user=self.user2)
122 except ObjectDoesNotExist:
123 self.fail("Karma event not created")
125 def test_note_get_flagged_karma(self):
126 """Lose karma for having your note flagged many times"""
127 flag_note(self.request2, self.note.pk)
128 flag_note(self.request2, self.note.pk)
129 flag_note(self.request2, self.note.pk)
130 flag_note(self.request2, self.note.pk)
131 flag_note(self.request2, self.note.pk)
132 flag_note(self.request2, self.note.pk)
134 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GET_FLAGGED, user=self.user1)
135 except ObjectDoesNotExist:
136 self.fail("Karma event not created")
138 def test_note_download_karma(self):
139 """You lose karma for downloading a note, person who uploaded it gains karma"""
140 downloaded_note(self.request2, self.note.pk)
142 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.DOWNLOADED_NOTE, user=self.user2)
143 except ObjectDoesNotExist:
144 self.fail("Karma event not created")
146 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.HAD_NOTE_DOWNLOADED, user=self.user1)
147 except ObjectDoesNotExist:
148 self.fail("Karma event not created")
150 def test_email_confirm_karma(self):
151 class FakeEmailAddress:
153 email = self.user1.email
155 give_email_confirm_karma(None, email_address=FakeEmailAddress())
157 GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.EMAIL_CONFIRMED, user=self.user1)
158 except ObjectDoesNotExist:
159 self.fail("Karma event not created")