53 lines
2.7 KiB
Python
53 lines
2.7 KiB
Python
"""لایک/دیسلایک و گزارشِ درس/سوال: API و ستونهای ادمین."""
|
||
from django.core.cache import cache
|
||
from django.test import TestCase
|
||
|
||
from accounts.authentication import issue_access_token
|
||
from accounts.models import User
|
||
from content.models import Choice, ContentVote, Grade, Lesson, LessonReport, Node, Question, Unit
|
||
|
||
|
||
class FeedbackTests(TestCase):
|
||
def setUp(self):
|
||
cache.clear()
|
||
g = Grade.objects.create(title='پایه نهم', icon='', color='')
|
||
u = Unit.objects.create(grade=g, title='فصل ۱', order=1)
|
||
n = Node.objects.create(unit=u, title='مبحث', order=1)
|
||
self.lesson = Lesson.objects.create(node=n, title='درس')
|
||
self.q = Question.objects.create(lesson=self.lesson, type='multiple_choice', prompt='؟')
|
||
Choice.objects.create(question=self.q, value='الف', is_correct=True)
|
||
Choice.objects.create(question=self.q, value='ب', is_correct=False)
|
||
self.user = User.objects.create(phone='09120000051')
|
||
self.auth = {'HTTP_AUTHORIZATION': f'Bearer {issue_access_token(self.user.id)}'}
|
||
|
||
def _post(self, url, body):
|
||
return self.client.post(url, body, content_type='application/json', **self.auth)
|
||
|
||
def test_vote_toggle_and_retract(self):
|
||
url = f'/api/questions/{self.q.pk}/vote'
|
||
self.assertEqual(self._post(url, {'value': 1}).status_code, 200)
|
||
self.assertEqual(self._post(url, {'value': -1}).status_code, 200)
|
||
self.assertEqual(ContentVote.objects.get().value, -1)
|
||
self._post(url, {'value': 0})
|
||
self.assertEqual(ContentVote.objects.count(), 0)
|
||
|
||
def test_vote_rejects_bad_value_and_anonymous(self):
|
||
url = f'/api/lessons/{self.lesson.pk}/vote'
|
||
self.assertEqual(self._post(url, {'value': 5}).status_code, 400)
|
||
self.assertEqual(self.client.post(url, {'value': 1}, content_type='application/json').status_code, 401)
|
||
|
||
def test_lesson_report_is_deduplicated(self):
|
||
url = f'/api/lessons/{self.lesson.pk}/report'
|
||
r1 = self._post(url, {'reason': 'typo', 'note': 'غلط'})
|
||
r2 = self._post(url, {'reason': 'typo'})
|
||
self.assertEqual((r1.status_code, r2.status_code), (201, 200))
|
||
self.assertEqual(LessonReport.objects.count(), 1)
|
||
|
||
def test_admin_lists_show_votes(self):
|
||
ContentVote.objects.create(kind='question', target_id=self.q.pk, user_id=self.user.id, value=-1)
|
||
from django.contrib.auth.models import User as DjUser
|
||
DjUser.objects.create_superuser('root', 'r@x.ir', 'pw')
|
||
self.client.login(username='root', password='pw')
|
||
for path in ('/admin/content/question/', '/admin/content/lesson/', '/admin/content/lessonreport/'):
|
||
self.assertEqual(self.client.get(path).status_code, 200, path)
|