Example #1
0
    def test_form_tags(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'get': 'labels',
            'post': 'labels',
            'delete': 'labels'
        })
        list_view = XFormViewSet.as_view({
            'get': 'list',
        })
        formid = self.xform.pk

        # no tags
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.data, [])

        # add tag "hello"
        request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data, [u'hello'])

        # check filter by tag
        request = self.factory.get('/', data={"tags": "hello"}, **self.extra)
        self.form_data = XFormSerializer(self.xform,
                                         context={
                                             'request': request
                                         }).data
        response = list_view(request, pk=formid)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [self.form_data])

        request = self.factory.get('/', data={"tags": "goodbye"}, **self.extra)
        response = list_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])

        # remove tag "hello"
        request = self.factory.delete('/',
                                      data={"tags": "hello"},
                                      **self.extra)
        response = view(request, pk=formid, label='hello')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
Example #2
0
    def test_public_form_list(self):
        self._publish_xls_form_to_project()
        self.view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk='public')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])

        # public shared form
        self.xform.shared = True
        self.xform.save()
        response = self.view(request, pk='public')
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.form_data['public'] = True
        del self.form_data['date_modified']
        del response.data[0]['date_modified']
        self.assertEqual(response.data, [self.form_data])

        # public shared form data
        self.xform.shared_data = True
        self.xform.shared = False
        self.xform.save()
        response = self.view(request, pk='public')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
Example #3
0
    def test_submission_to_require_auth_without_perm(self):
        """
        test submission to a private form by non-owner without perm is
        forbidden.
        """
        view = XFormViewSet.as_view({'patch': 'partial_update'})
        data = {'require_auth': True}
        self.assertFalse(self.xform.require_auth)
        request = self.factory.patch(
            '/',
            data=data,
            **{'HTTP_AUTHORIZATION': 'Token %s' % self.user.auth_token})
        view(request, pk=self.xform.id)
        self.xform.reload()
        self.assertTrue(self.xform.require_auth)

        xml_submission_file_path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            "../fixtures/tutorial/instances/tutorial_2012-06-27_11-27-53.xml")

        # create a new user
        username = '******'
        self._create_user(username, username)

        self._make_submission(xml_submission_file_path,
                              auth=DigestAuth('alice', 'alice'))

        self.assertEqual(self.response.status_code, 403)
Example #4
0
    def test_submission_to_require_auth_with_perm(self):
        """
        test submission to a private form by non-owner is forbidden.

        TODO send authentication challenge when xform.require_auth is set.
        This is non-trivial because we do not know the xform until we have
        parsed the XML.
        """
        raise SkipTest

        view = XFormViewSet.as_view({'patch': 'partial_update'})
        data = {'require_auth': True}
        self.assertFalse(self.xform.require_auth)
        request = self.factory.patch(
            '/',
            data=data,
            **{'HTTP_AUTHORIZATION': 'Token %s' % self.user.auth_token})
        view(request, pk=self.xform.id)
        self.xform.reload()
        self.assertTrue(self.xform.require_auth)

        # create a new user
        username = '******'
        alice = self._create_user(username, username)

        # assign report perms to user
        assign_perm('report_xform', alice, self.xform)
        auth = DigestAuth(username, username)

        xml_submission_file_path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            "../fixtures/tutorial/instances/tutorial_2012-06-27_11-27-53.xml")
        self._make_submission(xml_submission_file_path, auth=auth)
        self.assertEqual(self.response.status_code, 201)
