Testing for karma events #306
[oweals/karmaworld.git] / karmaworld / apps / users / tests.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2013  FinalsClub Foundation
4 import datetime
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
9
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
18
19
20 class TestUsers(TestCase):
21
22     def setUp(self):
23         # create base values to test db representations
24         self.now = datetime.datetime.utcnow()
25
26         # create a school to satisfy course requirements
27         self.school = School()
28         self.school.name = 'Marshall College'
29         self.school.save()
30
31         # create a course to test relationships
32         self.course = Course()
33         self.course.school = self.school
34         self.course.name = u'Archaeology 101'
35         self.course.save()
36         # override Course.save() appending an ID to the slug
37         self.course.slug = u'archaeology-101'
38         self.course.save()
39
40         self.user1 = User(username='Alice')
41         self.user1.save()
42
43         self.user2 = User(username='Bob')
44         self.user2.save()
45
46         # create a note to test against
47         self.note = Note()
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
52         self.note.save()
53
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()
59
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()
65
66     @classmethod
67     def setUpClass(cls):
68         index = SearchIndex(testing=True)
69         index.setup(testing=True)
70
71     @classmethod
72     def tearDownClass(cls):
73         """Delete the test index that was automatically
74         created by notes/search.py"""
75         index = SearchIndex()
76         index.delete_index()
77
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)
81         try:
82             NoteKarmaEvent.objects.get(note=self.note)
83             self.fail("You can't thank your own note")
84         except ObjectDoesNotExist:
85             pass
86
87     def test_thank_anothers_note_karma(self):
88         """Get karma for having your note thanked"""
89         thank_note(self.request2, self.note.pk)
90         try:
91             NoteKarmaEvent.objects.get(note=self.note)
92         except ObjectDoesNotExist:
93             self.fail("Karma event not created")
94
95     def test_note_deleted_karma(self):
96         """Lose karma if your note is deleted"""
97         thank_note(self.request2, self.note.pk)
98         self.note.delete()
99         try:
100             GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.NOTE_DELETED)
101         except ObjectDoesNotExist:
102             self.fail("Karma event not created")
103         try:
104             NoteKarmaEvent.objects.get(note=self.note)
105             self.fail("Karma event not deleted")
106         except ObjectDoesNotExist:
107             pass
108
109     def test_note_give_flag_karma(self):
110         """Lose karma for flagging a note"""
111         flag_note(self.request2, self.note.pk)
112         try:
113             NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GIVE_FLAG, user=self.user2)
114         except ObjectDoesNotExist:
115             self.fail("Karma event not created")
116
117     def test_course_give_flag_karma(self):
118         """Lose karma for flagging a course"""
119         flag_course(self.request2, self.course.pk)
120         try:
121             CourseKarmaEvent.objects.get(event_type=CourseKarmaEvent.GIVE_FLAG, user=self.user2)
122         except ObjectDoesNotExist:
123             self.fail("Karma event not created")
124
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)
133         try:
134             NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.GET_FLAGGED, user=self.user1)
135         except ObjectDoesNotExist:
136             self.fail("Karma event not created")
137
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)
141         try:
142             NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.DOWNLOADED_NOTE, user=self.user2)
143         except ObjectDoesNotExist:
144             self.fail("Karma event not created")
145         try:
146             NoteKarmaEvent.objects.get(event_type=NoteKarmaEvent.HAD_NOTE_DOWNLOADED, user=self.user1)
147         except ObjectDoesNotExist:
148             self.fail("Karma event not created")
149
150     def test_email_confirm_karma(self):
151         class FakeEmailAddress:
152             user = self.user1
153             email = self.user1.email
154
155         give_email_confirm_karma(None, email_address=FakeEmailAddress())
156         try:
157             GenericKarmaEvent.objects.get(event_type=GenericKarmaEvent.EMAIL_CONFIRMED, user=self.user1)
158         except ObjectDoesNotExist:
159             self.fail("Karma event not created")