コード例 #1
0
ファイル: test_plugin.py プロジェクト: okfn/ckanext-express
    def test_sysadmins_with_3_sysadmins(self):
        sysadmin_1 = factories.Sysadmin()
        sysadmin_2 = factories.Sysadmin()
        sysadmin_3 = factories.Sysadmin()

        assert _equal_unordered(
            plugin.sysadmins(),
            [sysadmin_1['id'], sysadmin_2['id'], sysadmin_3['id']])
コード例 #2
0
    def test_resource_controller_plugin_show(self):
        """
        Before show gets called by the other methods but we test it
        separately here and make sure that it doesn't call the other
        methods.
        """
        user = factories.Sysadmin()
        package = factories.Dataset(user=user)
        resource = factories.Resource(user=user, package_id=package['id'])

        # Set up the plugin here because we don't want the resource creation
        # to affect it (because we will only check for changes to delete)
        ckan.plugins.load('example_iresourcecontroller')
        plugin = ckan.plugins.get_plugin('example_iresourcecontroller')

        res = helpers.call_action('package_show',
                                  name_or_id=package['id'])

        assert plugin.counter['before_create'] == 0, plugin.counter
        assert plugin.counter['after_create'] == 0, 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
        assert plugin.counter['before_show'] == 1, plugin.counter
コード例 #3
0
    def test_package_purge_deletes_associations(self):
        '''
        Purging a package (actually deleting it from the database) deletes
        associated ShowcasePackageAssociation objects.
        '''
        sysadmin = factories.Sysadmin()
        context = {'user': sysadmin['name']}
        showcase = factories.Dataset(type='showcase', name='my-showcase')
        dataset_one = factories.Dataset(name='dataset-one')
        dataset_two = factories.Dataset(name='dataset-two')

        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context, package_id=dataset_one['id'],
                            showcase_id=showcase['id'])
        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context, package_id=dataset_two['id'],
                            showcase_id=showcase['id'])

        nosetools.assert_equal(model.Session.query(ShowcasePackageAssociation).count(), 2)

        # purge the first package, should also delete the
        # ShowcasePackageAssociation associated with it.
        pkg = model.Session.query(model.Package).get(dataset_one['id'])
        pkg.purge()
        model.repo.commit_and_remove()

        nosetools.assert_equal(model.Session.query(ShowcasePackageAssociation).count(), 1)
コード例 #4
0
    def test_showcase_new_redirects_to_manage_datasets(self):
        '''Creating a new showcase redirects to the manage datasets form.'''
        app = self._get_test_app()
        sysadmin = factories.Sysadmin()
        # need a dataset for the 'bulk_action.showcase_add' button to show
        factories.Dataset()

        env = {'REMOTE_USER': sysadmin['name'].encode('ascii')}
        response = app.get(
            url=url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='new'),
            extra_environ=env,
        )

        # create showcase
        form = response.forms['dataset-edit']
        form['name'] = u'my-showcase'
        create_response = submit_and_follow(app, form, env, 'save')

        # Unique to manage_datasets page
        nosetools.assert_true('bulk_action.showcase_add' in create_response)
        # Requested page is the manage_datasets url.
        nosetools.assert_equal(
            url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='manage_datasets',
                id='my-showcase'), create_response.request.path)
