Ejemplo n.º 1
0
    def test_get_form_json(self):
        """Get the JSON to rebuild the form builder"""
        crowdsource = CrowdsourceFactory()
        CrowdsourceTextFieldFactory(
            crowdsource=crowdsource,
            label='Text Field',
            help_text='Help',
            order=0,
        )
        CrowdsourceSelectFieldFactory(
            crowdsource=crowdsource,
            label='Select Field',
            order=1,
        )
        form_data = json.loads(crowdsource.get_form_json())
        eq_(form_data[0]['type'], 'text')
        eq_(form_data[0]['label'], 'Text Field')
        eq_(form_data[0]['description'], 'Help')

        eq_(form_data[1]['type'], 'select')
        eq_(form_data[1]['label'], 'Select Field')
        eq_(len(form_data[1]['values']), 3)
        eq_(
            set(form_data[1]['values'][0].keys()),
            {'value', 'label'},
        )
Ejemplo n.º 2
0
 def test_get_data_to_show(self):
     """Get data to show should pick the correct data"""
     crowdsource = CrowdsourceFactory()
     ip_address = None
     assert_is_none(
         crowdsource.get_data_to_show(crowdsource.user, ip_address))
     data = CrowdsourceDataFactory(crowdsource=crowdsource)
     eq_(data, crowdsource.get_data_to_show(crowdsource.user, ip_address))
Ejemplo n.º 3
0
 def test_get_metadata_keys(self):
     """Get the metadata keys associated with this crowdsoucre's data"""
     crowdsource = CrowdsourceFactory()
     eq_(crowdsource.get_metadata_keys(), [])
     data = CrowdsourceDataFactory(crowdsource=crowdsource)
     eq_(crowdsource.get_metadata_keys(), [])
     data.metadata = {"foo": "bar", "muck": "rock"}
     data.save()
     eq_(set(crowdsource.get_metadata_keys()), {"foo", "muck"})
Ejemplo n.º 4
0
 def test_get_metadata_keys(self):
     """Get the metadata keys associated with this crowdsoucre's data"""
     crowdsource = CrowdsourceFactory()
     eq_(crowdsource.get_metadata_keys(), [])
     data = CrowdsourceDataFactory(crowdsource=crowdsource)
     eq_(crowdsource.get_metadata_keys(), [])
     data.metadata = {'foo': 'bar', 'muck': 'rock'}
     data.save()
     eq_(set(crowdsource.get_metadata_keys()), {'foo', 'muck'})
Ejemplo n.º 5
0
 def test_create_form(self):
     """Create form should create fields from the JSON"""
     crowdsource = CrowdsourceFactory()
     CrowdsourceTextFieldFactory(
         crowdsource=crowdsource,
         label='Delete Me',
         order=0,
     )
     crowdsource.create_form(
         json.dumps([
             {
                 'label': 'Text Field',
                 'type': 'text',
                 'description': 'Here is some help',
             },
             {
                 'label':
                     'Select Field',
                 'type':
                     'select',
                 'values': [
                     {
                         'label': 'Choice 1',
                         'value': 'choice-1',
                     },
                     {
                         'label': 'Choice 2',
                         'value': 'choice-2',
                     },
                 ],
             },
         ])
     )
     assert_false(crowdsource.fields.filter(label='Delete Me').exists())
     ok_(
         crowdsource.fields.filter(
             label='Text Field',
             type='text',
             help_text='Here is some help',
             order=0,
         ).exists()
     )
     ok_(
         crowdsource.fields.filter(
             label='Select Field',
             type='select',
             order=1,
         ).exists()
     )
     eq_(crowdsource.fields.get(label='Select Field').choices.count(), 2)
