Ejemplo n.º 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()
Ejemplo n.º 2
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)
Ejemplo n.º 3
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])
Ejemplo n.º 4
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)
Ejemplo n.º 5
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')
Ejemplo n.º 6
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)
Ejemplo n.º 7
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()
Ejemplo n.º 8
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)
Ejemplo n.º 9
0
    def test_available_tasks_for__apt_is_1(self):
        batch = Batch(assignments_per_task=1, project=self.project)
        batch.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query,
                                            self.user)[batch.id], 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)

        task = Task(batch=batch, )
        task.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 1)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query,
                                            self.user)[batch.id], 1)
        self.assertEqual(batch.next_available_task_for(self.user), task)

        task_assignment = TaskAssignment(
            assigned_to=self.user,
            completed=False,
            task=task,
        )
        task_assignment.save()
        self.assertEqual(batch.total_available_tasks_for(self.user), 0)
        self.assertEqual(
            Batch.available_task_counts_for(self.batch_query,
                                            self.user)[batch.id], 0)
        self.assertEqual(batch.next_available_task_for(self.user), None)
Ejemplo n.º 10
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)
Ejemplo n.º 11
0
    def test_expire_abandoned_assignments(self):
        t = timezone.now()
        dt = datetime.timedelta(hours=2)
        past = t - dt

        project = Project(login_required=False)
        project.save()
        batch = Batch(allotted_assignment_time=1, project=project)
        batch.save()
        task = Task(batch=batch)
        task.save()
        ha = TaskAssignment(
            completed=False,
            expires_at=past,
            task=task,
        )
        # Bypass TaskAssignment's save(), which updates expires_at
        super(TaskAssignment, ha).save()
        self.assertEqual(TaskAssignment.objects.count(), 1)

        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        client = django.test.Client()
        client.login(username='******', password='******')
        response = client.get(
            reverse('turkle_admin:expire_abandoned_assignments'))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], '/admin/')
        self.assertEqual(TaskAssignment.objects.count(), 0)
        messages = list(get_messages(response.wsgi_request))
        self.assertEqual(len(messages), 1)
        self.assertEqual(str(messages[0]),
                         u'All 1 abandoned Tasks have been expired')
Ejemplo n.º 12
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'])
Ejemplo n.º 13
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])
Ejemplo n.º 14
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.
        """
        project = Project(name='test', html_template="<p>${foo}</p>")
        project.save()
        batch = Batch(project=project)
        batch.save()

        task = Task(
            batch=batch,
            input_csv_fields={u'foo': u'bar'},
            completed=True,
        )
        task.save()
        self.task = task

        self.task_assignment = TaskAssignment(answers={
            u"comment": u"\u221e",
            u"userDisplayLanguage": u"",
            u"sentence_textbox_3_verb1": u"",
            u"city": u"",
            u"sentence_textbox_1_verb6": u"",
            u"sentence_textbox_1_verb7": u"",
            u"sentence_textbox_1_verb4": u"",
            u"sentence_textbox_1_verb5": u"",
            u"sentence_textbox_1_verb2": u"",
            u"sentence_textbox_1_verb3": u"",
            u"sentence_textbox_1_verb1": u"",
            u"sentence_textbox_2_verb4": u"",
            u"csrfmiddlewaretoken": u"7zxQ9Yyug6Nsnm4nLky9p8ObJwNipdu8",
            u"sentence_drop_2_verb3": u"foo",
            u"sentence_drop_2_verb2": u"foo",
            u"sentence_drop_2_verb1": u"foo",
            u"sentence_textbox_2_verb1": u"",
            u"sentence_textbox_2_verb3": u"",
            u"sentence_drop_2_verb4": u"foo",
            u"sentence_textbox_2_verb2": u"",
            u"submitit": u"Submit",
            u"browserInfo": u"",
            u"sentence_drop_1_verb1": u"foo",
            u"sentence_drop_1_verb2": u"foo",
            u"sentence_drop_1_verb3": u"foo",
            u"sentence_drop_1_verb4": u"foo",
            u"sentence_drop_1_verb5": u"foo",
            u"sentence_drop_1_verb6": u"foo",
            u"sentence_drop_1_verb7": u"foo",
            u"country": u"",
            u"sentence_drop_3_verb1": u"foo",
            u"ipAddress": u"",
            u"region": u""
        },
                                              assigned_to=None,
                                              completed=True,
                                              task=task)
        self.task_assignment.save()
Ejemplo n.º 15
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))
Ejemplo n.º 16
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)
Ejemplo n.º 17
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)))
Ejemplo n.º 18
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:]]))
Ejemplo n.º 19
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)
Ejemplo n.º 20
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])
Ejemplo n.º 21
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()
Ejemplo n.º 22
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)
Ejemplo n.º 23
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()
Ejemplo n.º 24
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:]]))
Ejemplo n.º 25
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])
Ejemplo n.º 26
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)
Ejemplo n.º 27
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:]]))
Ejemplo n.º 28
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)
Ejemplo n.º 29
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'])
Ejemplo n.º 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)
Ejemplo n.º 31
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)
Ejemplo n.º 32
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)
Ejemplo n.º 33
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)
Ejemplo n.º 34
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)
Ejemplo n.º 35
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)
Ejemplo n.º 36
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:]]))
Ejemplo n.º 37
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]))
Ejemplo n.º 38
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'])
Ejemplo n.º 39
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)
Ejemplo n.º 40
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')
Ejemplo n.º 41
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)
Ejemplo n.º 42
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}))
Ejemplo n.º 43
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}))
Ejemplo n.º 44
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]),
            u'The Task with ID {} is no longer available'.format(self.task.id))
Ejemplo n.º 45
0
class TestPreview(TestCase):
    def setUp(self):
        self.project = Project(html_template='<p>${foo}: ${bar}</p>',
                               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]),
                         u'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]),
                         u'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]),
                         u'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]),
                         u'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(
            u'No more Tasks are available for Batch' in str(messages[0]))
Ejemplo n.º 46
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)
Ejemplo n.º 47
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')
Ejemplo n.º 48
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]),
                         u'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]),
                         u'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'])
Ejemplo n.º 49
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'])
Ejemplo n.º 50
0
class TestAcceptNextTask(TestCase):
    def setUp(self):
        project = Project(login_required=False,
                          name='foo',
                          html_template='<p>${foo}: ${bar}</p>')
        project.save()

        self.batch = Batch(project=project, name='foo', filename='foo.csv')
        self.batch.save()

        self.task = Task(batch=self.batch,
                         input_csv_fields={
                             'foo': 'fufu',
                             'bar': 'baba'
                         })
        self.task.save()

    def test_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]),
                         u'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]),
            u'No more Tasks available from Batch {}'.format(self.batch.id))

    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'])