Пример #1
0
    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()
Пример #2
0
    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)
Пример #3
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')
Пример #4
0
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)
Пример #5
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))
Пример #6
0
    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()
Пример #7
0
    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()
Пример #8
0
 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()
Пример #9
0
 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()
Пример #10
0
 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()
Пример #11
0
 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()
Пример #12
0
    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])
Пример #13
0
    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)
Пример #14
0
    def test_available_task_for_deactivated_project(self):
        user = User.objects.create_user('testuser', password='******')
        project = Project.objects.create(active=False)
        batch = Batch.objects.create(project=project)
        task1 = Task(
            batch=batch,
            completed=False,
            input_csv_fields={
                'number': '1',
                'letter': 'a'
            },
        )
        task1.save()

        self.assertEqual(0, len(batch.available_tasks_for(user)))
Пример #15
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()
Пример #16
0
    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,&nbsp;,&nbsp;,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\
            "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno,&nbsp;,&nbsp;,478,ALEJANDRO," + \
            " @aguillen19 &#44; un super abrazo mi querido , &#44; mis mejores deseos para " + \
            "este 2012 ... muakkk !,querido,&nbsp;,&nbsp;,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,&nbsp;,&nbsp;,2793_control," + \
            " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \
            "&nbsp;,gusta,&nbsp;,&nbsp;,357,OSCAR WILDE&QUOT;, &quot; @ ifilosofia : Las " + \
            "pequeñas acciones de cada día son las que hacen o deshacen el carácter.&quot; , " + \
            "bueno !!!! Es así,bueno,&nbsp;,&nbsp;",
        self.task = Task(
            batch=self.batch,
            input_csv_fields=dict(zip(field_names, values))
        )
        self.task.save()
Пример #17
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)
Пример #18
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()
Пример #19
0
    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:]]))
Пример #20
0
    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)
Пример #21
0
    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()
Пример #22
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()
Пример #23
0
    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()
Пример #24
0
    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()
Пример #25
0
    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)
Пример #26
0
 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()
Пример #27
0
    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)
Пример #28
0
    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])
Пример #29
0
    def test_batch_to_csv(self):
        template = '<p>${number} - ${letter}</p><textarea>'
        project = Project.objects.create(name='test', html_template=template)
        batch = Batch.objects.create(project=project)
        user = User.objects.create(username='******')

        task1 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={
                'number': '1',
                'letter': 'a'
            },
        )
        task1.save()
        ta = TaskAssignment(
            answers={'combined': '1a'},
            assigned_to=user,
            completed=True,
            task=task1,
        )
        ta.save()
        time_string = ta.created_at.strftime("%a %b %d %H:%M:%S %Z %Y")

        task2 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={
                'number': '2',
                'letter': 'b'
            },
        )
        task2.save()
        TaskAssignment(answers={
            'combined': '2b'
        },
                       assigned_to=user,
                       completed=True,
                       task=task2).save()

        csv_output = StringIO()
        batch.to_csv(csv_output)
        csv_string = csv_output.getvalue()
        self.assertTrue(
            '"Input.letter","Input.number","Answer.combined","Turkle.Username"\r\n'
            in csv_string)
        self.assertTrue('"b","2","2b","joe"\r\n' in csv_string)
        self.assertTrue('"a","1","1a","joe"\r\n' in csv_string)
        self.assertTrue(time_string in csv_string)
Пример #30
0
 def test_map_fields_csv_row(self):
     project = Project(
         name='test',
         html_template="""</select> con relaci&oacute;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&oacute;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)
Пример #31
0
    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'])
Пример #32
0
    def test_available_tasks_for__apt_is_2(self):
        batch = Batch(assignments_per_task=2, 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)

        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)

        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)

        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)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query,
                                            self.user)[batch.id], 0)
Пример #33
0
 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()
Пример #34
0
 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()
Пример #35
0
    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:]]))
Пример #36
0
    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)
Пример #37
0
    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)
Пример #38
0
 def test_map_fields_csv_row(self):
     project = Project(
         name='test',
         html_template="""</select> con relaci&oacute;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&oacute;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)
