Beispiel #1
0
    def test_resource_update_with_missing_name(self):
        '''If a user updates a resource and does not pass a name field, the
        name should be changed to the name of the resource's uploaded file.

        '''
        user = factories.User()
        dataset = factories.Dataset(user=user)
        api = ckanapi.TestAppCKAN(self.app, apikey=user['apikey'])
        resource = api.action.resource_create(
            package_id=dataset['id'],
            name='test-resource',
            upload=custom_helpers.get_csv_file(
                'test-data/lahmans-baseball-database/AllstarFull.csv'))

        del resource['name']
        helpers.call_action('resource_update', **resource)

        resource = helpers.call_action('resource_show', id=resource['id'])
        assert resource['name'] == 'AllstarFull.csv'
Beispiel #2
0
    def test_not_authorized_if_user_has_no_permissions_on_dataset(self):

        org = factories.Organization()

        user = factories.User()

        member = {'username': user['name'], 'role': 'admin', 'id': org['id']}
        helpers.call_action('organization_member_create', **member)

        user_2 = factories.User()

        dataset = factories.Dataset(owner_org=org['id'])

        context = {'user': user_2['name'], 'model': core_model}
        nose.tools.assert_raises(logic.NotAuthorized,
                                 helpers.call_auth,
                                 'package_create_default_resource_views',
                                 context=context,
                                 package=dataset)
Beispiel #3
0
 def test_reset_spam_state(self):
     owner = factories.User()
     org = factories.Organization(user=owner)
     dataset = factories.Dataset(owner_org=org['name'])
     issue = issue_factories.Issue(user_id=owner['id'],
                                   dataset_id=dataset['id'],
                                   spam_state='hidden',
                                   spam_count='20')
     context = {
         'user': owner['name'],
         'model': model,
     }
     helpers.call_action('issue_reset_spam_state',
                         context=context,
                         dataset_id=dataset['id'],
                         issue_id=issue['id'])
     result = helpers.call_action('issue_show', id=issue['id'])
     assert_equals(0, result['spam_count'])
     assert_equals('visible', result['spam_state'])
Beispiel #4
0
    def test_publisher_mark_spam(self):
        owner = factories.User()
        org = factories.Organization(user=owner)
        dataset = factories.Dataset(owner_org=org['name'])
        issue = issue_factories.Issue(user=owner,
                                      user_id=owner['id'],
                                      dataset_id=dataset['id'])

        context = {
            'user': owner['name'],
            'model': model,
        }
        helpers.call_action('issue_report_spam',
                            context=context,
                            dataset_id=dataset['id'],
                            issue_id=issue['id'])

        result = helpers.call_action('issue_show', id=issue['id'])
        assert_equals('hidden', result['spam_state'])
Beispiel #5
0
    def test_increase_spam(self):
        owner = factories.User()
        org = factories.Organization(user=owner)
        dataset = factories.Dataset(owner_org=org['name'])
        issue = issue_factories.Issue(user_id=owner['id'],
                                      dataset_id=dataset['id'])

        user = factories.User(name='unauthed')
        context = {
            'user': user['name'],
            'model': model,
        }
        helpers.call_action('issue_report_spam',
                            context=context,
                            dataset_id=dataset['id'],
                            issue_id=issue['id'])

        result = helpers.call_action('issue_show', id=issue['id'])
        assert_equals(1, result['spam_count'])
Beispiel #6
0
    def test_resource_schema_field_create_return_value(self):
        '''resource_schema_field_create should return the field that was
        created.

        '''
        resource = factories.Resource(dataset=factories.Dataset())

        field = helpers.call_action('resource_schema_field_create',
                                    resource_id=resource['id'],
                                    index=0,
                                    name='name',
                                    title='title',
                                    description='description',
                                    type='string',
                                    format='format')

        assert field == helpers.call_action('resource_schema_field_show',
                                            resource_id=resource['id'],
                                            index=0)
Beispiel #7
0
    def test_create_comment_on_issue(self):
        user = factories.User()
        dataset = factories.Dataset()

        issue = issue_factories.Issue(user=user,
                                      user_id=user['id'],
                                      dataset_id=dataset['id'])

        helpers.call_action('issue_comment_create',
                            context={'user': user['name']},
                            issue_id=issue['id'],
                            comment='some comment')

        result = helpers.call_action('issue_show',
                                     context={'user': user['name']},
                                     id=issue['id'])
        comments = result['comments']
        assert_equals(len(comments), 1)
        assert_equals(comments[0]['comment'], 'some comment')
