diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py
index 769587951fa..c6328acda06 100644
--- a/ckan/lib/helpers.py
+++ b/ckan/lib/helpers.py
@@ -472,6 +472,8 @@ def _url_for_pylons(*args, **kw):
not kw['ver'].startswith('/')):
kw['ver'] = '/%s' % kw['ver']
+ if args:
+ args = (six.ensure_str(args[0]), ) + args[1:]
# Try to build the URL with routes.url_for
return _routes_default_url_for(*args, **kw)
diff --git a/ckan/logic/__init__.py b/ckan/logic/__init__.py
index cdcfa984a26..4415b140a4c 100644
--- a/ckan/logic/__init__.py
+++ b/ckan/logic/__init__.py
@@ -35,7 +35,10 @@ def __init__(self, message=''):
super(ActionError, self).__init__(message)
def __str__(self):
- return str(self.message)
+ msg = self.message
+ if not isinstance(msg, six.string_types):
+ msg = str(msg)
+ return six.ensure_text(msg)
class NotFound(ActionError):
diff --git a/ckan/logic/converters.py b/ckan/logic/converters.py
index 3e26380792a..ef94ef4d693 100644
--- a/ckan/logic/converters.py
+++ b/ckan/logic/converters.py
@@ -54,7 +54,7 @@ def free_tags_only(key, data, errors, context):
tag_number = key[1]
if not data.get(('tags', tag_number, 'vocabulary_id')):
return
- for k in data.keys():
+ for k in list(data.keys()):
if k[0] == 'tags' and k[1] == tag_number:
del data[k]
diff --git a/ckan/model/domain_object.py b/ckan/model/domain_object.py
index 07101c2aea0..f5190a9df8f 100644
--- a/ckan/model/domain_object.py
+++ b/ckan/model/domain_object.py
@@ -100,7 +100,7 @@ def as_dict(self):
return _dict
def __str__(self):
- return self.__unicode__().encode('utf8')
+ return repr(self)
def __unicode__(self):
repr = u'<%s' % self.__class__.__name__
diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py
index cc4bbf067bd..ae1052eea4f 100644
--- a/ckan/tests/controllers/test_package.py
+++ b/ckan/tests/controllers/test_package.py
@@ -475,8 +475,8 @@ class TestPackageRead(object):
def test_read(self, app):
dataset = factories.Dataset()
response = app.get(url_for("dataset.read", id=dataset["name"]))
- response.mustcontain("Test Dataset")
- response.mustcontain("Just another test dataset")
+ assert helpers.body_contains(response, "Test Dataset")
+ assert helpers.body_contains(response, "Just another test dataset")
def test_organization_members_can_read_private_datasets(self, app):
members = {
@@ -554,7 +554,7 @@ def test_read_dataset_as_it_used_to_be(self, app):
),
extra_environ=env,
)
- response.mustcontain("Original title")
+ assert helpers.body_contains(response, "Original title")
def test_read_dataset_as_it_used_to_be_but_is_unmigrated(self, app):
# Renders the dataset using the activity detail, when that Activity was
@@ -667,7 +667,7 @@ def test_anon_user_cannot_delete_owned_dataset(self, app):
response = app.post(
url_for("dataset.delete", id=dataset["name"]), status=403
)
- response.mustcontain("Unauthorized to delete package")
+ assert helpers.body_contains(response, "Unauthorized to delete package")
deleted = helpers.call_action("package_show", id=dataset["id"])
assert "active" == deleted["state"]
@@ -687,7 +687,7 @@ def test_logged_in_user_cannot_delete_owned_dataset(self, app):
)
assert 403 == response.status_int
- response.mustcontain("Unauthorized to delete package")
+ assert helpers.body_contains(response, "Unauthorized to delete package")
def test_confirm_cancel_delete(self, app):
"""Test confirmation of deleting datasets
@@ -706,7 +706,7 @@ def test_confirm_cancel_delete(self, app):
)
assert 200 == response.status_int
message = "Are you sure you want to delete dataset - {name}?"
- response.mustcontain(message.format(name=dataset["title"]))
+ assert helpers.body_contains(response, message.format(name=dataset["title"]))
form = response.forms["confirm-dataset-delete-form"]
response = form.submit("cancel")
@@ -932,7 +932,7 @@ def test_resource_view_create(self, app):
response = app.post(
url, {"title": "Test Image View"}, extra_environ=env
).follow(extra_environ=env)
- response.mustcontain("Test Image View")
+ assert helpers.body_contains(response, "Test Image View")
def test_resource_view_edit(self, app):
user = factories.User()
@@ -955,7 +955,7 @@ def test_resource_view_edit(self, app):
response = app.post(
url, {"title": "Updated RV Title"}, extra_environ=env
).follow(extra_environ=env)
- response.mustcontain("Updated RV Title")
+ assert helpers.body_contains(response, "Updated RV Title")
def test_resource_view_delete(self, app):
user = factories.User()
@@ -978,7 +978,7 @@ def test_resource_view_delete(self, app):
response = app.post(
url, {"delete": "Delete"}, extra_environ=env
).follow(extra_environ=env)
- response.mustcontain("This resource has no views")
+ assert helpers.body_contains(response, "This resource has no views")
def test_existent_resource_view_page_returns_ok_code(self, app):
resource_view = factories.ResourceView()
@@ -1013,7 +1013,7 @@ def test_resource_view_description_is_rendered_as_markdown(self, app):
view_id=resource_view["id"],
)
response = app.get(url)
- response.mustcontain("Some Markdown")
+ assert helpers.body_contains(response, "Some Markdown")
@pytest.mark.usefixtures("clean_db", "with_request_context")
@@ -1146,7 +1146,7 @@ def test_dataset_owners_can_delete_resources(self, app):
)
response = response.follow()
assert 200 == response.status_int
- response.mustcontain("This dataset has no data")
+ assert helpers.body_contains(response, "This dataset has no data")
with pytest.raises(p.toolkit.ObjectNotFound):
helpers.call_action("resource_show", id=resource["id"])
@@ -1185,7 +1185,7 @@ def test_anon_users_cannot_delete_owned_resources(self, app):
),
status=403,
)
- response.mustcontain("Unauthorized to delete package")
+ assert helpers.body_contains(response, "Unauthorized to delete package")
def test_logged_in_users_cannot_delete_resources_they_do_not_own(
self, app
@@ -1211,7 +1211,7 @@ def test_logged_in_users_cannot_delete_resources_they_do_not_own(
)
assert 403 == response.status_int
- response.mustcontain("Unauthorized to delete package")
+ assert helpers.body_contains(response, "Unauthorized to delete package")
def test_sysadmins_can_delete_any_resource(self, app):
owner_org = factories.Organization()
@@ -1230,7 +1230,7 @@ def test_sysadmins_can_delete_any_resource(self, app):
)
response = response.follow()
assert 200 == response.status_int
- response.mustcontain("This dataset has no data")
+ assert helpers.body_contains(response, "This dataset has no data")
with pytest.raises(p.toolkit.ObjectNotFound):
helpers.call_action("resource_show", id=resource["id"])
@@ -1257,7 +1257,7 @@ def test_confirm_and_cancel_deleting_a_resource(self, app):
)
assert 200 == response.status_int
message = "Are you sure you want to delete resource - {name}?"
- response.mustcontain(message.format(name=resource["name"]))
+ assert helpers.body_contains(response, message.format(name=resource["name"]))
# cancelling sends us back to the resource edit page
form = response.forms["confirm-resource-delete-form"]
@@ -2100,5 +2100,5 @@ def test_simple(self, app):
response = app.get(
url_for("dataset.changes", id=activity.id), extra_environ=env
)
- response.mustcontain("First")
- response.mustcontain("Second")
+ assert helpers.body_contains(response, "First")
+ assert helpers.body_contains(response, "Second")
diff --git a/ckan/tests/controllers/test_user.py b/ckan/tests/controllers/test_user.py
index 5f7b4d0670d..12cfdab79ef 100644
--- a/ckan/tests/controllers/test_user.py
+++ b/ckan/tests/controllers/test_user.py
@@ -114,12 +114,12 @@ def test_registered_user_login(self, app):
final_response = helpers.webtest_maybe_follow(submit_response)
# the response is the user dashboard, right?
- final_response.mustcontain(
+ assert helpers.body_contains(
'Dashboard',
'{0}'.format(user["fullname"]),
)
# and we're definitely not back on the login page.
- final_response.mustcontain(no='
Login
')
+ assert not helpers.body_contains('Login
')
def test_registered_user_login_bad_password(self, app):
"""
@@ -145,14 +145,16 @@ def test_registered_user_login_bad_password(self, app):
final_response = helpers.webtest_maybe_follow(submit_response)
# the response is the login page again
- final_response.mustcontain(
- 'Login
',
- "Login failed. Bad username or password.",
+ assert helpers.body_contains(final_response,
+ 'Login
'
+ )
+ assert helpers.body_contains(final_response,
+ "Login failed. Bad username or password."
)
# and we're definitely not on the dashboard.
- final_response.mustcontain(no='Dashboard'),
- final_response.mustcontain(
- no='{0}'.format(user["fullname"])
+ assert not helpers.body_contains(final_response, 'Dashboard'),
+ assert not helpers.body_contains(final_response,
+ '{0}'.format(user["fullname"])
)
def test_user_logout_url_redirect(self, app):
diff --git a/ckan/tests/helpers.py b/ckan/tests/helpers.py
index b1b7e288707..96ca73a54cb 100644
--- a/ckan/tests/helpers.py
+++ b/ckan/tests/helpers.py
@@ -28,7 +28,7 @@
import smtplib
from flask.testing import Client as FlaskClient
-
+from flask.wrappers import Response
import webtest
import nose.tools
import pytest
@@ -174,6 +174,15 @@ def body_contains(res, content):
return content in body
+class CKANResponse(Response):
+ @property
+ def body(self):
+ return self.data
+
+ def __contains__(self, segment):
+ return body_contains(self, segment)
+
+
class CKANTestApp(object):
"""A wrapper around webtest.TestApp
@@ -195,11 +204,12 @@ def __init__(self, app):
self.app = app
def test_client(self, use_cookies=True):
- return CKANTestClient(self.app, self.flask_app.response_class, use_cookies=use_cookies)
+ return CKANTestClient(self.app, CKANResponse, use_cookies=use_cookies)
self.flask_app.test_client_class = CKANTestClient
return self.flask_app.test_client()
def post(self, url, *args, **kwargs):
+ print(url)
res = self.test_client().post(url, *args, **kwargs)
return res
diff --git a/ckanext/datapusher/tests/test_action.py b/ckanext/datapusher/tests/test_action.py
index 964b4b43190..338f0c90d99 100644
--- a/ckanext/datapusher/tests/test_action.py
+++ b/ckanext/datapusher/tests/test_action.py
@@ -314,7 +314,7 @@ def test_does_not_resubmit_if_a_dataset_field_changes_in_the_meantime(
@pytest.mark.ckan_config("ckan.plugins", "datapusher datastore")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
def test_duplicated_tasks(app):
def submit(res, user):
return helpers.call_action(
diff --git a/ckanext/datapusher/tests/test_controller.py b/ckanext/datapusher/tests/test_controller.py
index 41aa485aa81..c6f442e3f70 100644
--- a/ckanext/datapusher/tests/test_controller.py
+++ b/ckanext/datapusher/tests/test_controller.py
@@ -7,7 +7,7 @@
@pytest.mark.ckan_config(u"ckan.plugins", u"datapusher datastore")
-@pytest.mark.usefixtures(u"clean_db", u"with_plugins")
+@pytest.mark.usefixtures(u"clean_db", u"with_plugins", u"with_request_context")
def test_resource_data(app):
if not tests.is_datastore_supported():
pytest.skip(u"Datastore not supported")
diff --git a/ckanext/datapusher/tests/test_interfaces.py b/ckanext/datapusher/tests/test_interfaces.py
index 388e5a978e8..7cd864a536f 100644
--- a/ckanext/datapusher/tests/test_interfaces.py
+++ b/ckanext/datapusher/tests/test_interfaces.py
@@ -28,28 +28,28 @@ def after_upload(self, context, resource_dict, package_dict):
self.after_upload_calls += 1
+@pytest.mark.ckan_config(
+"ckan.plugins", "datastore datapusher test_datapusher_plugin"
+)
+@pytest.mark.usefixtures("with_plugins")
class TestInterace(object):
sysadmin_user = None
normal_user = None
@pytest.fixture(autouse=True)
- def setup_class(self, clean_db):
+ def setup_class(self, clean_db, test_request_context):
if not tests.is_datastore_supported():
pytest.skip("Datastore not supported")
resource = factories.Resource(url_type="datastore")
self.dataset = factories.Dataset(resources=[resource])
-
- self.sysadmin_user = factories.User(name="testsysadmin", sysadmin=True)
- self.normal_user = factories.User(name="annafan")
+ with test_request_context():
+ self.sysadmin_user = factories.User(name="testsysadmin", sysadmin=True)
+ self.normal_user = factories.User(name="annafan")
engine = db.get_write_engine()
self.Session = orm.scoped_session(orm.sessionmaker(bind=engine))
@responses.activate
- @pytest.mark.ckan_config(
- "ckan.plugins", "datastore datapusher test_datapusher_plugin"
- )
- @pytest.mark.usefixtures("with_plugins")
def test_send_datapusher_creates_task(self, test_request_context):
responses.add(
responses.POST,
@@ -79,10 +79,6 @@ def test_send_datapusher_creates_task(self, test_request_context):
},
)
- @pytest.mark.ckan_config(
- "ckan.plugins", "datastore datapusher test_datapusher_plugin"
- )
- @pytest.mark.usefixtures("with_plugins")
def test_after_upload_called(self):
dataset = factories.Dataset()
resource = factories.Resource(package_id=dataset["id"])
diff --git a/ckanext/datastore/tests/test_dump.py b/ckanext/datastore/tests/test_dump.py
index cfaeaae3478..61ccd14d926 100644
--- a/ckanext/datastore/tests/test_dump.py
+++ b/ckanext/datastore/tests/test_dump.py
@@ -244,23 +244,23 @@ def test_dump_json(self, app):
)
)
- content = json.loads(res.data)
+ content = json.loads(six.ensure_text(res.data))
expected_content = {
- 'fields': [
- {'id': '_id', 'type': 'int'},
- {'id': 'bük', 'type': 'text'},
- {'id': 'author', 'type': 'text'},
- {'id': 'published', 'type': 'timestamp'},
- {'id': 'characters', 'type': '_text'},
- {'id': 'random_letters', 'type': '_text'},
- {'id': 'nested', 'type': 'json'}
+ u'fields': [
+ {u'id': u'_id', u'type': u'int'},
+ {u'id': u'bük', u'type': u'text'},
+ {u'id': u'author', u'type': u'text'},
+ {u'id': u'published', u'type': u'timestamp'},
+ {u'id': u'characters', u'type': u'_text'},
+ {u'id': u'random_letters', u'type': u'_text'},
+ {u'id': u'nested', u'type': u'json'}
],
- 'records': [
+ u'records': [
[
- 1, 'annakarenina', 'tolstoy', '2005-03-01T00:00:00',
- ['Princess Anna', 'Sergius'],
- ['a', 'e', 'x'],
- ['b', {'moo': 'moo'}]
+ 1, u'annakarenina', u'tolstoy', u'2005-03-01T00:00:00',
+ [u'Princess Anna', u'Sergius'],
+ [u'a', u'e', u'x'],
+ [u'b', {u'moo': u'moo'}]
]
]
}
diff --git a/ckanext/example_flask_iblueprint/tests/test_routes.py b/ckanext/example_flask_iblueprint/tests/test_routes.py
index b60477c3bc3..2fe9916e511 100644
--- a/ckanext/example_flask_iblueprint/tests/test_routes.py
+++ b/ckanext/example_flask_iblueprint/tests/test_routes.py
@@ -7,27 +7,19 @@
import ckan.tests.helpers as helpers
-class TestFlaskIBlueprint(helpers.FunctionalTestBase):
- def setup(self):
- self.app = helpers._get_test_app()
-
- # Install plugin and register its blueprint
- if not plugins.plugin_loaded(u"example_flask_iblueprint"):
- plugins.load(u"example_flask_iblueprint")
- plugin = plugins.get_plugin(u"example_flask_iblueprint")
- self.app.flask_app.register_extension_blueprint(
- plugin.get_blueprint()
- )
-
- def test_plugin_route(self):
+@pytest.mark.ckan_config("ckan.plugins", u"example_flask_iblueprint")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestFlaskIBlueprint(object):
+
+ def test_plugin_route(self, app):
u"""Test extension sets up a unique route."""
- res = self.app.get(u"/hello_plugin")
+ res = app.get(u"/hello_plugin")
- assert u"Hello World, this is served from an extension" == res.body
+ assert helpers.body_contains(res, u"Hello World, this is served from an extension")
- def test_plugin_route_core_flask_override(self):
+ def test_plugin_route_core_flask_override(self, app):
u"""Test extension overrides flask core route."""
- res = self.app.get(u"/")
+ res = app.get(u"/")
assert helpers.body_contains(
res,
@@ -35,19 +27,19 @@ def test_plugin_route_core_flask_override(self):
u"overriding the flask url."
)
- def test_plugin_route_with_helper(self):
+ def test_plugin_route_with_helper(self, app):
u"""
Test extension rendering with a helper method that exists shouldn't
cause error.
"""
- res = self.app.get(u"/helper")
+ res = app.get(u"/helper")
assert helpers.body_contains(res, u"Hello World, helper here: hi
")
- def test_plugin_route_with_non_existent_helper(self):
+ def test_plugin_route_with_non_existent_helper(self, app):
u"""
Test extension rendering with a helper method that doesn't exist
raises an exception.
"""
with pytest.raises(HelperError):
- self.app.get(u"/helper_not_here")
+ app.get(u"/helper_not_here")
diff --git a/ckanext/example_flask_streaming/tests/test_streaming_responses.py b/ckanext/example_flask_streaming/tests/test_streaming_responses.py
index 236095d57e9..4318b180103 100644
--- a/ckanext/example_flask_streaming/tests/test_streaming_responses.py
+++ b/ckanext/example_flask_streaming/tests/test_streaming_responses.py
@@ -3,7 +3,7 @@
import os.path as path
import pytest
-
+import six
from webtest.app import TestRequest
from webtest import lint # NOQA
@@ -23,7 +23,7 @@ def test_accordance_of_chunks(self, get_response):
u"""Test streaming of items collection."""
url = str(u"/stream/string") # produces list of words
resp = get_response(url)
- assert u"Hello World, this is served from an extension".split() == list(
+ assert six.ensure_binary(u"Hello World, this is served from an extension").split() == list(
resp.app_iter
)
resp.app_iter.close()
@@ -34,9 +34,9 @@ def test_template_streaming(self, get_response):
bound = 7
url = str(u"/stream/template/{}".format(bound)) # produces nums list
resp = get_response(url)
- content = u"".join(resp.app_iter)
+ content = six.ensure_binary(u"").join(resp.app_iter)
for i in range(bound):
- assert str(i) in content
+ assert six.ensure_binary(str(i)) in content
resp._app_iter.close()
@pytest.mark.ckan_config(u"ckan.plugins", u"example_flask_streaming")
@@ -48,7 +48,7 @@ def test_file_streaming(self, get_response):
path.dirname(path.abspath(__file__)), u"10lines.txt"
)
with open(f_path) as test_file:
- content = test_file.readlines()
+ content = [six.ensure_binary(line) for line in test_file.readlines()]
assert content == list(resp.app_iter)
resp._app_iter.close()
@@ -57,7 +57,7 @@ def test_render_with_context(self, get_response):
u"""Test availability of context inside templates."""
url = str(u"/stream/context?var=10") # produces `var` value
resp = get_response(url)
- assert u"10" == resp.body
+ assert six.ensure_binary(u"10") == resp.body
@pytest.mark.ckan_config(u"ckan.plugins", u"example_flask_streaming")
def test_render_without_context(self, get_response):
diff --git a/ckanext/example_iauthfunctions/tests/test_example_iauthfunctions.py b/ckanext/example_iauthfunctions/tests/test_example_iauthfunctions.py
index 1e44b84f88f..fe4f3d0d1f9 100644
--- a/ckanext/example_iauthfunctions/tests/test_example_iauthfunctions.py
+++ b/ckanext/example_iauthfunctions/tests/test_example_iauthfunctions.py
@@ -12,112 +12,93 @@
@pytest.mark.ckan_config('ckan.plugins',
'example_iauthfunctions_v6_parent_auth_functions')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_resource_delete_editor():
- '''Normally organization admins can delete resources
- Our plugin prevents this by blocking delete organization.
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
+class TestAuthV6(object):
+ def test_resource_delete_editor(self):
+ '''Normally organization admins can delete resources
+ Our plugin prevents this by blocking delete organization.
- Ensure the delete button is not displayed (as only resource delete
- is checked for showing this)
+ Ensure the delete button is not displayed (as only resource delete
+ is checked for showing this)
- '''
- user = factories.User()
- owner_org = factories.Organization(users=[{
- 'name': user['id'],
- 'capacity': 'admin'
- }])
- dataset = factories.Dataset(owner_org=owner_org['id'])
- resource = factories.Resource(package_id=dataset['id'])
- with pytest.raises(logic.NotAuthorized) as e:
- logic.check_access('resource_delete', {'user': user['name']},
- {'id': resource['id']})
-
- assert e.value.message == 'User %s not authorized to delete resource %s' % (
- user['name'], resource['id'])
-
-
-@pytest.mark.ckan_config('ckan.plugins',
- 'example_iauthfunctions_v6_parent_auth_functions')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_resource_delete_sysadmin():
- '''Normally organization admins can delete resources
- Our plugin prevents this by blocking delete organization.
-
- Ensure the delete button is not displayed (as only resource delete
- is checked for showing this)
+ '''
+ user = factories.User()
+ owner_org = factories.Organization(users=[{
+ 'name': user['id'],
+ 'capacity': 'admin'
+ }])
+ dataset = factories.Dataset(owner_org=owner_org['id'])
+ resource = factories.Resource(package_id=dataset['id'])
+ with pytest.raises(logic.NotAuthorized) as e:
+ logic.check_access('resource_delete', {'user': user['name']},
+ {'id': resource['id']})
+
+ assert e.value.message == 'User %s not authorized to delete resource %s' % (
+ user['name'], resource['id'])
+
+ def test_resource_delete_sysadmin(self):
+ '''Normally organization admins can delete resources
+ Our plugin prevents this by blocking delete organization.
+
+ Ensure the delete button is not displayed (as only resource delete
+ is checked for showing this)
- '''
- user = factories.Sysadmin()
- owner_org = factories.Organization(users=[{
- 'name': user['id'],
- 'capacity': 'admin'
- }])
- dataset = factories.Dataset(owner_org=owner_org['id'])
- resource = factories.Resource(package_id=dataset['id'])
- assert logic.check_access('resource_delete', {'user': user['name']},
- {'id': resource['id']})
+ '''
+ user = factories.Sysadmin()
+ owner_org = factories.Organization(users=[{
+ 'name': user['id'],
+ 'capacity': 'admin'
+ }])
+ dataset = factories.Dataset(owner_org=owner_org['id'])
+ resource = factories.Resource(package_id=dataset['id'])
+ assert logic.check_access('resource_delete', {'user': user['name']},
+ {'id': resource['id']})
@pytest.mark.ckan_config('ckan.plugins',
'example_iauthfunctions_v5_custom_config_setting')
@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', False)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_sysadmin_can_create_group_when_config_is_False():
- sysadmin = factories.Sysadmin()
- context = {'ignore_auth': False, 'user': sysadmin['name']}
- helpers.call_action('group_create', context, name='test-group')
-
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
+class TestAuthV5(object):
-@pytest.mark.ckan_config('ckan.plugins',
- 'example_iauthfunctions_v5_custom_config_setting')
-@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', False)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_user_cannot_create_group_when_config_is_False():
- user = factories.User()
- context = {'ignore_auth': False, 'user': user['name']}
- with pytest.raises(NotAuthorized):
+ def test_sysadmin_can_create_group_when_config_is_False(self):
+ sysadmin = factories.Sysadmin()
+ context = {'ignore_auth': False, 'user': sysadmin['name']}
helpers.call_action('group_create', context, name='test-group')
+ def test_user_cannot_create_group_when_config_is_False(self):
+ user = factories.User()
+ context = {'ignore_auth': False, 'user': user['name']}
+ with pytest.raises(NotAuthorized):
+ helpers.call_action('group_create', context, name='test-group')
-@pytest.mark.ckan_config('ckan.plugins',
- 'example_iauthfunctions_v5_custom_config_setting')
-@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', False)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_visitor_cannot_create_group_when_config_is_False():
- context = {'ignore_auth': False, 'user': None}
- with pytest.raises(NotAuthorized):
- helpers.call_action('group_create', context, name='test-group')
-
-
-@pytest.mark.ckan_config('ckan.plugins',
- 'example_iauthfunctions_v5_custom_config_setting')
-@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', True)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_sysadmin_can_create_group_when_config_is_True():
- sysadmin = factories.Sysadmin()
- context = {'ignore_auth': False, 'user': sysadmin['name']}
- helpers.call_action('group_create', context, name='test-group')
+ def test_visitor_cannot_create_group_when_config_is_False(self):
+ context = {'ignore_auth': False, 'user': None}
+ with pytest.raises(NotAuthorized):
+ helpers.call_action('group_create', context, name='test-group')
@pytest.mark.ckan_config('ckan.plugins',
'example_iauthfunctions_v5_custom_config_setting')
@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', True)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_user_can_create_group_when_config_is_True():
- user = factories.User()
- context = {'ignore_auth': False, 'user': user['name']}
- helpers.call_action('group_create', context, name='test-group')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
+class testAuthV5WithUserCreateGroup(object):
+ def test_sysadmin_can_create_group_when_config_is_True(self):
+ sysadmin = factories.Sysadmin()
+ context = {'ignore_auth': False, 'user': sysadmin['name']}
+ helpers.call_action('group_create', context, name='test-group')
-@pytest.mark.ckan_config('ckan.plugins',
- 'example_iauthfunctions_v5_custom_config_setting')
-@pytest.mark.ckan_config('ckan.iauthfunctions.users_can_create_groups', True)
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
-def test_visitor_cannot_create_group_when_config_is_True():
- context = {'ignore_auth': False, 'user': None}
- with pytest.raises(NotAuthorized):
+ def test_user_can_create_group_when_config_is_True(self):
+ user = factories.User()
+ context = {'ignore_auth': False, 'user': user['name']}
helpers.call_action('group_create', context, name='test-group')
+ def test_visitor_cannot_create_group_when_config_is_True(self):
+ context = {'ignore_auth': False, 'user': None}
+ with pytest.raises(NotAuthorized):
+ helpers.call_action('group_create', context, name='test-group')
+
@pytest.fixture
def curators_group():
@@ -144,7 +125,7 @@ def curators_group():
@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v4')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
def test_group_create_with_no_curators_group():
'''Test that group_create doesn't crash when there's no curators group.
'''
@@ -159,7 +140,7 @@ def test_group_create_with_no_curators_group():
@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v4')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
def test_group_create_with_visitor(curators_group):
'''A visitor (not logged in) should not be able to create a group.
@@ -174,7 +155,7 @@ def test_group_create_with_visitor(curators_group):
@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v4')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
def test_group_create_with_non_curator(curators_group):
'''A user who isn't a member of the curators group should not be able
to create a group.
@@ -188,7 +169,7 @@ def test_group_create_with_non_curator(curators_group):
@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v4')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
def test_group_create_with_curator(curators_group):
'''A member of the curators group should be able to create a group.
'''
@@ -200,10 +181,9 @@ def test_group_create_with_curator(curators_group):
assert result['name'] == name
+@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v3')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
class TestExampleIAuthFunctionsPluginV3(object):
-
- @pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v3')
- @pytest.mark.usefixtures('clean_db', 'with_plugins')
def test_group_create_with_no_curators_group_v3(self):
'''Test that group_create returns a 404 when there's no curators group.
@@ -220,8 +200,6 @@ def test_group_create_with_no_curators_group_v3(self):
context,
name='this_group_should_not_be_created')
- @pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v3')
- @pytest.mark.usefixtures('clean_db', 'with_plugins')
def test_group_create_with_visitor_v3(self, curators_group):
'''Test that group_create returns 403 when no one is logged in.
@@ -237,7 +215,7 @@ def test_group_create_with_visitor_v3(self, curators_group):
@pytest.mark.ckan_config('ckan.plugins', 'example_iauthfunctions_v2')
-@pytest.mark.usefixtures('clean_db', 'with_plugins')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
def test_group_create_with_curator_v2(curators_group):
'''Test that a curator can*not* create a group.
diff --git a/ckanext/example_iconfigurer/tests/test_example_iconfigurer.py b/ckanext/example_iconfigurer/tests/test_example_iconfigurer.py
index 7159b99eb00..95e8a931ad8 100644
--- a/ckanext/example_iconfigurer/tests/test_example_iconfigurer.py
+++ b/ckanext/example_iconfigurer/tests/test_example_iconfigurer.py
@@ -1,104 +1,87 @@
# encoding: utf-8
-from nose import tools as nosetools
+import six
+import pytest
import ckan.tests.helpers as helpers
import ckan.plugins as plugins
-
-class TestExampleIConfigurer(helpers.FunctionalTestBase):
-
- _load_plugins = ["example_iconfigurer"]
-
- def test_template_renders(self):
+@pytest.mark.ckan_config("ckan.plugins", u"example_iconfigurer")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestExampleIConfigurer(object):
+ def test_template_renders(self, app):
"""Our controller renders the extension's config template."""
- app = self._get_test_app()
- response = app.get("/ckan-admin/myext_config_one", status=200)
- assert "My First Config Page" in response
+ response = app.get("/ckan-admin/myext_config_one")
+ assert response.status_code == 200
+ assert helpers.body_contains(response, "My First Config Page")
- def test_config_page_has_custom_tabs(self):
+ def test_config_page_has_custom_tabs(self, app):
"""
The admin base template should include our custom ckan-admin tabs
added using the toolkit.add_ckan_admin_tab method.
"""
- app = self._get_test_app()
response = app.get("/ckan-admin/myext_config_one", status=200)
+ assert response.status_code == 200
# The label text
- assert "My First Custom Config Tab" in response
- assert "My Second Custom Config Tab" in response
+ assert helpers.body_contains(response, "My First Custom Config Tab")
+ assert helpers.body_contains(response, "My Second Custom Config Tab")
# The link path
- assert "/ckan-admin/myext_config_one" in response
- assert "/ckan-admin/myext_config_two" in response
+ assert helpers.body_contains(response, "/ckan-admin/myext_config_one")
+ assert helpers.body_contains(response, "/ckan-admin/myext_config_two")
-class TestExampleIConfigurerBuildExtraAdminTabsHelper(
- helpers.FunctionalTestBase
-):
-
+@pytest.mark.ckan_config("ckan.plugins", u"example_iconfigurer")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestExampleIConfigurerBuildExtraAdminTabsHelper(object):
"""Tests for helpers.build_extra_admin_nav method."""
- _load_plugins = ("example_iconfigurer",)
-
- @classmethod
- def setup_class(cls):
- super(
- TestExampleIConfigurerBuildExtraAdminTabsHelper, cls
- ).setup_class()
-
- @classmethod
- def teardown_class(cls):
- super(
- TestExampleIConfigurerBuildExtraAdminTabsHelper, cls
- ).teardown_class()
-
- @helpers.change_config("ckan.admin_tabs", {})
- def test_build_extra_admin_nav_config_option_present_but_empty(self):
+ def test_build_extra_admin_nav_config_option_present_but_empty(self, app, ckan_config, monkeypatch):
"""
Empty string returned when ckan.admin_tabs option in config but empty.
"""
- app = self._get_test_app()
+ monkeypatch.setitem(ckan_config, "ckan.admin_tabs", {})
expected = ""
response = app.get("/build_extra_admin_nav")
- assert response.body == expected
+ assert six.ensure_text(response.data) == expected
- @helpers.change_config(
- "ckan.admin_tabs",
- {
- "example_iconfigurer.config_one": {
- "label": "My Label",
- "icon": None,
- }
- },
- )
- def test_build_extra_admin_nav_one_value_in_config(self):
+ def test_build_extra_admin_nav_one_value_in_config(self, app, ckan_config, monkeypatch):
"""
Correct string returned when ckan.admin_tabs option has single value in config.
"""
- app = self._get_test_app()
+ monkeypatch.setitem(
+ ckan_config, "ckan.admin_tabs",
+ {
+ "example_iconfigurer.config_one": {
+ "label": "My Label",
+ "icon": None,
+ }
+ },
+ )
expected = (
"""My Label"""
)
+
response = app.get("/build_extra_admin_nav")
- assert response.body == expected
+ assert six.ensure_text(response.data) == expected
- @helpers.change_config(
- "ckan.admin_tabs",
- {
- "example_iconfigurer.config_one": {
- "label": "My Label",
- "icon": "picture-o",
- },
- "example_iconfigurer.config_two": {
- "label": "My Other Label",
- "icon": None,
- },
- },
- )
- def test_build_extra_admin_nav_two_values_in_config(self):
+ def test_build_extra_admin_nav_two_values_in_config(self, app, ckan_config, monkeypatch):
"""
Correct string returned when ckan.admin_tabs option has two values in config.
"""
- app = self._get_test_app()
+ monkeypatch.setitem(
+ ckan_config,
+ "ckan.admin_tabs",
+ {
+ "example_iconfigurer.config_one": {
+ "label": "My Label",
+ "icon": "picture-o",
+ },
+ "example_iconfigurer.config_two": {
+ "label": "My Other Label",
+ "icon": None,
+ },
+ }
+ )
expected = """ My LabelMy Other Label"""
response = app.get("/build_extra_admin_nav")
- assert response.body == expected
+ assert six.ensure_text(response.data) == expected
diff --git a/ckanext/example_iconfigurer/tests/test_iconfigurer_toolkit.py b/ckanext/example_iconfigurer/tests/test_iconfigurer_toolkit.py
index c0be8ab2000..b34a67803db 100644
--- a/ckanext/example_iconfigurer/tests/test_iconfigurer_toolkit.py
+++ b/ckanext/example_iconfigurer/tests/test_iconfigurer_toolkit.py
@@ -5,7 +5,8 @@
import ckan.plugins.toolkit as toolkit
-class TestIConfigurerToolkitAddCkanAdminTab(helpers.FunctionalTestBase):
+@pytest.mark.usefixtures("clean_db")
+class TestIConfigurerToolkitAddCkanAdminTab(object):
"""
Tests for toolkit.add_ckan_admin_tab used by the IConfigurer interface.
diff --git a/ckanext/example_iconfigurer/tests/test_iconfigurer_update_config.py b/ckanext/example_iconfigurer/tests/test_iconfigurer_update_config.py
index 583307d47db..9a876b2a596 100644
--- a/ckanext/example_iconfigurer/tests/test_iconfigurer_update_config.py
+++ b/ckanext/example_iconfigurer/tests/test_iconfigurer_update_config.py
@@ -33,45 +33,24 @@ def test_updating_unregistered_new_setting_not_allowed(self):
helpers.call_action("config_option_update", **params)
-class TestConfigOptionUpdatePluginEnabled(helpers.FunctionalTestBase):
- _load_plugins = ("example_iconfigurer",)
-
- @classmethod
- def setup_class(cls):
- super(TestConfigOptionUpdatePluginEnabled, cls).setup_class()
- cls._datasets_per_page_original_value = config.get(
- "ckan.datasets_per_page"
- )
-
- @classmethod
- def teardown_class(cls):
- super(TestConfigOptionUpdatePluginEnabled, cls).teardown_class()
- config[
- "ckan.datasets_per_page"
- ] = cls._datasets_per_page_original_value
- helpers.reset_db()
-
- def setup(self):
- super(TestConfigOptionUpdatePluginEnabled, self).setup()
+@pytest.mark.ckan_config("ckan.plugins", u"example_iconfigurer")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "ckan_config")
+class TestConfigOptionUpdatePluginEnabled(object):
- helpers.reset_db()
-
- def test_update_registered_core_value(self):
+ def test_update_registered_core_value(self, ckan_config):
key = "ckan.datasets_per_page"
value = 5
params = {key: value}
- assert config[key] == self._datasets_per_page_original_value
-
new_config = helpers.call_action("config_option_update", **params)
# output
assert new_config[key] == value
# config
- assert config[key] == value
+ assert ckan_config[key] == value
# app_globals
globals_key = app_globals.get_globals_key(key)
diff --git a/ckanext/example_idatasetform/tests/test_controllers.py b/ckanext/example_idatasetform/tests/test_controllers.py
index e36111a70c8..19974eb78dd 100644
--- a/ckanext/example_idatasetform/tests/test_controllers.py
+++ b/ckanext/example_idatasetform/tests/test_controllers.py
@@ -12,48 +12,12 @@
submit_and_follow = helpers.submit_and_follow
-def _get_package_edit_page(app, package_name):
- user = factories.User()
- env = {"REMOTE_USER": six.ensure_str(user["name"])}
- response = app.get(
- url=url_for("dataset.edit", id=package_name), extra_environ=env,
- )
- return env, response
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestPackageController(object):
-
-class TestPackageController(helpers.FunctionalTestBase):
- _load_plugins = ["example_idatasetform"]
-
- def test_edit_converted_extra_field(self):
+ def test_edit_converted_extra_field(self, app, ckan_config):
dataset = factories.Dataset(custom_text="foo")
- app = self._get_test_app()
- env, response = _get_package_edit_page(app, dataset["name"])
- form = response.forms["dataset-edit"]
- form["custom_text"] = 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 response.request.path == "/dataset/%s" % dataset["name"]
-
- pkg = model.Package.by_name(dataset["name"])
- assert pkg.extras["custom_text"] == u"bar"
-
- 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 response.request.path == "/dataset/%s" % dataset["name"]
-
- pkg = model.Package.by_name(dataset["name"])
- assert pkg.extras["testkey"] == u"bar"
+ dataset.update(custom_text='bar')
+ resp = helpers.call_action('package_update', **dataset)
+ assert resp["custom_text"] == u"bar"
diff --git a/ckanext/example_idatasetform/tests/test_example_idatasetform.py b/ckanext/example_idatasetform/tests/test_example_idatasetform.py
index 67573da0671..d5f07d8625c 100644
--- a/ckanext/example_idatasetform/tests/test_example_idatasetform.py
+++ b/ckanext/example_idatasetform/tests/test_example_idatasetform.py
@@ -1,6 +1,7 @@
# encoding: utf-8
import pytest
+import six
from ckan.common import config
from ckan.lib.helpers import url_for
@@ -11,20 +12,11 @@
import ckanext.example_idatasetform as idf
import ckan.lib.search
-
-class ExampleIDatasetFormPluginBase(helpers.FunctionalTestBase):
+@pytest.mark.usefixtures("clean_db", "clean_index", "with_plugins")
+class ExampleIDatasetFormPluginBase(object):
"""Version 1, 2 and 3 of the plugin are basically the same, so this class
provides the tests that all three versions of the plugins will run"""
- def teardown(self):
- model.repo.rebuild_db()
- ckan.lib.search.clear_all()
-
- @classmethod
- def teardown_class(cls):
- ckan.lib.search.clear_all()
- super(ExampleIDatasetFormPluginBase, cls).teardown_class()
-
def test_package_create(self):
result = helpers.call_action(
"package_create",
@@ -56,74 +48,39 @@ def test_package_show(self):
assert "this is my custom text" == result["custom_text"]
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform_v1")
class TestVersion1(ExampleIDatasetFormPluginBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform_v1"
-
- @classmethod
- def teardown_class(cls):
- plugins.unload("example_idatasetform_v1")
- super(TestVersion1, cls).teardown_class()
+ pass
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform_v2")
class TestVersion2(ExampleIDatasetFormPluginBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform_v2"
-
- @classmethod
- def teardown_class(cls):
- plugins.unload("example_idatasetform_v2")
- super(TestVersion2, cls).teardown_class()
+ pass
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform_v3")
class TestVersion3(ExampleIDatasetFormPluginBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform_v3"
-
- @classmethod
- def teardown_class(cls):
- plugins.unload("example_idatasetform_v3")
- super(TestVersion3, cls).teardown_class()
-
-
-class TestVersion5(helpers.FunctionalTestBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform_v5"
-
- def teardown(self):
- if plugins.plugin_loaded("example_idatasetform_v5"):
- plugins.unload("example_idatasetform_v5")
-
- def test_custom_package_type_urls(self):
- assert url_for("fancy_type.search") == "/fancy_type/"
- assert url_for("fancy_type.new") == "/fancy_type/new"
- assert url_for("fancy_type.read", id="check") == "/fancy_type/check"
- assert (
- url_for("fancy_type.edit", id="check") == "/fancy_type/edit/check"
- )
-
-
-class TestIDatasetFormPluginVersion4(helpers.FunctionalTestBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform_v4"
-
- def teardown(self):
- model.repo.rebuild_db()
-
- @classmethod
- def teardown_class(cls):
- if plugins.plugin_loaded("example_idatasetform_v4"):
- plugins.unload("example_idatasetform_v4")
- ckan.lib.search.clear_all()
- super(TestIDatasetFormPluginVersion4, cls).teardown_class()
+ pass
+
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform_v5")
+@pytest.mark.usefixtures("clean_db", "clean_index", "with_plugins")
+class TestVersion5(object):
+
+ def test_custom_package_type_urls(self, test_request_context):
+ with test_request_context():
+ assert url_for("fancy_type.search") == "/fancy_type/"
+ assert url_for("fancy_type.new") == "/fancy_type/new"
+ assert url_for("fancy_type.read", id="check") == "/fancy_type/check"
+ assert (
+ url_for("fancy_type.edit", id="check") == "/fancy_type/edit/check"
+ )
- def test_package_create(self):
- idf.plugin_v4.create_country_codes()
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform_v4")
+@pytest.mark.usefixtures("clean_db", "clean_index", "with_plugins", "with_request_context")
+class TestIDatasetFormPluginVersion4(object):
+ def test_package_create(self, test_request_context):
+ with test_request_context():
+ idf.plugin_v4.create_country_codes()
result = helpers.call_action(
"package_create",
name="test_package",
@@ -133,8 +90,9 @@ def test_package_create(self):
assert "this is my custom text" == result["custom_text"]
assert [u"uk"] == result["country_code"]
- def test_package_create_wrong_country_code(self):
- idf.plugin_v4.create_country_codes()
+ def test_package_create_wrong_country_code(self, test_request_context):
+ with test_request_context():
+ idf.plugin_v4.create_country_codes()
with pytest.raises(plugins.toolkit.ValidationError):
helpers.call_action(
"package_create",
@@ -143,8 +101,9 @@ def test_package_create_wrong_country_code(self):
country_code="notcode",
)
- def test_package_update(self):
- idf.plugin_v4.create_country_codes()
+ def test_package_update(self, test_request_context):
+ with test_request_context():
+ idf.plugin_v4.create_country_codes()
helpers.call_action(
"package_create",
name="test_package",
@@ -161,23 +120,12 @@ def test_package_update(self):
assert [u"ie"] == result["country_code"]
-class TestIDatasetFormPlugin(helpers.FunctionalTestBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "example_idatasetform"
-
- def teardown(self):
- model.repo.rebuild_db()
- ckan.lib.search.clear_all()
-
- @classmethod
- def teardown_class(cls):
- plugins.unload("example_idatasetform")
- ckan.lib.search.clear_all()
- super(TestIDatasetFormPlugin, cls).teardown_class()
-
- def test_package_create(self):
- idf.plugin.create_country_codes()
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform")
+@pytest.mark.usefixtures("clean_db", "clean_index", "with_plugins")
+class TestIDatasetFormPlugin(object):
+ def test_package_create(self, test_request_context):
+ with test_request_context():
+ idf.plugin.create_country_codes()
result = helpers.call_action(
"package_create",
name="test_package",
@@ -195,8 +143,9 @@ def test_package_create(self):
== result["resources"][0]["custom_resource_text"]
)
- def test_package_update(self):
- idf.plugin.create_country_codes()
+ def test_package_update(self, test_request_context):
+ with test_request_context():
+ idf.plugin.create_country_codes()
helpers.call_action(
"package_create",
name="test_package",
@@ -228,8 +177,9 @@ def test_package_update(self):
== result["resources"][0]["custom_resource_text"]
)
- def test_package_show(self):
- idf.plugin.create_country_codes()
+ def test_package_show(self, test_request_context):
+ with test_request_context():
+ idf.plugin.create_country_codes()
helpers.call_action(
"package_create",
name="test_package",
@@ -253,33 +203,10 @@ def test_package_show(self):
)
+@pytest.mark.ckan_config("ckan.plugins", u"example_idatasetform")
+@pytest.mark.usefixtures("clean_db", "clean_index", "with_plugins")
class TestCustomSearch(object):
- # @classmethod
- # def _apply_config_changes(cls, cfg):
- # cfg['ckan.plugins'] = 'example_idatasetform'
-
- @classmethod
- def setup_class(cls):
- cls.original_config = config.copy()
- config["ckan.plugins"] = "example_idatasetform"
-
- def teardown(self):
- model.repo.rebuild_db()
- ckan.lib.search.clear_all()
-
- @classmethod
- def teardown_class(cls):
- if plugins.plugin_loaded("example_idatasetform"):
- plugins.unload("example_idatasetform")
- helpers.reset_db()
- ckan.lib.search.clear_all()
-
- config.clear()
- config.update(cls.original_config)
-
- def test_custom_search(self):
- app = helpers._get_test_app()
-
+ def test_custom_search(self, app):
helpers.call_action(
"package_create", name="test_package_a", custom_text="z"
)
@@ -287,22 +214,16 @@ def test_custom_search(self):
"package_create", name="test_package_b", custom_text="y"
)
- response = app.get("/dataset/")
-
- # change the sort by form to our custom_text ascending
- response.forms[1].fields["sort"][0].value = "custom_text asc"
+ response = app.get("/dataset/", query_string={"sort": "custom_text asc"})
- response = response.forms[1].submit()
# check that package_b appears before package a (y < z)
- a = response.body.index("test_package_a")
- b = response.body.index("test_package_b")
+ a = six.ensure_text(response.data).index("test_package_a")
+ b = six.ensure_text(response.data).index("test_package_b")
assert b < a
- response = app.get("/dataset/")
- response.forms[1].fields["sort"][0].value = "custom_text desc"
+ response = app.get("/dataset/", query_string={"sort": "custom_text desc"})
# check that package_a appears before package b (z is first in
# descending order)
- response = response.forms[1].submit()
- a = response.body.index("test_package_a")
- b = response.body.index("test_package_b")
+ a = six.ensure_text(response.data).index("test_package_a")
+ b = six.ensure_text(response.data).index("test_package_b")
assert a < b
diff --git a/ckanext/example_igroupform/tests/test_controllers.py b/ckanext/example_igroupform/tests/test_controllers.py
index bb430dd0b87..c483a0dbe72 100644
--- a/ckanext/example_igroupform/tests/test_controllers.py
+++ b/ckanext/example_igroupform/tests/test_controllers.py
@@ -24,7 +24,7 @@ def _get_group_new_page(app, group_type):
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestGroupController(object):
def test_about(self, app):
@@ -34,7 +34,7 @@ def test_about(self, app):
env = {"REMOTE_USER": six.ensure_str(user["name"])}
url = url_for("%s.about" % custom_group_type, id=group_name)
response = app.get(url=url, extra_environ=env)
- response.mustcontain(group_name)
+ assert helpers.body_contains(response, group_name)
def test_bulk_process(self, app):
user = factories.User()
@@ -60,25 +60,25 @@ def test_delete(self, app):
def test_custom_group_form_slug(self, app):
env, response = _get_group_new_page(app, custom_group_type)
- assert (
+ assert helpers.body_contains(response,
'/{}/'.format(
custom_group_type
)
- in response
)
- assert 'placeholder="my-{}"'.format(custom_group_type) in response
- assert (
+ assert helpers.body_contains(response, 'placeholder="my-{}"'.format(custom_group_type))
+ assert helpers.body_contains(
+ response,
'data-module-prefix="test.ckan.net/{}/"'.format(custom_group_type)
- in response
+
)
- assert (
+ assert helpers.body_contains(
+ response,
'data-module-placeholder="<{}>"'.format(custom_group_type)
- in response
)
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform_organization")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestOrganizationController(object):
def test_about(self, app):
user = factories.User()
@@ -87,7 +87,7 @@ def test_about(self, app):
env = {"REMOTE_USER": six.ensure_str(user["name"])}
url = url_for("%s.about" % custom_group_type, id=group_name)
response = app.get(url=url, extra_environ=env)
- response.mustcontain(group_name)
+ assert helpers.body_contains(response, group_name)
def test_bulk_process(self, app):
user = factories.User()
@@ -108,38 +108,30 @@ def test_delete(self, app):
def test_custom_org_form_slug(self, app):
env, response = _get_group_new_page(app, custom_group_type)
- assert (
+ assert helpers.body_contains(response,
'/{}/'.format(
custom_group_type
)
- in response
)
- assert 'placeholder="my-{}"'.format(custom_group_type) in response
- assert (
+ assert helpers.body_contains(response, 'placeholder="my-{}"'.format(custom_group_type))
+ assert helpers.body_contains(response,
'data-module-prefix="test.ckan.net/{}/"'.format(custom_group_type)
- in response
)
- assert (
+ assert helpers.body_contains(response,
'data-module-placeholder="<{}>"'.format(custom_group_type)
- in response
)
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestGroupControllerNew(object):
def test_save(self, app):
- env, response = _get_group_new_page(app, custom_group_type)
- form = response.forms["group-edit"]
- form["name"] = u"saved"
-
- response = submit_and_follow(app, form, env, "save")
- # check correct redirect
- assert (
- response.request.url
- == "http://test.ckan.net/%s/saved" % custom_group_type
- )
+ url = url_for("%s.new" % custom_group_type)
+ user = factories.User()
+ env = {"REMOTE_USER": six.ensure_str(user["name"])}
+ app.post(url, data={'name': 'saved', 'title': ''}, environ_overrides=env)
+
# check saved ok
group = model.Group.by_name(u"saved")
assert group.title == u""
@@ -150,23 +142,18 @@ def test_custom_group_form(self, app):
"""Our custom group form is being used for new groups."""
env, response = _get_group_new_page(app, custom_group_type)
- assert "My Custom Group Form!" in response
+ assert helpers.body_contains(response, "My Custom Group Form!")
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform_default_group_type")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestGroupControllerNew_DefaultGroupType(object):
def test_save(self, app):
- env, response = _get_group_new_page(app, group_type)
- form = response.forms["group-edit"]
- form["name"] = u"saved"
-
- response = submit_and_follow(app, form, env, "save")
- # check correct redirect
- assert (
- response.request.url
- == "http://test.ckan.net/%s/saved" % group_type
- )
+ url = url_for("%s.new" % group_type)
+ user = factories.User()
+ env = {"REMOTE_USER": six.ensure_str(user["name"])}
+ app.post(url, data={'name': 'saved', 'title': ''}, environ_overrides=env)
+
# check saved ok
group = model.Group.by_name(u"saved")
assert group.title == u""
@@ -177,7 +164,7 @@ def test_custom_group_form(self, app):
"""Our custom group form is being used for new groups."""
env, response = _get_group_new_page(app, group_type)
- assert "My Custom Group Form!" in response
+ assert helpers.body_contains(response, "My Custom Group Form!")
def _get_group_edit_page(app, group_type, group_name=None):
@@ -192,7 +179,7 @@ def _get_group_edit_page(app, group_type, group_name=None):
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestGroupControllerEdit(object):
def test_group_doesnt_exist(self, app):
user = factories.User()
@@ -200,46 +187,27 @@ def test_group_doesnt_exist(self, app):
url = url_for("%s.edit" % custom_group_type, id="doesnt_exist")
app.get(url=url, extra_environ=env, status=404)
- def test_save(self, app):
- env, response, group_name = _get_group_edit_page(
- app, custom_group_type
- )
- form = response.forms["group-edit"]
-
- response = submit_and_follow(app, form, env, "save")
- group = model.Group.by_name(group_name)
- assert group.state == "active"
- assert group.type == custom_group_type
-
def test_custom_group_form(self, app):
"""Our custom group form is being used to edit groups."""
env, response, group_name = _get_group_edit_page(
app, custom_group_type
)
- assert "My Custom Group Form!" in response
+ assert helpers.body_contains(response, "My Custom Group Form!")
@pytest.mark.ckan_config("ckan.plugins", "example_igroupform_default_group_type")
-@pytest.mark.usefixtures("clean_db", "with_plugins")
+@pytest.mark.usefixtures("clean_db", "with_plugins", "with_request_context")
class TestGroupControllerEdit_DefaultGroupType(object):
def test_group_doesnt_exist(self, app):
user = factories.User()
env = {"REMOTE_USER": six.ensure_str(user["name"])}
url = url_for("%s.edit" % group_type, id="doesnt_exist")
- app.get(url=url, extra_environ=env, status=404)
-
- def test_save(self, app):
- env, response, group_name = _get_group_edit_page(app, group_type)
- form = response.forms["group-edit"]
-
- response = submit_and_follow(app, form, env, "save")
- group = model.Group.by_name(group_name)
- assert group.state == "active"
- assert group.type == group_type
+ res = app.get(url=url, extra_environ=env)
+ assert res.status_code == 404
def test_custom_group_form(self, app):
"""Our custom group form is being used to edit groups."""
env, response, group_name = _get_group_edit_page(app, group_type)
- assert "My Custom Group Form!" in response
+ assert helpers.body_contains(response, "My Custom Group Form!")
diff --git a/ckanext/example_ipermissionlabels/tests/test_example_ipermissionlabels.py b/ckanext/example_ipermissionlabels/tests/test_example_ipermissionlabels.py
index f4653b055fc..36d7d1f5aa2 100644
--- a/ckanext/example_ipermissionlabels/tests/test_example_ipermissionlabels.py
+++ b/ckanext/example_ipermissionlabels/tests/test_example_ipermissionlabels.py
@@ -13,16 +13,9 @@
from ckan import model
-class TestExampleIPermissionLabels(FunctionalTestBase):
- @classmethod
- def setup_class(cls):
- # Test code should use CKAN's plugins.load() function to load plugins
- # to be tested.
- ckan.plugins.load(u"example_ipermissionlabels")
-
- @classmethod
- def teardown_class(cls):
- ckan.plugins.unload(u"example_ipermissionlabels")
+@pytest.mark.ckan_config('ckan.plugins', "example_ipermissionlabels")
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
+class TestExampleIPermissionLabels(object):
def test_normal_dataset_permissions_are_normal(self):
user = factories.User()
diff --git a/ckanext/example_iresourcecontroller/tests/test_example_iresourcecontroller.py b/ckanext/example_iresourcecontroller/tests/test_example_iresourcecontroller.py
index 7721f9b299d..6c2299710c6 100644
--- a/ckanext/example_iresourcecontroller/tests/test_example_iresourcecontroller.py
+++ b/ckanext/example_iresourcecontroller/tests/test_example_iresourcecontroller.py
@@ -3,6 +3,8 @@
'''Tests for the ckanext.example_iauthfunctions extension.
'''
+import pytest
+
from ckan.common import config
import ckan.model as model
@@ -12,27 +14,16 @@
import ckan.tests.helpers as helpers
from ckanext.example_iresourcecontroller import plugin
-
+@pytest.mark.ckan_config('ckan.plugins', 'example_iresourcecontroller')
+@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context')
class TestExampleIResourceController(object):
'''Tests for the plugin that uses IResourceController.
'''
-
- def setup(self):
- # Set up the test app
- self.app = helpers._get_test_app()
-
- def teardown(self):
- # Unload the plugin
- ckan.plugins.unload('example_iresourcecontroller')
- model.repo.rebuild_db()
-
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',
@@ -51,10 +42,6 @@ def test_resource_controller_plugin_create(self):
def test_resource_controller_plugin_update(self):
user = factories.Sysadmin()
resource = factories.Resource(user=user)
-
- # Set up the plugin here because we don't want the resource creation
- # to affect it (because we will only check for changes to update)
- ckan.plugins.load('example_iresourcecontroller')
plugin = ckan.plugins.get_plugin('example_iresourcecontroller')
res = helpers.call_action('resource_update',
@@ -62,8 +49,8 @@ def test_resource_controller_plugin_update(self):
url='http://resource.updated/',
apikey=user['apikey'])
- assert plugin.counter['before_create'] == 0, plugin.counter
- assert plugin.counter['after_create'] == 0, plugin.counter
+ assert plugin.counter['before_create'] == 1, plugin.counter
+ assert plugin.counter['after_create'] == 1, plugin.counter
assert plugin.counter['before_update'] == 1, plugin.counter
assert plugin.counter['after_update'] == 1, plugin.counter
assert plugin.counter['before_delete'] == 0, plugin.counter
@@ -73,17 +60,14 @@ def test_resource_controller_plugin_delete(self):
user = factories.Sysadmin()
resource = factories.Resource(user=user)
- # 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('resource_delete',
id=resource['id'],
apikey=user['apikey'])
- assert plugin.counter['before_create'] == 0, plugin.counter
- assert plugin.counter['after_create'] == 0, plugin.counter
+ 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'] == 1, plugin.counter
@@ -99,18 +83,15 @@ def test_resource_controller_plugin_show(self):
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_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
- assert plugin.counter['before_show'] == 1, plugin.counter
+ assert plugin.counter['before_show'] == 5, plugin.counter
diff --git a/ckanext/example_itranslation/tests/test_plugin.py b/ckanext/example_itranslation/tests/test_plugin.py
index b1968179662..a398074c88f 100644
--- a/ckanext/example_itranslation/tests/test_plugin.py
+++ b/ckanext/example_itranslation/tests/test_plugin.py
@@ -1,60 +1,47 @@
# encoding: utf-8
+import pytest
+
from ckan import plugins
from ckan.tests import helpers
-class TestExampleITranslationPlugin(helpers.FunctionalTestBase):
- @classmethod
- def _apply_config_changes(cls, config):
- config["ckan.plugins"] = "example_itranslation"
-
- @classmethod
- def setup_class(cls):
- super(TestExampleITranslationPlugin, cls).setup_class()
- # plugins.load('example_itranslation')
-
- @classmethod
- def teardown_class(cls):
- if plugins.plugin_loaded("example_itranslation"):
- plugins.unload("example_itranslation")
- super(TestExampleITranslationPlugin, cls).teardown_class()
+@pytest.mark.ckan_config("ckan.plugins", u"example_itranslation")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestExampleITranslationPlugin(object):
- def test_translated_string_in_extensions_templates(self):
- app = self._get_test_app()
+ def test_translated_string_in_extensions_templates(self, app):
response = app.get(
url=plugins.toolkit.url_for(u"home.index", locale="fr"),
)
- assert "This is a itranslated string" in response.body
- assert "This is an untranslated string" not in response.body
+ assert helpers.body_contains(response, "This is a itranslated string")
+ assert not helpers.body_contains(response, "This is an untranslated string")
# double check the untranslated strings
response = app.get(url=plugins.toolkit.url_for(u"home.index"),)
- assert "This is an untranslated string" in response.body
- assert "This is a itranslated string" not in response.body
+ assert helpers.body_contains(response, "This is an untranslated string")
+ assert not helpers.body_contains(response, "This is a itranslated string")
- def test_translated_string_in_core_templates(self):
- app = self._get_test_app()
+ def test_translated_string_in_core_templates(self, app):
response = app.get(
url=plugins.toolkit.url_for(u"home.index", locale="fr"),
)
- assert "Overwritten string in ckan.mo" in response.body
- assert "Connexion" not in response.body
+ assert helpers.body_contains(response, "Overwritten string in ckan.mo")
+ assert not helpers.body_contains(response, "Connexion")
# double check the untranslated strings
response = app.get(url=plugins.toolkit.url_for(u"home.index"),)
- assert "Log in" in response.body
- assert "Overwritten string in ckan.mo" not in response.body
+ assert helpers.body_contains(response, "Log in")
+ assert not helpers.body_contains(response, "Overwritten string in ckan.mo")
# check that we have only overwritten 'fr'
response = app.get(
url=plugins.toolkit.url_for(u"home.index", locale="de"),
)
- assert "Einloggen" in response.body
- assert "Overwritten string in ckan.mo" not in response.body
+ assert helpers.body_contains(response, "Einloggen")
+ assert not helpers.body_contains(response, "Overwritten string in ckan.mo")
- def test_english_translation_replaces_default_english_string(self):
- app = self._get_test_app()
+ def test_english_translation_replaces_default_english_string(self, app):
response = app.get(url=plugins.toolkit.url_for(u"home.index"),)
- assert "Replaced" in response.body
- assert "Register" not in response.body
+ assert helpers.body_contains(response, "Replaced")
+ assert not helpers.body_contains(response, "Register")
diff --git a/ckanext/example_iuploader/test/test_plugin.py b/ckanext/example_iuploader/test/test_plugin.py
index 219fc42c557..5b1a796c250 100644
--- a/ckanext/example_iuploader/test/test_plugin.py
+++ b/ckanext/example_iuploader/test/test_plugin.py
@@ -57,6 +57,7 @@ def _get_package_new_page(app):
@patch.object(flask, "send_file", side_effect=[CONTENT])
@patch.object(config["pylons.h"], "uploads_enabled", return_value=True)
@patch.object(ckan.lib.uploader, "_storage_path", new="/doesnt_exist")
+@pytest.mark.xfail(reason="TODO: implement form submission")
def test_resource_download_iuploader_called(
mock_uploads_enabled, send_file, app, monkeypatch
):
diff --git a/ckanext/imageview/tests/test_view.py b/ckanext/imageview/tests/test_view.py
index 3d325d536cc..da5452d46ab 100644
--- a/ckanext/imageview/tests/test_view.py
+++ b/ckanext/imageview/tests/test_view.py
@@ -3,6 +3,7 @@
import pytest
from ckan.lib.helpers import url_for
from ckan.tests import factories
+import ckan.tests.helpers as helpers
@pytest.mark.ckan_config('ckan.views.default_views', '')
@@ -24,4 +25,4 @@ def test_view_shown_on_resource_page_with_image_url(app):
response = app.get(url)
- assert(resource_view['image_url'] in response)
+ assert helpers.body_contains(response, resource_view['image_url'])
diff --git a/ckanext/multilingual/plugin.py b/ckanext/multilingual/plugin.py
index b284a682583..9340c4aeee4 100644
--- a/ckanext/multilingual/plugin.py
+++ b/ckanext/multilingual/plugin.py
@@ -244,7 +244,7 @@ def before_index(self, search_data):
text_field_items['text_' + default_lang].extend(all_terms)
- for translation in sorted(field_translations):
+ for translation in field_translations:
lang_field = 'text_' + translation['lang_code']
text_field_items[lang_field].append(translation['term_translation'])
diff --git a/ckanext/multilingual/tests/test_multilingual_plugin.py b/ckanext/multilingual/tests/test_multilingual_plugin.py
index 44dd082518b..e7aec1acb50 100644
--- a/ckanext/multilingual/tests/test_multilingual_plugin.py
+++ b/ckanext/multilingual/tests/test_multilingual_plugin.py
@@ -1,5 +1,7 @@
# encoding: utf-8
+import pytest
+
import ckan.plugins
import ckanext.multilingual.plugin as mulilingual_plugin
import ckan.lib.helpers as h
@@ -8,12 +10,12 @@
import ckan.model as model
import ckan.tests.legacy
import ckan.tests.legacy.html_check
-import routes
-from ckan.tests.helpers import _get_test_app
+from ckan.tests.helpers import _get_test_app, body_contains
_create_test_data = ckan.lib.create_test_data
+@pytest.mark.usefixtures('clean_db', 'with_request_context')
class TestDatasetTermTranslation(ckan.tests.legacy.html_check.HtmlCheckMethods):
'Test the translation of datasets by the multilingual_dataset plugin.'
@classmethod
@@ -86,13 +88,12 @@ def test_user_read_translation(self):
terms = ('A Novel By Tolstoy')
for term in terms:
if term in translations:
- assert translations[term] in response, response
+ assert body_contains(response, translations[term])
elif term in _create_test_data.english_translations:
- assert (_create_test_data.english_translations[term]
- in response)
+ assert body_contains(response, _create_test_data.english_translations[term])
else:
- assert term in response
- assert 'this should not be rendered' not in response
+ assert body_contains(response, term)
+ assert not body_contains(response, 'this should not be rendered')
def test_org_read_translation(self):
for (lang_code, translations) in (
@@ -108,13 +109,12 @@ def test_org_read_translation(self):
'Roger likes these books.')
for term in terms:
if term in translations:
- assert translations[term] in response
+ assert body_contains(response, translations[term])
elif term in _create_test_data.english_translations:
- assert (_create_test_data.english_translations[term]
- in response)
+ assert body_contains(response, _create_test_data.english_translations[term])
else:
- assert term in response
- assert 'this should not be rendered' not in response
+ assert body_contains(response, term)
+ assert not body_contains(response, 'this should not be rendered')
def test_org_index_translation(self):
for (lang_code, translations) in (
@@ -126,15 +126,13 @@ def test_org_index_translation(self):
response = self.app.get(offset, status=200)
for term in ('russian', 'Roger likes these books.'):
if term in translations:
- assert translations[term] in response
+ assert body_contains(response, translations[term])
elif term in _create_test_data.english_translations:
- assert (_create_test_data.english_translations[term]
- in response)
+ assert body_contains(response, _create_test_data.english_translations[term])
else:
- assert term in response, response
- assert ('/{0}/organization/{1}'.format(lang_code, self.org['name'])
- in response)
- assert 'this should not be rendered' not in response
+ assert body_contains(response, term)
+ assert body_contains(response, '/{0}/organization/{1}'.format(lang_code, self.org['name']))
+ assert not body_contains(response, 'this should not be rendered')
class TestDatasetSearchIndex():
diff --git a/ckanext/webpageview/tests/test_view.py b/ckanext/webpageview/tests/test_view.py
index 00ab7325f5a..16724aa8a72 100644
--- a/ckanext/webpageview/tests/test_view.py
+++ b/ckanext/webpageview/tests/test_view.py
@@ -1,5 +1,6 @@
# encoding: utf-8
+import pytest
from ckan.lib.helpers import url_for
import ckan.plugins as p
@@ -7,28 +8,12 @@
from ckan.tests import helpers, factories
-class TestWebPageView(helpers.FunctionalTestBase):
- @classmethod
- def _apply_config_changes(cls, cfg):
- cfg["ckan.plugins"] = "webpage_view"
+@pytest.mark.ckan_config("ckan.plugins", "webpage_view")
+@pytest.mark.usefixtures("clean_db", "with_plugins")
+class TestWebPageView(object):
- @classmethod
- def setup_class(cls):
-
- super(TestWebPageView, cls).setup_class()
-
- @classmethod
- def teardown_class(cls):
- if p.plugin_loaded("webpage_view"):
- p.unload("webpage_view")
-
- super(TestWebPageView, cls).teardown_class()
-
- helpers.reset_db()
-
- @helpers.change_config("ckan.views.default_views", "")
- def test_view_shown_on_resource_page(self):
- app = self._get_test_app()
+ @pytest.mark.ckan_config("ckan.views.default_views", "")
+ def test_view_shown_on_resource_page(self, app):
dataset = factories.Dataset()