Пример #39
0
    def setUp(self):
        with open('turkle/tests/resources/form_0.html') as f:
            html_template = f.read()
            # python 2 compat hack
            try:
                html_template = html_template.decode('utf-8')
            except AttributeError:
                pass

        self.project = Project(name="filepath", html_template=html_template)
        self.project.save()
        self.batch = Batch(project=self.project)
        self.batch.save()
        field_names = u"tweet0_id,tweet0_entity,tweet0_before_entity,tweet0_after_entity," + \
            u"tweet0_word0,tweet0_word1,tweet0_word2,tweet1_id,tweet1_entity," + \
            u"tweet1_before_entity,tweet1_after_entity,tweet1_word0,tweet1_word1,tweet1_word2," + \
            u"tweet2_id,tweet2_entity,tweet2_before_entity,tweet2_after_entity,tweet2_word0," + \
            u"tweet2_word1,tweet2_word2,tweet3_id,tweet3_entity,tweet3_before_entity," + \
            u"tweet3_after_entity,tweet3_word0,tweet3_word1,tweet3_word2,tweet4_id," + \
            u"tweet4_entity,tweet4_before_entity,tweet4_after_entity,tweet4_word0," + \
            u"tweet4_word1,tweet4_word2,tweet5_id,tweet5_entity,tweet5_before_entity," + \
            u"tweet5_after_entity,tweet5_word0,tweet5_word1,tweet5_word2",
        values = u"268,SANTOS, Muy bien America ......... y lo siento mucho , un muy buen " + \
            u"rival,mucho,&nbsp;,&nbsp;,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\
            u"tipo de milagros . @jcabrerac @CarlosCabreraR,bueno,&nbsp;,&nbsp;,478,ALEJANDRO," + \
            u" @aguillen19 &#44; un super abrazo mi querido , &#44; mis mejores deseos para " + \
            u"este 2012 ... muakkk !,querido,&nbsp;,&nbsp;,906_control, PF, Acusan camioneros " + \
            u"extorsiones de, : Transportistas acusaron que deben pagar entre 13 y 15 mil " + \
            u"pesos a agentes que .. http://t.co/d8LUVvhP,acusaron,&nbsp;,&nbsp;,2793_control," + \
            u" CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \
            u"&nbsp;,gusta,&nbsp;,&nbsp;,357,OSCAR WILDE&QUOT;, &quot; @ ifilosofia : Las " + \
            u"pequeñas acciones de cada día son las que hacen o deshacen el carácter.&quot; , " + \
            u"bueno !!!! Es así,bueno,&nbsp;,&nbsp;",
        self.task = Task(batch=self.batch,
                         input_csv_fields=dict(zip(field_names, values)))
        self.task.save()
Пример #40
0
    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)
Пример #41
0
class TestIndexAbandonedAssignments(TestCase):
    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 test_index_abandoned_assignment(self):
        TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=self.task,
        ).save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(b'You have abandoned' in response.content)

    def test_index_no_abandoned_assignments(self):
        TaskAssignment(
            assigned_to=None,
            completed=False,
            task=self.task,
        ).save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'You have abandoned' in response.content)
Пример #42
0
    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)
Пример #43
0
class TestIndexAbandonedAssignments(TestCase):
    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 test_index_abandoned_assignment(self):
        TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=self.task,
        ).save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(b'You have abandoned' in response.content)

    def test_index_no_abandoned_assignments(self):
        TaskAssignment(
            assigned_to=None,
            completed=False,
            task=self.task,
        ).save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'You have abandoned' in response.content)
Пример #44
0
    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])
Пример #45
0
 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()
Пример #46
0
    def test_batch_to_csv(self):
        template = '<p>${number} - ${letter}</p><textarea>'
        project = Project.objects.create(name='test', html_template=template)
        batch = Batch.objects.create(project=project)
        user = User.objects.create(username='******')

        task1 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'number': '1', 'letter': 'a'},
        )
        task1.save()
        ta = TaskAssignment(
            answers={'combined': '1a'},
            assigned_to=user,
            completed=True,
            task=task1,
        )
        ta.save()
        time_string = ta.created_at.strftime("%a %b %d %H:%M:%S %Z %Y")

        task2 = Task(
            batch=batch,
            completed=True,
            input_csv_fields={'number': '2', 'letter': 'b'},
        )
        task2.save()
        TaskAssignment(
            answers={'combined': '2b'},
            assigned_to=user,
            completed=True,
            task=task2
        ).save()

        csv_output = StringIO()
        batch.to_csv(csv_output)
        csv_string = csv_output.getvalue()
        self.assertTrue(
            '"Input.letter","Input.number","Answer.combined","Turkle.Username"\r\n'
            in csv_string)
        self.assertTrue('"b","2","2b","joe"\r\n' in csv_string)
        self.assertTrue('"a","1","1a","joe"\r\n' in csv_string)
        self.assertTrue(time_string in csv_string)
Пример #47
0
    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:]]))
Пример #48
0
    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])