Example #5
0
    def test_form_data_export(self):
        self._make_submissions()
        view = XFormViewSet.as_view({
            'get': 'retrieve'
        })
        formid = self.xform.pk
        # csv
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid, format='csv')
        self.assertEqual(response.status_code, 200)
        headers = dict(response.items())
        content_disposition = headers['Content-Disposition']
        filename = self._filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(headers['Content-Type'], 'application/csv')
        self.assertEqual(ext, '.csv')

        # xls
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid, format='xls')
        self.assertEqual(response.status_code, 200)
        headers = dict(response.items())
        content_disposition = headers['Content-Disposition']
        filename = self._filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(headers['Content-Type'],
                         'application/vnd.openxmlformats')
        self.assertEqual(ext, '.xlsx')
    def test_manager_can_update_xform_tags(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        view = XFormViewSet.as_view({
            'get': 'labels',
            'post': 'labels',
            'delete': 'labels'
        })
        formid = self.xform.pk

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        role.ManagerRole.add(self.user, self.xform)
        response = view(request, pk=formid)
        self.assertEqual(response.data, [])

        # add tag "hello"
        request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data, [u'hello'])

        # remove tag "hello"
        request = self.factory.delete('/', data={"tags": "hello"},
                                      **self.extra)
        response = view(request, pk=formid, label='hello')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [])
    def test_manager_can_update_xform(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        view = XFormViewSet.as_view({
            'put': 'update'
        })
        description = 'DESCRIPTION'
        request = self.factory.get('/', **self.extra)
        xfs = XFormSerializer(instance=self.xform,
                              context={'request': request})
        data = json.loads(JSONRenderer().render(xfs.data))
        data.update({'public': True, 'description': description})

        self.assertFalse(self.xform.shared)

        request = self.factory.put('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)
        self.assertEqual(response.status_code, 400)
        self.assertFalse(self.xform.shared)

        role.ManagerRole.add(self.user, self.xform)
        request = self.factory.put('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertTrue(self.xform.shared)
        self.assertEqual(self.xform.description, description)
        self.assertEqual(response.data['public'], True)
        self.assertEqual(response.data['description'], description)
Example #8
0
    def test_form_data_export(self):
        self._make_submissions()
        view = XFormViewSet.as_view({'get': 'retrieve'})
        formid = self.xform.pk
        # csv
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid, format='csv')
        self.assertEqual(response.status_code, 200)
        headers = dict(response.items())
        content_disposition = headers['Content-Disposition']
        filename = self._filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(headers['Content-Type'], 'application/csv')
        self.assertEqual(ext, '.csv')

        # xls
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid, format='xls')
        self.assertEqual(response.status_code, 200)
        headers = dict(response.items())
        content_disposition = headers['Content-Disposition']
        filename = self._filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(headers['Content-Type'],
                         'application/vnd.openxmlformats')
        self.assertEqual(ext, '.xlsx')
Example #9
0
    def test_update_xform_using_put_without_required_field(self):
        self._publish_xls_form_to_project()
        form_id = self.xform.pk

        view = XFormViewSet.as_view({
            'put': 'update',
        })

        post_data = {
            'uuid': 'ae631e898bd34ced91d2a309d8b72das',
            'description': 'Transport form',
            'downloadable': False,
            'owner': 'http://testserver/api/v1/users/{0}'.format(self.user),
            'created_by':
            'http://testserver/api/v1/users/{0}'.format(self.user),
            'public': False,
            'public_data': False,
            'project': 'http://testserver/api/v1/projects/{0}'.format(
                self.xform.project.pk),
        }
        request = self.factory.put('/', data=post_data, **self.extra)
        response = view(request, pk=form_id)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)
        self.assertEquals(response.data,
                          {'title': [u'This field is required.']})
    def test_form_inherits_permision_from_project(self):
        self._publish_xls_form_to_project()
        self._make_submissions()

        project_view = ProjectViewSet.as_view({'get': 'retrieve'})

        xform_view = XFormViewSet.as_view({'get': 'retrieve'})

        data_view = DataViewSet.as_view({'get': 'list'})

        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)

        formid = self.xform.pk
        project_id = self.project.pk

        request = self.factory.get('/', **self.extra)
        response = xform_view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        # Give owner role to the project
        role.OwnerRole.add(self.user, self.project)

        response = project_view(request, pk=project_id)
        self.assertEqual(response.status_code, 200)

        response = xform_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)

        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)
Example #11
0
 def test_add_form_tag_propagates_to_data_tags(self):
     """Test that when a tag is applied on an xform,
     it propagates to the instance submissions
     """
     self._make_submissions()
     xform = XForm.objects.all()[0]
     pk = xform.id
     view = XFormViewSet.as_view({
         'get': 'labels',
         'post': 'labels',
         'delete': 'labels'
     })
     # no tags
     request = self.factory.get('/', **self.extra)
     response = view(request, pk=pk)
     self.assertEqual(response.data, [])
     # add tag "hello"
     request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
     response = view(request, pk=pk)
     self.assertEqual(response.status_code, 201)
     self.assertEqual(response.data, [u'hello'])
     for i in self.xform.instances.all():
         self.assertIn(u'hello', i.tags.names())
     # remove tag "hello"
     request = self.factory.delete('/', data={"tags": "hello"},
                                   **self.extra)
     response = view(request, pk=pk, label='hello')
     self.assertEqual(response.status_code, 200)
     self.assertEqual(response.data, [])
     for i in self.xform.instances.all():
         self.assertNotIn(u'hello', i.tags.names())
Example #12
0
    def test_form_clone_endpoint(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        alice_profile = self._create_user_profile(alice_data)
        view = XFormViewSet.as_view({'post': 'clone'})
        formid = self.xform.pk
        count = XForm.objects.count()

        data = {'username': '******'}
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)

        data = {'username': '******'}
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertFalse(self.user.has_perm('can_add_xform', alice_profile))
        self.assertEqual(response.status_code, 403)

        ManagerRole.add(self.user, alice_profile)
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertTrue(self.user.has_perm('can_add_xform', alice_profile))
        self.assertEqual(response.status_code, 201)
        self.assertEqual(count + 1, XForm.objects.count())
Example #13
0
    def test_external_export(self):
        self._publish_xls_form_to_project()
        self._make_submissions()

        data_value = 'template 1|http://xls_server'
        self._add_form_metadata(self.xform, 'external_export', data_value)
        metadata = MetaData.objects.get(xform=self.xform,
                                        data_type='external_export')
        paths = [
            os.path.join(self.main_directory, 'fixtures', 'transportation',
                         'instances_w_uuid', s, s + '.xml')
            for s in ['transport_2011-07-25_19-05-36']
        ]

        self._make_submission(paths[0])
        self.assertEqual(self.response.status_code, 201)

        view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        data = {'meta': metadata.pk}
        formid = self.xform.pk
        request = self.factory.get('/', data=data, **self.extra)
        with HTTMock(external_mock):
            # External export
            response = view(request, pk=formid, format='xls')
            self.assertEqual(response.status_code, 302)
            expected_url = \
                'http://xls_server/xls/ee3ff9d8f5184fc4a8fdebc2547cc059'
            self.assertEquals(response.url, expected_url)
