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. """ admin = User.objects.create_superuser('admin', '*****@*****.**', 'secret') project = Project(name='test', html_template="<p>${foo}</p><textarea>") project.created_by = admin project.updated_by = admin save_model(project) batch = Batch(name='test', project=project, filename='test.csv') batch.created_by = admin batch.updated_by = admin save_model(batch) task = Task( batch=batch, input_csv_fields={'foo': 'bar'}, completed=True, ) task.save() self.task = task self.task_assignment = TaskAssignment( answers={ "comment": "\u221e", "userDisplayLanguage": "", "sentence_textbox_3_verb1": "", "city": "", "sentence_textbox_1_verb6": "", "sentence_textbox_1_verb7": "", "sentence_textbox_1_verb4": "", "sentence_textbox_1_verb5": "", "sentence_textbox_1_verb2": "", "sentence_textbox_1_verb3": "", "sentence_textbox_1_verb1": "", "sentence_textbox_2_verb4": "", "csrfmiddlewaretoken": "7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8", "sentence_drop_2_verb3": "foo", "sentence_drop_2_verb2": "foo", "sentence_drop_2_verb1": "foo", "sentence_textbox_2_verb1": "", "sentence_textbox_2_verb3": "", "sentence_drop_2_verb4": "foo", "sentence_textbox_2_verb2": "", "submitit": "Submit", "browserInfo": "", "sentence_drop_1_verb1": "foo", "sentence_drop_1_verb2": "foo", "sentence_drop_1_verb3": "foo", "sentence_drop_1_verb4": "foo", "sentence_drop_1_verb5": "foo", "sentence_drop_1_verb6": "foo", "sentence_drop_1_verb7": "foo", "country": "", "sentence_drop_3_verb1": "foo", "ipAddress": "", "region": "" }, assigned_to=None, completed=True, task=task ) self.task_assignment.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>') project.save() batch = Batch(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_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_access_permitted_for_active_flag(self): user = User.objects.create_user('testuser', password='******') self.assertEqual(len(Batch.access_permitted_for(user)), 0) active_project = Project.objects.create() inactive_project = Project.objects.create(active=False) Batch.objects.create( active=False, project=active_project, ) self.assertEqual(len(Batch.access_permitted_for(user)), 0) Batch.objects.create(active=False, project=inactive_project) self.assertEqual(len(Batch.access_permitted_for(user)), 0) Batch.objects.create(active=True, project=inactive_project) self.assertEqual(len(Batch.access_permitted_for(user)), 0) Batch.objects.create( active=True, project=active_project, ) self.assertEqual(len(Batch.access_permitted_for(user)), 1)
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 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_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_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 setUp(self): with open('turkle/tests/resources/form_0.html') as f: html_template = f.read() self.project = Project(name="filepath", html_template=html_template) self.project.save() self.batch = Batch(project=self.project) self.batch.save() field_names = "tweet0_id,tweet0_entity,tweet0_before_entity,tweet0_after_entity," + \ "tweet0_word0,tweet0_word1,tweet0_word2,tweet1_id,tweet1_entity," + \ "tweet1_before_entity,tweet1_after_entity,tweet1_word0,tweet1_word1,tweet1_word2," + \ "tweet2_id,tweet2_entity,tweet2_before_entity,tweet2_after_entity,tweet2_word0," + \ "tweet2_word1,tweet2_word2,tweet3_id,tweet3_entity,tweet3_before_entity," + \ "tweet3_after_entity,tweet3_word0,tweet3_word1,tweet3_word2,tweet4_id," + \ "tweet4_entity,tweet4_before_entity,tweet4_after_entity,tweet4_word0," + \ "tweet4_word1,tweet4_word2,tweet5_id,tweet5_entity,tweet5_before_entity," + \ "tweet5_after_entity,tweet5_word0,tweet5_word1,tweet5_word2", values = "268,SANTOS, Muy bien America ......... y lo siento mucho , un muy buen " + \ "rival,mucho, , ,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\ "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno, , ,478,ALEJANDRO," + \ " @aguillen19 , un super abrazo mi querido , , mis mejores deseos para " + \ "este 2012 ... muakkk !,querido, , ,906_control, PF, Acusan camioneros " + \ "extorsiones de, : Transportistas acusaron que deben pagar entre 13 y 15 mil " + \ "pesos a agentes que .. http://t.co/d8LUVvhP,acusaron, , ,2793_control," + \ " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \ " ,gusta, , ,357,OSCAR WILDE", " @ ifilosofia : Las " + \ "pequeñas acciones de cada dÃa son las que hacen o deshacen el carácter." , " + \ "bueno !!!! Es asÃ,bueno, , ", self.task = Task(batch=self.batch, input_csv_fields=dict(zip(field_names, values))) self.task.save()
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_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])
class TestAcceptTask(TestCase): 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_accept_unclaimed_task(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') self.assertEqual(self.task.taskassignment_set.count(), 0) client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('accept_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task.id})) self.assertEqual(response.status_code, 302) self.assertEqual(self.task.taskassignment_set.count(), 1) self.assertEqual(response['Location'], reverse('task_assignment', kwargs={'task_id': self.task.id, 'task_assignment_id': self.task.taskassignment_set.first().id})) def test_accept_unclaimed_task_as_anon(self): self.assertEqual(self.task.taskassignment_set.count(), 0) client = django.test.Client() response = client.get(reverse('accept_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task.id})) self.assertEqual(response.status_code, 302) self.assertEqual(self.task.taskassignment_set.count(), 1) self.assertEqual(response['Location'], reverse('task_assignment', kwargs={'task_id': self.task.id, 'task_assignment_id': self.task.taskassignment_set.first().id})) def test_accept_claimed_task(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') other_user = User.objects.create_user('testuser', password='******') TaskAssignment(assigned_to=other_user, task=self.task).save() self.assertEqual(self.task.taskassignment_set.count(), 1) client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('accept_task', kwargs={'batch_id': self.batch.id, '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]), 'The Task with ID {} is no longer available'.format(self.task.id))
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 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><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): 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): self.user = User.objects.create_user('testuser', password='******') self.project = Project() self.project.save() self.batch = Batch(project=self.project) self.batch.save() self.task = Task(batch=self.batch) self.task.save()
def setUp(self): self.project = Project(login_required=False) 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 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 test_available_tasks_for__aph_is_2(self): batch = Batch(assignments_per_task=2, project=self.project) batch.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) task = Task(batch=batch, ) task.save() self.assertEqual(batch.total_available_tasks_for(self.user), 1) task_assignment = TaskAssignment( assigned_to=self.user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) other_user = User.objects.create_user('other_user', password='******') self.assertEqual(batch.total_available_tasks_for(other_user), 1) task_assignment = TaskAssignment( assigned_to=other_user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(other_user), 0)
def test_available_tasks_for_anon_user(self): anon_user = AnonymousUser() user = User.objects.create_user('user', password='******') self.assertEqual(len(Batch.access_permitted_for(user)), 0) batch_protected = Batch.objects.create( active=True, login_required=True, project=self.project ) self.assertEqual(len(Batch.access_permitted_for(anon_user)), 0) self.assertEqual(len(Batch.access_permitted_for(user)), 1) Task.objects.create(batch=batch_protected) self.assertEqual(len(batch_protected.available_tasks_for(anon_user)), 0) self.assertEqual( Batch.available_task_counts_for(self.batch_query, anon_user)[batch_protected.id], 0) self.assertEqual(len(batch_protected.available_tasks_for(user)), 1) self.assertEqual( Batch.available_task_counts_for(self.batch_query, user)[batch_protected.id], 1) batch_unprotected = Batch.objects.create( active=True, login_required=False, project=self.project ) Task.objects.create(batch=batch_unprotected) self.assertEqual(len(Batch.access_permitted_for(anon_user)), 1) self.assertEqual(len(Batch.access_permitted_for(user)), 2) self.assertEqual(len(batch_unprotected.available_tasks_for(anon_user)), 1) self.assertEqual( Batch.available_task_counts_for(self.batch_query, anon_user)[batch_unprotected.id], 1) self.assertEqual(len(batch_unprotected.available_tasks_for(user)), 1) self.assertEqual( Batch.available_task_counts_for(self.batch_query, user)[batch_unprotected.id], 1)
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()
class TestCancelOrPublishBatch(django.test.TestCase): 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(active=False, project=project, name='MY_BATCH_NAME') self.batch.save() def test_batch_cancel(self): batch_id = self.batch.id client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 0) def test_batch_cancel_bad_batch_id(self): batch_id = 666 client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Cannot find Batch with ID 666') def test_batch_publish(self): batch_id = self.batch.id client = django.test.Client() self.assertFalse(self.batch.active) client.login(username='******', password='******') response = client.post(reverse('turkle_admin:publish_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 0) self.batch.refresh_from_db() self.assertTrue(self.batch.active) def test_batch_publish_bad_batch_id(self): batch_id = 666 client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:publish_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Cannot find Batch with ID 666')
class TestCancelOrPublishBatch(django.test.TestCase): def setUp(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>') project.save() self.batch = Batch(active=False, project=project, name='MY_BATCH_NAME') self.batch.save() def test_batch_cancel(self): batch_id = self.batch.id client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 0) def test_batch_cancel_bad_batch_id(self): batch_id = 666 client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:cancel_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), u'Cannot find Batch with ID 666') def test_batch_publish(self): batch_id = self.batch.id client = django.test.Client() self.assertFalse(self.batch.active) client.login(username='******', password='******') response = client.post(reverse('turkle_admin:publish_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 0) self.batch.refresh_from_db() self.assertTrue(self.batch.active) def test_batch_publish_bad_batch_id(self): batch_id = 666 client = django.test.Client() client.login(username='******', password='******') response = client.post(reverse('turkle_admin:publish_batch', kwargs={'batch_id': batch_id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('turkle_admin:turkle_batch_changelist')) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), u'Cannot find Batch with ID 666')
def test_access_permitted_for_login_required(self): anonymous_user = AnonymousUser() self.assertEqual(len(Batch.access_permitted_for(anonymous_user)), 0) project = Project.objects.create() Batch.objects.create(login_required=True, project=project) self.assertEqual(len(Batch.access_permitted_for(anonymous_user)), 0) authenticated_user = User.objects.create_user('testuser', password='******') self.assertEqual(len(Batch.access_permitted_for(authenticated_user)), 1)
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): 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 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 test_available_tasks_for__aph_is_2(self): batch = Batch( assignments_per_task=2, project=self.project ) batch.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) task = Task( batch=batch, ) task.save() self.assertEqual(batch.total_available_tasks_for(self.user), 1) task_assignment = TaskAssignment( assigned_to=self.user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) other_user = User.objects.create_user('other_user', password='******') self.assertEqual(batch.total_available_tasks_for(other_user), 1) task_assignment = TaskAssignment( assigned_to=other_user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(other_user), 0)
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 setUp(self): with open('turkle/tests/resources/form_0.html') as f: html_template = f.read() self.project = Project(name="filepath", html_template=html_template) self.project.save() self.batch = Batch(project=self.project) self.batch.save() field_names = "tweet0_id,tweet0_entity,tweet0_before_entity,tweet0_after_entity," + \ "tweet0_word0,tweet0_word1,tweet0_word2,tweet1_id,tweet1_entity," + \ "tweet1_before_entity,tweet1_after_entity,tweet1_word0,tweet1_word1,tweet1_word2," + \ "tweet2_id,tweet2_entity,tweet2_before_entity,tweet2_after_entity,tweet2_word0," + \ "tweet2_word1,tweet2_word2,tweet3_id,tweet3_entity,tweet3_before_entity," + \ "tweet3_after_entity,tweet3_word0,tweet3_word1,tweet3_word2,tweet4_id," + \ "tweet4_entity,tweet4_before_entity,tweet4_after_entity,tweet4_word0," + \ "tweet4_word1,tweet4_word2,tweet5_id,tweet5_entity,tweet5_before_entity," + \ "tweet5_after_entity,tweet5_word0,tweet5_word1,tweet5_word2", values = "268,SANTOS, Muy bien America ......... y lo siento mucho , un muy buen " + \ "rival,mucho, , ,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\ "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno, , ,478,ALEJANDRO," + \ " @aguillen19 , un super abrazo mi querido , , mis mejores deseos para " + \ "este 2012 ... muakkk !,querido, , ,906_control, PF, Acusan camioneros " + \ "extorsiones de, : Transportistas acusaron que deben pagar entre 13 y 15 mil " + \ "pesos a agentes que .. http://t.co/d8LUVvhP,acusaron, , ,2793_control," + \ " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \ " ,gusta, , ,357,OSCAR WILDE", " @ ifilosofia : Las " + \ "pequeñas acciones de cada dÃa son las que hacen o deshacen el carácter." , " + \ "bueno !!!! Es asÃ,bueno, , ", self.task = Task( batch=self.batch, input_csv_fields=dict(zip(field_names, values)) ) self.task.save()
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 index(request): """ Security behavior: - Anyone can access the page, but the page only shows the user information they have access to. """ abandoned_assignments = [] if request.user.is_authenticated: for ha in TaskAssignment.objects.filter( assigned_to=request.user).filter(completed=False): abandoned_assignments.append({ 'task': ha.task, 'task_assignment_id': ha.id }) batch_list = Batch.access_permitted_for(request.user) batch_query = Batch.objects.filter(id__in=[b.id for b in batch_list]) available_task_counts = Batch.available_task_counts_for( batch_query, request.user) batch_rows = [] for batch in batch_query.values('created_at', 'id', 'name', 'project__name'): total_tasks_available = available_task_counts[batch['id']] if total_tasks_available > 0: batch_rows.append({ 'project_name': batch['project__name'], 'batch_name': batch['name'], 'batch_published': batch['created_at'], 'assignments_available': total_tasks_available, 'preview_next_task_url': reverse('preview_next_task', kwargs={'batch_id': batch['id']}), 'accept_next_task_url': reverse('accept_next_task', kwargs={'batch_id': batch['id']}) }) return render(request, 'index.html', { 'abandoned_assignments': abandoned_assignments, 'batch_rows': batch_rows })
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_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()
class TestDownloadBatchCSV(TestCase): 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_get_as_admin(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') client = django.test.Client() client.login(username='******', password='******') download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id}) response = client.get(download_url) self.assertEqual(response.status_code, 200) self.assertEqual( response.get('Content-Disposition'), 'attachment; filename="%s"' % self.batch.csv_results_filename()) def test_get_as_rando(self): client = django.test.Client() client.login(username='******', password='******') download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id}) response = client.get(download_url) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], '/admin/login/?next=%s' % download_url)
def test_available_tasks_for__aph_is_1(self): batch = Batch(assignments_per_task=1, project=self.project) batch.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) self.assertEqual(batch.next_available_task_for(self.user), None) task = Task(batch=batch, ) task.save() self.assertEqual(batch.total_available_tasks_for(self.user), 1) self.assertEqual(batch.next_available_task_for(self.user), task) task_assignment = TaskAssignment( assigned_to=self.user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) self.assertEqual(batch.next_available_task_for(self.user), None)
def setUp(self): project = Project(name='foo', html_template='<p>${foo}: ${bar}</p>') 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 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_expire_all_abandoned__dont_delete_completed(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=True, 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(), 1)
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:]]))
class TestDownloadBatchCSV(TestCase): 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_get_as_admin(self): User.objects.create_superuser('admin', '*****@*****.**', 'secret') client = django.test.Client() client.login(username='******', password='******') download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id}) response = client.get(download_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Disposition'), 'attachment; filename="%s"' % self.batch.csv_results_filename()) def test_get_as_rando(self): client = django.test.Client() client.login(username='******', password='******') download_url = reverse('turkle_admin:download_batch', kwargs={'batch_id': self.batch.id}) response = client.get(download_url) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], '/admin/login/?next=%s' % download_url)
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)
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 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_available_tasks_for__aph_is_1(self): batch = Batch( assignments_per_task=1, project=self.project ) batch.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) self.assertEqual(batch.next_available_task_for(self.user), None) task = Task( batch=batch, ) task.save() self.assertEqual(batch.total_available_tasks_for(self.user), 1) self.assertEqual(batch.next_available_task_for(self.user), task) task_assignment = TaskAssignment( assigned_to=self.user, completed=False, task=task, ) task_assignment.save() self.assertEqual(batch.total_available_tasks_for(self.user), 0) self.assertEqual(batch.next_available_task_for(self.user), None)
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_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:]]))
class TestAcceptNextTask(TestCase): 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 test_accept_next_task(self): user = User.objects.create_user('testuser', password='******') self.assertEqual(self.task.taskassignment_set.count(), 0) client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) # We are redirected to the task_assignment view, but we can't predict the # full task_assignment URL self.assertTrue('{}/assignment/'.format(self.task.id) in response['Location']) self.assertEqual(self.task.taskassignment_set.count(), 1) self.assertEqual(self.task.taskassignment_set.first().assigned_to, user) def test_accept_next_task_as_anon(self): client = django.test.Client() response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) # We are redirected to the task_assignment view, but we can't predict the # full task_assignment URL self.assertTrue('{}/assignment/'.format(self.task.id) in response['Location']) def test_accept_next_task__bad_batch_id(self): User.objects.create_user('testuser', password='******') self.assertEqual(self.task.taskassignment_set.count(), 0) client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('accept_next_task', kwargs={'batch_id': 666})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) self.assertEqual(self.task.taskassignment_set.count(), 0) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Cannot find Task Batch with ID {}'.format(666)) def test_accept_next_task__no_more_tasks(self): User.objects.create_user('testuser', password='******') task_assignment = TaskAssignment(completed=True, task=self.task) task_assignment.save() self.assertEqual(self.task.taskassignment_set.count(), 1) client = django.test.Client() client.login(username='******', password='******') response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('index')) self.assertEqual(self.task.taskassignment_set.count(), 1) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'No more Tasks available for Batch {}'.format(self.batch.name)) def test_accept_next_task__respect_skip(self): task_two = Task(batch=self.batch) task_two.save() User.objects.create_user('testuser', password='******') client = django.test.Client() client.login(username='******', password='******') # Per the Django docs: # To modify the session and then save it, it must be stored in a variable first # (because a new SessionStore is created every time this property is accessed # https://docs.djangoproject.com/en/1.11/topics/testing/tools/#persistent-state s = client.session s.update({ 'skipped_tasks_in_batch': {str(self.batch.id): [str(self.task.id)]} }) s.save() response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertTrue('{}/assignment/'.format(task_two.id) in response['Location'])
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(active=False, project=project, name='MY_BATCH_NAME') self.batch.save()
class TestSkipTask(TestCase): 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_preview_next_task_order(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_one.id})) # Since no Tasks have been completed or skipped, preview_next_task redirects to same Task 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_one.id})) def test_skip_task(self): client = django.test.Client() # Skip task_one response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_one.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('preview_next_task', kwargs={'batch_id': self.batch.id})) # Verify that task_one has been skipped 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_two.id})) # Skip task_two response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_two.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('preview_next_task', kwargs={'batch_id': self.batch.id})) # Verify that task_two has been skipped 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_three.id})) # Skip task_three response = client.post(reverse('skip_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_three.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('preview_next_task', kwargs={'batch_id': self.batch.id})) # Verify that, with all existing Tasks skipped, we have been redirected back to # task_one and that info message is displayed about only skipped Tasks remaining 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_one.id})) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Only previously skipped Tasks are available') def test_skip_and_accept_next_task(self): client = django.test.Client() ha_one = TaskAssignment(task=self.task_one) ha_one.save() # Skip task_one response = client.post(reverse('skip_and_accept_next_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_one.id, 'task_assignment_id': ha_one.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) # Verify that task_one has been skipped response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertTrue('{}/assignment/'.format(self.task_two.id) in response['Location']) # Skip task_two ha_two = self.task_two.taskassignment_set.first() response = client.post(reverse('skip_and_accept_next_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_two.id, 'task_assignment_id': ha_two.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) # Verify that task_two has been skipped response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertTrue('{}/assignment/'.format(self.task_three.id) in response['Location']) # Skip task_three ha_three = self.task_three.taskassignment_set.first() response = client.post(reverse('skip_and_accept_next_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_three.id, 'task_assignment_id': ha_three.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) # Verify that, with all existing Tasks skipped, we have been redirected back to # task_one and that info message is displayed about only skipped Tasks remaining response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertTrue('{}/assignment/'.format(self.task_one.id) in response['Location']) messages = list(get_messages(response.wsgi_request)) self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Only previously skipped Tasks are available') # Skip task_one for a second time ha_one = self.task_one.taskassignment_set.first() response = client.post(reverse('skip_and_accept_next_task', kwargs={'batch_id': self.batch.id, 'task_id': self.task_one.id, 'task_assignment_id': ha_one.id})) self.assertEqual(response.status_code, 302) self.assertEqual(response['Location'], reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) # Verify that task_one has been skipped for a second time response = client.get(reverse('accept_next_task', kwargs={'batch_id': self.batch.id})) self.assertEqual(response.status_code, 302) self.assertTrue('{}/assignment/'.format(self.task_two.id) in response['Location'])
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]))