"""
Tests the core api for sessions
"""
import datetime
import logging
from uuid import uuid4
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APITransactionTestCase
from notes.models import Session, Note
logger = logging.getLogger(__name__)
class SessionApiTests(APITransactionTestCase):
def setUp(self):
User = get_user_model()
user1 = User.objects.create_user(
username='test_user1',
email='test_user@emial.com',
password='top_secret'
)
user2 = User.objects.create_user(
username='test_user2',
email='test_user@emial.com',
password='top_secret'
)
user3 = User.objects.create_user(
username='test_user3',
email='test_user@emial.com',
password='top_secret'
)
self.session1 = Session.objects.create(
title="a new session 1",
description="Description 1",
protocol="[]",
owner=user1
)
self.session2 = Session.objects.create(
title="a new session 2",
description="Description 2",
protocol="[]",
owner=user2
)
self.session3 = Session.objects.create(
title="a new session 3",
description="Description 3",
protocol="[]",
owner=user3
)
self.session4 = Session.objects.create(
title="a new session 4",
description="Description 4",
protocol="[]",
owner=user3
)
Note.objects.create(
tc_start=timezone.now(),
tc_end=timezone.now(),
session=self.session1,
plain="example note 1",
html="<i>example note 1</i>",
raw="<i>example note 1</i>",
margin_note="margin note 1",
categorization="[]"
)
Note.objects.create(
tc_start=timezone.now(),
tc_end=timezone.now(),
session=self.session2,
plain="example note 2",
html="<i>example note</i>",
raw="<i>example note</i>",
margin_note="margin note",
categorization="[]"
)
def test_list_session_no_user(self):
url = reverse('notes:session-list')
response = self.client.post(url)
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_list_session(self):
url = reverse('notes:session-list')
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 1, "must have one session")
self.assertEqual(len(json['results']), 1, "must have one session")
for session in json['results']:
self.assertEqual(session['owner'], 'test_user1')
def test_list_session_filter(self):
url = reverse('notes:session-list')
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, {"ext_id__in": ",".join([str(self.session1.ext_id)])})
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 1, "must have one session")
self.assertEqual(len(json['results']), 1, "must have one session")
for session in json['results']:
self.assertEqual(session['owner'], 'test_user1')
def test_list_session_filter_bad(self):
url = reverse('notes:session-list')
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, {"ext_id__in": ",".join([str(uuid4())])})
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 0, "must have no session")
self.assertEqual(len(json['results']), 0, "must have no session")
def test_create_session_no_user(self):
url = reverse('notes:session-list')
response = self.client.post(url, {
'title': "a new session",
'description': "description of the session",
'protocol': "[]"
}, format='json')
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_create_session(self):
url = reverse('notes:session-list')
self.client.login(username='test_user1', password='top_secret')
response = self.client.post(url, {
'title': "a new session",
'description': "description of the session",
'protocol': "[]"
}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
json = response.json()
self.assertIn('ext_id', json)
def test_create_session_with_ext_id(self):
url = reverse('notes:session-list')
self.client.login(username='test_user1', password='top_secret')
ext_id = str(uuid4())
response = self.client.post(url, {
'ext_id': ext_id,
'title': "a new session",
'description': "description of the session",
'protocol': "[]"
}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
json = response.json()
self.assertIn('ext_id', json)
self.assertEqual(json['ext_id'], ext_id)
def test_detail_session(self):
url = reverse('notes:session-detail', kwargs={'ext_id':str(self.session1.ext_id)})
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_list_notes(self):
url = reverse('notes:notes-session-list', kwargs={'session_ext_id':str(self.session1.ext_id)})
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_detail_session_bad(self):
url = reverse('notes:session-detail', kwargs={'ext_id':str(self.session2.ext_id)})
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
def test_list_notes_bad(self):
url = reverse('notes:notes-session-list', kwargs={'session_ext_id':str(self.session2.ext_id)})
self.client.login(username='test_user1', password='top_secret')
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_filter_modified_since(self):
url = reverse('notes:session-list')
self.client.login(username='test_user3', password='top_secret')
nexthour = \
datetime.datetime.utcnow().replace(tzinfo=timezone.utc) +\
datetime.timedelta(hours=1)
Session.objects.filter(pk=self.session4.id).update(updated=nexthour)
response = self.client.get(
url,
{'modified_since': (nexthour - datetime.timedelta(minutes=30)).timestamp()},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 1, "must have one session")
self.assertEqual(len(json['results']), 1, "must have one session")
self.assertEqual(json['results'][0].get('title'), "a new session 4")
def test_filter_modified_since_zero(self):
url = reverse('notes:session-list')
self.client.login(username='test_user3', password='top_secret')
response = self.client.get(url, {'modified_since': 0}, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 2, "must have two sessions")
self.assertEqual(len(json['results']), 2, "must have two sessions")
for session_json in json['results']:
self.assertIn(session_json.get('title'), ['a new session 3', 'a new session 4'])
def test_filter_modified_seconds(self):
url = reverse('notes:session-list')
self.client.login(username='test_user3', password='top_secret')
prevmoment = \
datetime.datetime.utcnow().replace(tzinfo=timezone.utc) -\
datetime.timedelta(seconds=5)
response = self.client.get(url, {'modified_since': prevmoment.timestamp()}, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
json = response.json()
self.assertIn('results', json, "must have results")
self.assertIn('count', json, "must have count")
self.assertEqual(json['count'], 2, "must have two sessions")
self.assertEqual(len(json['results']), 2, "must have two sessions")
for session_json in json['results']:
self.assertIn(session_json.get('title'), ['a new session 3', 'a new session 4'])