add personal group, default_group to users and add group info to session on backend
"""
Tests the core api for sessions
"""
import datetime
import logging
from uuid import uuid4
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
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, GroupProfile
logger = logging.getLogger(__name__)
class SessionApiTests(APITransactionTestCase):
def setUp(self):
User = get_user_model()
self.user1 = User.objects.create_user(
username='test_user1',
email='test_user@emial.com',
password='top_secret'
)
self.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.group1 = Group(name='group1')
self.group1.save()
self.group1.user_set.add(self.user1)
self.group1.user_set.add(self.user2)
self.group1.profile.owner = self.user1
self.group1.profile.description = "This is the group 1"
self.group1.profile.save()
self.user2.profile.default_group = self.group1
self.user2.profile.save()
self.session1 = Session.objects.create(
title="a new session 1",
description="Description 1",
protocol="[]",
group=self.user1.profile.default_group,
owner=self.user1
)
self.session2 = Session.objects.create(
title="a new session 2",
description="Description 2",
protocol="[]",
group=self.user2.profile.default_group,
owner=self.user2
)
self.session3 = Session.objects.create(
title="a new session 3",
description="Description 3",
protocol="[]",
group=user3.profile.default_group,
owner=user3
)
self.session4 = Session.objects.create(
title="a new session 4",
description="Description 4",
protocol="[]",
group=user3.profile.default_group,
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': "[]",
'group': 'group1'
}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
json = response.json()
self.assertIn('ext_id', json)
session = Session.objects.get(ext_id=json['ext_id'])
self.assertIsNotNone(session)
self.assertEqual(self.group1, session.group)
def test_create_session_no_group(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, "Error when creating session %r" % response.json())
json = response.json()
self.assertIn('ext_id', json)
session = Session.objects.get(ext_id=json['ext_id'])
self.assertIsNotNone(session)
user1_personal_group = Group.objects.get(profile__owner_personal=self.user1)
self.assertEqual(user1_personal_group, session.group)
def test_create_session_no_group_default(self):
url = reverse('notes:session-list')
self.client.login(username='test_user2', 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, "Error when creating session %r" % response.json())
json = response.json()
self.assertIn('ext_id', json)
session = Session.objects.get(ext_id=json['ext_id'])
self.assertIsNotNone(session)
self.assertEqual(self.group1, session.group)
def test_create_session_no_group_default(self):
url = reverse('notes:session-list')
self.client.login(username='test_user2', 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, "Error when creating session %r" % response.json())
json = response.json()
self.assertIn('ext_id', json)
session = Session.objects.get(ext_id=json['ext_id'])
self.assertIsNotNone(session)
self.assertEqual(self.group1, session.group)
def test_create_session_bad_group(self):
url = reverse('notes:session-list')
self.client.login(username='test_user3', password='top_secret')
response = self.client.post(url, {
'title': "a new session",
'description': "description of the session",
'protocol': "[]",
'group': "group1"
}, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
json = response.json()
self.assertIn('non_field_errors', json)
self.assertIn('Owner must be in group', json['non_field_errors'])
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",
'group': 'group1',
'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'])