From a9185c806a45ce090e196e8ab48f0ba0581847c0 Mon Sep 17 00:00:00 2001
From: Flavio Tarsetti <flavio.tarsetti@idiap.ch>
Date: Mon, 18 May 2020 13:11:13 +0200
Subject: [PATCH] [accounts][tests] Adding tests for TemporaryUrl

---
 beat/web/accounts/models.py |   1 +
 beat/web/accounts/tests.py  | 969 +++++++++++++++++++++++++-----------
 2 files changed, 690 insertions(+), 280 deletions(-)

diff --git a/beat/web/accounts/models.py b/beat/web/accounts/models.py
index 9eb4dbda9..9c6523002 100644
--- a/beat/web/accounts/models.py
+++ b/beat/web/accounts/models.py
@@ -168,6 +168,7 @@ def generate_url_hash():
     )
     return url_hash
 
+
 class TemporaryUrlManager(models.Manager):
     def create_temporary_url(self, status, supervision_track):
         # Actions that result creating the object
diff --git a/beat/web/accounts/tests.py b/beat/web/accounts/tests.py
index 3d5d92300..ad2d4577b 100644
--- a/beat/web/accounts/tests.py
+++ b/beat/web/accounts/tests.py
@@ -35,38 +35,54 @@ from rest_framework.test import APITestCase
 from django.contrib.auth.models import User
 from django.conf import settings
 
-from .models import SupervisionTrack, Profile
+from .models import SupervisionTrack
+from .models import Profile
+from .models import TemporaryUrl
 
 from datetime import datetime, timedelta
 import datetime
 import simplejson as json
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountTestCase(APITestCase):
-
     def setUp(self):
         self.tearDown()
 
-
         now = datetime.datetime.now()
-        expiration_date_delta = datetime.timedelta(days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS)
+        expiration_date_delta = datetime.timedelta(
+            days=settings.ACCOUNT_BLOCKAGE_AFTER_FIRST_REJECTION_DAYS
+        )
 
         # Create the users
-        self.password = '1234'
+        self.password = "1234"
 
-        self.firstsupervisor = User.objects.create_user('firstsupervisor', 'firstsupervisor@test.org', self.password)
-        self.secondsupervisor = User.objects.create_user('secondsupervisor', 'secondsupervisor@test.org', self.password)
-        self.invalidsupervisor = User.objects.create_user('invalidsupervisor', 'invalidsupervisor@test.org', self.password)
+        self.firstsupervisor = User.objects.create_user(
+            "firstsupervisor", "firstsupervisor@test.org", self.password
+        )
+        self.secondsupervisor = User.objects.create_user(
+            "secondsupervisor", "secondsupervisor@test.org", self.password
+        )
+        self.invalidsupervisor = User.objects.create_user(
+            "invalidsupervisor", "invalidsupervisor@test.org", self.password
+        )
 
-        self.accepteduser = User.objects.create_user('accepteduser', 'accepteduser@test.org', self.password)
-        self.rejecteduser = User.objects.create_user('rejecteduser', 'rejecteduser@test.org', self.password)
-        self.yearrevalidationuser = User.objects.create_user('yearrevalidationuser', 'yearrevalidationuser@test.org', self.password)
-        self.blockeduser = User.objects.create_user('blockeduser', 'blockeduser@test.org', self.password)
+        self.accepteduser = User.objects.create_user(
+            "accepteduser", "accepteduser@test.org", self.password
+        )
+        self.rejecteduser = User.objects.create_user(
+            "rejecteduser", "rejecteduser@test.org", self.password
+        )
+        self.yearrevalidationuser = User.objects.create_user(
+            "yearrevalidationuser", "yearrevalidationuser@test.org", self.password
+        )
+        self.blockeduser = User.objects.create_user(
+            "blockeduser", "blockeduser@test.org", self.password
+        )
 
         # Update the profiles
