#!/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)