Пример #49
0
    def test_task_marked_as_completed(self):
        # When assignment_per_task==1, completing 1 Assignment marks Task as complete
        project = Project(name='test',
                          html_template='<p>${number} - ${letter}</p>')
        project.save()
        batch = Batch(project=project)
        batch.save()

        task = Task(batch=batch,
                    input_csv_fields={
                        'number': '1',
                        'letter': 'a'
                    })
        task.save()

        self.assertEqual(batch.assignments_per_task, 1)
        self.assertFalse(task.completed)

        TaskAssignment(assigned_to=None, completed=True, task=task).save()

        task.refresh_from_db()
        self.assertTrue(task.completed)
Пример #50
0
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'])
Пример #51
0
class TestReturnTaskAssignment(TestCase):
    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 test_return_task_assignment(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(
            assigned_to=user,
            task=self.task
        )
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('return_task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': task_assignment.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_return_completed_task_assignment(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(
            assigned_to=user,
            completed=True,
            task=self.task
        )
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('return_task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': 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.assertEqual(str(messages[0]),
                         "The Task can't be returned because it has been completed")

    def test_return_task_assignment_as_anonymous_user(self):
        task_assignment = TaskAssignment(
            assigned_to=None,
            task=self.task
        )
        task_assignment.save()

        client = django.test.Client()
        response = client.get(reverse('return_task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': task_assignment.id}))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_return_task_assignment__anon_user_returns_other_users_task(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(
            assigned_to=user,
            task=self.task
        )
        task_assignment.save()

        client = django.test.Client()
        response = client.get(reverse('return_task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': 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.assertEqual(str(messages[0]),
                         'The Task you are trying to return belongs to another user')

    def test_return_task_assignment__user_returns_anon_users_task(self):
        User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(
            assigned_to=None,
            task=self.task
        )
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('return_task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': 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.assertEqual(str(messages[0]),
                         'The Task you are trying to return belongs to another user')
Пример #52
0
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]))
Пример #53
0
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)
Пример #54
0
class TestTaskAssignment(TestCase):
    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_get_task_assignment(self):
        client = django.test.Client()
        response = client.get(reverse('task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_id': self.task_assignment.id}))
        self.assertEqual(response.status_code, 200)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)

    def test_get_task_assignment_with_bad_task_id(self):
        client = django.test.Client()
        response = client.get(reverse('task_assignment',
                                      kwargs={'task_id': 666,
                                              '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.assertEqual(str(messages[0]),
                         'Cannot find Task with ID {}'.format(666))

    def test_get_task_assignment_with_bad_task_assignment_id(self):
        client = django.test.Client()
        response = client.get(reverse('task_assignment',
                                      kwargs={'task_id': self.task.id,
                                              'task_assignment_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 Assignment with ID {}'.format(666))

    def test_get_task_assignment_with_wrong_user(self):
        user = User.objects.create_user('testuser', password='******')
        User.objects.create_user('wrong_user', password='******')
        self.task_assignment.assigned_to = user
        self.task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(reverse('task_assignment',
                                      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_get_task_assignment_owned_by_user_as_anonymous(self):
        user = User.objects.create_user('testuser', password='******')
        self.task_assignment.assigned_to = user
        self.task_assignment.save()

        client = django.test.Client()
        response = client.get(reverse('task_assignment',
                                      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_submit_assignment_without_auto_accept(self):
        client = django.test.Client()

        s = client.session
        s.update({'auto_accept_status': False})
        s.save()

        response = client.post(reverse('task_assignment',
                                       kwargs={'task_id': self.task.id,
                                               'task_assignment_id': self.task_assignment.id}),
                               {'foo': 'bar'})
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_submit_assignment_with_auto_accept(self):
        client = django.test.Client()

        s = client.session
        s.update({'auto_accept_status': True})
        s.save()

        response = client.post(reverse('task_assignment',
                                       kwargs={'task_id': self.task.id,
                                               'task_assignment_id': self.task_assignment.id}),
                               {'foo': 'bar'})
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('accept_next_task',
                                                       kwargs={'batch_id': self.task.batch_id}))
Пример #55
0
    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:]]))
Пример #56
0
    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()
Пример #57
0
class TestGenerateForm(django.test.TestCase):
    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,&nbsp;,&nbsp;,2472,GREGORY, Ah bueno , tampoco andes pidiendo ese " +\
            "tipo de milagros . @jcabrerac @CarlosCabreraR,bueno,&nbsp;,&nbsp;,478,ALEJANDRO," + \
            " @aguillen19 &#44; un super abrazo mi querido , &#44; mis mejores deseos para " + \
            "este 2012 ... muakkk !,querido,&nbsp;,&nbsp;,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,&nbsp;,&nbsp;,2793_control," + \
            " CHICARO, Me gusta cuando chicharo hace su oracion es lo que lo hace especial .," + \
            "&nbsp;,gusta,&nbsp;,&nbsp;,357,OSCAR WILDE&QUOT;, &quot; @ ifilosofia : Las " + \
            "pequeñas acciones de cada día son las que hacen o deshacen el carácter.&quot; , " + \
            "bueno !!!! Es así,bueno,&nbsp;,&nbsp;",
        self.task = Task(batch=self.batch,
                         input_csv_fields=dict(zip(field_names, values)))
        self.task.save()

    def test_populate_html_template(self):
        with open('turkle/tests/resources/form_0_filled.html') as f:
            form = f.read()

        expect = form
        actual = self.task.populate_html_template()
        self.assertNotEqual(expect, actual)

    def test_map_fields_csv_row(self):
        project = Project(
            name='test',
            html_template="""</select> con relaci&oacute;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&oacute;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)
Пример #58
0
class TestTaskAssignment(TestCase):
    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_get_task_assignment(self):
        client = django.test.Client()
        response = client.get(
            reverse('task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': self.task_assignment.id
                    }))
        self.assertEqual(response.status_code, 200)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 0)

    def test_get_task_assignment_with_bad_task_id(self):
        client = django.test.Client()
        response = client.get(
            reverse('task_assignment',
                    kwargs={
                        'task_id': 666,
                        '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.assertEqual(str(messages[0]),
                         'Cannot find Task with ID {}'.format(666))

    def test_get_task_assignment_with_bad_task_assignment_id(self):
        client = django.test.Client()
        response = client.get(
            reverse('task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_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 Assignment with ID {}'.format(666))

    def test_get_task_assignment_with_wrong_user(self):
        user = User.objects.create_user('testuser', password='******')
        User.objects.create_user('wrong_user', password='******')
        self.task_assignment.assigned_to = user
        self.task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('task_assignment',
                    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_get_task_assignment_owned_by_user_as_anonymous(self):
        user = User.objects.create_user('testuser', password='******')
        self.task_assignment.assigned_to = user
        self.task_assignment.save()

        client = django.test.Client()
        response = client.get(
            reverse('task_assignment',
                    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_submit_assignment_without_auto_accept(self):
        client = django.test.Client()

        s = client.session
        s.update({'auto_accept_status': False})
        s.save()

        response = client.post(
            reverse('task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': self.task_assignment.id
                    }), {'foo': 'bar'})
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_submit_assignment_with_auto_accept(self):
        client = django.test.Client()

        s = client.session
        s.update({'auto_accept_status': True})
        s.save()

        response = client.post(
            reverse('task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': self.task_assignment.id
                    }), {'foo': 'bar'})
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response['Location'],
            reverse('accept_next_task',
                    kwargs={'batch_id': self.task.batch_id}))
Пример #59
0
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'])
Пример #60
0
class TestReturnTaskAssignment(TestCase):
    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 test_return_task_assignment(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(assigned_to=user, task=self.task)
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('return_task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': task_assignment.id
                    }))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_return_completed_task_assignment(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(assigned_to=user,
                                         completed=True,
                                         task=self.task)
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('return_task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': 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.assertEqual(
            str(messages[0]),
            "The Task can't be returned because it has been completed")

    def test_return_task_assignment_as_anonymous_user(self):
        task_assignment = TaskAssignment(assigned_to=None, task=self.task)
        task_assignment.save()

        client = django.test.Client()
        response = client.get(
            reverse('return_task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': task_assignment.id
                    }))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], reverse('index'))

    def test_return_task_assignment__anon_user_returns_other_users_task(self):
        user = User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(assigned_to=user, task=self.task)
        task_assignment.save()

        client = django.test.Client()
        response = client.get(
            reverse('return_task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': 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.assertEqual(
            str(messages[0]),
            'The Task you are trying to return belongs to another user')

    def test_return_task_assignment__user_returns_anon_users_task(self):
        User.objects.create_user('testuser', password='******')

        task_assignment = TaskAssignment(assigned_to=None, task=self.task)
        task_assignment.save()

        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('return_task_assignment',
                    kwargs={
                        'task_id': self.task.id,
                        'task_assignment_id': 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.assertEqual(
            str(messages[0]),
            'The Task you are trying to return belongs to another user')