Skip to content

Commit

Permalink
Merge pull request #1662 from doccano/enhancement/improveTestHelper
Browse files Browse the repository at this point in the history
Improve test helper
  • Loading branch information
Hironsan committed Jan 31, 2022
2 parents ae7c41b + 422826f commit 5a03c40
Show file tree
Hide file tree
Showing 23 changed files with 248 additions and 232 deletions.
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)

0 comments on commit 5a03c40

Please sign in to comment.