Example #14
0
    def test_form_clone_endpoint(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        alice_profile = self._create_user_profile(alice_data)
        view = XFormViewSet.as_view({
            'post': 'clone'
        })
        formid = self.xform.pk
        count = XForm.objects.count()

        data = {'username': '******'}
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)

        data = {'username': '******'}
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertFalse(self.user.has_perm('can_add_xform', alice_profile))
        self.assertEqual(response.status_code, 403)

        ManagerRole.add(self.user, alice_profile)
        request = self.factory.post('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertTrue(self.user.has_perm('can_add_xform', alice_profile))
        self.assertEqual(response.status_code, 201)
        self.assertEqual(count + 1, XForm.objects.count())
Example #15
0
    def test_form_share_endpoint(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        alice_profile = self._create_user_profile(alice_data)

        view = XFormViewSet.as_view({
            'post': 'share'
        })
        formid = self.xform.pk

        ROLES = [ReadOnlyRole,
                 DataEntryRole,
                 EditorRole,
                 ManagerRole,
                 OwnerRole]
        for role_class in ROLES:
            self.assertFalse(role_class.user_has_role(alice_profile.user,
                                                      self.xform))

            data = {'username': '******', 'role': role_class.name}
            request = self.factory.post('/', data=data, **self.extra)
            response = view(request, pk=formid)

            self.assertEqual(response.status_code, 204)
            self.assertTrue(role_class.user_has_role(alice_profile.user,
                                                     self.xform))
Example #16
0
    def test_external_export_error(self):
        self._publish_xls_form_to_project()

        data_value = 'template 1|http://xls_server'
        self._add_form_metadata(self.xform, 'external_export',
                                data_value)

        paths = [os.path.join(
            self.main_directory, 'fixtures', 'transportation',
            'instances_w_uuid', s, s + '.xml')
            for s in ['transport_2011-07-25_19-05-36']]

        self._make_submission(paths[0])
        self.assertEqual(self.response.status_code, 201)

        view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        formid = self.xform.pk
        token = 'http://xls_server/xls/' +\
            '8e86d4bdfa7f435ab89485aeae4ea6f5'
        data = {'token': token}
        request = self.factory.get('/', data=data, **self.extra)

        # External export
        response = view(
            request,
            pk=formid,
            format='xls')

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)
        data = json.loads(response.data)
        self.assertTrue(data.get('error')
                        .startswith("J2X client could not generate report."))
Example #17
0
    def test_external_export(self):
        self._publish_xls_form_to_project()
        self._make_submissions()

        data_value = 'template 1|http://xls_server'
        self._add_form_metadata(self.xform, 'external_export',
                                data_value)
        metadata = MetaData.objects.get(xform=self.xform,
                                        data_type='external_export')
        paths = [os.path.join(
            self.main_directory, 'fixtures', 'transportation',
            'instances_w_uuid', s, s + '.xml')
            for s in ['transport_2011-07-25_19-05-36']]

        self._make_submission(paths[0])
        self.assertEqual(self.response.status_code, 201)

        view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        data = {'meta': metadata.pk}
        formid = self.xform.pk
        request = self.factory.get('/', data=data,
                                   **self.extra)
        with HTTMock(external_mock):
            # External export
            response = view(
                request,
                pk=formid,
                format='xls')
            self.assertEqual(response.status_code, 302)
            expected_url = \
                'http://xls_server/xls/ee3ff9d8f5184fc4a8fdebc2547cc059'
            self.assertEquals(response.url, expected_url)
Example #18
0
    def test_update_xform_xls_file_with_submissions(self):
        self._publish_xls_form_to_project()
        self._make_submissions()

        self.assertIsNotNone(self.xform.version)
        version = self.xform.version
        form_id = self.xform.pk

        view = XFormViewSet.as_view({
            'patch': 'partial_update',
        })

        path = os.path.join(
            settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
            "transportation", "transportation_updated.xls")
        with open(path) as xls_file:
            post_data = {'xls_file': xls_file}
            request = self.factory.patch('/', data=post_data, **self.extra)
            response = view(request, pk=form_id)

            self.assertEqual(response.status_code, 400)
            self.assertEqual(response.get('Last-Modified'), None)
            self.assertEquals(response.data, u"Cannot update the xls file in "
                                             u"a form that has submissions")

        self.xform.reload()
        new_version = self.xform.version

        # diff versions
        self.assertEquals(version, new_version)
        self.assertEquals(form_id, self.xform.pk)
Example #19
0
    def test_partial_update(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({'patch': 'partial_update'})
        title = u'مرحب'
        description = 'DESCRIPTION'
        data = {
            'public': True,
            'description': description,
            'title': title,
            'downloadable': True
        }

        self.assertFalse(self.xform.shared)

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertTrue(self.xform.downloadable)
        self.assertTrue(self.xform.shared)
        self.assertEqual(self.xform.description, description)
        self.assertEqual(response.data['public'], True)
        self.assertEqual(response.data['description'], description)
        self.assertEqual(response.data['title'], title)
        matches = re.findall(r"<h:title>([^<]+)</h:title>", self.xform.xml)
        self.assertTrue(len(matches) > 0)
        self.assertEqual(matches[0], title)
Example #20
0
    def test_update_xform_xls_file_with_version_set(self):
        self._publish_xls_form_to_project()
        form_id = self.xform.pk

        self.assertIsNotNone(self.xform.version)

        view = XFormViewSet.as_view({
            'patch': 'partial_update',
        })

        path = os.path.join(
            settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
            "transportation", "transportation_version.xls")
        with open(path) as xls_file:
            post_data = {'xls_file': xls_file}
            request = self.factory.patch('/', data=post_data, **self.extra)
            response = view(request, pk=form_id)

            self.assertEqual(response.status_code, 200)

        self.xform.reload()

        # diff versions
        self.assertEquals(self.xform.version, u"212121211")
        self.assertEquals(form_id, self.xform.pk)
Example #21
0
    def test_update_xform_using_put(self):
        self._publish_xls_form_to_project()
        form_id = self.xform.pk

        version = self.xform.version
        view = XFormViewSet.as_view({
            'put': 'update',
        })

        post_data = {
            'uuid': 'ae631e898bd34ced91d2a309d8b72das',
            'description': 'Transport form',
            'downloadable': False,
            'owner': 'http://testserver/api/v1/users/{0}'.format(self.user),
            'created_by':
            'http://testserver/api/v1/users/{0}'.format(self.user),
            'public': False,
            'public_data': False,
            'project': 'http://testserver/api/v1/projects/{0}'.format(
                self.xform.project.pk),
            'title': 'Transport Form'
        }
        request = self.factory.put('/', data=post_data, **self.extra)
        response = view(request, pk=form_id)
        self.assertEqual(response.status_code, 200, response.data)

        self.xform.reload()

        self.assertEquals(version, self.xform.version)
        self.assertEquals(self.xform.description, u'Transport form')
        self.assertEquals(self.xform.title, u'Transport Form')
        self.assertEquals(form_id, self.xform.pk)
Example #22
0
 def test_publish_xlsform(self):
     view = XFormViewSet.as_view({'post': 'create'})
     data = {
         'owner': 'http://testserver/api/v1/users/bob',
         'public': False,
         'public_data': False,
         'description': u'transportation_2011_07_25',
         'downloadable': True,
         'allows_sms': False,
         'encrypted': False,
         'sms_id_string': u'transportation_2011_07_25',
         'id_string': u'transportation_2011_07_25',
         'title': u'transportation_2011_07_25',
         'bamboo_dataset': u''
     }
     path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                         "fixtures", "transportation", "transportation.xls")
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 201)
         xform = self.user.xforms.all()[0]
         data.update(
             {'url': 'http://testserver/api/v1/forms/%s' % xform.pk})
         self.assertDictContainsSubset(data, response.data)
         self.assertTrue(OwnerRole.user_has_role(self.user, xform))
         self.assertEquals("owner", response.data['users'][0]['role'])