Beispiel #8
0
    def test_extra_gets_deleted_on_extra_only_update(self):
        dataset = factories.Dataset()
        resource = factories.Resource(package=dataset,
                                      url='http://first',
                                      newfield='first')

        res_returned = helpers.call_action('resource_update',
                                           id=resource['id'],
                                           url='http://first',
                                           anotherfield='second')

        assert_equals(res_returned['url'], 'http://first')
        assert_equals(res_returned['anotherfield'], 'second')
        assert 'newfield' not in res_returned

        resource = helpers.call_action('resource_show', id=resource['id'])
        assert_equals(res_returned['url'], 'http://first')
        assert_equals(res_returned['anotherfield'], 'second')
        assert 'newfield' not in res_returned
Beispiel #9
0
    def test_edit_custom_extra_field(self):
        # i.e. an extra field that is not mentioned in the schema, filled in on
        # the form in the 'custom-fields' section
        dataset = factories.Dataset(extras=[{
            'key': 'testkey',
            'value': 'foo'
        }])
        app = self._get_test_app()
        env, response = _get_package_edit_page(app, dataset['name'])
        form = response.forms['dataset-edit']
        form['extras__0__value'] = u'bar'

        response = submit_and_follow(app, form, env, 'save')
        # just check it has finished the edit, rather than being sent on to the
        # resource create/edit form.
        assert_equal(response.req.path, '/dataset/%s' % dataset['name'])

        pkg = model.Package.by_name(dataset['name'])
        assert_equal(pkg.extras['testkey'], u'bar')
Beispiel #10
0
    def test_resource_schema_field_create_with_nonconsecutive_indices(self):
        '''Test creating a field with index 3, when no fields with indexes
        0, 1 or 2 exist yet.

        '''
        resource = factories.Resource(dataset=factories.Dataset())

        helpers.call_action('resource_schema_field_create',
                            resource_id=resource['id'],
                            index=3,
                            name='foo')

        schema = helpers.call_action('resource_schema_show',
                                     resource_id=resource['id'])
        assert 'fields' in schema
        fields = schema['fields']
        assert len(fields) == 1
        field = fields[0]
        assert field == {'index': 3, 'name': 'foo'}
Beispiel #11
0
    def test_resource_with_no_file(self):
        '''When viewing the page of a resource that has a remote URL instead of
        an uploaded file, a 'No such file or directory' error should be shown
        instead of the CSV preview.

        '''
        dataset = factories.Dataset()
        resource = factories.Resource(dataset=dataset)

        response = self.app.get(
            toolkit.url_for(controller='package', action='resource_read',
                            id=dataset['id'], resource_id=resource['id']))

        soup = response.html
        divs = soup('div', class_='ckanext-datapreview')
        assert len(divs) == 1
        div = divs[0]
        assert div.text.strip() == ("Error: There's no uploaded file for this "
                                    "resource")
Beispiel #12
0
    def setup(self):
        super(TestModeratedAbuseReport, self).setup()
        self.owner = factories.User()
        self.reporter = factories.User()
        self.org = factories.Organization(user=self.owner)
        self.dataset = factories.Dataset(user=self.owner,
                                         owner_org=self.org['name'])

        # issue_abuse is moderated - i.e. definitely abuse/spam
        self.issue_abuse = issue_factories.Issue(user=self.owner,
                                                 user_id=self.owner['id'],
                                                 dataset_id=self.dataset['id'])
        issue_abuse = Issue.get(self.issue_abuse['id'])
        issue_abuse.visibility = 'hidden'
        issue_abuse.report_abuse(model.Session, self.reporter['id'])
        issue_abuse.abuse_status = AbuseStatus.abuse.value
        issue_abuse.save()
        self.user = factories.User()
        self.app = self._get_test_app()