-        #supervisors
+        # supervisors
         self.firstsupervisor.profile.status = Profile.ACCEPTED
         self.secondsupervisor.profile.status = Profile.ACCEPTED
         self.invalidsupervisor.profile.status = Profile.BLOCKED
@@ -82,134 +98,138 @@ class AccountTestCase(APITestCase):
         self.secondsupervisor.profile.save()
         self.invalidsupervisor.profile.save()
 
-        #users
+        # users
         self.accepteduser.profile.status = Profile.ACCEPTED
         self.rejecteduser.profile.status = Profile.REJECTED
         self.yearrevalidationuser.profile.status = Profile.YEARREVALIDATION
         self.blockeduser.profile.status = Profile.BLOCKED
 
         # Create the supervision tracks
-        #Accepted user
-        #Create and assign key
-        self.accepteduser.profile.supervision_key = self.accepteduser.profile._generate_current_supervision_key()
+        # Accepted user
+        # Create and assign key
+        self.accepteduser.profile.supervision_key = (
+            self.accepteduser.profile._generate_current_supervision_key()
+        )
         supervisiontrack = SupervisionTrack.objects.create(
-            supervisee = self.accepteduser,
-            supervisor = self.firstsupervisor,
-            is_valid = True,
-            start_date = now,
-            expiration_date = now + expiration_date_delta,
-            last_validation_date = now
+            supervisee=self.accepteduser,
+            supervisor=self.firstsupervisor,
+            is_valid=True,
+            start_date=now,
+            expiration_date=now + expiration_date_delta,
+            last_validation_date=now,
         )
 
-        #Assign key to supervision track
+        # Assign key to supervision track
         supervisiontrack.supervision_key = self.accepteduser.profile.supervision_key
         supervisiontrack.save()
         self.accepteduser.profile.supervision.add(supervisiontrack)
         self.accepteduser.profile.save()
         self.accepteduser.save()
 
-        #Rejected user
-        #No supervision key but a rejection date
+        # Rejected user
+        # No supervision key but a rejection date
         self.rejecteduser.profile.supervision_key = None
         self.rejecteduser.profile.rejection_date = now + expiration_date_delta
         self.rejecteduser.profile.save()
         self.rejecteduser.save()
 
-        #YearRevalidation user
-        #Create and assign key
-        self.yearrevalidationuser.profile.supervision_key = self.yearrevalidationuser.profile._generate_current_supervision_key()
+        # YearRevalidation user
+        # Create and assign key
+        self.yearrevalidationuser.profile.supervision_key = (
+            self.yearrevalidationuser.profile._generate_current_supervision_key()
+        )
         supervisiontrack = SupervisionTrack.objects.create(
-            supervisee = self.yearrevalidationuser,
-            supervisor = self.firstsupervisor,
-            is_valid = True,
-            start_date = now,
-            expiration_date = now + expiration_date_delta,
-            last_validation_date = now
+            supervisee=self.yearrevalidationuser,
+            supervisor=self.firstsupervisor,
+            is_valid=True,
+            start_date=now,
+            expiration_date=now + expiration_date_delta,
+            last_validation_date=now,
         )
 
-        #Assign key to supervision track
-        supervisiontrack.supervision_key = self.yearrevalidationuser.profile.supervision_key
+        # Assign key to supervision track
+        supervisiontrack.supervision_key = (
+            self.yearrevalidationuser.profile.supervision_key
+        )
         supervisiontrack.save()
         self.yearrevalidationuser.profile.supervision.add(supervisiontrack)
         self.yearrevalidationuser.profile.save()
         self.yearrevalidationuser.save()
 
-        #Blocked user
+        # Blocked user
         self.blockeduser.profile.supervision_key = None
         self.blockeduser.profile.rejection_date = None
         self.blockeduser.is_active = False
         self.blockeduser.profile.save()
         self.blockeduser.save()
 
-
     def tearDown(self):
         user = None
         pass
 
     def test_check_access_and_setup(self):
 
