Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

REST API tests with skeletons #4987

Merged
merged 49 commits into from
Sep 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
39c03be
Added changes to CvatExtractor
yasakova-anastasia Aug 24, 2022
4355f43
Added Skeleton annotation type
yasakova-anastasia Aug 26, 2022
8496436
Some fixes
yasakova-anastasia Aug 30, 2022
5f39c10
Resolve conflicts
yasakova-anastasia Sep 13, 2022
12208be
Fix an issue with backups
yasakova-anastasia Sep 13, 2022
2c0eeae
Fixes
yasakova-anastasia Sep 13, 2022
c57d6bc
Update Datumaro version
yasakova-anastasia Sep 13, 2022
912c312
Resolve conflicts
yasakova-anastasia Sep 13, 2022
ca4def9
Fix an issue with backups
yasakova-anastasia Sep 15, 2022
bcd7b00
Fix tests
yasakova-anastasia Sep 19, 2022
2a565ed
Fix Pylint
yasakova-anastasia Sep 19, 2022
1fc4d42
Small fix
yasakova-anastasia Sep 19, 2022
cc72a50
Fix test
yasakova-anastasia Sep 19, 2022
8cf1267
Merge branch 'develop' into ay/fix-dataset-import
yasakova-anastasia Sep 19, 2022
07e1e5f
Small fix
yasakova-anastasia Sep 19, 2022
3a36bbe
Add a test to create a task
yasakova-anastasia Sep 20, 2022
f99c605
Merge branch 'develop' into ay/tests-with-skeletons
yasakova-anastasia Sep 21, 2022
c705550
Merge remote-tracking branch 'remotes/origin/ay/fix-dataset-import' i…
yasakova-anastasia Sep 21, 2022
b1c41a5
Add tests
yasakova-anastasia Sep 21, 2022
46e1b5b
Merge branch 'develop' into ay/fix-dataset-import
yasakova-anastasia Sep 21, 2022
3beb2f2
Update Datumaro version
yasakova-anastasia Sep 21, 2022
aa2dccc
Merge branch 'develop' into ay/datumaro-update
yasakova-anastasia Sep 21, 2022
5f99f37
Update Changelog
yasakova-anastasia Sep 22, 2022
a5f5f80
Fixes
yasakova-anastasia Sep 22, 2022
3907ec9
Merge branch 'ay/fix-dataset-import' into ay/tests-with-skeletons
yasakova-anastasia Sep 22, 2022
fbfadf2
Fix assets
yasakova-anastasia Sep 23, 2022
c153d93
Small fix
yasakova-anastasia Sep 23, 2022
a31b1a4
Update tests
yasakova-anastasia Sep 23, 2022
dd937ff
Fixes
yasakova-anastasia Sep 23, 2022
fed0296
Merge branch 'ay/fix-dataset-import' into ay/tests-with-skeletons
yasakova-anastasia Sep 23, 2022
dd849f3
Fix tests
yasakova-anastasia Sep 23, 2022
9f83cd7
Add tests
yasakova-anastasia Sep 23, 2022
7fa94e7
Small fix
yasakova-anastasia Sep 23, 2022
8b669e9
Merge branch 'ay/fix-dataset-import' into ay/tests-with-skeletons
yasakova-anastasia Sep 23, 2022
a88aeaf
Add test for COCO Keypoints
yasakova-anastasia Sep 25, 2022
39ed8df
Fix Pylint
yasakova-anastasia Sep 25, 2022
96724e1
Merge branch 'develop' into ay/tests-with-skeletons
yasakova-anastasia Sep 25, 2022
4139a1a
Fix sdk tests
yasakova-anastasia Sep 25, 2022
395b5f5
Small fix
yasakova-anastasia Sep 26, 2022
f20c915
Update documentation
yasakova-anastasia Sep 26, 2022
1bc417c
Resolve conflicts
yasakova-anastasia Sep 26, 2022
b33527f
Update Changelog
yasakova-anastasia Sep 26, 2022
a178140
Some fixes
yasakova-anastasia Sep 26, 2022
2052141
Merge branch 'ay/fix-dataset-import' into ay/tests-with-skeletons
yasakova-anastasia Sep 26, 2022
caa3ea4
Small fix
yasakova-anastasia Sep 27, 2022
d7db4fc
Fix test
yasakova-anastasia Sep 27, 2022
8400912
Add test to remove skeleton label
yasakova-anastasia Sep 27, 2022
7b3beed
Resolve conflicts
yasakova-anastasia Sep 28, 2022
900af1a
Remove useless changes
yasakova-anastasia Sep 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- SDK section in docs (<https://github.com/opencv/cvat/pull/4928>)
- An env variable to enable or disable host certificate checking in CLI (<https://github.com/opencv/cvat/pull/4928>)
- REST API tests with skeletons (<https://github.com/opencv/cvat/pull/4987>)

### Changed
- `api/docs`, `api/swagger`, `api/schema` endpoints now allow unauthorized access (<https://github.com/opencv/cvat/pull/4928>)
Expand All @@ -25,7 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
non-ascii paths while adding files from "Connected file share" (issue #4428)
- Removed unnecessary volumes defined in docker-compose.serverless.yml
(<https://github.com/openvinotoolkit/cvat/pull/4659>)
- Project import with skeletons (<https://github.com/opencv/cvat/pull/4867>,
- Project import/export with skeletons (<https://github.com/opencv/cvat/pull/4867>,
<https://github.com/opencv/cvat/pull/5004>)

### Security
Expand Down
4 changes: 2 additions & 2 deletions tests/python/rest_api/test_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ def test_member_update_job_annotations(self, org, role, job_staff, expect_succes
users = find_users(role=role, org=org)
jobs = jobs_by_org[org]
filtered_jobs = filter_jobs_with_shapes(jobs)
username, jid = find_job_staff_user(filtered_jobs, users, job_staff)
username, jid = find_job_staff_user(filtered_jobs, users, job_staff, [18])

data = request_data(jid)
self._check_respone(username, jid, expect_success, data, org=org)
Expand All @@ -255,7 +255,7 @@ def test_non_member_update_job_annotations(self, org, privilege, expect_success,
users = find_users(privilege=privilege, exclude_org=org)
jobs = jobs_by_org[org]
filtered_jobs = filter_jobs_with_shapes(jobs)
username, jid = find_job_staff_user(filtered_jobs, users, False)
username, jid = find_job_staff_user(filtered_jobs, users, False, [18])

data = request_data(jid)
self._check_respone(username, jid, expect_success, data, org=org)
Expand Down
77 changes: 76 additions & 1 deletion tests/python/rest_api/test_projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,16 +349,91 @@ def test_can_import_dataset_in_org(self, admin_user):

self._test_import_project(admin_user, project_id, 'CVAT 1.1', import_data)

def test_can_export_and_import_dataset_with_skeletons_coco_keypoints(self, admin_user):
project_id = 5

response = self._test_export_project(admin_user, project_id, 'COCO Keypoints 1.0')

tmp_file = io.BytesIO(response.data)
tmp_file.name = 'dataset.zip'
import_data = {
'dataset_file': tmp_file,
}

self._test_import_project(admin_user, project_id, 'COCO Keypoints 1.0', import_data)

def test_can_export_and_import_dataset_with_skeletons_cvat_for_images(self, admin_user):
project_id = 5

response = self._test_export_project(admin_user, project_id, 'CVAT for images 1.1')

tmp_file = io.BytesIO(response.data)
tmp_file.name = 'dataset.zip'
import_data = {
'dataset_file': tmp_file,
}

self._test_import_project(admin_user, project_id, 'CVAT 1.1', import_data)

def test_can_export_and_import_dataset_with_skeletons_cvat_for_video(self, admin_user):
project_id = 5

response = self._test_export_project(admin_user, project_id, 'CVAT for video 1.1')

tmp_file = io.BytesIO(response.data)
tmp_file.name = 'dataset.zip'
import_data = {
'dataset_file': tmp_file,
}

self._test_import_project(admin_user, project_id, 'CVAT 1.1', import_data)

def _test_can_get_project_backup(self, username, pid, **kwargs):
for _ in range(30):
response = get_method(username, f"projects/{pid}/backup", **kwargs)
response.raise_for_status()
if response.status_code == HTTPStatus.CREATED:
break
sleep(1)
response = get_method(username, f"projects/{pid}/backup", action="download", **kwargs)
assert response.status_code == HTTPStatus.OK
return response

def test_admin_can_get_project_backup_and_create_project_by_backup(self, admin_user):
project_id = 5
response = self._test_can_get_project_backup(admin_user, project_id)

tmp_file = io.BytesIO(response.content)
tmp_file.name = 'dataset.zip'

import_data = {
'project_file': tmp_file,
}

with make_api_client(admin_user) as api_client:
(_, response) = api_client.projects_api.create_backup(
backup_write_request=deepcopy(import_data),
_content_type="multipart/form-data")
assert response.status == HTTPStatus.ACCEPTED

@pytest.mark.usefixtures('changedb')
class TestPatchProjectLabel:
def test_admin_can_delete_label(self, projects):
project = deepcopy(list(projects)[0])
project = deepcopy(list(projects)[1])
sizov-kirill marked this conversation as resolved.
Show resolved Hide resolved
labels = project['labels'][0]
labels.update({'deleted': True})
response = patch_method('admin1', f'/projects/{project["id"]}', {'labels': [labels]})
assert response.status_code == HTTPStatus.OK
assert len(response.json()['labels']) == len(project['labels']) - 1

def test_admin_can_delete_skeleton_label(self, projects):
project = deepcopy(list(projects)[0])
labels = project['labels'][0]
labels.update({'deleted': True})
response = patch_method('admin1', f'/projects/{project["id"]}', {'labels': [labels]})
assert response.status_code == HTTPStatus.OK
assert len(response.json()['labels']) == len(project['labels']) - 4

def test_admin_can_rename_label(self, projects):
project = deepcopy(list(projects)[0])
labels = project['labels'][0]
Expand Down
73 changes: 72 additions & 1 deletion tests/python/rest_api/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,77 @@ def test_worker_cannot_create_task_in_project_without_ownership(self, org, proje
users = find_users(org=org['id'], role=role)
self._test_users_to_create_task_in_project(project_id, users, is_staff, is_allow, is_project_staff, org=org['slug'])

def test_can_create_task_with_skeleton(self):
username = "admin1"

spec = {
"name": f'test admin1 to create a task with skeleton',
"labels": [
{
"name": "s1",
"color": "#5c5eba",
"attributes": [
{
"name": "color",
"mutable": False,
"input_type": "select",
"default_value": "white",
"values": [
"white",
"black"
]
}
],
"type": "skeleton",
"sublabels": [
{
"name": "1",
"color": "#d53957",
"attributes": [
{
"id": 23,
"name": "attr",
"mutable": False,
"input_type": "select",
"default_value": "val1",
"values": [
"val1",
"val2"
]
}
],
"type": "points"
},
{
"name": "2",
"color": "#4925ec",
"attributes": [],
"type": "points"
},
{
"name": "3",
"color": "#59a8fe",
"attributes": [],
"type": "points"
}
],
"svg": "<line x1=\"36.329429626464844\" y1=\"45.98662185668945\" x2=\"59.07190704345703\" y2=\"23.076923370361328\" " \
"stroke=\"black\" data-type=\"edge\" data-node-from=\"2\" stroke-width=\"0.5\" data-node-to=\"3\"></line>" \
"<line x1=\"22.61705780029297\" y1=\"25.75250816345215\" x2=\"36.329429626464844\" y2=\"45.98662185668945\" " \
"stroke=\"black\" data-type=\"edge\" data-node-from=\"1\" stroke-width=\"0.5\" data-node-to=\"2\"></line>" \
"<circle r=\"1.5\" stroke=\"black\" fill=\"#b3b3b3\" cx=\"22.61705780029297\" cy=\"25.75250816345215\" " \
"stroke-width=\"0.1\" data-type=\"element node\" data-element-id=\"1\" data-node-id=\"1\" data-label-name=\"1\">" \
"</circle><circle r=\"1.5\" stroke=\"black\" fill=\"#b3b3b3\" cx=\"36.329429626464844\" cy=\"45.98662185668945\" " \
"stroke-width=\"0.1\" data-type=\"element node\" data-element-id=\"2\" data-node-id=\"2\" data-label-name=\"2\"></circle>" \
"<circle r=\"1.5\" stroke=\"black\" fill=\"#b3b3b3\" cx=\"59.07190704345703\" cy=\"23.076923370361328\" " \
"stroke-width=\"0.1\" data-type=\"element node\" data-element-id=\"3\" data-node-id=\"3\" data-label-name=\"3\"></circle>"
}
]
}

self._test_create_task_201(username, spec)


@pytest.mark.usefixtures('dontchangedb')
class TestGetData:
_USERNAME = 'user1'
Expand Down Expand Up @@ -226,7 +297,7 @@ def test_member_update_task_annotation(self, org, role, task_staff, is_allow,
find_task_staff_user, find_users, tasks_by_org, request_data):
users = find_users(role=role, org=org)
tasks = tasks_by_org[org]
username, tid = find_task_staff_user(tasks, users, task_staff)
username, tid = find_task_staff_user(tasks, users, task_staff, [14])

data = request_data(tid)
with make_api_client(username) as api_client:
Expand Down
3 changes: 2 additions & 1 deletion tests/python/sdk/test_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ def test_can_download_dataset(self, fxt_new_task: Task, include_images: bool):

task_id = fxt_new_task.id
path = str(self.tmp_path / f"task_{task_id}-cvat.zip")
job = self.client.jobs.retrieve(task_id)
job_id = fxt_new_task.get_jobs()[0].id
job = self.client.jobs.retrieve(job_id)
job.export_dataset(
format_name="CVAT for images 1.1",
filename=path,
Expand Down
Loading