Beispiel #13
0
    def test_user_cannot_edit_another_users_issue(self):
        owner = factories.User()
        user = factories.User()
        org = factories.Organization(user=owner)
        dataset = factories.Dataset(user=owner, owner_org=org['name'])
        issue = issue_factories.Issue(user=owner, dataset_id=dataset['id'])

        app = self._get_test_app()
        env = {'REMOTE_USER': user['name'].encode('ascii')}

        response = app.post(
            url=toolkit.url_for('issues_edit',
                                package_id=dataset['id'],
                                id=issue['id']),
            params={'title': 'edit', 'description': 'edited description'},
            extra_environ=env,
            expect_errors=True
        )
        assert_equals(response.status_int, 401)
    def test_spatial_extra(self):
        ''' '''
        app = self._get_test_app()

        user = factories.User()
        env = {u'REMOTE_USER': user[u'name'].encode(u'ascii')}
        dataset = factories.Dataset(user=user)

        offset = toolkit.url_for(controller=u'package',
                                 action=u'edit',
                                 id=dataset[u'id'])
        res = app.get(offset, extra_environ=env)

        form = res.forms[1]
        form[u'extras__0__key'] = u'spatial'
        form[u'extras__0__value'] = self.geojson_examples[u'point']

        res = helpers.submit_and_follow(app, form, env, u'save')

        assert u'Error' not in res, res

        package_extent = Session.query(PackageExtent) \
            .filter(PackageExtent.package_id == dataset[u'id']).first()

        geojson = json.loads(self.geojson_examples[u'point'])

        assert_equals(package_extent.package_id, dataset[u'id'])
        if legacy_geoalchemy:
            assert_equals(Session.scalar(package_extent.the_geom.x),
                          geojson[u'coordinates'][0])
            assert_equals(Session.scalar(package_extent.the_geom.y),
                          geojson[u'coordinates'][1])
            assert_equals(Session.scalar(package_extent.the_geom.srid),
                          self.db_srid)
        else:
            from sqlalchemy import func
            assert_equals(
                Session.query(func.ST_X(package_extent.the_geom)).first()[0],
                geojson[u'coordinates'][0])
            assert_equals(
                Session.query(func.ST_Y(package_extent.the_geom)).first()[0],
                geojson[u'coordinates'][1])
            assert_equals(package_extent.the_geom.srid, self.db_srid)
Beispiel #15
0
    def test_default_views_created_on_package_update(self):

        dataset_dict = factories.Dataset(resources=[{
            'url': 'http://not.for.viewing',
            'format': 'xxx',
        }])

        resource_id = dataset_dict['resources'][0]['id']

        views_list = helpers.call_action('resource_view_list', id=resource_id)

        eq_(len(views_list), 0)

        updated_data_dict = {
            'id':
            dataset_dict['id'],
            'resources': [
                {
                    'url': 'http://not.for.viewing',
                    'format': 'xxx',
                },
                {
                    'url': 'http://some.image.png',
                    'format': 'png',
                },
            ]
        }

        dataset_dict = helpers.call_action('package_update',
                                           **updated_data_dict)

        for resource in dataset_dict['resources']:
            resource_id = resource['id'] if resource[
                'format'] == 'PNG' else None

        assert resource_id

        updated_views_list = helpers.call_action('resource_view_list',
                                                 id=resource_id)
        eq_(len(updated_views_list), 1)
        eq_(updated_views_list[0]['view_type'], 'image_view')

        pass
Beispiel #16
0
    def test_spatial_extra_bad_geojson(self):
        app = self._get_test_app()

        user = factories.User()
        env = {'REMOTE_USER': user['name'].encode('ascii')}
        dataset = factories.Dataset(user=user)

        offset = url_for(controller='package', action='edit', id=dataset['id'])
        res = app.get(offset, extra_environ=env)

        form = res.forms[1]
        form['extras__0__key'] = u'spatial'
        form['extras__0__value'] = u'{"Type":"Bad_GeoJSON","a":2}'

        res = helpers.webtest_submit(form, extra_environ=env, name='save')

        assert 'Error' in res, res
        assert 'Spatial' in res
        assert 'Error creating geometry' in res
Beispiel #17
0
    def test_package_patch_updating_single_field(self):
        user = factories.User()
        dataset = factories.Dataset(
            name='annakarenina',
            notes='some test now',
            user=user)

        dataset = helpers.call_action(
            'package_patch',
            id=dataset['id'],
            name='somethingnew')

        assert_equals(dataset['name'], 'somethingnew')
        assert_equals(dataset['notes'], 'some test now')

        dataset2 = helpers.call_action('package_show', id=dataset['id'])

        assert_equals(dataset2['name'], 'somethingnew')
        assert_equals(dataset2['notes'], 'some test now')