Ejemplo n.º 6
0
    def test_get_values(self):
        """Test getting the values from the response"""
        crowdsource = CrowdsourceFactory()
        response = CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user__username="******",
            datetime=datetime(2017,
                              1,
                              2,
                              tzinfo=timezone.get_current_timezone()),
            data=None,
        )
        field = CrowdsourceTextFieldFactory(crowdsource=crowdsource, order=0)
        CrowdsourceHeaderFieldFactory(crowdsource=crowdsource, order=1)
        CrowdsourceValueFactory(response=response, field=field, value="Value")

        eq_(
            response.get_values([]),
            [
                "Username",
                False,
                "2017-01-02 00:00:00",
                False,
                False,
                False,
                "",
                "Value",
            ],
        )
Ejemplo n.º 7
0
    def test_has_assignment_no_limit(self):
        """Test the has assignment method without a user limit"""
        # pylint: disable=protected-access
        view = CrowdsourceFormView()
        crowdsource = CrowdsourceFactory(user_limit=False)
        user = UserFactory()
        ip_address = '127.0.0.1'

        # should always return true

        # the user hasn't replied yet, should have an assignment
        assert_true(view._has_assignment(crowdsource, user, None))

        # the user replied, they may reply again
        CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user=user,
        )
        assert_true(view._has_assignment(crowdsource, user, None))

        # the ip address hasn't replied yet, should have an assignment
        assert_true(
            view._has_assignment(crowdsource, AnonymousUser(), ip_address))

        # the ip address replied, they may reply again
        CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user=None,
            ip_address=ip_address,
        )
        assert_true(
            view._has_assignment(crowdsource, AnonymousUser(), ip_address))
Ejemplo n.º 8
0
    def test_get_values(self):
        """Test getting the values from the response"""
        crowdsource = CrowdsourceFactory()
        response = CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user__username='******',
            datetime=datetime(
                2017, 1, 2, tzinfo=timezone.get_current_timezone()
            ),
            data=None,
        )
        field = CrowdsourceTextFieldFactory(
            crowdsource=crowdsource,
            order=0,
        )
        CrowdsourceValueFactory(
            response=response,
            field=field,
            value='Value',
        )

        eq_(
            response.get_values([]),
            [
                'Username',
                '2017-01-02 00:00:00',
                False,
                False,
                False,
                '',
                'Value',
            ],
        )
Ejemplo n.º 9
0
    def test_get_viewable(self):
        """Get the list of viewable crowdsources for the user"""
        project = ProjectFactory()
        admin = UserFactory(is_staff=True)
        proj_user, owner, user = UserFactory.create_batch(3)
        project.contributors.add(proj_user)

        draft_crowdsource = CrowdsourceFactory(user=owner, status='draft')
        open_crowdsource = CrowdsourceFactory(user=owner, status='open')
        closed_crowdsource = CrowdsourceFactory(user=owner, status='close')
        project_crowdsource = CrowdsourceFactory(
            user=owner,
            status='open',
            project=project,
            project_only=True,
        )

        crowdsources = Crowdsource.objects.get_viewable(admin)
        assert_in(draft_crowdsource, crowdsources)
        assert_in(open_crowdsource, crowdsources)
        assert_in(closed_crowdsource, crowdsources)
        assert_in(project_crowdsource, crowdsources)

        crowdsources = Crowdsource.objects.get_viewable(proj_user)
        assert_not_in(draft_crowdsource, crowdsources)
        assert_in(open_crowdsource, crowdsources)
        assert_not_in(closed_crowdsource, crowdsources)
        assert_in(project_crowdsource, crowdsources)

        crowdsources = Crowdsource.objects.get_viewable(owner)
        assert_in(draft_crowdsource, crowdsources)
        assert_in(open_crowdsource, crowdsources)
        assert_in(closed_crowdsource, crowdsources)
        assert_in(project_crowdsource, crowdsources)

        crowdsources = Crowdsource.objects.get_viewable(user)
        assert_not_in(draft_crowdsource, crowdsources)
        assert_in(open_crowdsource, crowdsources)
        assert_not_in(closed_crowdsource, crowdsources)
        assert_not_in(project_crowdsource, crowdsources)

        crowdsources = Crowdsource.objects.get_viewable(AnonymousUser())
        assert_not_in(draft_crowdsource, crowdsources)
        assert_in(open_crowdsource, crowdsources)
        assert_not_in(closed_crowdsource, crowdsources)
        assert_not_in(project_crowdsource, crowdsources)
