Source code for beat.web.plotters.tests

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :

###############################################################################
#                                                                             #
# Copyright (c) 2016 Idiap Research Institute, http://www.idiap.ch/           #
# Contact: beat.support@idiap.ch                                              #
#                                                                             #
# This file is part of the beat.web module of the BEAT platform.              #
#                                                                             #
# Commercial License Usage                                                    #
# Licensees holding valid commercial BEAT licenses may use this file in       #
# accordance with the terms contained in a written agreement between you      #
# and Idiap. For further information contact tto@idiap.ch                     #
#                                                                             #
# Alternatively, this file may be used under the terms of the GNU Affero      #
# Public License version 3 as published by the Free Software and appearing    #
# in the file LICENSE.AGPL included in the packaging of this file.            #
# The BEAT platform is distributed in the hope that it will be useful, but    #
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY  #
# or FITNESS FOR A PARTICULAR PURPOSE.                                        #
#                                                                             #
# You should have received a copy of the GNU Affero Public License along      #
# with the BEAT platform. If not, see http://www.gnu.org/licenses/.           #
#                                                                             #
###############################################################################


import os
import shutil
import simplejson as json

from django.contrib.auth.models import User
from django.conf import settings
from django.core.urlresolvers import reverse

from ..dataformats.models import DataFormat

from ..common.testutils import tearDownModule  # noqa test runner will call it

from .models import Plotter

from rest_framework import status
from rest_framework.test import APITestCase


# ----------------------------------------------------------


[docs]class PlotterParameterTestCase(APITestCase):
[docs] def setUp(self): self.tearDown() # Create the users self.password = "1234" self.johndoe = User.objects.create_user( "johndoe", "johndoe@test.org", self.password ) self.jackdoe = User.objects.create_user( "jackdoe", "jackdoe@test.org", self.password ) self.plot = User.objects.create_user("plot", "plotdoe@test.org", self.password) # Create a dataformat (dataformat, errors) = DataFormat.objects.create_dataformat( author=self.plot, name="text", short_description="description", declaration={"text": "string"}, ) self.assertIsNotNone(dataformat, errors) # Create a plotter self.client.login(username=self.plot.username, password=self.password) self.url_plotter = reverse( "api_plotters:list_create", kwargs={"author_name": self.plot.username} ) self.data_plotter = { "author": self.plot.username, "name": "plotter_test", "short_description": "some description plotter", "description": "some longer description plotter", "declaration": { "language": "python", "parameters": {}, "dataformat": "plot/text/1", }, "code": "#test", } response = self.client.post(self.url_plotter, self.data_plotter, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.plotter = Plotter.objects.get(name="plotter_test") self.url = reverse( "api_plotters:view", kwargs={"author_name": self.johndoe.username} ) self.data = { "name": "plotterparameter1", "short_description": "some description", "description": "some longer description", "plotter": self.plotter.id, } self.data2 = { "name": "plotterparameter2", "short_description": "some description2", "description": "some longer description2", "plotter": self.plotter.id, }
[docs] def tearDown(self): for path in [ settings.TOOLCHAINS_ROOT, settings.EXPERIMENTS_ROOT, settings.DATAFORMATS_ROOT, settings.ALGORITHMS_ROOT, settings.CACHE_ROOT, ]: if os.path.exists(path): shutil.rmtree(path)
# ----------------------------------------------------------
[docs]class PlotterParameterCreationTestCase(PlotterParameterTestCase):
[docs] def test_anonymous_user(self): response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual( response.content, b'{"detail":"You do not have permission to perform this action."}', )
[docs] def test_logged_in_user(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"])
[docs] def test_logged_in_user_existing_plotterparameter_name(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual( json.loads(response.content)["non_field_errors"][0], "This plotterparameter name already exists on this account", )
# ----------------------------------------------------------
[docs]class PlotterParameterListTestCase(PlotterParameterTestCase):
[docs] def test_anonymous_user(self): response = self.client.get(self.url, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK)
[docs] def test_logged_in_user_no_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.get(self.url, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(json.loads(response.content)), 0)
[docs] def test_logged_in_user_single_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.get(self.url, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(json.loads(response.content)), 1)
[docs] def test_logged_in_user_multiple_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.post(self.url, self.data2, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data2["name"]) response = self.client.get(self.url, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(json.loads(response.content)), 2)
# ----------------------------------------------------------
[docs]class PlotterParameterRetrievalTestCase(PlotterParameterTestCase):
[docs] def setUp(self): super(PlotterParameterRetrievalTestCase, self).setUp() self.url_single_plotterparameter = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter1", "version": 1, }, ) self.url_single_plotterparameter2 = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter2", "version": 1, }, )
[docs] def test_anonymous_user(self): response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_logged_in_user_no_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_logged_in_user_single_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", )
[docs] def test_logged_in_user_multiple_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.post(self.url, self.data2, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data2["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", ) response = self.client.get(self.url_single_plotterparameter2, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data2["name"] + "/1", )
# ----------------------------------------------------------
[docs]class PlotterParameterUpdateTestCase(PlotterParameterTestCase):
[docs] def setUp(self): super(PlotterParameterUpdateTestCase, self).setUp() self.url_single_plotterparameter = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter1", "version": 1, }, ) self.url_single_plotterparameter2 = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter2", "version": 1, }, )
[docs] def test_anonymous_user(self): response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_logged_in_user_no_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_logged_in_user_single_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", )
[docs] def test_logged_in_user_multiple_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.post(self.url, self.data2, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data2["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", ) response = self.client.get(self.url_single_plotterparameter2, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data2["name"] + "/1", )
# ----------------------------------------------------------
[docs]class PlotterParameterDeletionTestCase(PlotterParameterTestCase):
[docs] def setUp(self): super(PlotterParameterDeletionTestCase, self).setUp() self.url_single_plotterparameter = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter1", "version": 1, }, ) self.url_single_plotterparameter2 = reverse( "api_plotters:view", kwargs={ "author_name": self.johndoe.username, "object_name": "plotterparameter2", "version": 1, }, )
[docs] def test_anonymous_user(self): response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) response = self.client.delete(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
[docs] def test_logged_in_user_no_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) response = self.client.delete(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_logged_in_user_single_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", ) response = self.client.delete(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
[docs] def test_logged_in_user_multiple_plotterparameter(self): self.client.login(username=self.johndoe.username, password=self.password) response = self.client.post(self.url, self.data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data["name"]) response = self.client.post(self.url, self.data2, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(json.loads(response.content)["name"], self.data2["name"]) response = self.client.get(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data["name"] + "/1", ) response = self.client.get(self.url_single_plotterparameter2, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( json.loads(response.content)["name"], self.johndoe.username + "/" + self.data2["name"] + "/1", ) response = self.client.delete(self.url_single_plotterparameter, format="json") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) response = self.client.delete(self.url_single_plotterparameter2, format="json") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)