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

Improve test helper #1662

Merged
merged 1 commit into from
Jan 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 12 additions & 12 deletions backend/api/tests/api/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def setUpTestData(cls):
cls.url = reverse(viewname='project_list')

def test_return_projects_to_member(self):
for member in self.project.users:
for member in self.project.members:
response = self.assert_fetch(member, status.HTTP_200_OK)
project = response.data[0]
self.assertEqual(len(response.data), 1)
Expand Down Expand Up @@ -45,10 +45,10 @@ def test_allows_staff_user_to_create_project(self):
response = self.assert_create(self.user, status.HTTP_201_CREATED)
self.assertEqual(response.data['name'], self.data['name'])

def test_disallows_non_staff_user_to_create_project(self):
def test_denies_non_staff_user_to_create_project(self):
self.assert_create(self.user, status.HTTP_403_FORBIDDEN)

def test_disallows_unauthenticated_user_to_create_project(self):
def test_denies_unauthenticated_user_to_create_project(self):
self.assert_create(expected=status.HTTP_403_FORBIDDEN)


Expand Down Expand Up @@ -87,30 +87,30 @@ def setUpTestData(cls):
cls.data = {'description': 'lorem', 'resourcetype': 'SequenceLabelingProject'}

def test_return_project_to_member(self):
for member in self.project.users:
for member in self.project.members:
response = self.assert_fetch(member, status.HTTP_200_OK)
self.assertEqual(response.data['id'], self.project.item.id)

def test_does_not_return_project_to_non_member(self):
self.assert_fetch(self.non_member, status.HTTP_403_FORBIDDEN)

def test_allows_admin_to_update_project(self):
response = self.assert_update(self.project.users[0], status.HTTP_200_OK)
response = self.assert_update(self.project.admin, status.HTTP_200_OK)
self.assertEqual(response.data['description'], self.data['description'])