Ejemplo n.º 10
0
    def test_get_form_json(self):
        """Get the JSON to rebuild the form builder"""
        crowdsource = CrowdsourceFactory()
        CrowdsourceTextFieldFactory(crowdsource=crowdsource,
                                    label="Text Field",
                                    help_text="Help",
                                    order=0)
        CrowdsourceSelectFieldFactory(crowdsource=crowdsource,
                                      label="Select Field",
                                      order=1)
        form_data = json.loads(crowdsource.get_form_json())
        eq_(form_data[0]["type"], "text")
        eq_(form_data[0]["label"], "Text Field")
        eq_(form_data[0]["description"], "Help")

        eq_(form_data[1]["type"], "select")
        eq_(form_data[1]["label"], "Select Field")
        eq_(len(form_data[1]["values"]), 3)
        eq_(set(form_data[1]["values"][0].keys()), {"value", "label"})
Ejemplo n.º 11
0
 def test_create_form(self):
     """Create form should create fields from the JSON"""
     crowdsource = CrowdsourceFactory()
     CrowdsourceTextFieldFactory(crowdsource=crowdsource,
                                 label="Delete Me",
                                 order=0)
     crowdsource.create_form(
         json.dumps([
             {
                 "label": "Text Field",
                 "type": "text",
                 "description": "Here is some help",
             },
             {
                 "label":
                 "Select Field",
                 "type":
                 "select",
                 "values": [
                     {
                         "label": "Choice 1",
                         "value": "choice-1"
                     },
                     {
                         "label": "Choice 2",
                         "value": "choice-2"
                     },
                 ],
             },
         ]))
     ok_(crowdsource.fields.get(label="Delete Me").deleted)
     ok_(
         crowdsource.fields.filter(label="Text Field",
                                   type="text",
                                   help_text="Here is some help",
                                   order=0).exists())
     ok_(
         crowdsource.fields.filter(label="Select Field",
                                   type="select",
                                   order=1).exists())
     eq_(crowdsource.fields.get(label="Select Field").choices.count(), 2)
Ejemplo n.º 12
0
 def test_authenticated_cannot_view(self):
     """Authenticated users cannot view a crowdsource's details"""
     crowdsource = CrowdsourceFactory()
     url = reverse(
         "crowdsource-detail",
         kwargs={"slug": crowdsource.slug, "idx": crowdsource.pk},
     )
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = UserFactory()
     response = self.view(request, slug=crowdsource.slug, idx=crowdsource.pk)
     eq_(response.status_code, 302)
