From: Berker Peksag Date: Sun, 23 Feb 2014 12:47:09 +0000 (+0200) Subject: Issue #686: Create User.url_for_self() method. X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=de6a313c5a3ca9bd7beaf92addb6da0bbe3ad0c2;p=mediagoblin.git Issue #686: Create User.url_for_self() method. *Note from cwebber on merge of this branch:* Thanks also to Sturm who provided an early version of this patch. --- diff --git a/mediagoblin/db/mixin.py b/mediagoblin/db/mixin.py index 25ce6642..048cc07c 100644 --- a/mediagoblin/db/mixin.py +++ b/mediagoblin/db/mixin.py @@ -46,6 +46,12 @@ class UserMixin(object): def bio_html(self): return cleaned_markdown_conversion(self.bio) + def url_for_self(self, urlgen, **kwargs): + """Generate a URL for this User's home page.""" + return urlgen('mediagoblin.user_pages.user_home', + user=self.username, **kwargs) + + class GenerateSlugMixin(object): """ Mixin to add a generate_slug method to objects. diff --git a/mediagoblin/tests/__init__.py b/mediagoblin/tests/__init__.py index cf200791..fbf3fc6c 100644 --- a/mediagoblin/tests/__init__.py +++ b/mediagoblin/tests/__init__.py @@ -14,9 +14,50 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import pytest + +from mediagoblin.db.models import User +from mediagoblin.tests.tools import fixture_add_user +from mediagoblin.tools import template + def setup_package(): import warnings from sqlalchemy.exc import SAWarning warnings.simplefilter("error", SAWarning) + + +class MGClientTestCase: + + usernames = None + + @pytest.fixture(autouse=True) + def setup(self, test_app): + self.test_app = test_app + + if self.usernames is None: + msg = ('The usernames attribute should be overridden ' + 'in the subclass') + raise pytest.skip(msg) + for username, options in self.usernames: + fixture_add_user(username, **options) + + def user(self, username): + return User.query.filter(User.username == username).first() + + def _do_request(self, url, *context_keys, **kwargs): + template.clear_test_template_context() + response = self.test_app.request(url, **kwargs) + context_data = template.TEMPLATE_TEST_CONTEXT + for key in context_keys: + context_data = context_data[key] + return response, context_data + + def do_get(self, url, *context_keys, **kwargs): + kwargs['method'] = 'GET' + return self._do_request(url, *context_keys, **kwargs) + + def do_post(self, url, *context_keys, **kwargs): + kwargs['method'] = 'POST' + return self._do_request(url, *context_keys, **kwargs) diff --git a/mediagoblin/tests/test_modelmethods.py b/mediagoblin/tests/test_modelmethods.py index 86513c76..ca436c76 100644 --- a/mediagoblin/tests/test_modelmethods.py +++ b/mediagoblin/tests/test_modelmethods.py @@ -20,9 +20,11 @@ from mediagoblin.db.base import Session from mediagoblin.db.models import MediaEntry, User, Privilege +from mediagoblin.tests import MGClientTestCase from mediagoblin.tests.tools import fixture_add_user import mock +import pytest class FakeUUID(object): @@ -30,6 +32,8 @@ class FakeUUID(object): UUID_MOCK = mock.Mock(return_value=FakeUUID()) +REQUEST_CONTEXT = ['mediagoblin/root.html', 'request'] + class TestMediaEntrySlugs(object): def _setup(self): @@ -204,3 +208,23 @@ def test_media_data_init(test_app): print repr(obj) assert obj_in_session == 0 + +class TestUserUrlForSelf(MGClientTestCase): + + usernames = [(u'lindsay', dict(privileges=[u'active']))] + + def test_url_for_self(self): + _, request = self.do_get('/', *REQUEST_CONTEXT) + + assert self.user(u'lindsay').url_for_self(request.urlgen) == '/u/lindsay/' + + def test_url_for_self_not_callable(self): + _, request = self.do_get('/', *REQUEST_CONTEXT) + + def fake_urlgen(): + pass + + with pytest.raises(TypeError) as excinfo: + self.user(u'lindsay').url_for_self(fake_urlgen()) + assert excinfo.errisinstance(TypeError) + assert 'object is not callable' in str(excinfo)