Example #23
0
    def test_external_export_error(self):
        self._publish_xls_form_to_project()

        data_value = 'template 1|http://xls_server'
        self._add_form_metadata(self.xform, 'external_export', data_value)

        paths = [
            os.path.join(self.main_directory, 'fixtures', 'transportation',
                         'instances_w_uuid', s, s + '.xml')
            for s in ['transport_2011-07-25_19-05-36']
        ]

        self._make_submission(paths[0])
        self.assertEqual(self.response.status_code, 201)

        view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        formid = self.xform.pk
        token = 'http://xls_server/xls/' +\
            '8e86d4bdfa7f435ab89485aeae4ea6f5'
        data = {'token': token}
        request = self.factory.get('/', data=data, **self.extra)

        # External export
        response = view(request, pk=formid, format='xls')

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)
        data = json.loads(response.data)
        self.assertTrue(
            data.get('error').startswith(
                "J2X client could not generate report."))
Example #24
0
    def test_partial_update(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'patch': 'partial_update'
        })
        title = u'مرحب'
        description = 'DESCRIPTION'
        data = {'public': True, 'description': description, 'title': title,
                'downloadable': True}

        self.assertFalse(self.xform.shared)

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertTrue(self.xform.downloadable)
        self.assertTrue(self.xform.shared)
        self.assertEqual(self.xform.description, description)
        self.assertEqual(response.data['public'], True)
        self.assertEqual(response.data['description'], description)
        self.assertEqual(response.data['title'], title)
        matches = re.findall(r"<h:title>([^<]+)</h:title>", self.xform.xml)
        self.assertTrue(len(matches) > 0)
        self.assertEqual(matches[0], title)
    def test_manager_can_update_xform(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        view = XFormViewSet.as_view({'put': 'update'})
        description = 'DESCRIPTION'
        request = self.factory.get('/', **self.extra)
        xfs = XFormSerializer(instance=self.xform,
                              context={'request': request})
        data = json.loads(JSONRenderer().render(xfs.data))
        data.update({'public': True, 'description': description})

        self.assertFalse(self.xform.shared)

        request = self.factory.put('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)
        self.assertEqual(response.status_code, 400)
        self.assertFalse(self.xform.shared)

        role.ManagerRole.add(self.user, self.xform)
        request = self.factory.put('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertTrue(self.xform.shared)
        self.assertEqual(self.xform.description, description)
        self.assertEqual(response.data['public'], True)
        self.assertEqual(response.data['description'], description)
    def test_manager_can_update_xform_tags(self):
        self._publish_xls_form_to_project()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        view = XFormViewSet.as_view({
            'get': 'labels',
            'post': 'labels',
            'delete': 'labels'
        })
        formid = self.xform.pk

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        role.ManagerRole.add(self.user, self.xform)
        response = view(request, pk=formid)
        self.assertEqual(response.data, [])

        # add tag "hello"
        request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data, [u'hello'])

        # remove tag "hello"
        request = self.factory.delete('/',
                                      data={"tags": "hello"},
                                      **self.extra)
        response = view(request, pk=formid, label='hello')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [])
Example #27
0
    def test_public_form_list(self):
        self._publish_xls_form_to_project()
        self.view = XFormViewSet.as_view({
            'get': 'retrieve',
        })
        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk='public')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])

        # public shared form
        self.xform.shared = True
        self.xform.save()
        response = self.view(request, pk='public')
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.form_data['public'] = True
        del self.form_data['date_modified']
        del response.data[0]['date_modified']
        self.assertEqual(response.data, [self.form_data])

        # public shared form data
        self.xform.shared_data = True
        self.xform.shared = False
        self.xform.save()
        response = self.view(request, pk='public')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
