diff --git a/cvat/apps/engine/tests/test_rest_api.py b/cvat/apps/engine/tests/test_rest_api.py index d9786cb742e..6262ff99641 100644 --- a/cvat/apps/engine/tests/test_rest_api.py +++ b/cvat/apps/engine/tests/test_rest_api.py @@ -1349,6 +1349,7 @@ def test_api_v1_projects_delete_label(self): }] } self._check_api_v1_project(data) + class ProjectListOfTasksAPITestCase(APITestCase): def setUp(self): self.client = APIClient() @@ -1395,6 +1396,79 @@ def test_api_v1_projects_id_tasks_no_auth(self): response = self._run_api_v1_projects_id_tasks(None, project.id) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) +class ProjectExportAPITestCase(APITestCase): + def setUp(self): + self.client = APIClient() + + @classmethod + def setUpTestData(cls): + create_db_users(cls) + project_data = { + "name": "Project for check tasks in a xml", + "owner": cls.admin, + "labels": [{ + "name": "car" + }] + } + + db_project = create_db_project(project_data) + create_dummy_db_tasks(cls, db_project) + cls.project = db_project + + def _run_api_v1_project_id_export(self, pid, user, annotation_format=""): + with ForceLogin(user, self.client): + response = self.client.get( + '/api/v1/projects/{}/annotations?format={}'.format(pid, annotation_format), + format="json") + return response + + def _run_api_v1_tasks_id_delete(self, tid, user): + with ForceLogin(user, self.client): + response = self.client.delete('/api/v1/tasks/{}'.format(tid), format="json") + return response + + def _check_tasks_count(self, project, expected_result): + tasks_id = [task.id for task in project.tasks.all()] + self.assertEqual(len(tasks_id), expected_result) + + def _check_xml(self, pid, user, expected_result): + annotation_format = "CVAT for images 1.1" + response = self._run_api_v1_project_id_export(pid, user, annotation_format) + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + + response = self._run_api_v1_project_id_export(pid, user, annotation_format) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + annotation_format = "CVAT for images 1.1&action=download" + response = self._run_api_v1_project_id_export(pid, user, annotation_format) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + content = io.BytesIO(b"".join(response.streaming_content)) + content.seek(0) + + with tempfile.TemporaryDirectory() as tmp_dir: + zipfile.ZipFile(content).extractall(tmp_dir) + xml = osp.join(tmp_dir, 'annotations.xml') + self.assertTrue(xml) + root = ET.parse(xml).getroot() + tasks = root.findall('meta/project/tasks/task/name') + self.assertEqual(len(tasks), expected_result) + + def test_api_v1_projects_remove_task_export(self): + project = self.project + pid = project.id + user = self.admin + + self._check_tasks_count(project, 4) + self._check_xml(pid, user, 4) + + tasks_id = [task.id for task in project.tasks.all()] + response = self._run_api_v1_tasks_id_delete(tasks_id[0], self.admin) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + self._check_tasks_count(project, 3) + self._check_xml(pid, user, 3) + class TaskListAPITestCase(APITestCase): def setUp(self):