-        #Supervisors
+        # Supervisors
         user = self.firstsupervisor
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(user.username, 'firstsupervisor')
+        self.assertEqual(user.username, "firstsupervisor")
         logged_out = self.client.logout()
 
         user = self.secondsupervisor
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(user.username, 'secondsupervisor')
+        self.assertEqual(user.username, "secondsupervisor")
         logged_out = self.client.logout()
 
         user = self.invalidsupervisor
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(user.username, 'invalidsupervisor')
+        self.assertEqual(user.username, "invalidsupervisor")
         logged_out = self.client.logout()
 
-        #Users
+        # Users
         user = self.accepteduser
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(user.username, 'accepteduser')
+        self.assertEqual(user.username, "accepteduser")
         logged_out = self.client.logout()
 
         user = self.rejecteduser
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(user.username, 'rejecteduser')
+        self.assertEqual(user.username, "rejecteduser")
         logged_out = self.client.logout()
 
         user = self.yearrevalidationuser
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(user.username, 'yearrevalidationuser')
+        self.assertEqual(user.username, "yearrevalidationuser")
         logged_out = self.client.logout()
 
         user = self.blockeduser
         logged_in = self.client.login(username=user.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(user.username, 'blockeduser')
+        self.assertEqual(user.username, "blockeduser")
         logged_out = self.client.logout()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountListTestCase(AccountTestCase):
-
     def setUp(self):
         super(AccountListTestCase, self).setUp()
 
-        self.url = reverse('api_accounts:list_supervisee')
+        self.url = reverse("api_accounts:list_supervisee")
 
     def test_anonymous_user(self):
-        response = self.client.get(self.url, format='json')
+        response = self.client.get(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
     def test_logged_in_user_not_supervisor(self):
 
@@ -217,14 +237,14 @@ class AccountListTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
-        response = self.client.get(self.url, format='json')
+        response = self.client.get(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -234,49 +254,51 @@ class AccountListTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.get(self.url, format='json')
+        response = self.client.get(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 2)
-        self.assertEqual(content[0]['supervisee']['username'], 'accepteduser')
-        self.assertEqual(content[1]['supervisee']['username'], 'yearrevalidationuser')
+        self.assertEqual(content[0]["supervisee"]["username"], "accepteduser")
+        self.assertEqual(content[1]["supervisee"]["username"], "yearrevalidationuser")
 
         logged_out = self.client.logout()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountRevalidationTestCase(AccountTestCase):
-
     def setUp(self):
         super(AccountRevalidationTestCase, self).setUp()
 
-        self.url = reverse('api_accounts:revalidate_account')
+        self.url = reverse("api_accounts:revalidate_account")
 
     def test_anonymous_user(self):
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
     def test_logged_in_accepted_user(self):
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, "You don't need to revalidate at the moment, your supervision is still valid")
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You don't need to revalidate at the moment, your supervision is still valid",
+        )
 
         logged_out = self.client.logout()
 
@@ -285,14 +307,17 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, 'You are not allowed to perform this action, you first need to get a valid supervision')
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You are not allowed to perform this action, you first need to get a valid supervision",
+        )
 
         logged_out = self.client.logout()
 
@@ -302,9 +327,9 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         logged_out = self.client.logout()
@@ -315,17 +340,20 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, "You don't need to revalidate at the moment, your supervision is still valid")
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You don't need to revalidate at the moment, your supervision is still valid",
+        )
 
         logged_out = self.client.logout()
 
@@ -335,14 +363,14 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'blockeduser')
+        self.assertEqual(client.username, "blockeduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
@@ -352,14 +380,17 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, 'You are not allowed to perform this action, you first need to get a valid supervision')
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You are not allowed to perform this action, you first need to get a valid supervision",
+        )
 
         logged_out = self.client.logout()
 
@@ -369,63 +400,74 @@ class AccountRevalidationTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'invalidsupervisor')
+        self.assertEqual(client.username, "invalidsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountAddSupervisorTestCase(AccountTestCase):
-
     def setUp(self):
         super(AccountAddSupervisorTestCase, self).setUp()
 
-        self.url = reverse('api_accounts:add_supervisor', kwargs={'supervisor_name': self.secondsupervisor.username})
+        self.url = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.secondsupervisor.username},
+        )
 
     def test_anonymous_user(self):
