test_view.py

#
import json

from rest_framework.test import RequestsClient
from rest_framework import status
from django.test import TestCase, Client
from django.urls import reverse
from .models import *
from .serializers import *
#

initialize the APIClient app

client = Client()
#

This test case checks that we can correctly return the users

class GetUsersTest(TestCase):
#
#

This is the setup method for tests, it creates all the objects we need

    def setUp(self):
#
        Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok',
            password='blahblah', salt='salty')
        Users.objects.create(
            email='kbartok@ualberta.ca', username='kbartok',
            password='blahblah', salt='salty')
        Users.objects.create(
            email='abartok@ualberta.ca', username='abartok',
            password='blahblah', salt='salty')
#
    def test_get_all_users(self):
        response = client.get(reverse('get_post_users'))
        users = Users.objects.all()
        serializer = UsersSerializer(users, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#

This test case checks that a user is created properly

class CreateNewUserTest(TestCase):
#
#
    def setUp(self):

        self.valid_payload = {
            'email': 'bbartok@ualberta.ca',
            'username': 'bartok',
            'password': 'blahblah',
            'salt': 'salty'
        }
        self.invalid_payload_1 = {
            'email': '',
            'username': 'bartok',
            'password': 'blahblah',
            'salt': 'salty'
        }
        self.invalid_payload_2 = {
            'email': 'bbartok@ualberta.ca',
            'username': '',
            'password': 'blahblah',
            'salt': 'salty'
        }
#

Test to see if a valid user is created properly

    def test_create_valid_users(self):
#
        response = client.post(
            reverse('get_post_users'),
            data=json.dumps(self.valid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
#

Test to see if an invalid user is not created

    def test_create_invalid_users(self):
#
        response = client.post(
            reverse('get_post_users'),
            data=json.dumps(self.invalid_payload_1),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Test to see if an invalid user is not created

    def test_create_invalid_users_2(self):
#
        response = client.post(
            reverse('get_post_users'),
            data=json.dumps(self.invalid_payload_2),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

This test is to see if we can correctly get all the topics.

class GetAllTopicsTest(TestCase):
#
#
    def setUp(self):
        user1 = Users.objects.create(
            email='tbartok@ualberta.ca', username='tbartok',
            password='blahblah', salt='salty')
        user2 = Users.objects.create(
            email='abartok@ualberta.ca', username='abartok',
            password='blahblah', salt='salty')
        user3 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok',
            password='blahblah', salt='salty')
#

user1 = UsersSerializer(instance=user1) user2 = UsersSerializer(instance=user2) user3 = UsersSerializer(instance=user3)

        Topics.objects.create(
            name="Topic A", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        Topics.objects.create(
            name="Topic B", creator_id=user2, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        Topics.objects.create(
            name="Topic C", creator_id=user3, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
#
    def test_get_all_topics(self):
#

Get API Response

        response = client.get(reverse('get_post_topics'))
#

Get data from DB

        topics = Topics.objects.all()
        serializer = TopicsSerializer(topics, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#

Test Module for Inserting a new Topic

class CreateNewTopicTest(TestCase):
#
#
    def setUp(self):

        user1 = Users.objects.create(
            email='bbartok@ulaberta.ca', username='bartok',
            password='blahblah', salt='salty')
        '''self.user = Topics.objects.create(
            name = 'Topic A',
            creator_id = user1,
            tags = ["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"]
        )'''
        self.valid_payload = {
            'name': 'Topic A',
            'creator_id': 'bartok',
            'tags': ["sample_tag"],
            'learningoutcomes': ["LO 1", "LO 2"]
        }
        self.invalid_payload_1 = {
            'name': '',

            'creator_id': 'bartok',

            'tags': ["sample_tag"],
            'learningoutcomes': ["LO 1", "LO 2"]
        }
        self.invalid_payload_2 = {
            'name': 'Topic A',
            'creator_id': '',
            'tags': ["sample_tag"],
            'learningoutcomes': ["LO 1", "LO 2"]
        }
        self.invalid_payload_3 = {
            'name': 'Topic A',

            'creator_id': 'bartok',

            'tags': '',
            'learningoutcomes': ["LO 1", "LO 2"]
        }
        self.invalid_payload_4 = {
            'name': 'Topic A',

            'creator_id': 'bartok',

            'tags': ["sample_tag"],
            'learningoutcomes': ''
        }
#
    def test_create_valid_topic(self):
        response = client.post(
            reverse('get_post_topics'),
            data=json.dumps(self.valid_payload),
            content_type='application/json'
        )

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
#
    def test_create_invalid_topic_1(self):
        response = client.post(
            reverse('get_post_topics'),
            data=json.dumps(self.invalid_payload_1),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_topic_2(self):
        response = client.post(
            reverse('get_post_topics'),
            data=json.dumps(self.invalid_payload_2),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_topic_3(self):
        response = client.post(
            reverse('get_post_topics'),
            data=json.dumps(self.invalid_payload_3),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_topic_4(self):
        response = client.post(
            reverse('get_post_topics'),
            data=json.dumps(self.invalid_payload_4),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Test Module for Updating a Topic

class UpdateTopicTest(TestCase):
#
#
    def setUp(self):
        user1 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok',
            password='blahblah', salt='salty')
#

user1 = Users.objects.get(username=’bartok’).username user1 = UsersSerializer(instance=user1)

        '''self.user = Users.objects.create(
            email = 'bbartok@ualberta.ca'
            username = 'bartok',
            password = 'blahblah'
            salt = 'salty'
        )'''
        self.user = Topics.objects.create(
            name="Topic Test",
            creator_id=user1,
            learningoutcomes=['LO 1'],
            tags=["Test Tag"]
        )
        self.valid_payload = {
            "name": "Topic Test",
            "creator_id": 'bartok',
            "learningoutcomes": ["LO 1", "LO 2"],
            "tags": ["Test Tag", "Test Tag 2"]
        }
        self.invalid_payload = {
            "name": "Topic Test",
            "creator_id": '',
            "learningoutcomes": ["LO 1"],
            "tags": ["Test Tag"]
        }
#
    def test_update_valid_topic(self):
        response = client.put(
            reverse('get_delete_update_topics', kwargs={
                    'name': getattr(self.user, 'name')}),
            data=self.valid_payload,
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#
    def test_update_invalid_topic(self):
        response = client.put(
            reverse('get_delete_update_topics', kwargs={
                'name': getattr(self.user, 'name')}),
            data=json.dumps(self.invalid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Test Module for Deleting a Topic

class DeleteTopicTest(TestCase):
#
#
    def setUp(self):
        user1 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok',
            password='blahblah', salt='salty')
#

user1 = UsersSerializer(instance=user1)

        self.user = Topics.objects.create(
            name="Topic Test",
            creator_id=user1,
            learningoutcomes=["LO 1"],
            tags=["Test Tag"]
        )
#
    def test_delete_valid_topic(self):
        response = client.delete(
            reverse('get_delete_update_topics', kwargs={
                    'name': getattr(self.user, 'name')}),
        )
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
#
    def test_delete_invalid_topic(self):
        response = client.delete(
            reverse('get_delete_update_topics', kwargs={
                    'name': 'wrong name'}),
        )
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
#

Test Module for Getting the user’s questions

class GetQuestionTest(TestCase):
#
#
    def setUp(self):

        user1 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bbartok',
            password='blahblah', salt='salty')
        user2 = Users.objects.create(
            email='notme@ualberta.ca', username='notme',
            password='blahblah', salt='salty1')
        topicA = Topics.objects.create(
            name='Containerization', creator_id=user1,
            learningoutcomes=["LO 1"], tags=["some"])
        topicB = Topics.objects.create(
            name='UML', creator_id=user1,
            learningoutcomes=["LO 1"], tags=["other"])

        self.user_1 = Questions.objects.create(
            _id="someID1",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicA,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False

        )
        self.user_1 = Questions.objects.create(
            _id="someID2",
            prompt="This is a test question B.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicA,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False

        )
        self.not_user_1 = Questions.objects.create(
            _id="someID3",
            prompt="This is a test question C.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicB,
            username=user2,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False

        )
        self.not_user_2 = Questions.objects.create(
            _id="someID4",
            prompt="This is a test question D.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicB,
            username=user2,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False

        )
#
    def test_get_all_questions(self):
#

Get API Response

        response = client.get(reverse('get_post_question'))
#

Get data from DB

        topics = Questions.objects.all()
        serializer = QuestionSerializer(topics, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#
    def test_get_users_questions(self):
#

Get API Response

        response = client.get(
            reverse('get_post_question'),
            {'username': getattr(self.user_1, 'username'), 'self': 'true'})
#

Get data from DB

        topics = Questions.objects.filter(username="test user")
        serializer = QuestionSerializer(topics, many=True)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#
    def test_get_not_users_questions(self):
#

Get API Response

        response = client.get(reverse('get_post_question'), {
                              'username': getattr(self.user_1, 'username')})
#

Get data from DB

        topics = Questions.objects.exclude(username="test user")
        serializer = QuestionSerializer(topics, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#

Test Module for Creating a Question

class CreateNewQuestionTest(TestCase):
#
#
    def setUp(self):

        user1 = Users.objects.create(
            email='kbartok@ualberta.ca', username='kbartok',
            password='blahblah', salt='salty')
        topicA = Topics.objects.create(
            name='Containerization', creator_id=user1,
            learningoutcomes=["LO 1"], tags=["some"])
#

user1 = UsersSerializer(instance=user1) topicA = TopicsSerializer(instance=topicA)

        self.valid_payload = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False

        }
        self.invalid_payload_1 = {
            "_id": '',
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False

        }
        self.invalid_payload_2 = {
            "_id": "someID1",
            "prompt": '',
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False

        }
        self.invalid_payload_3 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": '',
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False

        }
        self.invalid_payload_4 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": '',
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False
        }
        self.invalid_payload_5 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": '',
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False
        }
        self.invalid_payload_6 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": '',

            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False
        }
        self.invalid_payload_7 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": "",
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False
                        

        }
        self.invalid_payload_8 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",

            "topic": 'Containerization',
            "username": '',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            "draft": False,
            "hidden": False
        }
        self.invalid_payload_9 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": '',
            'hidden': False,
            'draft': False
        }
        self.invalid_payload_10 = {
            "_id": "someID1",
            "prompt": "This is a test question A.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": '',
            "feedback": ["Feedback A", "Feedback B",
                         "Feedback C", "Feedback D"],
            'hidden': False,
            'draft': False
        }
#
    def test_create_valid_question(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.valid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
#
    def test_create_invalid_question_1(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_1),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_2(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_2),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_3(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_3),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_4(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_4),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_5(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_5),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_6(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_6),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_7(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_7),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_8(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_8),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_9(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_9),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#
    def test_create_invalid_question_10(self):
        response = client.post(
            reverse('get_post_question'),
            data=json.dumps(self.invalid_payload_10),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Test Module for Updating a Question

class UpdateQuestionTest(TestCase):
#
#
    def setUp(self):

        user1 = Users.objects.create(
            email='kbartok@ualberta.ca', username='kbartok',
            password='blahblah', salt='salty')
        topicA = Topics.objects.create(
            name='Containerization', creator_id=user1,
            learningoutcomes=["LO 1"], tags=["some"])
#

user1 = UsersSerializer(instance=user1) topicA = TopicsSerializer(instance=topicA)

        self.user = Questions.objects.create(
            _id="someID1",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicA,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B", "Feedback C", "Feedback D"],
            draft = False,
            hidden=False
        )
        self.valid_payload = {
            "_id": "someID1",
            "prompt": "This is a test question AAAA.",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            'hidden': False,
            'draft': False
        }
        self.invalid_payload = {
            "_id": '',
            "prompt": "",
            "shuffleoption": False,
            "choices": ["A", "B", "C", "D"],
            "choiceanswers": [True, False, False, False],
            "typename": "multipleChoice",
            "topic": 'Containerization',
            "username": 'kbartok',
            "learningoutcome": ["LO 1"],
            "feedback": ["Feedback A", "Feedback B", "Feedback C", "Feedback D"],
            'hidden': False,
            'draft': False
        }
#
    def test_update_valid_question(self):
        response = client.put(
            reverse('get_delete_update_questions', kwargs={
                    '_id': getattr(self.user, '_id')}),
            data=json.dumps(self.valid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#
    def test_update_invalid_question(self):
        response = client.put(
            reverse('get_delete_update_questions', kwargs={
                    '_id': getattr(self.user, '_id')}),
            data=json.dumps(self.invalid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Test Module for Deleting a Question

class DeleteQuestionTest(TestCase):
#
#
    def setUp(self):
        user1 = Users.objects.create(
            email='kbartok@ualberta.ca', username='kbartok',
            password='blahblah', salt='salty')
        topicA = Topics.objects.create(
            name='Containerization', creator_id=user1,
            learningoutcomes=["LO 1"], tags=["some"])
#

user1 = UsersSerializer(instance=user1) topicA = TopicsSerializer(instance=topicA)

        self.user = Questions.objects.create(
            _id="someID1",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topicA,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B", "Feedback C", "Feedback D"],
            hidden = False,
            draft= False
        )
#
    def test_delete_valid_question(self):

        response = client.delete(
            reverse('get_delete_update_questions', kwargs={
                    '_id': getattr(self.user, '_id')}),
        )
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
#
    def test_delete_valid_question2(self):

        response = client.delete(
            reverse('get_delete_update_questions', kwargs={'_id': 'wrong_id'}),
        )
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)


'''
#DIVIDER
class GetLearningOutcomeforTopicTest(TestCase):
#DIVIDER

#DIVIDER
    def setUp(self):

        user1 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok', 
            password='blahblah', salt='salty')
        topicA = Topics.objects.create(
            name="Topic A", creator_id=user1, tags=["LO 1", "LO 2"])

        TopicLearningOutcome.objects.create(
            topic=topicA, learningoutcome="LO 1"
        )
        TopicLearningOutcome.objects.create(
            topic=topicA, learningoutcome="LO 2"
        )
#DIVIDER
    def test_get_all_topics(self):
#DIVIDER
        response = client.get(reverse("get_post_learningoutcome"))
#DIVIDER
        topiclearningoutcome = TopicLearningOutcome.objects.all()
        serializer = TopicLearningOutcomeSerializer(
            topiclearningoutcome, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
#DIVIDER
class GenerateNewQuizTest(TestCase):
#DIVIDER

#DIVIDER
    def setUp(self):
        user1 = Users.objects.create(
            email='bbartok@ualberta.ca', username='bartok', 
            password='blahblah', salt='salty')
        topicA = Topics.objects.create(
            name = "Topic A", creator_id=user1, tags=["LO1", "LO 2"])
        Questions.objects.create(
            _id="1",

            prompt="This is a prompt 1.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="mcq",
            ismc=True,

            topic=topicA
        )
        Questions.objects.create(
            _id="2",

            prompt="This is a prompt 2.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="mcq",
            ismc=True,

            topic=topicA

        )
#DIVIDER
    def test_generate_quiz(self):
#DIVIDER
        response = client.get(reverse('get_questions'))
#DIVIDER
        questions = Questions.objects.all()
        serializer = QuestionSerializer(questions, many=True)
        self.assertEqual(response.data, serializer.data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
'''
#

Test Module for Getting Learning Outcome of a Topic

class StatisticsQuizTest(TestCase):
#
    def setUp(self):
        user1 = Users.objects.create(
            email='tbartok@ualberta.ca', username='tbartok',
            password='blahblah', salt='salty')

        topic1 = Topics.objects.create(
            name="Topic A", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        topic2 = Topics.objects.create(
            name="Topic B", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        topic3 = Topics.objects.create(
            name="Topic C", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])

        ReviewQuiz.objects.create(
            _id = 'abc',
            questions = ['abcd', 'lmno'],
            answers = ['yes', 'no'],
            correct = 2,
            total = 2,
            username = user1,
            topic = topic1,
            correctness = []
        )
        ReviewQuiz.objects.create(
            _id = 'abcd',
            questions = ['abcd', 'lmno'],
            answers = ['yes', 'no'],
            correct = 2,
            total = 2,
            username = user1,
            topic = topic1,
            correctness = []
        )
        ReviewQuiz.objects.create(
            _id = 'abcde',
            questions = ['abcd', 'lmno'],
            answers = ['yes', 'no'],
            correct = 2,
            total = 2,
            username = user1,
            topic = topic2,
            correctness = []
        )
        ReviewQuiz.objects.create(
            _id = 'abcdefg',
            questions = ['abcd', 'lmno'],
            answers = ['yes', 'no'],
            correct = 2,
            total = 2,
            username = user1,
            topic = topic3,
            correctness = []
        )
#
    def test_username_topic(self):
        response = client.get(reverse('get_quiz_stats'))
        for _, val in response.data.items():
            self.assertGreater(val['topic'], 0)
#
class QuestionsForTopic(TestCase):
#

Get API Response

    def setUp(self):
        user1 = Users.objects.create(
            email='tbartok@ualberta.ca', username='tbartok',
            password='blahblah', salt='salty')
        topic1 = Topics.objects.create(
            name="Topic A", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        topic2 = Topics.objects.create(
            name="Topic B", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        topic3 = Topics.objects.create(
            name="Topic C", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        Questions.objects.create(
            _id="someID1",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topic1,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False
        )
        Questions.objects.create(
            _id="someID2",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topic1,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False
        )
        Questions.objects.create(
            _id="someID3",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topic1,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False
        )
        Questions.objects.create(
            _id="someID4",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topic2,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden = False,
            draft= False
        )
#

Get data from DB

    def test_number_of_questions(self):
        response = client.get(reverse('get_question_stats'))
        data = response.data.keys()
        data2 = response.data
        value = {'Total': 3, 'LO 1':3}
        for key in data:
            self.assertEqual(data2[key], value )
            break
#
class RatingsTest(TestCase):
#

Test Module for Generating a Quiz

    def setUp(self):
        user1 = Users.objects.create(
            email='tbartok@ualberta.ca', username='tbartok',
            password='blahblah', salt='salty')
        user2 = Users.objects.create(
            email='tbartok1@ualberta.ca', username='tbartok2',
            password='blahblah', salt='salty')
        user3 = Users.objects.create(
            email='tbartok11111@ualberta.ca', username='tbartok3',
            password='blahblah', salt='salty')
        topic = Topics.objects.create(
            name="Topic A", creator_id=user1, tags=["sample_tag"],
            learningoutcomes=["LO 1", "LO 2"])
        qid = Questions.objects.create(
            _id="someID1",
            prompt="This is a test question A.",
            shuffleoption=False,
            choices=["A", "B", "C", "D"],
            choiceanswers=[True, False, False, False],
            typename="multipleChoice",

            topic=topic,
            username=user1,
            learningoutcome=["LO 1"],
            feedback=["Feedback A", "Feedback B",
                      "Feedback C", "Feedback D"],
            hidden=False,
            draft=False
        )

        QuestionRatings.objects.create(
            qid=qid,
            username=user1,
            rating=4
        )

        QuestionRatings.objects.create(
            qid=qid,
            username=user3,
            rating=3
        )
        self.valid_payload = {
            'qid': "someID1",
            'username': 'tbartok2',
            'rating': 3
        }
        self.invalid_payload = {
            'qid': 'someID100',
            'username': 'tbartok2',
            'rating': 3
        }
#
    def test_post_rating(self):
        response = client.post(
            reverse('get_ratings'),
            data=json.dumps(self.valid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
#
    def test_post_rating_invalid(self):
        response = client.post(
            reverse('get_ratings'),
            data=json.dumps(self.invalid_payload),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
#

Get API Response

    def test_rating_return(self):
        response = client.get(reverse('get_ratings'), {'username':'tbartok'})
        key = response.data.keys()
        for i in key:
            self.assertEqual(i, 'someID1')
#

Get data from DB

#

Test module to check if we are correctly getting the statistics from quizzes back

#
#
#

Test moduel to check if we are correctly getting the information on questions per topic back

#
#
#

Test module to check if we are correctly posting ratings and if the api is returning the correct info when ratings are made

#
#
#
#
#

self.assertEqual(val, 3.5)