Example #28
0
    def test_submission_to_require_auth_anon(self):
        """
        test submission to a private form by non-owner without perm is
        forbidden.
        """
        view = XFormViewSet.as_view({
            'patch': 'partial_update'
        })
        data = {'require_auth': True}
        self.assertFalse(self.xform.require_auth)
        request = self.factory.patch('/', data=data, **{
            'HTTP_AUTHORIZATION': 'Token %s' % self.user.auth_token})
        view(request, pk=self.xform.id)
        self.xform.reload()
        self.assertTrue(self.xform.require_auth)

        xml_submission_file_path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            "../fixtures/tutorial/instances/tutorial_2012-06-27_11-27-53.xml"
        )

        # create a new user
        username = '******'
        self._create_user(username, username)

        self._make_submission(xml_submission_file_path,
                              auth=DigestAuth('alice', 'alice'))
        self.assertEqual(self.response.status_code, 403)
Example #29
0
 def test_publish_xlsform(self):
     view = XFormViewSet.as_view({
         'post': 'create'
     })
     data = {
         'owner': 'http://testserver/api/v1/users/bob',
         'public': False,
         'public_data': False,
         'description': u'transportation_2011_07_25',
         'downloadable': True,
         'allows_sms': False,
         'encrypted': False,
         'sms_id_string': u'transportation_2011_07_25',
         'id_string': u'transportation_2011_07_25',
         'title': u'transportation_2011_07_25',
         'bamboo_dataset': u''
     }
     path = os.path.join(
         settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
         "transportation", "transportation.xls")
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 201)
         xform = self.user.xforms.all()[0]
         data.update({
             'url':
             'http://testserver/api/v1/forms/%s' % xform.pk
         })
         self.assertDictContainsSubset(data, response.data)
         self.assertTrue(OwnerRole.user_has_role(self.user, xform))
         self.assertEquals("owner", response.data['users'][0]['role'])
    def test_data_entry_role(self):
        self._publish_xls_form_to_project()
        self._make_submissions()
        view = XFormViewSet.as_view({'get': 'retrieve', 'put': 'update'})
        data_view = DataViewSet.as_view({'get': 'list'})
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        formid = self.xform.pk

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        role.DataEntryRole.add(self.user, self.xform)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 200)

        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)

        data = {'public': True, 'description': "Some description"}
        request = self.factory.put('/', data=data, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 403)
    def test_editor_role(self):
        self._publish_xls_form_to_project()
        self._make_submissions()
        view = XFormViewSet.as_view({
            'get': 'retrieve',
            'patch': 'update'
        })
        data_view = DataViewSet.as_view({'get': 'list'})
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        formid = self.xform.pk

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 404)

        role.EditorRole.add(self.user, self.xform)

        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 200)
        response = data_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)
Example #32
0
    def test_submission_to_require_auth_with_perm(self):
        """
        test submission to a private form by non-owner is forbidden.

        TODO send authentication challenge when xform.require_auth is set.
        This is non-trivial because we do not know the xform until we have
        parsed the XML.
        """
        raise SkipTest

        view = XFormViewSet.as_view({
            'patch': 'partial_update'
        })
        data = {'require_auth': True}
        self.assertFalse(self.xform.require_auth)
        request = self.factory.patch('/', data=data, **{
            'HTTP_AUTHORIZATION': 'Token %s' % self.user.auth_token})
        view(request, pk=self.xform.id)
        self.xform.reload()
        self.assertTrue(self.xform.require_auth)

        # create a new user
        username = '******'
        alice = self._create_user(username, username)

        # assign report perms to user
        assign_perm('report_xform', alice, self.xform)
        auth = DigestAuth(username, username)

        xml_submission_file_path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            "../fixtures/tutorial/instances/tutorial_2012-06-27_11-27-53.xml"
        )
        self._make_submission(xml_submission_file_path, auth=auth)
        self.assertEqual(self.response.status_code, 201)
Example #33
0
 def test_add_form_tag_propagates_to_data_tags(self):
     """Test that when a tag is applied on an xform,
     it propagates to the instance submissions
     """
     self._make_submissions()
     xform = XForm.objects.all()[0]
     pk = xform.id
     view = XFormViewSet.as_view({
         'get': 'labels',
         'post': 'labels',
         'delete': 'labels'
     })
     # no tags
     request = self.factory.get('/', **self.extra)
     response = view(request, pk=pk)
     self.assertEqual(response.data, [])
     # add tag "hello"
     request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
     response = view(request, pk=pk)
     self.assertEqual(response.status_code, 201)
     self.assertEqual(response.data, [u'hello'])
     for i in self.xform.instances.all():
         self.assertIn(u'hello', i.tags.names())
     # remove tag "hello"
     request = self.factory.delete('/',
                                   data={"tags": "hello"},
                                   **self.extra)
     response = view(request, pk=pk, label='hello')
     self.assertEqual(response.status_code, 200)
     self.assertEqual(response.data, [])
     for i in self.xform.instances.all():
         self.assertNotIn(u'hello', i.tags.names())
