Пример #1
0
    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
    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')