def test_disallows_non_admin_to_update_project(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_update_project(self):
for member in self.project.staffs:
self.assert_update(member, status.HTTP_403_FORBIDDEN)

def test_disallows_non_member_to_update_project(self):
def test_denies_non_member_to_update_project(self):
self.assert_update(self.non_member, status.HTTP_403_FORBIDDEN)

def test_allows_admin_to_delete_project(self):
self.assert_delete(self.project.users[0], status.HTTP_204_NO_CONTENT)
self.assert_delete(self.project.admin, status.HTTP_204_NO_CONTENT)

def test_disallows_non_admin_to_delete_project(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_delete_project(self):
for member in self.project.staffs:
self.assert_delete(member, status.HTTP_403_FORBIDDEN)

def test_disallows_non_member_to_delete_project(self):
def test_denies_non_member_to_delete_project(self):
self.assert_delete(self.non_member, status.HTTP_403_FORBIDDEN)
22 changes: 11 additions & 11 deletions backend/api/tests/api/test_tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def setUpTestData(cls):
cls.url = reverse(viewname='tag_list', args=[cls.project.item.id])

def test_return_tags_to_member(self):
for member in self.project.users:
for member in self.project.members:
response = self.assert_fetch(member, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)

Expand All @@ -34,15 +34,15 @@ def setUpTestData(cls):
cls.url = reverse(viewname='tag_list', args=[cls.project.item.id])
cls.data = {'text': 'example'}

def test_allow_admin_to_create_tag(self):
response = self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
def test_allows_admin_to_create_tag(self):
response = self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(response.data['text'], self.data['text'])

def test_disallow_non_admin_to_create_tag(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_create_tag(self):
for member in self.project.staffs:
self.assert_create(member, status.HTTP_403_FORBIDDEN)

def test_disallow_unauthenticated_user_to_create_tag(self):
def test_denies_unauthenticated_user_to_create_tag(self):
self.assert_create(expected=status.HTTP_403_FORBIDDEN)


Expand All @@ -57,12 +57,12 @@ def setUp(self):
tag = make_tag(project=self.project.item)
self.url = reverse(viewname='tag_detail', args=[self.project.item.id, tag.id])

def test_allow_admin_to_delete_tag(self):
self.assert_delete(self.project.users[0], status.HTTP_204_NO_CONTENT)
def test_allows_admin_to_delete_tag(self):
self.assert_delete(self.project.admin, status.HTTP_204_NO_CONTENT)

def test_disallow_non_admin_to_delete_tag(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_delete_tag(self):
for member in self.project.staffs:
self.assert_delete(member, status.HTTP_403_FORBIDDEN)

def test_disallow_unauthenticated_user_to_delete_tag(self):
def test_denies_unauthenticated_user_to_delete_tag(self):
self.assert_delete(expected=status.HTTP_403_FORBIDDEN)
25 changes: 22 additions & 3 deletions backend/api/tests/api/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import os
from collections import namedtuple
from typing import List

from django.conf import settings
Expand All @@ -17,7 +16,27 @@
DATA_DIR = os.path.join(os.path.dirname(__file__), '../../../data_import/tests/data')


ProjectData = namedtuple('ProjectData', ['item', 'users'])
class ProjectData:

def __init__(self, item, members):
self.item = item
self.members = members

@property
def admin(self):
return self.members[0]

@property
def approver(self):
return self.members[1]

@property
def annotator(self):
return self.members[2]

@property
def staffs(self):
return [self.approver, self.annotator]


def create_default_roles():
Expand Down Expand Up @@ -83,7 +102,7 @@ def make_project(

return ProjectData(
item=project,
users=users,
members=users
)


Expand Down
40 changes: 20 additions & 20 deletions backend/auto_labeling/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,23 @@ def setUp(self):

def test_allow_admin_to_fetch_template_list(self):
self.url += '?task_name=DocumentClassification'
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
self.assertIn('Custom REST Request', response.data)
self.assertGreaterEqual(len(response.data), 1)

def test_deny_non_admin_to_fetch_template_list(self):
def test_deny_project_staff_to_fetch_template_list(self):
self.url += '?task_name=DocumentClassification'
for user in self.project.users[1:]:
for user in self.project.staffs:
self.assert_fetch(user, status.HTTP_403_FORBIDDEN)

def test_return_only_default_template_with_empty_task_name(self):
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertIn('Custom REST Request', response.data)

def test_return_only_default_template_with_wrong_task_name(self):
self.url += '?task_name=foobar'
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertIn('Custom REST Request', response.data)

Expand All @@ -57,21 +57,21 @@ def setUp(self):

@patch('auto_labeling.views.RestAPIRequestTesting.send_request', return_value={})
def test_called_with_proper_model(self, mock):
self.assert_create(self.project.users[0], status.HTTP_200_OK)
self.assert_create(self.project.admin, status.HTTP_200_OK)
_, kwargs = mock.call_args
expected = RequestModelFactory.create(self.data['model_name'], self.data['model_attrs'])
self.assertEqual(kwargs['model'], expected)

@patch('auto_labeling.views.RestAPIRequestTesting.send_request', return_value={})
def test_called_with_text(self, mock):
self.assert_create(self.project.users[0], status.HTTP_200_OK)
self.assert_create(self.project.admin, status.HTTP_200_OK)
_, kwargs = mock.call_args
self.assertEqual(kwargs['example'], self.data['text'])

@patch('auto_labeling.views.RestAPIRequestTesting.send_request', return_value={})
def test_called_with_image(self, mock):
self.data['text'] = str(data_dir / 'images/1500x500.jpeg')
self.assert_create(self.project.users[0], status.HTTP_200_OK)
self.assert_create(self.project.admin, status.HTTP_200_OK)
_, kwargs = mock.call_args
self.assertEqual(kwargs['example'], self.data['text'])

Expand All @@ -96,13 +96,13 @@ def setUp(self):
self.url = reverse(viewname='auto_labeling_template_test', args=[self.project.item.id])

def test_template_mapping(self):
response = self.assert_create(self.project.users[0], status.HTTP_200_OK)
response = self.assert_create(self.project.admin, status.HTTP_200_OK)
expected = [{'label': 'NEUTRAL'}]
self.assertEqual(response.json(), expected)

def test_json_decode_error(self):
self.data['template'] = ''
self.assert_create(self.project.users[0], status.HTTP_400_BAD_REQUEST)
self.assert_create(self.project.admin, status.HTTP_400_BAD_REQUEST)


class TestLabelMapping(CRUDMixin):
Expand All @@ -117,7 +117,7 @@ def setUp(self):
self.url = reverse(viewname='auto_labeling_mapping_test', args=[self.project.item.id])

def test_label_mapping(self):
response = self.assert_create(self.project.users[0], status.HTTP_200_OK)
response = self.assert_create(self.project.admin, status.HTTP_200_OK)
expected = [{'label': 'Negative'}]
self.assertEqual(response.json(), expected)

Expand All @@ -141,12 +141,12 @@ def setUp(self):
self.url = reverse(viewname='auto_labeling_configs', args=[self.project.item.id])

def test_create_config(self):
response = self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
response = self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(response.data['model_name'], self.data['model_name'])

def test_list_config(self):
mommy.make('AutoLabelingConfig', project=self.project.item)
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)


Expand All @@ -168,7 +168,7 @@ def setUp(self):
@patch('auto_labeling.views.execute_pipeline', return_value=Categories([{'label': 'POS'}]))
def test_category_labeling(self, mock):
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Category.objects.count(), 1)
self.assertEqual(Category.objects.first().label, self.category_pos)

Expand All @@ -182,7 +182,7 @@ def test_category_labeling(self, mock):
def test_multiple_configs(self, mock):
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Category.objects.count(), 2)
self.assertEqual(Category.objects.first().label, self.category_pos)
self.assertEqual(Category.objects.last().label, self.category_neg)
Expand All @@ -197,7 +197,7 @@ def test_multiple_configs(self, mock):
def test_cannot_label_same_category_type(self, mock):
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Category.objects.count(), 1)

@patch(
Expand All @@ -210,14 +210,14 @@ def test_cannot_label_same_category_type(self, mock):
def test_allow_multi_type_configs(self, mock):
mommy.make('AutoLabelingConfig', task_type='Category', project=self.project.item)
mommy.make('AutoLabelingConfig', task_type='Span', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Category.objects.count(), 1)
self.assertEqual(Span.objects.count(), 1)

@patch('auto_labeling.views.execute_pipeline', return_value=Categories([{'label': 'POS'}]))
def test_cannot_use_other_project_config(self, mock):
mommy.make('AutoLabelingConfig', task_type='Category')
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Category.objects.count(), 0)


Expand All @@ -240,7 +240,7 @@ def setUp(self):
def test_cannot_label_overlapping_span(self, mock):
mommy.make('AutoLabelingConfig', task_type='Span', project=self.project.item)
mommy.make('AutoLabelingConfig', task_type='Span', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(Span.objects.count(), 1)


Expand All @@ -262,5 +262,5 @@ def setUp(self):
def test_cannot_label_same_text(self, mock):
mommy.make('AutoLabelingConfig', task_type='Text', project=self.project.item)
mommy.make('AutoLabelingConfig', task_type='Text', project=self.project.item)
self.assert_create(self.project.users[0], status.HTTP_201_CREATED)
self.assert_create(self.project.admin, status.HTTP_201_CREATED)
self.assertEqual(TextLabel.objects.count(), 1)
4 changes: 2 additions & 2 deletions backend/data_export/tests/test_repositories.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ def setUp(self):

def test_list(self):
example = mommy.make('Example', project=self.project.item, text='example')
category = mommy.make('Category', example=example, user=self.project.users[0])
span = mommy.make('Span', example=example, user=self.project.users[0], start_offset=0, end_offset=1)
category = mommy.make('Category', example=example, user=self.project.admin)
span = mommy.make('Span', example=example, user=self.project.admin, start_offset=0, end_offset=1)
repository = IntentDetectionSlotFillingRepository(self.project.item)
expected = [
{
Expand Down
6 changes: 3 additions & 3 deletions backend/data_export/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ def setUp(self):
self.url = reverse(viewname='download-format', args=[self.project.item.id])

def test_allows_project_admin_to_list_catalog(self):
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
for item in response.data:
self.assertIn('name', item)

def test_denies_non_project_admin_to_list_catalog(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_list_catalog(self):
for member in self.project.staffs:
self.assert_fetch(member, status.HTTP_403_FORBIDDEN)
4 changes: 2 additions & 2 deletions backend/data_import/tests/test_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ def test_can_load_only_text_column(self):
expected = {'data': 'Text', 'label': []}
self.assert_record(actual, expected)

def test_disallow_no_data_column(self):
def test_denies_no_data_column(self):
row = {'label': 'Label'}
data_column = builders.DataColumn('text', TextData)
label_columns = [builders.LabelColumn('label', CategoryLabel)]
with self.assertRaises(FileParseException):
self.create_record(row, data_column, label_columns)

def test_disallow_empty_text(self):
def test_denies_empty_text(self):
row = {'text': '', 'label': 'Label'}
data_column = builders.DataColumn('text', TextData)
label_columns = [builders.LabelColumn('label', CategoryLabel)]
Expand Down
2 changes: 1 addition & 1 deletion backend/data_import/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class TestImportData(TestCase):

def setUp(self):
self.project = prepare_project(self.task)
self.user = self.project.users[0]
self.user = self.project.admin
self.data_path = pathlib.Path(__file__).parent / 'data'

def import_dataset(self, filename, file_format, kwargs=None):
Expand Down
6 changes: 3 additions & 3 deletions backend/data_import/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ def setUp(self):
self.url = reverse(viewname='catalog', args=[self.project.item.id])

def test_allows_project_admin_to_list_catalog(self):
response = self.assert_fetch(self.project.users[0], status.HTTP_200_OK)
response = self.assert_fetch(self.project.admin, status.HTTP_200_OK)
for item in response.data:
self.assertIn('name', item)

def test_denies_non_project_admin_to_list_catalog(self):
for member in self.project.users[1:]:
def test_denies_project_staff_to_list_catalog(self):
for member in self.project.staffs:
self.assert_fetch(member, status.HTTP_403_FORBIDDEN)