Example #34
0
    def test_update_xform_using_put_without_required_field(self):
        self._publish_xls_form_to_project()
        form_id = self.xform.pk

        view = XFormViewSet.as_view({
            'put': 'update',
        })

        post_data = {
            'uuid':
            'ae631e898bd34ced91d2a309d8b72das',
            'description':
            'Transport form',
            'downloadable':
            False,
            'owner':
            'http://testserver/api/v1/users/{0}'.format(self.user),
            'created_by':
            'http://testserver/api/v1/users/{0}'.format(self.user),
            'public':
            False,
            'public_data':
            False,
            'project':
            'http://testserver/api/v1/projects/{0}'.format(
                self.xform.project.pk),
        }
        request = self.factory.put('/', data=post_data, **self.extra)
        response = view(request, pk=form_id)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)
        self.assertEquals(response.data,
                          {'title': [u'This field is required.']})
Example #35
0
    def test_update_xform_xls_file_with_version_set(self):
        self._publish_xls_form_to_project()
        form_id = self.xform.pk

        self.assertIsNotNone(self.xform.version)

        view = XFormViewSet.as_view({
            'patch': 'partial_update',
        })

        path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                            "fixtures", "transportation",
                            "transportation_version.xls")
        with open(path) as xls_file:
            post_data = {'xls_file': xls_file}
            request = self.factory.patch('/', data=post_data, **self.extra)
            response = view(request, pk=form_id)

            self.assertEqual(response.status_code, 200)

        self.xform.reload()

        # diff versions
        self.assertEquals(self.xform.version, u"212121211")
        self.assertEquals(form_id, self.xform.pk)
Example #36
0
    def test_update_xform_xls_file_with_submissions(self):
        self._publish_xls_form_to_project()
        self._make_submissions()

        self.assertIsNotNone(self.xform.version)
        version = self.xform.version
        form_id = self.xform.pk

        view = XFormViewSet.as_view({
            'patch': 'partial_update',
        })

        path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                            "fixtures", "transportation",
                            "transportation_updated.xls")
        with open(path) as xls_file:
            post_data = {'xls_file': xls_file}
            request = self.factory.patch('/', data=post_data, **self.extra)
            response = view(request, pk=form_id)

            self.assertEqual(response.status_code, 400)
            self.assertEqual(response.get('Last-Modified'), None)
            self.assertEquals(
                response.data, u"Cannot update the xls file in "
                u"a form that has submissions")

        self.xform.reload()
        new_version = self.xform.version

        # diff versions
        self.assertEquals(version, new_version)
        self.assertEquals(form_id, self.xform.pk)
Example #37
0
    def test_form_tags(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'get': 'labels',
            'post': 'labels',
            'delete': 'labels'
        })
        list_view = XFormViewSet.as_view({
            'get': 'list',
        })
        formid = self.xform.pk

        # no tags
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.data, [])

        # add tag "hello"
        request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
        response = view(request, pk=formid)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data, [u'hello'])

        # check filter by tag
        request = self.factory.get('/', data={"tags": "hello"}, **self.extra)
        self.form_data = XFormSerializer(
            self.xform, context={'request': request}).data
        response = list_view(request, pk=formid)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [self.form_data])

        request = self.factory.get('/', data={"tags": "goodbye"}, **self.extra)
        response = list_view(request, pk=formid)
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])

        # remove tag "hello"
        request = self.factory.delete('/', data={"tags": "hello"},
                                      **self.extra)
        response = view(request, pk=formid, label='hello')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
Example #38
0
 def test_form_get(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({'get': 'retrieve'})
     formid = self.xform.pk
     request = self.factory.get('/', **self.extra)
     response = view(request, pk=formid)
     self.assertNotEqual(response.get('Last-Modified'), None)
     self.assertEqual(response.status_code, 200)
     self.assertEqual(response.data, self.form_data)
Example #39
0
    def test_form_format(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'get': 'form'
        })
        formid = self.xform.pk
        data = {
            "name": "transportation",
            "title": "transportation_2011_07_25",
            "default_language": "default",
            "id_string": "transportation_2011_07_25",
            "type": "survey",
        }
        request = self.factory.get('/', **self.extra)
        # test for unsupported format
        response = view(request, pk=formid, format='csvzip')
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)

        # test for supported formats
        response = view(request, pk=formid, format='json')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertDictContainsSubset(data, response.data)
        response = view(request, pk=formid, format='xml')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        response_doc = minidom.parseString(response.data)
        response = view(request, pk=formid, format='xls')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)

        xml_path = os.path.join(
            settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
            "transportation", "transportation.xml")
        with open(xml_path) as xml_file:
            expected_doc = minidom.parse(xml_file)

        model_node = [
            n for n in
            response_doc.getElementsByTagName("h:head")[0].childNodes
            if n.nodeType == Node.ELEMENT_NODE and
            n.tagName == "model"][0]

        # check for UUID and remove
        uuid_nodes = [
            node for node in model_node.childNodes
            if node.nodeType == Node.ELEMENT_NODE
            and node.getAttribute("nodeset") == "/transportation/formhub/uuid"]
        self.assertEqual(len(uuid_nodes), 1)
        uuid_node = uuid_nodes[0]
        uuid_node.setAttribute("calculate", "''")

        # check content without UUID
        response_xml = response_doc.toxml().replace(
            self.xform.version, u"201411120717")
        self.assertEqual(response_xml, expected_doc.toxml())