-        response = self.client.post(self.url, format='json')
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
     def test_logged_in_accepted_user_supervision_request_to_invalid_supervisor(self):
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        self.url = reverse('api_accounts:add_supervisor', kwargs={'supervisor_name': self.invalidsupervisor.username})
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        self.url = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.invalidsupervisor.username},
+        )
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, 'Not a valid supervisor request')
+        errormsg = content["error"]
+        self.assertEqual(errormsg, "Not a valid supervisor request")
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        # check track change and supervisor
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track, new_supervision_track)
         self.assertEqual(previous_supervision_track.is_valid, True)
         self.assertEqual(previous_supervision_key, new_supervision_key)
@@ -438,26 +480,34 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        # check track change and supervisor
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.REJECTED)
         logged_out = self.client.logout()
 
@@ -467,20 +517,22 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
         previous_supervision_key = client.profile.supervision_key
         self.assertEqual(previous_supervision_key, None)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
         self.assertEqual(new_supervision_track.supervisor.username, "secondsupervisor")
         self.assertEqual(client.profile.status, Profile.REJECTED)
@@ -492,36 +544,43 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
         previous_supervision_key = client.profile.supervision_key
         self.assertEqual(previous_supervision_key, None)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
         self.assertEqual(new_supervision_track.supervisor.username, "secondsupervisor")
         self.assertEqual(client.profile.status, Profile.REJECTED)
-        #change supervisor second request
-        response = self.client.post(self.url, format='json')
+        # change supervisor second request
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, "You are not able to perform this action as you already have a pending request")
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You are not able to perform this action as you already have a pending request",
+        )
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
         self.assertEqual(new_supervision_track.supervisor.username, "secondsupervisor")
         self.assertEqual(client.profile.status, Profile.REJECTED)
@@ -533,26 +592,34 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        # check track change and supervisor
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.REJECTED)
 
         logged_out = self.client.logout()
@@ -563,16 +630,16 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'blockeduser')
+        self.assertEqual(client.username, "blockeduser")
 
-        response = self.client.post(self.url, format='json')
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
-        #This reactivation can be done through online request ONLY
+        # This reactivation can be done through online request ONLY
 
         logged_out = self.client.logout()
 
@@ -582,14 +649,14 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.post(self.url, format='json')
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisee account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisee account")
 
         logged_out = self.client.logout()
 
@@ -599,55 +666,59 @@ class AccountAddSupervisorTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'invalidsupervisor')
+        self.assertEqual(client.username, "invalidsupervisor")
 
-        response = self.client.post(self.url, format='json')
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountValidateSuperviseeTestCase(AccountTestCase):
-
     def setUp(self):
         super(AccountValidateSuperviseeTestCase, self).setUp()
 
-        self.url = reverse('api_accounts:validate_supervisee', kwargs={'supervisee_name': self.accepteduser.username})
+        self.url = reverse(
+            "api_accounts:validate_supervisee",
+            kwargs={"supervisee_name": self.accepteduser.username},
+        )
 
     def test_anonymous_user(self):
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
     def test_logged_in_accepted_user(self):
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -656,15 +727,15 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -674,15 +745,15 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -692,14 +763,14 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'blockeduser')
+        self.assertEqual(client.username, "blockeduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
@@ -709,57 +780,74 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, "You can't validate this supervisee as his supervision is still valid")
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You can't validate this supervisee as his supervision is still valid",
+        )
 
         logged_out = self.client.logout()
 
     def test_logged_in_user_secondsupervisor_validates_previously_accepted_user(self):
 
-        self.url = reverse('api_accounts:add_supervisor', kwargs={'supervisor_name': self.secondsupervisor.username})
+        self.url = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.secondsupervisor.username},
+        )
 
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        # check track change and supervisor
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertEqual(new_supervision_track.is_valid, False)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.REJECTED)
         logged_out = self.client.logout()
 