コード例 #5
0
    def test_resource_create(self):
        '''Test that a schema is added to a resource when it's created.

        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'])
        csv_file = custom_helpers.get_csv_file(
            'test-data/lahmans-baseball-database/AllstarFull.csv')

        api.action.resource_create(package_id=package['id'],
                                   name='test-resource',
                                   upload=csv_file)

        # Apparently resource_create doesn't return the resource dict when
        # called via ckanapi, so we need another call to get it.
        package = api.action.package_show(id=package['id'])

        # The package should have just one resource, the one we just created.
        assert len(package['resources']) == 1
        resource = package['resources'][0]

        # There should be a schema in the resource.
        assert 'schema' in resource
        assert 'fields' in resource['schema']
コード例 #6
0
    def test_showcase_admin_manage_page_lists_showcase_admins(self):
        '''
        Showcase admins are listed on the showcase admin page.
        '''
        app = self._get_test_app()
        user_one = factories.User()
        user_two = factories.User()
        user_three = factories.User()

        helpers.call_action('ckanext_showcase_admin_add',
                            context={},
                            username=user_one['name'])
        helpers.call_action('ckanext_showcase_admin_add',
                            context={},
                            username=user_two['name'])

        sysadmin = factories.Sysadmin()

        env = {'REMOTE_USER': sysadmin['name'].encode('ascii')}
        response = app.get(url=url_for(
            controller='ckanext.showcase.controller:ShowcaseController',
            action='manage_showcase_admins'),
                           status=200,
                           extra_environ=env)

        nosetools.assert_true('/user/{0}'.format(user_one['name']) in response)
        nosetools.assert_true('/user/{0}'.format(user_two['name']) in response)
        nosetools.assert_true(
            '/user/{0}'.format(user_three['name']) not in response)
コード例 #7
0
    def test_dataset_showcase_page_add_to_showcase_dropdown_submit(self):
        '''
        Submitting 'Add to showcase' form with selected showcase value creates
        a sc/pkg association.
        '''
        app = self._get_test_app()
        sysadmin = factories.Sysadmin()
        dataset = factories.Dataset(name='my-dataset')
        showcase_one = factories.Dataset(name='my-first-showcase',
                                         type='showcase')
        factories.Dataset(name='my-second-showcase', type='showcase')
        factories.Dataset(name='my-third-showcase', type='showcase')

        nosetools.assert_equal(
            model.Session.query(ShowcasePackageAssociation).count(), 0)

        env = {'REMOTE_USER': sysadmin['name'].encode('ascii')}

        response = app.get(url=url_for(
            controller='ckanext.showcase.controller:ShowcaseController',
            action='dataset_showcase_list',
            id=dataset['id']),
                           extra_environ=env)

        form = response.forms['showcase-add']
        form['showcase_added'] = showcase_one['id']
        showcase_add_response = submit_and_follow(app, form, env)

        # returns to the correct page
        nosetools.assert_equal(showcase_add_response.request.path,
                               "/dataset/showcases/my-dataset")
        # an association is created
        nosetools.assert_equal(
            model.Session.query(ShowcasePackageAssociation).count(), 1)
コード例 #8
0
    def test_dataset_showcase_page_add_to_showcase_dropdown_list(self):
        '''
        Add to showcase dropdown only lists showcases that aren't already
        associated with dataset.
        '''
        app = self._get_test_app()
        sysadmin = factories.Sysadmin()
        dataset = factories.Dataset(name='my-dataset')
        showcase_one = factories.Dataset(name='my-first-showcase',
                                         type='showcase')
        showcase_two = factories.Dataset(name='my-second-showcase',
                                         type='showcase')
        showcase_three = factories.Dataset(name='my-third-showcase',
                                           type='showcase')

        context = {'user': sysadmin['name']}
        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context,
                            package_id=dataset['id'],
                            showcase_id=showcase_one['id'])

        response = app.get(
            url=url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='dataset_showcase_list',
                id=dataset['id']),
            extra_environ={'REMOTE_USER': str(sysadmin['name'])})

        showcase_add_form = response.forms['showcase-add']
        showcase_added_options = [
            value for (value, _) in showcase_add_form['showcase_added'].options
        ]
        nosetools.assert_true(showcase_one['id'] not in showcase_added_options)
        nosetools.assert_true(showcase_two['id'] in showcase_added_options)
        nosetools.assert_true(showcase_three['id'] in showcase_added_options)
コード例 #9
0
    def test_dataset_showcase_page_lists_showcases_two_associations(self):
        '''
        Two showcases are listed for dataset with two showcase associations.
        '''

        app = self._get_test_app()
        sysadmin = factories.Sysadmin()
        dataset = factories.Dataset(name='my-dataset')
        showcase_one = factories.Dataset(name='my-first-showcase',
                                         type='showcase')
        showcase_two = factories.Dataset(name='my-second-showcase',
                                         type='showcase')
        factories.Dataset(name='my-third-showcase', type='showcase')

        context = {'user': sysadmin['name']}
        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context,
                            package_id=dataset['id'],
                            showcase_id=showcase_one['id'])
        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context,
                            package_id=dataset['id'],
                            showcase_id=showcase_two['id'])

        response = app.get(url=url_for(
            controller='ckanext.showcase.controller:ShowcaseController',
            action='dataset_showcase_list',
            id=dataset['id']))

        nosetools.assert_equal(len(response.html.select('li.media-item')), 2)
        nosetools.assert_true('my-first-showcase' in response)
        nosetools.assert_true('my-second-showcase' in response)
        nosetools.assert_true('my-third-showcase' not in response)
コード例 #10
0
    def test_showcase_edit_redirects_to_showcase_details(self):
        '''Editing a showcase redirects to the showcase details page.'''
        app = self._get_test_app()
        sysadmin = factories.Sysadmin()
        factories.Dataset(name='my-showcase', type='showcase')

        env = {'REMOTE_USER': sysadmin['name'].encode('ascii')}
        response = app.get(
            url=url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='edit',
                id='my-showcase'),
            extra_environ=env,
        )

        # edit showcase
        form = response.forms['dataset-edit']
        form['name'] = u'my-changed-showcase'
        edit_response = submit_and_follow(app, form, env, 'save')

        # Requested page is the showcase read url.
        nosetools.assert_equal(
            url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='read',
                id='my-changed-showcase'), edit_response.request.path)
コード例 #11
0
    def test_package_delete_retains_associations(self):
        '''
        Deleting a package (setting its status to 'delete') retains associated
        ShowcasePackageAssociation objects.
        '''
        sysadmin = factories.Sysadmin()
        context = {'user': sysadmin['name']}
        showcase = factories.Dataset(type='showcase', name='my-showcase')
        dataset_one = factories.Dataset(name='dataset-one')
        dataset_two = factories.Dataset(name='dataset-two')

        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context, package_id=dataset_one['id'],
                            showcase_id=showcase['id'])
        helpers.call_action('ckanext_showcase_package_association_create',
                            context=context, package_id=dataset_two['id'],
                            showcase_id=showcase['id'])

        nosetools.assert_equal(model.Session.query(ShowcasePackageAssociation).count(), 2)

        # delete the first package, should also delete the
        # ShowcasePackageAssociation associated with it.
        helpers.call_action('package_delete',
                            context=context, id=dataset_one['id'])

        nosetools.assert_equal(model.Session.query(ShowcasePackageAssociation).count(), 2)
コード例 #12
0
    def test_group_show_does_not_show_private_datasets(self):
        '''group_show() should never show private datasets.

        If a dataset is a private member of an organization and also happens to
        be a member of a group, group_show() should not return the dataset as
        part of the group dict, even if the user calling group_show() is a
        member or admin of the group or the organization or is a sysadmin.

        '''
        org_member = factories.User()
        org = factories.Organization(user=org_member)
        private_dataset = factories.Dataset(user=org_member,
                                            owner_org=org['name'],
                                            private=True)

        group = factories.Group()

        # Add the private dataset to the group.
        helpers.call_action('member_create',
                            id=group['id'],
                            object=private_dataset['id'],
                            object_type='package',
                            capacity='public')

        # Create a member user and an admin user of the group.
        group_member = factories.User()
        helpers.call_action('member_create',
                            id=group['id'],
                            object=group_member['id'],
                            object_type='user',
                            capacity='member')
        group_admin = factories.User()
        helpers.call_action('member_create',
                            id=group['id'],
                            object=group_admin['id'],
                            object_type='user',
                            capacity='admin')

        # Create a user who isn't a member of any group or organization.
        non_member = factories.User()

        sysadmin = factories.Sysadmin()

        # None of the users should see the dataset when they call group_show().
        for user in (org_member, group_member, group_admin, non_member,
                     sysadmin, None):

            if user is None:
                context = None  # No user logged-in.
            else:
                context = {'user': user['name']}

            group = helpers.call_action('group_show',
                                        id=group['id'],
                                        context=context)

            assert private_dataset['id'] not in [
                dataset['id'] for dataset in group['packages']
            ], ("group_show() should never show private datasets")
コード例 #13
0
    def test_sysadmin_can_update_any_users_package(self):
        package = factories.Dataset(user=factories.User())
        context = {'user': factories.Sysadmin()['name'], 'ignore_auth': False}

        helpers.call_action('package_update',
                            context=context,
                            id=package['id'],
                            schema='')
コード例 #14
0
 def test_showcase_admin_list_correct_creds(self):
     '''
     Calling showcase admin list by a sysadmin doesn't raise
     NotAuthorized.
     '''
     a_sysadmin = factories.Sysadmin()
     context = {'user': a_sysadmin['name'], 'model': None}
     helpers.call_auth('ckanext_showcase_admin_list', context=context)
コード例 #15
0
    def test_sysadmin_can_create_group_when_config_is_True(self):
        app = self._get_app(users_can_create_groups=True)
        sysadmin = factories.Sysadmin()

        tests.call_action_api(app,
                              'group_create',
                              name='test-group',
                              apikey=sysadmin['apikey'])
コード例 #16
0
def _get_package_new_page_as_sysadmin(app):
    user = factories.Sysadmin()
    env = {'REMOTE_USER': user['name'].encode('ascii')}
    response = app.get(
        url=url_for(controller='package', action='new'),
        extra_environ=env,
    )
    return env, response
コード例 #17
0
 def test_showcase_delete_no_args(self):
     '''
     Calling showcase delete with no args raises a ValidationError.
     '''
     sysadmin = factories.Sysadmin()
     context = {'user': sysadmin['name']}
     nosetools.assert_raises(toolkit.ValidationError, helpers.call_action,
                             'ckanext_showcase_delete', context=context)
コード例 #18
0
    def test_sysadmin_can_delete_anyones_package(self):
        package = factories.Dataset(user=factories.User())

        sysadmin = factories.Sysadmin()
        extra_environ = {'REMOTE_USER': str(sysadmin['name'])}

        response = self.app.get('/package/delete/{0}'.format(package['name']),
                                extra_environ=extra_environ)
        nose.tools.assert_equals(200, response.status_int)
コード例 #19
0
 def test_auth_sysadmin_can_view_showcase_admin_manage_page(self):
     '''
     A sysadmin can access the manage showcase admin page.
     '''
     app = self._get_test_app()
     user = factories.Sysadmin()
     app.get("/showcase/new",
             status=200,
             extra_environ={'REMOTE_USER': str(user['name'])})
コード例 #20
0
    def test_users_can_delete_packages_they_created(self):
        user = factories.Sysadmin()
        package = factories.Dataset(user=user)

        extra_environ = {'REMOTE_USER': str(user['name'])}

        response = self.app.get('/package/delete/{0}'.format(package['name']),
                                extra_environ=extra_environ)
        nose.tools.assert_equals(200, response.status_int)
コード例 #21
0
    def test_sysadmins_can_update_all_packages(self):
        sysadmin = factories.Sysadmin()
        package = factories.Dataset(user=factories.User())

        extra_environ = {'REMOTE_USER': str(sysadmin['name'])}

        response = self.app.get('/package/edit/{0}'.format(package['name']),
                                extra_environ=extra_environ)
        nose.tools.assert_equals(200, response.status_int)
コード例 #22
0
    def test_sysadmins_can_view_other_users_packages(self):
        package = factories.Dataset(user=factories.User())

        other_user = factories.Sysadmin()
        extra_environ = {'REMOTE_USER': str(other_user['name'])}

        response = self.app.get('/package/{0}'.format(package['name']),
                                extra_environ=extra_environ)
        nose.tools.assert_equals(200, response.status_int)
コード例 #23
0
 def test_showcase_package_association_delete_sysadmin(self):
     '''
     Calling showcase package association create by a sysadmin doesn't
     raise NotAuthorized.
     '''
     a_sysadmin = factories.Sysadmin()
     context = {'user': a_sysadmin['name'], 'model': None}
     helpers.call_auth('ckanext_showcase_package_association_delete',
                       context=context)
コード例 #24
0
 def test_id_cant_already_exist(self):
     dataset = factories.Dataset()
     user = factories.Sysadmin()
     assert_raises(
         logic.ValidationError,
         helpers.call_action,
         'package_create',
         id=dataset['id'],
         name='test-dataset',
     )
コード例 #25
0
 def test_showcase_delete_incorrect_args(self):
     '''
     Calling showcase delete with incorrect args raises ObjectNotFound.
     '''
     sysadmin = factories.Sysadmin()
     context = {'user': sysadmin['name']}
     factories.Dataset(type='showcase')
     nosetools.assert_raises(toolkit.ObjectNotFound, helpers.call_action,
                             'ckanext_showcase_delete', context=context,
                             id='blah-blah')
コード例 #26
0
    def test_user_generate_apikey_sysadmin_user(self):
        user = factories.User()
        sysadmin = factories.Sysadmin()
        context = {'user': sysadmin['name'], 'ignore_auth': False}
        result = helpers.call_action('user_generate_apikey', context=context,
                                     id=user['id'])
        updated_user = helpers.call_action('user_show', context=context,
                                           id=user['id'])

        assert updated_user['apikey'] != user['apikey']
        assert result['apikey'] == updated_user['apikey']
コード例 #27
0
    def test_sysadmin_is_authorized(self):

        sysadmin = factories.Sysadmin()

        resource = {'title': 'Resource', 'url': 'http://test', 'format': 'csv'}

        context = {'user': sysadmin['name'], 'model': core_model}
        response = helpers.call_auth('resource_create',
                                     context=context,
                                     **resource)
        assert_equals(response, True)
コード例 #28
0
    def test_showcase_create_form_renders(self):
        app = self._get_test_app()
        sysadmin = factories.Sysadmin()

        env = {'REMOTE_USER': sysadmin['name'].encode('ascii')}
        response = app.get(
            url=url_for(
                controller='ckanext.showcase.controller:ShowcaseController',
                action='new'),
            extra_environ=env,
        )
        nosetools.assert_true('dataset-edit' in response.forms)
コード例 #29
0
    def test_auth_sysadmin_can_view_delete_showcase_page(self):
        '''
        A sysadmin can access the showcase delete page.
        '''
        app = self._get_test_app()
        user = factories.Sysadmin()

        factories.Dataset(type='showcase', name='my-showcase')

        app.get('/showcase/delete/my-showcase',
                status=200,
                extra_environ={'REMOTE_USER': str(user['name'])})
コード例 #30
0
 def test_sysadmin_can_set_id(self):
     user = factories.Sysadmin()
     context = {
         'user': user['name'],
         'ignore_auth': False,
     }
     dataset = helpers.call_action(
         'package_create',
         context=context,
         id='1234',
         name='test-dataset',
     )
     assert_equals(dataset['id'], '1234')