Beispiel #18
0
    def test_resource_update(self):
        '''Test that a resource's schema is updated when the resource is
        updated with a new uploaded CSV file.

        Unit tests elsewhere test that the schemas inferred from CSV files are
        correct, here we're just testing that the schema gets added to the
        resource on resource_create().

        '''
        user = factories.Sysadmin()
        package = factories.Dataset(user=user)
        api = ckanapi.TestAppCKAN(self.app, apikey=user['apikey'])

        # Upload a first CSV file to the package.
        csv_file = custom_helpers.get_csv_file(
            'test-data/lahmans-baseball-database/AllstarFull.csv')
        api.action.resource_create(package_id=package['id'],
                                   name='test-package',
                                   upload=csv_file)

        # Get the generated schema from the resource.
        package = api.action.package_show(id=package['id'])
        assert len(package['resources']) == 1
        resource = package['resources'][0]
        assert 'schema' in resource
        original_schema = resource['schema']

        # Now update the resource with a new file.
        csv_file = custom_helpers.get_csv_file(
            'test-data/lahmans-baseball-database/Appearances.csv')
        api.action.resource_update(id=resource['id'],
                                   name=resource['name'],
                                   upload=csv_file)

        # Check that the schema has been changed.
        package = api.action.package_show(id=package['id'])
        assert len(package['resources']) == 1
        resource = package['resources'][0]
        assert 'schema' in resource
        schema = resource['schema']
        assert 'fields' in schema
        assert schema != original_schema
Beispiel #19
0
    def test_normal_user_cannot_update_issue(self):
        issue_owner = factories.User()
        org = factories.Organization()
        dataset = factories.Dataset(owner_org=org['name'])
        issue = issue_factories.Issue(user=issue_owner,
                                      user_id=issue_owner['id'],
                                      dataset_id=dataset['id'])

        other_user = factories.User()
        context = {
            'user': other_user['name'],
            'model': model,
        }
        assert_raises(toolkit.NotAuthorized,
                      helpers.call_auth,
                      'issue_update',
                      context,
                      id=issue['id'],
                      dataset_id=dataset['id'],
                      status='open')
Beispiel #20
0
    def test_org_editor_can_update_an_issue(self):
        org_editor = factories.User()
        org = factories.Organization()
        helpers.call_action('member_create',
                            object=org_editor['name'],
                            id=org['id'],
                            object_type='user',
                            capacity='editor')
        dataset = factories.Dataset(owner_org=org['name'], private=True)
        user = helpers.call_action('get_site_user')
        issue = issue_factories.Issue(user=user, dataset_id=dataset['id'])

        context = {
            'user': org_editor['name'],
            'model': model,
        }
        assert_true(
            helpers.call_auth('issue_update',
                              context,
                              dataset_id=dataset['id']))
Beispiel #21
0
    def test_group_dictize_with_package_list_limited_over(self):
        '''
        Packages limit is set higher than number of packages in group.
        '''
        group_ = factories.Group()
        for _ in range(3):
            factories.Dataset(groups=[{'name': group_['name']}])
        group_obj = model.Session.query(model.Group).filter_by().first()
        # limit packages to 4
        context = {
            'model': model,
            'session': model.Session,
            'limits': {
                'packages': 4
            }
        }

        group = model_dictize.group_dictize(group_obj, context)

        assert_equal(len(group['packages']), 3)
Beispiel #22
0
    def test_authorized_if_user_has_permissions_on_dataset(self):

        user = factories.User()

        dataset = factories.Dataset(user=user)

        resource = factories.Resource(user=user, package_id=dataset['id'])

        resource_view = {
            'resource_id': resource['id'],
            'title': u'Resource View',
            'view_type': u'image_view',
            'image_url': 'url'
        }

        context = {'user': user['name'], 'model': core_model}
        response = helpers.call_auth('resource_view_create',
                                     context=context,
                                     **resource_view)
        assert_equals(response, True)
Beispiel #23
0
    def test_resource_schema_field_update_with_invalid_type(self):
        '''Updating a field with an invalid type should raise ValidationError.

        '''
        resource = factories.Resource(dataset=factories.Dataset())
        field = helpers.call_action('resource_schema_field_create',
                                    resource_id=resource['id'],
                                    index=0,
                                    name='foo',
                                    type='string')

        for type_ in (False, 1, 2.0, [], {}, '', 'foo', [1, 2, 3], {
                'foo': 'bar'
        }):
            field['type'] = type_
            nose.tools.assert_raises(toolkit.ValidationError,
                                     helpers.call_action,
                                     'resource_schema_field_update',
                                     resource_id=resource['id'],
                                     **field)