-        self.url = reverse('api_accounts:validate_supervisee', kwargs={'supervisee_name': self.accepteduser.username})
+        self.url = reverse(
+            "api_accounts:validate_supervisee",
+            kwargs={"supervisee_name": self.accepteduser.username},
+        )
         client = self.secondsupervisor
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'secondsupervisor')
+        self.assertEqual(client.username, "secondsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
 
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
@@ -767,51 +855,62 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         client = User.objects.get(username=self.accepteduser.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertEqual(new_supervision_track.is_valid, True)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.ACCEPTED)
 
-
     def test_logged_in_user_secondsupervisor_validates_rejected_user(self):
 
-        self.url = reverse('api_accounts:add_supervisor', kwargs={'supervisor_name': self.secondsupervisor.username})
+        self.url = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.secondsupervisor.username},
+        )
 
         client = self.rejecteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
         previous_supervision_key = client.profile.supervision_key
         self.assertEqual(previous_supervision_key, None)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
         self.assertEqual(new_supervision_track.supervisor.username, "secondsupervisor")
         self.assertEqual(client.profile.status, Profile.REJECTED)
         logged_out = self.client.logout()
 
-        self.url = reverse('api_accounts:validate_supervisee', kwargs={'supervisee_name': self.rejecteduser.username})
+        self.url = reverse(
+            "api_accounts:validate_supervisee",
+            kwargs={"supervisee_name": self.rejecteduser.username},
+        )
         client = self.secondsupervisor
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'secondsupervisor')
+        self.assertEqual(client.username, "secondsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
 
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
@@ -819,53 +918,69 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         client = User.objects.get(username=self.rejecteduser.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertEqual(new_supervision_track.is_valid, True)
         self.assertNotEqual(new_supervision_track.supervisor, "secondsupervisor")
         self.assertEqual(client.profile.status, Profile.ACCEPTED)
 
     def test_logged_in_user_secondsupervisor_validates_yearrevalidation_user(self):
 
-        self.url = reverse('api_accounts:add_supervisor', kwargs={'supervisor_name': self.secondsupervisor.username})
+        self.url = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.secondsupervisor.username},
+        )
 
         client = self.yearrevalidationuser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        #change supervisor
-        response = self.client.post(self.url, format='json')
+        # change supervisor
+        response = self.client.post(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         client = User.objects.get(username=client.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        # check track change and supervisor
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.REJECTED)
 
         logged_out = self.client.logout()
 
-        self.url = reverse('api_accounts:validate_supervisee', kwargs={'supervisee_name': self.yearrevalidationuser.username})
+        self.url = reverse(
+            "api_accounts:validate_supervisee",
+            kwargs={"supervisee_name": self.yearrevalidationuser.username},
+        )
         client = self.secondsupervisor
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'secondsupervisor')
+        self.assertEqual(client.username, "secondsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
 
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
@@ -873,13 +988,17 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         client = User.objects.get(username=self.yearrevalidationuser.username)
         new_supervision_key = client.profile.supervision_key
-        new_supervision_track = SupervisionTrack.objects.get(supervision_key = new_supervision_key)
+        new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=new_supervision_key
+        )
 
-        #check track change and supervisor
+        # check track change and supervisor
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertEqual(new_supervision_track.is_valid, True)
         self.assertNotEqual(previous_supervision_key, new_supervision_key)
-        self.assertNotEqual(previous_supervision_track.supervisor, new_supervision_track.supervisor)
+        self.assertNotEqual(
+            previous_supervision_track.supervisor, new_supervision_track.supervisor
+        )
         self.assertEqual(client.profile.status, Profile.ACCEPTED)
 
     def test_logged_in_user_supervisor_validation_try(self):
@@ -888,14 +1007,17 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['error']
-        self.assertEqual(errormsg, "You can't validate this supervisee as his supervision is still valid")
+        errormsg = content["error"]
+        self.assertEqual(
+            errormsg,
+            "You can't validate this supervisee as his supervision is still valid",
+        )
 
         logged_out = self.client.logout()
 
