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_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_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_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 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><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_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_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 test_available_tasks_for__apt_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.available_task_counts_for(self.batch_query, self.user)[batch.id], 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.available_task_counts_for(self.batch_query, self.user)[batch.id], 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.available_task_counts_for(self.batch_query, self.user)[batch.id], 0) self.assertEqual(batch.next_available_task_for(self.user), None)
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) project.save() self.batch = Batch(project=project) self.batch.save() self.task = Task(batch=self.batch) self.task.save()
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_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_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): 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 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.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 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 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 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 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): 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>${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_login_required_validation_3(self): with self.assertRaisesMessage(ValidationError, 'Assignments per Task must be 1'): project = Project( name='test', html_template='<textarea>', created_by=self.admin, updated_by=self.admin, ) save_model(project) Batch( name='test', assignments_per_task=2, login_required=False, project=project, ).clean()
def test_login_required_validation_2(self): # No ValidationError thrown project = Project( name='test', login_required=True, html_template='<textarea>', created_by=self.admin, updated_by=self.admin, ) save_model(project) Batch( name='test', assignments_per_task=2, project=project, ).clean()
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_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)