Beispiel #24
0
    def test_org_editor_can_update_an_issue(self):
        org_editor = factories.User()
        org = factories.Organization(users=[{
            'name': org_editor['id'],
            'capacity': 'editor'
        }])
        dataset = factories.Dataset(owner_org=org['name'], private=True)
        user = helpers.call_action('get_site_user')
        issue = issue_factories.Issue(user=user, dataset_id=dataset['id'])

        context = {
            'user': org_editor['name'],
            'model': model,
        }
        assert_true(
            helpers.call_auth('issue_update',
                              context,
                              issue_number=issue['number'],
                              dataset_id=dataset['id'],
                              status='open'))
Beispiel #25
0
 def test_create_index_on_specific_fields(self):
     package = factories.Dataset()
     data = {
         'resource': {
             'boo%k': 'crime',
             'author': ['tolstoy', 'dostoevsky'],
             'package_id': package['id']
         },
         'fields': [{
             'id': 'book',
             'type': 'text'
         }, {
             'id': 'author',
             'type': 'text'
         }],
         'indexes': ['author']
     }
     result = helpers.call_action('datastore_create', **data)
     resource_id = result['resource_id']
     assert self._has_index_on_field(resource_id, '"author"')
Beispiel #26
0
 def test_create_adds_index_on_full_text_search_when_not_creating_other_indexes(
         self):
     package = factories.Dataset()
     data = {
         'resource': {
             'boo%k': 'crime',
             'author': ['tolstoy', 'dostoevsky'],
             'package_id': package['id']
         },
         'fields': [{
             'id': 'book',
             'type': 'text'
         }, {
             'id': 'author',
             'type': 'text'
         }],
     }
     result = helpers.call_action('datastore_create', **data)
     resource_id = result['resource_id']
     assert self._has_index_on_field(resource_id, '"_full_text"')
Beispiel #27
0
    def test_resource_controller_plugin_create(self):
        user = factories.Sysadmin()
        package = factories.Dataset(user=user)

        # Set up the plugin
        ckan.plugins.load('example_iresourcecontroller')
        plugin = ckan.plugins.get_plugin('example_iresourcecontroller')

        res = helpers.call_action('resource_create',
                                  package_id=package['id'],
                                  name='test-resource',
                                  url='http://resource.create/',
                                  apikey=user['apikey'])

        assert plugin.counter['before_create'] == 1, plugin.counter
        assert plugin.counter['after_create'] == 1, plugin.counter
        assert plugin.counter['before_update'] == 0, plugin.counter
        assert plugin.counter['after_update'] == 0, plugin.counter
        assert plugin.counter['before_delete'] == 0, plugin.counter
        assert plugin.counter['after_delete'] == 0, plugin.counter
Beispiel #28
0
    def test_group_dictize_with_package_list_limited(self):
        '''
        Packages returned in group are limited by context var.
        '''
        group_ = factories.Group()
        for _ in range(10):
            factories.Dataset(groups=[{'name': group_['name']}])
        group_obj = model.Session.query(model.Group).filter_by().first()
        # limit packages to 4
        context = {
            'model': model,
            'session': model.Session,
            'limits': {
                'packages': 4
            }
        }

        group = model_dictize.group_dictize(group_obj, context)

        assert_equal(len(group['packages']), 4)
Beispiel #29
0
    def test_resource_update_with_custom_format(self):
        '''If a format other than CSV is given when updating a resource, it
        should be accepted.

        '''
        user = factories.User()
        dataset = factories.Dataset(user=user)
        api = ckanapi.TestAppCKAN(self.app, apikey=user['apikey'])
        resource = api.action.resource_create(
            package_id=dataset['id'],
            upload=custom_helpers.get_csv_file(
                'test-data/lahmans-baseball-database/AllstarFull.csv'))

        for format_ in ('jpeg', 'image/png', 'foobar'):
            resource = api.action.resource_update(id=resource['id'],
                                                  format=format_,
                                                  url=resource['url'])

            resource = api.action.resource_show(id=resource['id'])
            assert resource['format'] == format_
Beispiel #30
0
    def test_resource_schema_field_create_with_string_int_as_index(self):
        '''If an integer in a string (like "1") is passed as the index
        parameter to resource_schema_field_create it should be converted to
        an int and used.

        '''
        resource = factories.Resource(dataset=factories.Dataset())

        helpers.call_action('resource_schema_field_create',
                            resource_id=resource['id'],
                            index='0',
                            name='foo')

        schema = helpers.call_action('resource_schema_show',
                                     resource_id=resource['id'])
        assert 'fields' in schema
        fields = schema['fields']
        assert len(fields) == 1
        field = fields[0]
        assert field == {'index': 0, 'name': 'foo'}