@@ -905,55 +1027,59 @@ class AccountValidateSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'invalidsupervisor')
+        self.assertEqual(client.username, "invalidsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class AccountRemoveSuperviseeTestCase(AccountTestCase):
-
     def setUp(self):
         super(AccountRemoveSuperviseeTestCase, self).setUp()
 
-        self.url = reverse('api_accounts:remove_supervisee', kwargs={'supervisee_name': self.accepteduser.username})
+        self.url = reverse(
+            "api_accounts:remove_supervisee",
+            kwargs={"supervisee_name": self.accepteduser.username},
+        )
 
     def test_anonymous_user(self):
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
     def test_logged_in_accepted_user(self):
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -962,15 +1088,15 @@ class AccountRemoveSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'rejecteduser')
+        self.assertEqual(client.username, "rejecteduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -980,15 +1106,15 @@ class AccountRemoveSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Not a supervisor account')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Not a supervisor account")
 
         logged_out = self.client.logout()
 
@@ -998,97 +1124,108 @@ class AccountRemoveSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'blockeduser')
+        self.assertEqual(client.username, "blockeduser")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
 
     def test_logged_in_supervisor_remove_accepted_user(self):
-        #accepted user before
+        # accepted user before
         client = self.accepteduser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
         self.assertEqual(client.profile.status, Profile.ACCEPTED)
         logged_out = self.client.logout()
 
-        #accepted user removed
+        # accepted user removed
         client = self.firstsupervisor
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         logged_out = self.client.logout()
 
-        #accepted user after
+        # accepted user after
         client = User.objects.get(username=self.accepteduser.username)
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'accepteduser')
+        self.assertEqual(client.username, "accepteduser")
 
         new_supervision_key = client.profile.supervision_key
         self.assertEqual(new_supervision_key, None)
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertEqual(client.profile.status, Profile.REJECTED)
         logged_out = self.client.logout()
 
     def test_logged_in_supervisor_remove_yearrevalidation_user(self):
-        self.url = reverse('api_accounts:remove_supervisee', kwargs={'supervisee_name': self.yearrevalidationuser.username})
+        self.url = reverse(
+            "api_accounts:remove_supervisee",
+            kwargs={"supervisee_name": self.yearrevalidationuser.username},
+        )
 
-        #yearrevalidationuser user before
+        # yearrevalidationuser user before
         client = self.yearrevalidationuser
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
         previous_supervision_key = client.profile.supervision_key
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
 
         self.assertEqual(previous_supervision_track.is_valid, True)
         self.assertEqual(client.profile.status, Profile.YEARREVALIDATION)
         logged_out = self.client.logout()
 
-        #yearrevalidationuser user removed
+        # yearrevalidationuser user removed
         client = self.firstsupervisor
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'firstsupervisor')
+        self.assertEqual(client.username, "firstsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
         logged_out = self.client.logout()
 
-        #yearrevalidationuser user after
+        # yearrevalidationuser user after
         client = User.objects.get(username=self.yearrevalidationuser.username)
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertTrue(logged_in)
-        self.assertEqual(client.username, 'yearrevalidationuser')
+        self.assertEqual(client.username, "yearrevalidationuser")
 
         new_supervision_key = client.profile.supervision_key
         self.assertEqual(new_supervision_key, None)
-        previous_supervision_track = SupervisionTrack.objects.get(supervision_key = previous_supervision_key)
+        previous_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=previous_supervision_key
+        )
         self.assertEqual(previous_supervision_track.is_valid, False)
         self.assertEqual(client.profile.status, Profile.REJECTED)
         logged_out = self.client.logout()
@@ -1099,13 +1236,285 @@ class AccountRemoveSuperviseeTestCase(AccountTestCase):
 
         logged_in = self.client.login(username=client.username, password=self.password)
         self.assertFalse(logged_in)
