Skip to content
Snippets Groups Projects
Verified Commit fb08f263 authored by Erwan Rouchet's avatar Erwan Rouchet
Browse files

Add missing unit tests for UpdateWorkerVersion

parent d5126727
No related branches found
No related tags found
1 merge request!2467Add missing unit tests for UpdateWorkerVersion
from unittest.mock import call, patch
from django.urls import reverse
from rest_framework import status
from arkindex.process.models import FeatureUsage, Worker, WorkerVersionState
from arkindex.project.tests import FixtureAPITestCase
from arkindex.users.models import Role
class TestWorkerVersionPartialUpdate(FixtureAPITestCase):
@classmethod
def setUpTestData(cls):
super().setUpTestData()
cls.worker_reco = Worker.objects.get(slug="reco")
cls.worker_dla = Worker.objects.get(slug="dla")
cls.version_1 = cls.worker_reco.versions.get()
cls.version_2 = cls.worker_dla.versions.get()
def test_requires_login(self):
with self.assertNumQueries(0):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"configuration": {"test": "test2"},
"docker_image_iid": "registry.nerv.co.jp/cruel/angel/thesis:latest",
"state": "error",
"gpu_usage": "disabled",
"model_usage": FeatureUsage.Disabled.value,
},
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertEqual(response.json(), {"detail": "Authentication credentials were not provided."})
def test_invalid_id(self):
self.client.force_login(self.user)
with self.assertNumQueries(3):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": "12341234-1234-1234-1234-123412341234"}),
data={
"configuration": {"test": "test2"},
"docker_image_iid": "registry.nerv.co.jp/cruel/angel/thesis:latest",
"state": "error",
"gpu_usage": "disabled",
"model_usage": FeatureUsage.Disabled.value,
},
)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
def test_partial_update(self):
"""
Update worker version artifact, configuration, state and tag
Updating the branch should reset the branch on any other version on the same worker
"""
self.client.force_login(self.user)
self.version_1.state = WorkerVersionState.Created
self.version_1.save()
self.assertNotEqual(self.version_1.worker_id, self.version_2.worker_id)
self.version_2.branch = "operation-yashima"
self.version_2.save()
branch_version = self.version_1.worker.versions.create(branch="operation-yashima", version=2)
with self.assertNumQueries(6):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"configuration": {"test": "test2"},
"docker_image_iid": "eva:unit-01",
"state": "error",
"tag": "eva-01",
"branch": "operation-yashima",
},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data["id"], str(self.version_1.id))
self.version_1.refresh_from_db()
self.assertEqual(self.version_1.configuration, {"test": "test2"})
self.assertEqual(self.version_1.docker_image_iid, "eva:unit-01")
self.assertEqual(self.version_1.state, WorkerVersionState.Error)
self.assertEqual(self.version_1.gpu_usage, FeatureUsage.Disabled)
self.assertEqual(self.version_1.tag, "eva-01")
self.assertEqual(self.version_1.branch, "operation-yashima")
self.version_2.refresh_from_db()
self.assertEqual(self.version_2.branch, "operation-yashima")
branch_version.refresh_from_db()
self.assertIsNone(branch_version.branch)
@patch("arkindex.users.utils.filter_rights", return_value=Worker.objects.none())
def test_requires_worker_contributor(self, filter_rights_mock):
"""
Without contributor access to the worker, this endpoint does not reveal that the version exists
"""
self.client.force_login(self.user)
with self.assertNumQueries(3):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={"state": "error"},
)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(response.json(), {"detail": "No WorkerVersion matches the given query."})
self.assertEqual(filter_rights_mock.call_count, 1)
self.assertEqual(filter_rights_mock.call_args, call(self.user, Worker, Role.Contributor.value))
@patch("arkindex.users.utils.get_max_level", return_value=Role.Contributor.value)
def test_requires_worker_admin(self, get_max_level_mock):
"""
With contributor access and not admin, an explicit permission error is returned
"""
self.client.force_login(self.user)
with self.assertNumQueries(3):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={"state": "error"},
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertEqual(response.json(), {"detail": "You do not have admin access to this version's worker."})
self.assertEqual(get_max_level_mock.call_count, 1)
self.assertEqual(get_max_level_mock.call_args, call(self.user, self.worker_reco))
def test_unique_tag(self):
self.worker_reco.versions.create(
docker_image_iid="registry.fake.com/workers/worker:12345",
state=WorkerVersionState.Available,
version=12,
tag="eva-01"
)
self.client.force_login(self.user)
with self.assertNumQueries(4):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"tag": "eva-01",
"configuration": {},
},
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {"tag": ["A version already exists for this worker with this tag."]})
def test_empty_tag_branch(self):
self.client.force_login(self.user)
with self.assertNumQueries(3):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"tag": "",
"branch": "",
"configuration": {},
},
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {
"tag": ["This field may not be blank."],
"branch": ["This field may not be blank."],
})
def test_revision_ignored(self):
self.client.force_login(self.user)
self.version_1.revision_url = "url"
self.version_1.version = None
self.version_1.state = WorkerVersionState.Created
self.version_1.save()
with self.assertNumQueries(4):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"revision_url": "updated",
"configuration": {},
},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data["id"], str(self.version_1.id))
self.version_1.refresh_from_db()
# revision_url just gets ignored
self.assertEqual(self.version_1.revision_url, "url")
def test_revision_url_ignored(self):
self.client.force_login(self.user)
with self.assertNumQueries(4):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"revision_url": "https://gitlab.com/NERV/eva/commit/eva-01",
"configuration": {},
},
)
# revision_url just gets ignored
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data["id"], str(self.version_1.id))
self.version_1.refresh_from_db()
self.assertEqual(self.version_1.revision_url, None)
def test_available_requires_docker_image(self):
self.client.force_login(self.user)
self.version_1.state = WorkerVersionState.Created
self.version_1.docker_image_iid = None
self.version_1.save()
with self.assertNumQueries(3):
response = self.client.put(
reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}),
data={
"state": "available",
"configuration": {},
},
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), {
"state": [
"A worker version must have a `docker_image_iid` set when updated to available."
]
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment