def test_batch_add(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath( 'turkle/tests/resources/form_1_vals.csv')) as fp: response = client.post( u'/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'error' not in response.content) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').last() self.assertEqual( response['Location'], u'/admin/turkle/batch/{}/review/'.format(matching_batch.id)) self.assertEqual(matching_batch.filename, u'form_1_vals.csv') self.assertEqual(matching_batch.total_tasks(), 1) self.assertEqual( matching_batch.allotted_assignment_time, Batch._meta.get_field('allotted_assignment_time').get_default()) self.assertEqual(matching_batch.created_by, self.user)
def test_index_unprotected_template(self): project_unprotected = Project( active=True, login_required=False, name='MY_TEMPLATE_NAME', ) project_unprotected.save() batch = Batch(project=project_unprotected, name='MY_BATCH_NAME') batch.save() Task(batch=batch).save() anon_client = django.test.Client() response = anon_client.get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertFalse(b'No Tasks available' in response.content) self.assertTrue(b'MY_TEMPLATE_NAME' in response.content) self.assertTrue(b'MY_BATCH_NAME' in response.content) known_client = django.test.Client() User.objects.create_superuser('admin', '*****@*****.**', 'secret') known_client.login(username='******', password='******') response = known_client.get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertFalse(b'No Tasks available' in response.content) self.assertTrue(b'MY_TEMPLATE_NAME' in response.content) self.assertTrue(b'MY_BATCH_NAME' in response.content)
def test_available_tasks_for_anon_user(self): anonymous_user = AnonymousUser() user = User.objects.create_user('user', password='******') project_protected = Project( active=True, login_required=True, ) project_protected.save() self.assertEqual(len(Project.all_available_for(anonymous_user)), 0) self.assertEqual(len(Project.all_available_for(user)), 2) # Project created by setUp batch_protected = Batch(project=project_protected) batch_protected.save() Task(batch=batch_protected).save() self.assertEqual(len(batch_protected.available_tasks_for(anonymous_user)), 0) self.assertEqual(len(batch_protected.available_tasks_for(user)), 1) project_unprotected = Project( active=True, login_required=False, ) project_unprotected.save() batch_unprotected = Batch(project=project_unprotected) batch_unprotected.save() Task(batch=batch_unprotected).save() self.assertEqual(len(Project.all_available_for(anonymous_user)), 1) self.assertEqual(len(Project.all_available_for(user)), 3) self.assertEqual(len(project_unprotected.batches_available_for(anonymous_user)), 1) self.assertEqual(len(project_unprotected.batches_available_for(user)), 1) self.assertEqual(len(batch_unprotected.available_tasks_for(anonymous_user)), 1) self.assertEqual(len(batch_unprotected.available_tasks_for(user)), 1)
def test_task_marked_as_completed_two_way_redundancy(self): # When assignment_per_task==2, completing 2 Assignments marks Task as complete project = Project(name='test', html_template='<p>${number} - ${letter}</p><textarea>') project.save() batch = Batch(name='test', project=project) batch.assignments_per_task = 2 batch.save() task = Task( batch=batch, input_csv_fields={'number': '1', 'letter': 'a'} ) task.save() self.assertFalse(task.completed) TaskAssignment( assigned_to=None, completed=True, task=task ).save() task.refresh_from_db() self.assertFalse(task.completed) TaskAssignment( assigned_to=None, completed=True, task=task ).save() task.refresh_from_db() self.assertTrue(task.completed)
def test_batch_add_csv_with_emoji(self): project = Project(name='foo', html_template='<p>${emoji}: ${more_emoji}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath('turkle/tests/resources/emoji.csv')) as fp: response = client.post( '/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'Please correct the error' not in response.content) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').last() self.assertEqual(response['Location'], '/admin/turkle/batch/{}/review/'.format(matching_batch.id)) self.assertEqual(matching_batch.filename, 'emoji.csv') self.assertEqual(matching_batch.total_tasks(), 3) tasks = matching_batch.task_set.all() self.assertEqual(tasks[0].input_csv_fields['emoji'], '😀') self.assertEqual(tasks[0].input_csv_fields['more_emoji'], '😃') self.assertEqual(tasks[2].input_csv_fields['emoji'], '🤔') self.assertEqual(tasks[2].input_csv_fields['more_emoji'], 'ðŸ¤')
def test_batch_to_input_csv(self): project = Project(name='test', html_template='<p>${letter}</p><textarea>') project.save() batch = Batch(project=project) batch.save() task1 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'a', 'number': '1'}, ) task1.save() task2 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'b', 'number': '2'}, ) task2.save() csv_output = StringIO() batch.to_input_csv(csv_output) rows = csv_output.getvalue().split() # Original column order not guaranteed if '"letter","number"' in rows[0]: self.assertTrue(any(['"a","1"' in row for row in rows[1:]])) self.assertTrue(any(['"b","2"' in row for row in rows[1:]])) elif '"number","letter"' in rows[0]: self.assertTrue(any(['"1","a"' in row for row in rows[1:]])) self.assertTrue(any(['"2","b"' in row for row in rows[1:]])) else: self.fail('Unexpected header value: %s' % rows[0])
def setUp(self): project = Project(login_required=False) project.save() self.batch = Batch(project=project) self.batch.save() self.task = Task(batch=self.batch) self.task.save()
def test_task_marked_as_completed_two_way_redundancy(self): # When assignment_per_task==2, completing 2 Assignments marks Task as complete project = Project( name='test', html_template='<p>${number} - ${letter}</p><textarea>') project.save() batch = Batch(name='test', project=project) batch.assignments_per_task = 2 batch.save() task = Task(batch=batch, input_csv_fields={ 'number': '1', 'letter': 'a' }) task.save() self.assertFalse(task.completed) self.assertFalse(batch.completed) TaskAssignment(assigned_to=None, completed=True, task=task).save() task.refresh_from_db() batch.refresh_from_db() self.assertFalse(task.completed) self.assertFalse(batch.completed) TaskAssignment(assigned_to=None, completed=True, task=task).save() task.refresh_from_db() batch.refresh_from_db() self.assertTrue(task.completed) self.assertTrue(batch.completed)
def test_batch_add_csv_with_emoji(self): project = Project(name='foo', html_template='<p>${emoji}: ${more_emoji}</p>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath('turkle/tests/resources/emoji.csv')) as fp: response = client.post( u'/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'error' not in response.content) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').last() self.assertEqual( response['Location'], u'/admin/turkle/batch/{}/review/'.format(matching_batch.id)) self.assertEqual(matching_batch.filename, u'emoji.csv') self.assertEqual(matching_batch.total_tasks(), 3) tasks = matching_batch.task_set.all() self.assertEqual(tasks[0].input_csv_fields['emoji'], u'😀') self.assertEqual(tasks[0].input_csv_fields['more_emoji'], u'😃') self.assertEqual(tasks[2].input_csv_fields['emoji'], u'🤔') self.assertEqual(tasks[2].input_csv_fields['more_emoji'], u'ðŸ¤')
def test_batch_add_validation_extra_csv_fields(self): project = Project(name='foo', html_template='<p>${f2}</p>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') # CSV file has fields 'f2' and 'f3' with open( os.path.abspath( 'turkle/tests/resources/mismatched_fields.csv')) as fp: response = client.post( u'/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').first() self.assertEqual( response['Location'], reverse('turkle_admin:review_batch', kwargs={'batch_id': matching_batch.id})) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertTrue( u'The CSV file contained fields that are not in the HTML template.' in str(messages[0]))
def test_expire_abandoned_assignments(self): t = timezone.now() dt = datetime.timedelta(hours=2) past = t - dt project = Project(login_required=False) project.save() batch = Batch(allotted_assignment_time=1, project=project) batch.save() task = Task(batch=batch) task.save() ha = TaskAssignment( completed=False, expires_at=past, task=task, ) # Bypass TaskAssignment's save(), which updates expires_at super(TaskAssignment, ha).save() self.assertEqual(TaskAssignment.objects.count(), 1) User.objects.create_superuser('admin', '*****@*****.**', 'secret') client = django.test.Client() client.login(username='******', password='******') response = client.get( reverse('turkle_admin:expire_abandoned_assignments')) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], '/admin/') self.assertEqual(TaskAssignment.objects.count(), 0) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), u'All 1 abandoned Tasks have been expired')
def test_batch_add(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath('turkle/tests/resources/form_1_vals.csv')) as fp: response = client.post( '/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'Please correct the error' not in response.content) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').last() self.assertEqual(response['Location'], '/admin/turkle/batch/{}/review/'.format(matching_batch.id)) self.assertEqual(matching_batch.filename, 'form_1_vals.csv') self.assertEqual(matching_batch.total_tasks(), 1) self.assertEqual(matching_batch.allotted_assignment_time, Batch._meta.get_field('allotted_assignment_time').get_default()) self.assertEqual(matching_batch.created_by, self.user)
class TestTaskAssignmentIFrame(TestCase): def setUp(self): self.user = User.objects.create_user('testuser', password='******') self.admin = User.objects.create_superuser('admin', '*****@*****.**', 'secret') self.project = Project(name="Test", login_required=False) self.project.created_by = self.admin self.project.updated_by = self.admin self.project.save() batch = Batch(project=self.project) batch.save() self.task = Task(input_csv_fields={}, batch=batch) self.task.save() self.task_assignment = TaskAssignment(task=self.task) self.task_assignment.save() def test_get_task_assignment_iframe_with_wrong_user(self): User.objects.create_user('wrong_user', password='******') self.task_assignment.assigned_to = self.user self.task_assignment.save() client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('task_assignment_iframe', kwargs={'task_id': self.task.id, 'task_assignment_id': self.task_assignment.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertTrue('You do not have permission to work on the Task Assignment with ID' in str(messages[0])) def test_template_with_submit_button(self): self.project.html_template = \ '<input id="my_submit_button" type="submit" value="MySubmit" />' save_model(self.project) self.project.refresh_from_db() self.assertTrue(self.project.html_template_has_submit_button) client = django.test.Client() response = client.get(reverse('task_assignment_iframe', kwargs={'task_id': self.task.id, 'task_assignment_id': self.task_assignment.id})) self.assertEqual(response.status_code, 200) self.assertTrue(b'my_submit_button' in response.content) self.assertFalse(b'submitButton' in response.content) def test_template_without_submit_button(self): self.project.form = '<input id="foo" type="text" value="MyText" />' self.project.save() self.project.refresh_from_db() self.assertFalse(self.project.html_template_has_submit_button) client = django.test.Client() response = client.get(reverse('task_assignment_iframe', kwargs={'task_id': self.task.id, 'task_assignment_id': self.task_assignment.id})) self.assertEqual(response.status_code, 200) self.assertFalse(b'my_submit_button' in response.content) self.assertTrue(b'submitButton' in response.content)
def test_form_with_submit_button(self): project = Project( html_template= '<p><input id="my_submit_button" type="submit" value="MySubmit" /></p>' ) project.save() self.assertTrue(project.html_template_has_submit_button)
def test_batches_available_for_anon(self): anonymous_user = AnonymousUser() project_protected = Project( active=True, login_required=True, ) project_protected.save() self.assertEqual( len(project_protected.batches_available_for(anonymous_user)), 0) Batch(project=project_protected).save() self.assertEqual( len(project_protected.batches_available_for(anonymous_user)), 0) project_unprotected = Project( active=True, login_required=False, ) project_unprotected.save() self.assertEqual( len(project_unprotected.batches_available_for(anonymous_user)), 0) Batch(project=project_unprotected).save() self.assertEqual( len(project_unprotected.batches_available_for(anonymous_user)), 1)
def test_batch_add_validation_extra_csv_fields(self): project = Project(name='foo', html_template='<p>${f2}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') # CSV file has fields 'f2' and 'f3' with open(os.path.abspath('turkle/tests/resources/mismatched_fields.csv')) as fp: response = client.post( '/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertEqual(response.status_code, 302) self.assertTrue(Batch.objects.filter(name='batch_save').exists()) matching_batch = Batch.objects.filter(name='batch_save').first() self.assertEqual(response['Location'], reverse('turkle_admin:review_batch', kwargs={'batch_id': matching_batch.id})) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertTrue('The CSV file contained fields that are not in the HTML template.' in str(messages[0]))
def test_expire_abandoned_assignments(self): t = timezone.now() dt = datetime.timedelta(hours=2) past = t - dt project = Project(login_required=False) project.save() batch = Batch( allotted_assignment_time=1, project=project ) batch.save() task = Task(batch=batch) task.save() ha = TaskAssignment( completed=False, expires_at=past, task=task, ) # Bypass TaskAssignment's save(), which updates expires_at super(TaskAssignment, ha).save() self.assertEqual(TaskAssignment.objects.count(), 1) User.objects.create_superuser('admin', '*****@*****.**', 'secret') client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('turkle_admin:expire_abandoned_assignments')) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], '/admin/') self.assertEqual(TaskAssignment.objects.count(), 0) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'All 1 abandoned Tasks have been expired')
def test_batch_to_csv_variable_number_of_answers(self): project = Project(name='test', html_template='<p>${letter}</p><textarea>') project.save() batch = Batch(project=project) batch.save() task1 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'a'}, ) task1.save() TaskAssignment( answers={ '1': 1, '2': 2 }, assigned_to=None, completed=True, task=task1, ).save() task2 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'b'}, ) task2.save() TaskAssignment(answers={ '3': 3, '4': 4 }, assigned_to=None, completed=True, task=task2).save() task3 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'c'}, ) task3.save() TaskAssignment(answers={ '3': 3, '2': 2 }, assigned_to=None, completed=True, task=task3).save() csv_output = StringIO() batch.to_csv(csv_output) rows = csv_output.getvalue().split() self.assertTrue( '"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0]) self.assertTrue(any(['"a","1","2","",""' in row for row in rows[1:]])) self.assertTrue(any(['"b","","","3","4"' in row for row in rows[1:]])) self.assertTrue(any(['"c","","2","3",""' in row for row in rows[1:]]))
def test_login_required_validation_2(self): # No ValidationError thrown project = Project(login_required=True, ) project.save() Batch( assignments_per_task=2, project=project, ).clean()
def setUp(self): """ Sets up Project, Task objects, and saves them to the DB. The Project form HTML only displays the one input variable. The Task has inputs and answers and refers to the Project form. """ project = Project(name='test', html_template="<p>${foo}</p>") project.save() batch = Batch(project=project) batch.save() task = Task( batch=batch, input_csv_fields={u'foo': u'bar'}, completed=True, ) task.save() self.task = task self.task_assignment = TaskAssignment(answers={ u"comment": u"\u221e", u"userDisplayLanguage": u"", u"sentence_textbox_3_verb1": u"", u"city": u"", u"sentence_textbox_1_verb6": u"", u"sentence_textbox_1_verb7": u"", u"sentence_textbox_1_verb4": u"", u"sentence_textbox_1_verb5": u"", u"sentence_textbox_1_verb2": u"", u"sentence_textbox_1_verb3": u"", u"sentence_textbox_1_verb1": u"", u"sentence_textbox_2_verb4": u"", u"csrfmiddlewaretoken": u"7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8", u"sentence_drop_2_verb3": u"foo", u"sentence_drop_2_verb2": u"foo", u"sentence_drop_2_verb1": u"foo", u"sentence_textbox_2_verb1": u"", u"sentence_textbox_2_verb3": u"", u"sentence_drop_2_verb4": u"foo", u"sentence_textbox_2_verb2": u"", u"submitit": u"Submit", u"browserInfo": u"", u"sentence_drop_1_verb1": u"foo", u"sentence_drop_1_verb2": u"foo", u"sentence_drop_1_verb3": u"foo", u"sentence_drop_1_verb4": u"foo", u"sentence_drop_1_verb5": u"foo", u"sentence_drop_1_verb6": u"foo", u"sentence_drop_1_verb7": u"foo", u"country": u"", u"sentence_drop_3_verb1": u"foo", u"ipAddress": u"", u"region": u"" }, assigned_to=None, completed=True, task=task) self.task_assignment.save()
def test_login_required_validation_3(self): with self.assertRaisesMessage(ValidationError, 'Assignments per Task must be 1'): project = Project(login_required=False, ) project.save() Batch( assignments_per_task=2, project=project, ).clean()
def setUp(self): self.user = User.objects.create_user('testuser', password='******') project = Project() project.save() batch = Batch(project=project) batch.save() self.task = Task(batch=batch) self.task.save()
def setUp(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>') project.save() batch = Batch(project=project, name='foo', filename='foo.csv') batch.save() self.task = Task(batch=batch) self.task.save()
def setUp(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() batch = Batch(project=project, name='foo', filename='foo.csv') batch.save() self.task = Task(batch=batch) self.task.save()
def setUp(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() self.batch = Batch(project=project, name='MY_BATCH_NAME', published=False) self.batch.save()
def setUp(self): project = Project(login_required=False) project.save() self.batch = Batch(project=project) self.batch.save() self.task_one = Task(batch=self.batch) self.task_one.save() self.task_two = Task(batch=self.batch) self.task_two.save() self.task_three = Task(batch=self.batch) self.task_three.save()
def test_batch_to_csv_variable_number_of_answers(self): project = Project(name='test', html_template='<p>${letter}</p><textarea>') project.save() batch = Batch(project=project) batch.save() task1 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'a'}, ) task1.save() TaskAssignment( answers={'1': 1, '2': 2}, assigned_to=None, completed=True, task=task1, ).save() task2 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'b'}, ) task2.save() TaskAssignment( answers={'3': 3, '4': 4}, assigned_to=None, completed=True, task=task2 ).save() task3 = Task( batch=batch, completed=True, input_csv_fields={'letter': 'c'}, ) task3.save() TaskAssignment( answers={'3': 3, '2': 2}, assigned_to=None, completed=True, task=task3 ).save() csv_output = StringIO() batch.to_csv(csv_output) rows = csv_output.getvalue().split() self.assertTrue('"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0]) self.assertTrue(any(['"a","1","2","",""' in row for row in rows[1:]])) self.assertTrue(any(['"b","","","3","4"' in row for row in rows[1:]])) self.assertTrue(any(['"c","","2","3",""' in row for row in rows[1:]]))
def setUp(self): project = Project(login_required=False, name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() self.batch = Batch(project=project, name='foo', filename='foo.csv') self.batch.save() self.task = Task( batch=self.batch, input_csv_fields={'foo': 'fufu', 'bar': 'baba'} ) self.task.save()
def setUp(self): project = Project(login_required=False, name='foo', html_template='<p></p><textarea>') project.save() batch = Batch(project=project) batch.save() self.task = Task(batch=batch, input_csv_fields='{}') self.task.save() self.task_assignment = TaskAssignment(assigned_to=None, completed=False, task=self.task) self.task_assignment.save()
def setUp(self): project = Project(login_required=False, name='foo', html_template='<p></p><textarea>') project.save() batch = Batch(project=project) batch.save() self.task = Task(batch=batch, input_csv_fields='{}') self.task.save() self.task_assignment = TaskAssignment( assigned_to=None, completed=False, task=self.task ) self.task_assignment.save()
def setUp(self): project = Project(login_required=False, name='foo', html_template='<p>${foo}: ${bar}</p>') project.save() self.batch = Batch(project=project, name='foo', filename='foo.csv') self.batch.save() self.task = Task(batch=self.batch, input_csv_fields={ 'foo': 'fufu', 'bar': 'baba' }) self.task.save()
def test_all_available_for_custom_permissions(self): user = User.objects.create_user('testuser', password='******') group = Group.objects.create(name='testgroup') user.groups.add(group) project = Project(custom_permissions=True) project.save() self.assertEqual(len(project.all_available_for(user)), 0) # Verify that giving the group access also gives the group members access self.assertFalse(user.has_perm('can_work_on', project)) assign_perm('can_work_on', group, project) self.assertEqual(len(project.all_available_for(user)), 1) # add superusers should have access to it self.assertEqual(len(project.all_available_for(self.admin)), 1)
def test_batch_from_emoji_csv(self): template = '<p>${emoji} - ${more_emoji}</p><textarea>' project = Project(name='test', html_template=template) project.save() batch = Batch(project=project) batch.save() with open(os.path.abspath('turkle/tests/resources/emoji.csv'), 'r') as csv_fh: batch.create_tasks_from_csv(csv_fh) self.assertEqual(batch.total_tasks(), 3) tasks = batch.task_set.all() self.assertEqual(tasks[0].input_csv_fields['emoji'], '😀') self.assertEqual(tasks[0].input_csv_fields['more_emoji'], '😃') self.assertEqual(tasks[2].input_csv_fields['emoji'], '🤔') self.assertEqual(tasks[2].input_csv_fields['more_emoji'], 'ðŸ¤')
def test_batch_from_emoji_csv(self): template = '<p>${emoji} - ${more_emoji}</p><textarea>' project = Project(name='test', html_template=template) project.save() batch = Batch(project=project) batch.save() csv_fh = open(os.path.abspath('turkle/tests/resources/emoji.csv'), 'r') batch.create_tasks_from_csv(csv_fh) self.assertEqual(batch.total_tasks(), 3) tasks = batch.task_set.all() self.assertEqual(tasks[0].input_csv_fields['emoji'], '😀') self.assertEqual(tasks[0].input_csv_fields['more_emoji'], '😃') self.assertEqual(tasks[2].input_csv_fields['emoji'], '🤔') self.assertEqual(tasks[2].input_csv_fields['more_emoji'], 'ðŸ¤')
def test_project_to_csv(self): project = Project(name='test', html_template='<p>${number} - ${letter}</p>') project.save() batch_one = Batch(project=project) batch_one.save() task1 = Task( batch=batch_one, completed=True, input_csv_fields={ 'number': '1', 'letter': 'a' }, ) task1.save() TaskAssignment(answers={ 'combined': '1a' }, assigned_to=None, completed=True, task=task1).save() batch_two = Batch(project=project) batch_two.save() task2 = Task(batch=batch_two, completed=True, input_csv_fields={ 'number': '2', 'letter': 'b' }) task2.save() TaskAssignment(answers={ 'combined': '2b' }, assigned_to=None, completed=True, task=task2).save() csv_output = BytesIO() project.to_csv(csv_output) rows = csv_output.getvalue().split(b'\r\n') self.assertTrue( b'"Input.letter","Input.number","Answer.combined"' in rows[0]) self.assertTrue(any([b'"a","1","1a"' in row for row in rows[1:]])) self.assertTrue(any([b'"b","2","2b"' in row for row in rows[1:]]))
def test_batch_to_csv(self): project = Project(name='test', html_template='<p>${number} - ${letter}</p>') project.save() batch = Batch(project=project) batch.save() task1 = Task( batch=batch, completed=True, input_csv_fields={ 'number': '1', 'letter': 'a' }, ) task1.save() TaskAssignment(answers={ 'combined': '1a' }, assigned_to=None, completed=True, task=task1).save() task2 = Task( batch=batch, completed=True, input_csv_fields={ 'number': '2', 'letter': 'b' }, ) task2.save() TaskAssignment(answers={ 'combined': '2b' }, assigned_to=None, completed=True, task=task2).save() csv_output = StringIO() batch.to_csv(csv_output) csv_string = csv_output.getvalue() self.assertTrue(b'"Input.letter","Input.number","Answer.combined"\r\n' in csv_string) self.assertTrue(b'"b","2","2b"\r\n' in csv_string) self.assertTrue(b'"a","1","1a"\r\n' in csv_string)
def test_project_to_csv_different_answers_per_batch(self): project = Project(name='test', html_template='<p>${letter}</p>') project.save() batch_one = Batch(project=project) batch_one.save() task1 = Task( batch=batch_one, completed=True, input_csv_fields={'letter': 'a'}, ) task1.save() TaskAssignment(answers={ '1': 1, '2': 2 }, assigned_to=None, completed=True, task=task1).save() batch_two = Batch(project=project) batch_two.save() task2 = Task( batch=batch_two, completed=True, input_csv_fields={'letter': 'b'}, ) task2.save() TaskAssignment(answers={ '3': 3, '4': 4 }, assigned_to=None, completed=True, task=task2).save() csv_output = BytesIO() project.to_csv(csv_output) rows = csv_output.getvalue().split(b'\r\n') self.assertTrue( b'"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0]) self.assertTrue(b'"a","1","2","",""' in rows[1]) self.assertTrue(b'"b","","","3","4"' in rows[2])
def setUp(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() self.batch = Batch(project=project, name='foo', filename='foo.csv') self.batch.save() task = Task( batch=self.batch, input_csv_fields={'foo': 'fufu', 'bar': 'baba'} ) task.save() TaskAssignment( answers={'a1': 'sauce'}, assigned_to=None, completed=True, task=task ).save()
def test_batches_available_for(self): user = User.objects.create_user('testuser', password='******') project = Project(active=True, ) project.save() self.assertEqual(len(project.batches_available_for(user)), 0) Batch( active=False, project=project, ).save() self.assertEqual(len(project.batches_available_for(user)), 0) Batch( active=True, project=project, ).save() self.assertEqual(len(project.batches_available_for(user)), 1)
def test_batch_add_missing_file_field(self): project = Project(name='foo', html_template='<p>${emoji}: ${more_emoji}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') response = client.post( '/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', }) self.assertTrue(b'Please correct the error' in response.content) self.assertEqual(response.status_code, 200) self.assertTrue(b'This field is required' in response.content)
def test_group_permissions(self): user = User.objects.create_user('testuser', password='******') group = Group.objects.create(name='testgroup') user.groups.add(group) project = Project() project.save() # Group permissions are ignored if custom_permissions is False self.assertTrue(project.available_for(user)) project.custom_permissions = True project.save() self.assertFalse(project.available_for(user)) # Verify that giving the group access also gives the group members access self.assertFalse(user.has_perm('can_work_on', project)) assign_perm('can_work_on', group, project) self.assertTrue(user.has_perm('can_work_on', project)) self.assertTrue(project.available_for(user))
def test_batch_add_missing_file_field(self): project = Project(name='foo', html_template='<p>${emoji}: ${more_emoji}</p>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') response = client.post( u'/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'project': project.id, 'name': 'batch_save', }) self.assertTrue(b'error' in response.content) self.assertEqual(response.status_code, 200) self.assertTrue(b'This field is required' in response.content)
def test_batch_add_missing_project(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath( 'turkle/tests/resources/form_1_vals.csv')) as fp: response = client.post(u'/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'error' in response.content) self.assertEqual(response.status_code, 200) self.assertTrue(b'This field is required' in response.content)
def test_batch_add_missing_project(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') with open(os.path.abspath('turkle/tests/resources/form_1_vals.csv')) as fp: response = client.post( '/admin/turkle/batch/add/', { 'assignments_per_task': 1, 'name': 'batch_save', 'csv_file': fp }) self.assertTrue(b'Please correct the error' in response.content) self.assertEqual(response.status_code, 200) self.assertTrue(b'This field is required' in response.content)
def test_project_to_csv_different_answers_per_batch(self): project = Project(name='test', html_template='<p>${letter}</p><textarea>') project.save() batch_one = Batch(project=project) batch_one.save() task1 = Task( batch=batch_one, completed=True, input_csv_fields={'letter': 'a'}, ) task1.save() TaskAssignment( answers={'1': 1, '2': 2}, assigned_to=None, completed=True, task=task1 ).save() batch_two = Batch(project=project) batch_two.save() task2 = Task( batch=batch_two, completed=True, input_csv_fields={'letter': 'b'}, ) task2.save() TaskAssignment( answers={'3': 3, '4': 4}, assigned_to=None, completed=True, task=task2 ).save() csv_output = StringIO() project.to_csv(csv_output) rows = csv_output.getvalue().split('\r\n') self.assertTrue( '"Input.letter","Answer.1","Answer.2","Answer.3","Answer.4"' in rows[0]) self.assertTrue('"a","1","2","",""' in rows[1]) self.assertTrue('"b","","","3","4"' in rows[2])
def test_project_to_csv(self): project = Project(name='test', html_template='<p>${number} - ${letter}</p><textarea>') project.save() batch_one = Batch(project=project) batch_one.save() task1 = Task( batch=batch_one, completed=True, input_csv_fields={'number': '1', 'letter': 'a'}, ) task1.save() TaskAssignment( answers={'combined': '1a'}, assigned_to=None, completed=True, task=task1 ).save() batch_two = Batch(project=project) batch_two.save() task2 = Task( batch=batch_two, completed=True, input_csv_fields={'number': '2', 'letter': 'b'} ) task2.save() TaskAssignment( answers={'combined': '2b'}, assigned_to=None, completed=True, task=task2 ).save() csv_output = StringIO() project.to_csv(csv_output) rows = csv_output.getvalue().split('\r\n') self.assertTrue( '"Input.letter","Input.number","Answer.combined"' in rows[0]) self.assertTrue(any(['"a","1","1a"' in row for row in rows[1:]])) self.assertTrue(any(['"b","2","2b"' in row for row in rows[1:]]))
def test_batches_available_for(self): user = User.objects.create_user('testuser', password='******') project = Project( active=True, ) project.save() self.assertEqual(len(project.batches_available_for(user)), 0) Batch( active=False, project=project, ).save() self.assertEqual(len(project.batches_available_for(user)), 0) Batch( active=True, project=project, ).save() self.assertEqual(len(project.batches_available_for(user)), 1)
def test_batch_add_validation_variable_fields_per_row(self): project = Project(name='foo', html_template='<p>${f1} ${f2} ${f3}</p><textarea>') project.save() self.assertFalse(Batch.objects.filter(name='batch_save').exists()) client = django.test.Client() client.login(username='******', password='******') # CSV file has fields 'f2' and 'f3' with open(os.path.abspath('turkle/tests/resources/variable_fields_per_row.csv')) as fp: response = client.post( '/admin/turkle/batch/add/', { 'project': project.id, 'name': 'batch_save', 'csv_file': fp }) self.assertEqual(response.status_code, 200) self.assertTrue(b'Please correct the error' in response.content) self.assertTrue(b'line 2 has 2 fields' in response.content) self.assertTrue(b'line 4 has 4 fields' in response.content)
def test_batches_available_for_anon(self): anonymous_user = AnonymousUser() project_protected = Project( active=True, login_required=True, ) project_protected.save() self.assertEqual(len(project_protected.batches_available_for(anonymous_user)), 0) Batch(project=project_protected).save() self.assertEqual(len(project_protected.batches_available_for(anonymous_user)), 0) project_unprotected = Project( active=True, login_required=False, ) project_unprotected.save() self.assertEqual(len(project_unprotected.batches_available_for(anonymous_user)), 0) Batch(project=project_unprotected).save() self.assertEqual(len(project_unprotected.batches_available_for(anonymous_user)), 1)
def test_expire_all_abandoned(self): t = timezone.now() dt = datetime.timedelta(hours=2) past = t - dt project = Project(login_required=False) project.save() batch = Batch( allotted_assignment_time=1, project=project ) batch.save() task = Task(batch=batch) task.save() ha = TaskAssignment( completed=False, expires_at=past, task=task, ) # Bypass TaskAssignment's save(), which updates expires_at super(TaskAssignment, ha).save() self.assertEqual(TaskAssignment.objects.count(), 1) TaskAssignment.expire_all_abandoned() self.assertEqual(TaskAssignment.objects.count(), 0)
def test_map_fields_csv_row(self): project = Project( name='test', html_template="""</select> con relación a """ + """<span style="color: rgb(0, 0, 255);">""" + """${tweet0_entity}</span> en este mensaje.</p><textarea>""" ) project.save() batch = Batch(project=project) batch.save() task = Task( batch=batch, input_csv_fields=dict( zip( ["tweet0_id", "tweet0_entity"], ["268", "SANTOS"], ) ), ) task.save() expect = """</select> con relación a <span style="color:""" + \ """ rgb(0, 0, 255);">SANTOS</span> en este mensaje.</p><textarea>""" actual = task.populate_html_template() self.assertEqual(expect, actual)
class TestPreview(TestCase): def setUp(self): self.project = Project(html_template='<p>${foo}: ${bar}</p><textarea>', login_required=False, name='foo') self.project.save() self.batch = Batch(filename='foo.csv', project=self.project, name='foo') self.batch.save() self.task = Task( batch=self.batch, input_csv_fields={'foo': 'fufu', 'bar': 'baba'}, ) self.task.save() def test_get_preview(self): client = django.test.Client() response = client.get(reverse('preview', kwargs={'task_id': self.task.id})) self.assertEqual(response.status_code, 200) def test_get_preview_as_anonymous_but_login_required(self): self.project.login_required = True self.project.save() client = django.test.Client() response = client.get(reverse('preview', kwargs={'task_id': self.task.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'You do not have permission to view this Task') def test_get_preview_bad_task_id(self): client = django.test.Client() response = client.get(reverse('preview', kwargs={'task_id': 666})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Cannot find Task with ID {}'.format(666)) def test_get_preview_iframe(self): client = django.test.Client() response = client.get(reverse('preview_iframe', kwargs={'task_id': self.task.id})) self.assertEqual(response.status_code, 200) def test_get_preview_iframe_bad_task_id(self): client = django.test.Client() response = client.get(reverse('preview_iframe', kwargs={'task_id': 666})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Cannot find Task with ID {}'.format(666)) def test_get_preview_iframe_as_anonymous_but_login_required(self): self.project.login_required = True self.project.save() client = django.test.Client() response = client.get(reverse('preview_iframe', kwargs={'task_id': self.task.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'You do not have permission to view this Task') def test_preview_next_task(self): client = django.test.Client() response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('preview', kwargs={'task_id': self.task.id})) def test_preview_next_task_no_more_tasks(self): self.task.completed = True self.task.save() client = django.test.Client() response = client.get(reverse('preview_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertTrue('No more Tasks are available for Batch' in str(messages[0]))