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.views import thank_note, flag_note, downloaded_note
16 from karmaworld.apps.users.models import NoteKarmaEvent, GenericKarmaEvent, CourseKarmaEvent, give_email_confirm_karma
19 class TestUsers(TestCase):
22 # create base values to test db representations
23 self.now = datetime.datetime.utcnow()
25 # create a school to satisfy course requirements
26 self.school = School()
27 self.school.name = 'Marshall College'
30 # create a course to test relationships
31 self.course = Course()
32 self.course.school = self.school
33 self.course.name = u'Archaeology 101'
35 # override Course.save() appending an ID to the slug
36 self.course.slug = u'archaeology-101'
39 self.user1 = User(username='Alice')
42 self.user2 = User(username='Bob')
45 # create a note to test against
47 self.note.course = self.course
48 self.note.name = u"Lecture notes concerning the use of therefore ∴"
49 self.note.text = "This is the plaintext version of a note. It's pretty cool."
50 self.note.user = self.user1
53 self.request1 = HttpRequest()
54 self.request1.user = self.user1
55 self.request1.method = 'POST'
56 self.request1.META = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
57 self.request1.session = SessionStore()
59 self.request2 = HttpRequest()
60 self.request2.user = self.user2
61 self.request2.method = 'POST'
62 self.request2.META = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
63 self.request2.session = SessionStore()
65 def test_thank_own_note_karma(self):
66 """Make sure you don't get karma for thanking your own note"""
67 thank_note(self.request1, self.note.pk)
69 NoteKarmaEvent.objects.get(note=self.note)
70 self.fail("You can't thank your own note")
71 except ObjectDoesNotExist:
74 def test_thank_anothers_note_karma(self):
75 """Get karma for having your note thanked"""
76 thank_note(self.request2, self.note.pk)
78 NoteKarmaEvent.objects.get(note=self.note)
79 except ObjectDoesNotExist:
80 self.fail("Karma event not created")
82 def test_note_deleted_karma(self):
83 """Lose karma if your note is deleted"""
84 thank_note(self.request2, self.note.pk)
87 GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.NOTE_DELETED)
88 except ObjectDoesNotExist:
89 self.fail("Karma event not created")
91 NoteKarmaEvent.objects.get(note=self.note)
92 self.fail("Karma event not deleted")
93 except ObjectDoesNotExist:
96 def test_note_give_flag_karma(self):
97 """Lose karma for flagging a note"""
98 flag_note(self.request2, self.note.pk)
100 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GIVE_FLAG, user=self.user2)
101 except ObjectDoesNotExist:
102 self.fail("Karma event not created")
104 def test_course_give_flag_karma(self):
105 """Lose karma for flagging a course"""
106 flag_course(self.request2, self.course.pk)
108 CourseKarmaEvent.objects.get(event_type=CourseKarmaEvent.GIVE_FLAG, user=self.user2)
109 except ObjectDoesNotExist:
110 self.fail("Karma event not created")
112 def test_note_get_flagged_karma(self):
113 """Lose karma for having your note flagged many times"""
114 flag_note(self.request2, self.note.pk)
115 flag_note(self.request2, self.note.pk)
116 flag_note(self.request2, self.note.pk)
117 flag_note(self.request2, self.note.pk)
118 flag_note(self.request2, self.note.pk)
119 flag_note(self.request2, self.note.pk)
121 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GET_FLAGGED, user=self.user1)
122 except ObjectDoesNotExist:
123 self.fail("Karma event not created")
125 def test_note_download_karma(self):
126 """You lose karma for downloading a note, person who uploaded it gains karma"""
127 downloaded_note(self.request2, self.note.pk)
129 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.DOWNLOADED_NOTE, user=self.user2)
130 except ObjectDoesNotExist:
131 self.fail("Karma event not created")
133 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.HAD_NOTE_DOWNLOADED, user=self.user1)
134 except ObjectDoesNotExist:
135 self.fail("Karma event not created")
137 def test_download_own_note_karma(self):
138 """No karma change for downloading your own note"""
139 downloaded_note(self.request1, self.note.pk)
141 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.DOWNLOADED_NOTE, user=self.user1)
142 self.fail("Karma debited for downloading own note, but shouldn't have been.")
143 except ObjectDoesNotExist:
146 NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.HAD_NOTE_DOWNLOADED, user=self.user1)
147 self.fail("Karma given for downloading own note, but shouldn't have been.")
148 except ObjectDoesNotExist:
151 def test_email_confirm_karma(self):
152 class FakeEmailAddress:
154 email = self.user1.email
156 give_email_confirm_karma(None, email_address=FakeEmailAddress())
158 GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.EMAIL_CONFIRMED, user=self.user1)
159 except ObjectDoesNotExist:
160 self.fail("Karma event not created")