Ejemplo n.º 13
0
 def test_staff_can_view(self):
     """Staff can view a crowdsource's details"""
     crowdsource = CrowdsourceFactory()
     url = reverse(
         "crowdsource-detail",
         kwargs={"slug": crowdsource.slug, "idx": crowdsource.pk},
     )
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = UserFactory(is_staff=True)
     response = self.view(request, slug=crowdsource.slug, idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 14
0
 def test_public(self):
     """Anybody can fill out a public assignment"""
     crowdsource = CrowdsourceFactory(status="open")
     url = reverse(
         "crowdsource-assignment",
         kwargs={"slug": crowdsource.slug, "idx": crowdsource.pk},
     )
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = AnonymousUser()
     response = self.view(request, slug=crowdsource.slug, idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 15
0
 def test_get_header_values(self):
     """Get the header values for CSV export"""
     crowdsource = CrowdsourceFactory()
     CrowdsourceTextFieldFactory(
         crowdsource=crowdsource,
         label='Text Field',
         help_text='Help',
         order=0,
     )
     CrowdsourceSelectFieldFactory(
         crowdsource=crowdsource,
         label='Select Field',
         order=1,
     )
     eq_(
         crowdsource.get_header_values(['meta']),
         [
             'user',
             'datetime',
             'skip',
             'flag',
             'gallery',
             'tags',
             'Text Field',
             'Select Field',
         ],
     )
     crowdsource.multiple_per_page = True
     eq_(
         crowdsource.get_header_values(['meta']),
         [
             'user',
             'datetime',
             'skip',
             'flag',
             'gallery',
             'tags',
             'number',
             'Text Field',
             'Select Field',
         ],
     )
     CrowdsourceDataFactory(crowdsource=crowdsource)
     eq_(
         crowdsource.get_header_values(['meta']),
         [
             'user',
             'datetime',
             'skip',
             'flag',
             'gallery',
             'tags',
             'number',
             'datum',
             'meta',
             'Text Field',
             'Select Field',
         ],
     )
Ejemplo n.º 16
0
 def test_project_admin_can_view(self):
     """Project admin can view a crowdsource's details"""
     project = ProjectFactory()
     crowdsource = CrowdsourceFactory(project_admin=True, project=project)
     url = reverse(
         "crowdsource-detail",
         kwargs={"slug": crowdsource.slug, "idx": crowdsource.pk},
     )
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = UserFactory()
     project.contributors.add(request.user)
     response = self.view(request, slug=crowdsource.slug, idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 17
0
 def test_owner_can_view(self):
     """Owner can view a crowdsource's details"""
     crowdsource = CrowdsourceFactory()
     url = reverse('crowdsource-detail',
                   kwargs={
                       'slug': crowdsource.slug,
                       'idx': crowdsource.pk
                   })
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = crowdsource.user
     response = self.view(request,
                          slug=crowdsource.slug,
                          idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 18
0
 def test_anonymous_cannot_view(self):
     """Anonymous users cannot view a crowdsource's details"""
     crowdsource = CrowdsourceFactory()
     url = reverse('crowdsource-detail',
                   kwargs={
                       'slug': crowdsource.slug,
                       'idx': crowdsource.pk
                   })
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = AnonymousUser()
     response = self.view(request,
                          slug=crowdsource.slug,
                          idx=crowdsource.pk)
     eq_(response.status_code, 302)
Ejemplo n.º 19
0
 def test_owner(self):
     """Crowdsource owner can fill out a private assignment"""
     project = ProjectFactory()
     crowdsource = CrowdsourceFactory(
         status="open", project_only=True, project=project
     )
     url = reverse(
         "crowdsource-assignment",
         kwargs={"slug": crowdsource.slug, "idx": crowdsource.pk},
     )
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = crowdsource.user
     response = self.view(request, slug=crowdsource.slug, idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 20
0
    def test_get_values_blank(self):
        """Test getting the values from the response
        Blank responses should only be ignored for multiselect fields
        """
        crowdsource = CrowdsourceFactory()
        response = CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user__username="******",
            public=True,
            datetime=datetime(2017,
                              1,
                              2,
                              tzinfo=timezone.get_current_timezone()),
            data=None,
        )
        text_field = CrowdsourceTextFieldFactory(crowdsource=crowdsource,
                                                 order=0)
        CrowdsourceValueFactory(response=response, field=text_field, value="")
        check_field = CrowdsourceCheckboxGroupFieldFactory(
            crowdsource=crowdsource, order=1)
        CrowdsourceValueFactory(response=response, field=check_field, value="")
        CrowdsourceValueFactory(response=response,
                                field=check_field,
                                value="Foo")
        CrowdsourceValueFactory(response=response,
                                field=check_field,
                                value="Foo")
        check_field2 = CrowdsourceCheckboxGroupFieldFactory(
            crowdsource=crowdsource, order=2)
        CrowdsourceValueFactory(response=response,
                                field=check_field2,
                                value="")

        eq_(
            response.get_values([]),
            [
                "Username",
                True,
                "2017-01-02 00:00:00",
                False,
                False,
                False,
                "",
                "",
                "Foo, Foo",
                "",
            ],
        )
Ejemplo n.º 21
0
 def test_uniqify_label_name(self):
     """Uniqify label name should give each label a unqiue name"""
     # pylint: disable=protected-access
     crowdsource = CrowdsourceFactory()
     seen = set()
     eq_("one", crowdsource._uniqify_label_name(seen, "one"))
     eq_("one-1", crowdsource._uniqify_label_name(seen, "one"))
     eq_("two", crowdsource._uniqify_label_name(seen, "two"))
     eq_("one-2", crowdsource._uniqify_label_name(seen, "one"))
     eq_("two-1", crowdsource._uniqify_label_name(seen, "two"))
Ejemplo n.º 22
0
 def test_uniqify_label_name(self):
     """Uniqify label name should give each label a unqiue name"""
     # pylint: disable=protected-access
     crowdsource = CrowdsourceFactory()
     seen = set()
     eq_('one', crowdsource._uniqify_label_name(seen, 'one'))
     eq_('one-1', crowdsource._uniqify_label_name(seen, 'one'))
     eq_('two', crowdsource._uniqify_label_name(seen, 'two'))
     eq_('one-2', crowdsource._uniqify_label_name(seen, 'one'))
     eq_('two-1', crowdsource._uniqify_label_name(seen, 'two'))
Ejemplo n.º 23
0
    def test_get_choices(self):
        """Test the get choices queryset method"""
        crowdsource = CrowdsourceFactory()
        data = CrowdsourceDataFactory.create_batch(
            3,
            crowdsource=crowdsource,
        )
        user = crowdsource.user
        limit = 2

        # all data should be valid choices
        eq_(
            set(crowdsource.data.get_choices(limit, user)),
            set(data),
        )
        # if I respond to one, it is no longer a choice for me
        CrowdsourceResponseFactory(
            crowdsource=crowdsource,
            user=crowdsource.user,
            data=data[0],
        )
        eq_(
            set(crowdsource.data.get_choices(limit, user)),
            set(data[1:]),
        )
        # if one has at least `limit` responses, it is no longer a valid choice
        CrowdsourceResponseFactory.create_batch(
            2,
            crowdsource=crowdsource,
            data=data[1],
        )
        eq_(
            set(crowdsource.data.get_choices(limit, user)),
            set(data[2:]),
        )
        # multiple responses from the same user only count once
        new_user = UserFactory()
        CrowdsourceResponseFactory.create_batch(
            2,
            crowdsource=crowdsource,
            data=data[2],
            user=new_user,
        )
        eq_(
            set(crowdsource.data.get_choices(limit, user)),
            set(data[2:]),
        )
Ejemplo n.º 24
0
 def test_project_non_admin_cannot_view(self):
     """Project contributor cannot view a crowdsource's details if project
     admin option is not on
     """
     project = ProjectFactory()
     crowdsource = CrowdsourceFactory(project_admin=False, project=project)
     url = reverse('crowdsource-detail',
                   kwargs={
                       'slug': crowdsource.slug,
                       'idx': crowdsource.pk
                   })
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = UserFactory()
     project.contributors.add(request.user)
     response = self.view(request,
                          slug=crowdsource.slug,
                          idx=crowdsource.pk)
     eq_(response.status_code, 302)
Ejemplo n.º 25
0
    def test_get_choices(self):
        """Test the get choices queryset method"""
        crowdsource = CrowdsourceFactory()
        data = CrowdsourceDataFactory.create_batch(4, crowdsource=crowdsource)
        user = crowdsource.user
        ip_address = "127.0.0.1"
        limit = 2

        # all data should be valid choices
        eq_(set(crowdsource.data.get_choices(limit, user, None)), set(data))
        # if I respond to one, it is no longer a choice for me
        CrowdsourceResponseFactory(crowdsource=crowdsource,
                                   user=crowdsource.user,
                                   data=data[0])
        eq_(set(crowdsource.data.get_choices(limit, user, None)),
            set(data[1:]))
        # if one has at least `limit` responses, it is no longer a valid choice
        CrowdsourceResponseFactory.create_batch(2,
                                                crowdsource=crowdsource,
                                                data=data[1])
        eq_(set(crowdsource.data.get_choices(limit, user, None)),
            set(data[2:]))
        # multiple responses from the same user only count once
        new_user = UserFactory()
        CrowdsourceResponseFactory(crowdsource=crowdsource,
                                   user=new_user,
                                   data=data[2],
                                   number=1)
        CrowdsourceResponseFactory(crowdsource=crowdsource,
                                   user=new_user,
                                   data=data[2],
                                   number=2)
        eq_(set(crowdsource.data.get_choices(limit, user, None)),
            set(data[2:]))
        # if I anonymously to one, it is no longer a choice for me
        CrowdsourceResponseFactory(crowdsource=crowdsource,
                                   ip_address=ip_address,
                                   data=data[3])
        eq_(
            set(crowdsource.data.get_choices(limit, None, ip_address)),
            set([data[0], data[2]]),
        )
Ejemplo n.º 26
0
 def test_private(self):
     """Everybody cannot fill out a private assignment"""
     project = ProjectFactory()
     crowdsource = CrowdsourceFactory(
         status='open',
         project_only=True,
         project=project,
     )
     url = reverse('crowdsource-assignment',
                   kwargs={
                       'slug': crowdsource.slug,
                       'idx': crowdsource.pk
                   })
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = AnonymousUser()
     response = self.view(request,
                          slug=crowdsource.slug,
                          idx=crowdsource.pk)
     eq_(response.status_code, 302)
Ejemplo n.º 27
0
 def test_project(self):
     """Project members can fill out a private assignment"""
     project = ProjectFactory()
     crowdsource = CrowdsourceFactory(
         status='open',
         project_only=True,
         project=project,
     )
     url = reverse('crowdsource-assignment',
                   kwargs={
                       'slug': crowdsource.slug,
                       'idx': crowdsource.pk
                   })
     request = self.request_factory.get(url)
     request = mock_middleware(request)
     request.user = UserFactory()
     project.contributors.add(request.user)
     response = self.view(request,
                          slug=crowdsource.slug,
                          idx=crowdsource.pk)
     eq_(response.status_code, 200)
Ejemplo n.º 28
0
 def test_get_header_values(self):
     """Get the header values for CSV export"""
     crowdsource = CrowdsourceFactory()
     CrowdsourceTextFieldFactory(crowdsource=crowdsource,
                                 label="Text Field",
                                 help_text="Help",
                                 order=0)
     CrowdsourceHeaderFieldFactory(crowdsource=crowdsource,
                                   label="Header",
                                   order=1)
     CrowdsourceSelectFieldFactory(crowdsource=crowdsource,
                                   label="Select Field",
                                   order=2)
     eq_(
         crowdsource.get_header_values(["meta"]),
         [
             "user",
             "public",
             "datetime",
             "skip",
             "flag",
             "gallery",
             "tags",
             "Text Field",
             "Select Field",
         ],
     )
     crowdsource.multiple_per_page = True
     eq_(
         crowdsource.get_header_values(["meta"]),
         [
             "user",
             "public",
             "datetime",
             "skip",
             "flag",
             "gallery",
             "tags",
             "number",
             "Text Field",
             "Select Field",
         ],
     )
     CrowdsourceDataFactory(crowdsource=crowdsource)
     eq_(
         crowdsource.get_header_values(["meta"]),
         [
             "user",
             "public",
             "datetime",
             "skip",
             "flag",
             "gallery",
             "tags",
             "number",
             "datum",
             "meta",
             "Text Field",
             "Select Field",
         ],
     )