src/notes/tests/api/auth.py
author ymh <ymh.work@gmail.com>
Wed, 19 Jul 2017 15:57:13 +0200
changeset 119 8ff8e2aee0f9
parent 117 9864fe2067cd
child 131 adad5563603c
permissions -rw-r--r--
add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes

"""
Tests the core api for sessions
"""
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 django.contrib.auth.models import Group

logger = logging.getLogger(__name__)


class GroupApiTests(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'
        )

        self.group1 = Group(name='group1')
        self.group1.save()
        self.group1.user_set.add(self.user1)
        self.group1.profile.owner = self.user1
        self.group1.profile.description = "This is the group 1"
        self.group1.profile.save()

        self.group2 = Group(name='group2')
        self.group2.save()
        self.group2.profile.owner = self.user2
        self.group2.profile.description = "This is the group 2"
        self.group2.profile.save()


    def test_list_group_no_login(self):
        url = reverse('auth_group-list')
        response = self.client.get(url)
        logger.debug("LIST group response %r", response.data)

        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)


    def test_list_group(self):
        url = reverse('auth_group-list')
        self.client.login(username='test_user1', password='top_secret')
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertEqual(2, len(response.data), "Must have 2 groups")
        for group_def in response.data:
            self.assertIn('name', group_def.keys())
            self.assertIn('owner', group_def.keys())
            self.assertIn('description', group_def.keys())
            self.assertIn(group_def.get('owner'), ['test_user1', 'test_user2'])
            self.assertIn(group_def.get('description'), ['This is the group 1', 'This is the group 2'])
            self.assertIn(group_def.get('name'), ['group1', 'group2'])

    def test_create_group(self):
        url = reverse('auth_group-list')
        self.client.login(username='test_user1', password='top_secret')
        response = self.client.post(
            url,
            {'name':"group3", 'description': "this is group 3", 'users': ['test_user2']})

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        self.assertEqual('group3', response.data.get('name'))
        self.assertSetEqual(set(['test_user1', 'test_user2']), set(response.data.get('users')))

        group3 = Group.objects.get(name='group3')
        self.assertEqual('this is group 3', group3.profile.description)
        self.assertSetEqual(
            set(['test_user1', 'test_user2']),
            set(map(lambda u: u.username, group3.user_set.all()))
        )

    def test_create_group_no_user(self):
        url = reverse('auth_group-list')
        self.client.login(username='test_user1', password='top_secret')
        response = self.client.post(
            url,
            {'name':"group3", 'description': "this is group 3"})

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        self.assertEqual('group3', response.data.get('name'))
        self.assertSetEqual(set(['test_user1']), set(response.data.get('users')))

        group3 = Group.objects.get(name='group3')
        self.assertEqual('this is group 3', group3.profile.description)
        self.assertSetEqual(
            set(['test_user1']),
            set(map(lambda u: u.username, group3.user_set.all()))
        )


    def test_detail_group(self):
        url = reverse('auth_group-detail', kwargs={'name': self.group1.name})
        self.client.login(username='test_user1', password='top_secret')
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual('group1', response.data.get('name'))
        self.assertEqual('This is the group 1', response.data.get('description'))
        self.assertSetEqual(set(['test_user1']), set(response.data.get('users')))

    def test_update_group(self):
        url = reverse('auth_group-detail', kwargs={'name': self.group1.name})
        self.client.login(username='test_user1', password='top_secret')
        response = self.client.put(
            url,
            {'name': 'group1', 'description': "this is group 1 changed", 'users': ['test_user2']})

        logger.debug("RESPONSE %r", response.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual('group1', response.data.get('name'))
        self.assertEqual('this is group 1 changed', response.data.get('description'))
        self.assertSetEqual(set(['test_user1', 'test_user2']), set(response.data.get('users')))

        group1 = Group.objects.get(name='group1')
        self.assertEqual('this is group 1 changed', group1.profile.description)
        self.assertSetEqual(
            set(['test_user1', 'test_user2']),
            set(map(lambda u: u.username, group1.user_set.all()))
        )