Example #40
0
    def test_form_format(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({'get': 'form'})
        formid = self.xform.pk
        data = {
            "name": "transportation",
            "title": "transportation_2011_07_25",
            "default_language": "default",
            "id_string": "transportation_2011_07_25",
            "type": "survey",
        }
        request = self.factory.get('/', **self.extra)
        # test for unsupported format
        response = view(request, pk=formid, format='csvzip')
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.get('Last-Modified'), None)

        # test for supported formats
        response = view(request, pk=formid, format='json')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertDictContainsSubset(data, response.data)
        response = view(request, pk=formid, format='xml')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        response_doc = minidom.parseString(response.data)
        response = view(request, pk=formid, format='xls')
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)

        xml_path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                                "fixtures", "transportation",
                                "transportation.xml")
        with open(xml_path) as xml_file:
            expected_doc = minidom.parse(xml_file)

        model_node = [
            n
            for n in response_doc.getElementsByTagName("h:head")[0].childNodes
            if n.nodeType == Node.ELEMENT_NODE and n.tagName == "model"
        ][0]

        # check for UUID and remove
        uuid_nodes = [
            node for node in model_node.childNodes
            if node.nodeType == Node.ELEMENT_NODE
            and node.getAttribute("nodeset") == "/transportation/formhub/uuid"
        ]
        self.assertEqual(len(uuid_nodes), 1)
        uuid_node = uuid_nodes[0]
        uuid_node.setAttribute("calculate", "''")

        # check content without UUID
        response_xml = response_doc.toxml().replace(self.xform.version,
                                                    u"201411120717")
        self.assertEqual(response_xml, expected_doc.toxml())
Example #41
0
 def test_enketo_url(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({'get': 'enketo'})
     formid = self.xform.pk
     # no tags
     request = self.factory.get('/', **self.extra)
     with HTTMock(enketo_mock):
         response = view(request, pk=formid)
         data = {"enketo_url": "https://dmfrm.enketo.org/webform"}
         self.assertEqual(response.data, data)
Example #42
0
 def test_form_delete(self):
     self._publish_xls_form_to_project()
     self.xform.save()
     view = XFormViewSet.as_view({'delete': 'destroy'})
     formid = self.xform.pk
     request = self.factory.delete('/', **self.extra)
     response = view(request, pk=formid)
     self.assertEqual(response.data, None)
     self.assertEqual(response.status_code, 204)
     with self.assertRaises(XForm.DoesNotExist):
         self.xform.reload()
Example #43
0
 def test_csv_import_fail(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({'post': 'csv_import'})
     csv_import = open(os.path.join(settings.PROJECT_ROOT, 'libs', 'utils',
                                    'tests', 'fixtures', 'bad.csv'))
     post_data = {'csv_file': csv_import}
     request = self.factory.post('/', data=post_data, **self.extra)
     response = view(request, pk=self.xform.id)
     self.assertEqual(response.status_code, 400)
     self.assertEqual(response.get('Last-Modified'), None)
     self.assertIsNotNone(response.data.get('error'))
Example #44
0
 def test_form_get(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({
         'get': 'retrieve'
     })
     formid = self.xform.pk
     request = self.factory.get('/', **self.extra)
     response = view(request, pk=formid)
     self.assertNotEqual(response.get('Last-Modified'), None)
     self.assertEqual(response.status_code, 200)
     self.assertEqual(response.data, self.form_data)
Example #45
0
 def test_enketo_url(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({
         'get': 'enketo'
     })
     formid = self.xform.pk
     # no tags
     request = self.factory.get('/', **self.extra)
     with HTTMock(enketo_mock):
         response = view(request, pk=formid)
         data = {"enketo_url": "https://dmfrm.enketo.org/webform"}
         self.assertEqual(response.data, data)
Example #46
0
    def test_enketo_url_no_account(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({'get': 'enketo'})
        formid = self.xform.pk
        # no tags
        request = self.factory.get('/', **self.extra)
        with HTTMock(enketo_error_mock):
            response = view(request, pk=formid)
            data = {'message': u"Enketo not properly configured."}

            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data, data)
Example #47
0
 def test_csv_import_fail(self):
     self._publish_xls_form_to_project()
     view = XFormViewSet.as_view({'post': 'csv_import'})
     csv_import = open(
         os.path.join(settings.PROJECT_ROOT, 'libs', 'utils', 'tests',
                      'fixtures', 'bad.csv'))
     post_data = {'csv_file': csv_import}
     request = self.factory.post('/', data=post_data, **self.extra)
     response = view(request, pk=self.xform.id)
     self.assertEqual(response.status_code, 400)
     self.assertEqual(response.get('Last-Modified'), None)
     self.assertIsNotNone(response.data.get('error'))
Example #48
0
    def test_set_form_bad_key(self):
        self._publish_xls_form_to_project()
        self.xform.save()
        view = XFormViewSet.as_view({'patch': 'partial_update'})
        data = {'nonExistentField': False}

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertFalse(self.xform.shared)
        self.assertFalse(response.data['public'])
Example #49
0
 def test_form_delete(self):
     self._publish_xls_form_to_project()
     self.xform.save()
     view = XFormViewSet.as_view({
         'delete': 'destroy'
     })
     formid = self.xform.pk
     request = self.factory.delete('/', **self.extra)
     response = view(request, pk=formid)
     self.assertEqual(response.data, None)
     self.assertEqual(response.status_code, 204)
     with self.assertRaises(XForm.DoesNotExist):
         self.xform.reload()
Example #50
0
 def test_publish_xlsform_anon(self):
     view = XFormViewSet.as_view({'post': 'create'})
     path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                         "fixtures", "transportation", "transportation.xls")
     username = '******'
     error_msg = 'User with username %s does not exist.' % username
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file, 'owner': username}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.get('Last-Modified'), None)
         self.assertEqual(response.data.get('message'), error_msg)
Example #51
0
 def test_publish_invalid_xls_form(self):
     view = XFormViewSet.as_view({'post': 'create'})
     path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                         "fixtures", "transportation",
                         "transportation.bad_id.xls")
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.get('Last-Modified'), None)
         error_msg = '[row : 5] Question or group with no name.'
         self.assertEqual(response.data.get('text'), error_msg)