-        self.assertEqual(client.username, 'invalidsupervisor')
+        self.assertEqual(client.username, "invalidsupervisor")
 
-        response = self.client.put(self.url, format='json')
+        response = self.client.put(self.url, format="json")
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
         content = json.loads(response.content)
         self.assertEqual(len(json.loads(response.content)), 1)
-        errormsg = content['detail']
-        self.assertEqual(errormsg, 'Authentication credentials were not provided.')
+        errormsg = content["detail"]
+        self.assertEqual(errormsg, "Authentication credentials were not provided.")
 
         logged_out = self.client.logout()
+
+
+# ----------------------------------------------------------
+
+
+class TemporaryUrlTestCase(AccountTestCase):
+    def setUp(self):
+        super(TemporaryUrlTestCase, self).setUp()
+
+        # expired time
+        now = datetime.datetime.now()
+        expiration_date_delta = datetime.timedelta(
+            days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR
+        )
+        self.expired_time = now - expiration_date_delta
+
+        # Generation of a new supervision track
+        # rejected user makes new supervision request
+        self.url_add_supervisor = reverse(
+            "api_accounts:add_supervisor",
+            kwargs={"supervisor_name": self.secondsupervisor.username},
+        )
+        client = self.rejecteduser
+
+        logged_in = self.client.login(username=client.username, password=self.password)
+        self.assertTrue(logged_in)
+        self.assertEqual(client.username, "rejecteduser")
+
+        previous_supervision_key = client.profile.supervision_key
+        self.assertEqual(previous_supervision_key, None)
+
+        # change supervisor
+        response = self.client.post(self.url_add_supervisor, format="json")
+        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+
+        client = User.objects.get(username=client.username)
+
+        # Supervision tracks
+        self.new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=client.profile.supervision_key
+        )
+        logged_out = self.client.logout()
+        self.valid_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=self.accepteduser.profile.supervision_key
+        )
+        self.revalidate_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=self.yearrevalidationuser.profile.supervision_key
+        )
+
+        # Temporary urls use cases
+        self.temp_url_validation = TemporaryUrl.objects.create_temporary_url(
+            TemporaryUrl.VALIDATION, self.new_supervision_track
+        )
+        self.temp_url_yearrevalidation = TemporaryUrl.objects.create_temporary_url(
+            TemporaryUrl.YEARREVALIDATION, self.revalidate_supervision_track
+        )
+        self.temp_url_rejection = TemporaryUrl.objects.create_temporary_url(
+            TemporaryUrl.REJECTION, self.new_supervision_track
+        )
+
+        # Endpoint use cases (validation/yearly revalidation/rejection)
+        self.url_false = reverse(
+            "accounts:temp_url_validation", kwargs={"hash_url": "some_inexistant_hash"}
+        )
+        self.url_validation = reverse(
+            "accounts:temp_url_validation",
+            kwargs={"hash_url": self.temp_url_validation.url_hash},
+        )
+        self.url_yearrevalidation = reverse(
+            "accounts:temp_url_validation",
+            kwargs={"hash_url": self.temp_url_yearrevalidation.url_hash},
+        )
+        self.url_rejection = reverse(
+            "accounts:temp_url_rejection",
+            kwargs={"hash_url": self.temp_url_rejection.url_hash},
+        )
+
+    def test_false_url(self):
+        response = self.client.get(self.url_false, format="json")
+        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+    def test_validation_new_supervision_track(self):
+        # Temporary url exists and supervision track is not valid yet
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_validation.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_validation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.new_supervision_track.is_valid, False)
+
+        # Post request temporary url vanishes and supervision track is valid
+        response = self.client.get(self.url_validation, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        self.assertEqual(self.new_supervision_track.is_valid, True)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_validation.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+    def test_expired_validation_new_supervision_track(self):
+        # Expired Temporary url exists and supervision track is not valid yet
+
+        self.temp_url_validation.expires = self.expired_time
+        self.temp_url_validation.save()
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_validation.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_validation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.new_supervision_track.is_valid, False)
+
+        # Post request temporary url vanishes and supervision track remains invalid
+        response = self.client.get(self.url_validation, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        self.assertEqual(self.new_supervision_track.is_valid, False)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_validation.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+    def test_rejection_new_supervision_track(self):
+        # Temporary url exists and supervision track is not valid yet
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_rejection.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_validation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.new_supervision_track.is_valid, False)
+
+        # Post request temporary url vanishes and supervision track remains invalid
+        response = self.client.get(self.url_rejection, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.new_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        self.assertEqual(self.new_supervision_track.is_valid, False)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_rejection.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+    def test_validation_yearly(self):
+        # Temporary url exists and supervision track is still valid
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+        previous_expiration_date = self.revalidate_supervision_track.expiration_date
+
+        # Post request temporary url vanishes and supervision track remains valid
+        response = self.client.get(self.url_yearrevalidation, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.revalidate_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        new_expiration_date = self.revalidate_supervision_track.expiration_date
+
+        # Verify change in expiry date (1 year postpone)
+        self.assertEqual(
+            new_expiration_date, previous_expiration_date + timedelta(days=365)
+        )
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+    def test_expired_validation_yearly(self):
+        # Temporary url exists and supervision track is still valid
+        self.temp_url_yearrevalidation.expires = self.expired_time
+        self.temp_url_yearrevalidation.save()
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+
+        # Post request temporary url vanishes and supervision track gets invalid
+        response = self.client.get(self.url_yearrevalidation, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.revalidate_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+
+        self.assertEqual(self.revalidate_supervision_track.is_valid, False)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+    def test_rejection_after_yearly_revalidation(self):
+        # Temporary url exists and supervision track is still valid
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+        previous_expiration_date = self.revalidate_supervision_track.expiration_date
+
+        # Post request temporary url vanishes and supervision track remains valid
+        response = self.client.get(self.url_yearrevalidation, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.revalidate_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        new_expiration_date = self.revalidate_supervision_track.expiration_date
+
+        # Verify change in expiry date (1 year postpone)
+        self.assertEqual(
+            new_expiration_date, previous_expiration_date + timedelta(days=365)
+        )
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+        count = TemporaryUrl.objects.filter(
+            url_hash=self.temp_url_yearrevalidation.url_hash
+        ).count()
+        self.assertEqual(count, 0)
+
+        # Supervisor rejects this supervisee after yearly revalidation
+        # Temporary url rejection exists and supervision track is still valid
+        temp_url_supervisor = TemporaryUrl.objects.filter(
+            status=TemporaryUrl.REJECTION
+        ).exclude(url_hash=self.temp_url_rejection.url_hash)
+        count = temp_url_supervisor.count()
+        supervision_key_ = TemporaryUrl.objects.get(
+            url_hash=temp_url_supervisor[0].url_hash
+        ).supervision_track.supervision_key
+        self.assertEqual(count, 1)
+        self.assertEqual(self.revalidate_supervision_track.is_valid, True)
+        url_yearrevalidation_revoke = reverse(
+            "accounts:temp_url_rejection",
+            kwargs={"hash_url": temp_url_supervisor[0].url_hash},
+        )
+        # Post request temporary url vanishes and supervision track gets invalid
+        response = self.client.get(url_yearrevalidation_revoke, format="json")
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.revalidate_supervision_track = SupervisionTrack.objects.get(
+            supervision_key=supervision_key_
+        )
+        self.assertEqual(self.revalidate_supervision_track.is_valid, False)
+        rejection_date = self.revalidate_supervision_track.expiration_date
+
+        # Verify rejection date is now
+        self.assertEqual(rejection_date.date(), datetime.date.today())
+
+        count = (
+            TemporaryUrl.objects.filter(status=TemporaryUrl.REJECTION)
+            .exclude(url_hash=self.temp_url_rejection.url_hash)
+            .count()
+        )
+        self.assertEqual(count, 0)
-- 
GitLab