Example #52
0
    def test_enketo_url_no_account(self):
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'get': 'enketo'
        })
        formid = self.xform.pk
        # no tags
        request = self.factory.get('/', **self.extra)
        with HTTMock(enketo_error_mock):
            response = view(request, pk=formid)
            data = {'message': u"Enketo not properly configured."}

            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data, data)
Example #53
0
    def test_set_form_bad_value(self):
        key = 'shared'
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({'patch': 'partial_update'})
        data = {'public': 'String'}

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertFalse(self.xform.__getattribute__(key))
        self.assertEqual(
            response.data,
            {'shared': [u"'String' value must be either True or False."]})
Example #54
0
    def test_set_form_bad_key(self):
        self._publish_xls_form_to_project()
        self.xform.save()
        view = XFormViewSet.as_view({
            'patch': 'partial_update'
        })
        data = {'nonExistentField': False}

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertFalse(self.xform.shared)
        self.assertFalse(response.data['public'])
Example #55
0
    def test_form_list_filter_by_user(self):
        # publish bob's form
        self._publish_xls_form_to_project()

        previous_user = self.user
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(extra_post_data=alice_data)
        self.assertEqual(self.user.username, 'alice')
        self.assertNotEqual(previous_user,  self.user)

        ReadOnlyRole.add(self.user, self.xform)
        view = XFormViewSet.as_view({
            'get': 'retrieve'
        })
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.xform.pk)
        bobs_form_data = response.data

        # publish alice's form
        self._publish_xls_form_to_project()

        request = self.factory.get('/', **self.extra)
        response = self.view(request)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        # should be both bob's and alice's form
        self.assertEqual(sorted(response.data),
                         sorted([bobs_form_data, self.form_data]))

        # apply filter, see only bob's forms
        request = self.factory.get('/', data={'owner': 'bob'}, **self.extra)
        response = self.view(request)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [bobs_form_data])

        # apply filter, see only alice's forms
        request = self.factory.get('/', data={'owner': 'alice'}, **self.extra)
        response = self.view(request)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [self.form_data])

        # apply filter, see a non existent user
        request = self.factory.get('/', data={'owner': 'noone'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
Example #56
0
 def test_publish_invalid_xls_form_no_choices(self):
     view = XFormViewSet.as_view({'post': 'create'})
     path = os.path.join(settings.PROJECT_ROOT, "apps", "main", "tests",
                         "fixtures", "transportation",
                         "transportation.no_choices.xls")
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.get('Last-Modified'), None)
         error_msg = (
             'There should be a choices sheet in this xlsform. Please '
             'ensure that the choices sheet name is all in small caps.')
         self.assertEqual(response.data.get('text'), error_msg)
Example #57
0
 def test_publish_invalid_xls_form(self):
     view = XFormViewSet.as_view({
         'post': 'create'
     })
     path = os.path.join(
         settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
         "transportation", "transportation.bad_id.xls")
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.get('Last-Modified'), None)
         error_msg = '[row : 5] Question or group with no name.'
         self.assertEqual(response.data.get('text'), error_msg)
Example #58
0
    def test_set_form_private(self):
        key = 'shared'
        self._publish_xls_form_to_project()
        self.xform.__setattr__(key, True)
        self.xform.save()
        view = XFormViewSet.as_view({'patch': 'partial_update'})
        data = {'public': False}

        self.assertTrue(self.xform.__getattribute__(key))

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertFalse(self.xform.__getattribute__(key))
        self.assertFalse(response.data['public'])
Example #59
0
 def test_publish_xlsform_anon(self):
     view = XFormViewSet.as_view({
         'post': 'create'
     })
     path = os.path.join(
         settings.PROJECT_ROOT, "apps", "main", "tests", "fixtures",
         "transportation", "transportation.xls")
     username = '******'
     error_msg = 'User with username %s does not exist.' % username
     with open(path) as xls_file:
         post_data = {'xls_file': xls_file, 'owner': username}
         request = self.factory.post('/', data=post_data, **self.extra)
         response = view(request)
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.get('Last-Modified'), None)
         self.assertEqual(response.data.get('message'), error_msg)
Example #60
0
    def test_set_form_bad_value(self):
        key = 'shared'
        self._publish_xls_form_to_project()
        view = XFormViewSet.as_view({
            'patch': 'partial_update'
        })
        data = {'public': 'String'}

        request = self.factory.patch('/', data=data, **self.extra)
        response = view(request, pk=self.xform.id)

        self.xform.reload()
        self.assertFalse(self.xform.__getattribute__(key))
        self.assertEqual(response.data,
                         {'shared':
                          [u"'String' value must be either True or False."]})