Skip to content

Commit

Permalink
fixup! Add support of TODO tags
Browse files Browse the repository at this point in the history
  • Loading branch information
asaunier committed Dec 1, 2019
1 parent 7b47bb8 commit 6317593
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 161 deletions.
197 changes: 39 additions & 158 deletions c2corg_api/tests/views/test_route_tag.py
Original file line number Diff line number Diff line change
@@ -1,206 +1,87 @@
from c2corg_api.models.route import Route
from c2corg_api.models.route import Route, RouteLocale
from c2corg_api.models.tag import RouteTag
from c2corg_api.models.user import User
from c2corg_api.tests.views import BaseTestRest
from c2corg_api.views.route_tag import get_tag_relation


#TODO
class BaseTagTest(BaseTestRest):
class BaseRouteTagTest(BaseTestRest):

def setUp(self): # noqa
super(BaseTagTest, self).setUp()
super().setUp()

self.contributor = self.session.query(User).get(
self.global_userids['contributor'])
self.contributor2 = self.session.query(User).get(
self.global_userids['contributor2'])
self.moderator = self.session.query(User).get(
self.global_userids['moderator'])

self.session.add(FollowedUser(
followed_user_id=self.contributor2.id,
follower_user_id=self.contributor.id))
self.route1 = Route(activities=['skitouring'],locales=[
RouteLocale(lang='en', title='Route1')
])
self.session.add(self.route1)
self.route2 = Route(activities=['skitouring'],locales=[
RouteLocale(lang='en', title='Route2')
])
self.session.add(self.route2)
self.route3 = Route(activities=['hiking'],locales=[
RouteLocale(lang='en', title='Route3')
])
self.session.add(self.route3)
self.session.flush()

self.session.add(RouteTag(
user_id=self.contributor2.id,
route_id=self.route2.document_id))
self.session.flush()

def is_following(self, followed_user_id, follower_user_id):
return get_follower_relation(
followed_user_id, follower_user_id) is not None
def has_tagged(self, user_id, route_id):
return get_tag_relation(user_id, route_id) is not None


class TestUserFollowRest(BaseFollowTest):
class TestRouteTagRest(BaseRouteTagTest):

def setUp(self): # noqa
super(TestUserFollowRest, self).setUp()
self._prefix = '/users/follow'
super().setUp()
self._prefix = '/routes/tag'

def test_follow_unauthenticated(self):
def test_tag_unauthenticated(self):
self.app_post_json(self._prefix, {}, status=403)

def test_follow(self):
request_body = {
'user_id': self.moderator.id
}

headers = self.add_authorization_header(username='contributor')
self.app_post_json(
self._prefix, request_body, status=200, headers=headers)

self.assertTrue(
self.is_following(self.moderator.id, self.contributor.id))

def test_follow_already_followed_user(self):
""" Test that following an already followed user does not raise an
error.
"""
def test_tag(self):
request_body = {
'user_id': self.contributor2.id
'route_id': self.route1.document_id
}

headers = self.add_authorization_header(username='contributor')
self.app_post_json(
self._prefix, request_body, status=200, headers=headers)

self.assertTrue(
self.is_following(self.contributor2.id, self.contributor.id))
self.assertTrue(self.has_tagged(self.contributor.id, self.route1.document_id))

def test_follow_invalid_user_id(self):
request_body = {
'user_id': -1
}

headers = self.add_authorization_header(username='contributor')
response = self.app_post_json(
self._prefix, request_body, status=400, headers=headers)

body = response.json
self.assertEqual(body.get('status'), 'error')
errors = body.get('errors')
self.assertIsNotNone(self.get_error(errors, 'user_id'))


class TestUserUnfollowRest(BaseFollowTest):
class TestRouteTaggedRest(BaseRouteTagTest):

def setUp(self): # noqa
super(TestUserUnfollowRest, self).setUp()
self._prefix = '/users/unfollow'

def test_follow_unauthenticated(self):
self.app_post_json(self._prefix, {}, status=403)
super().setUp()
self._prefix = '/routes/tagged'

def test_unfollow(self):
request_body = {
'user_id': self.contributor2.id
}

headers = self.add_authorization_header(username='contributor')
self.app_post_json(
self._prefix, request_body, status=200, headers=headers)

self.assertFalse(
self.is_following(self.moderator.id, self.contributor.id))

def test_unfollow_not_followed_user(self):
""" Test that unfollowing a not followed user does not raise an error.
"""
request_body = {
'user_id': self.moderator.id
}

headers = self.add_authorization_header(username='contributor')
self.app_post_json(
self._prefix, request_body, status=200, headers=headers)

self.assertFalse(
self.is_following(self.moderator.id, self.contributor.id))

def test_follow_invalid_user_id(self):
request_body = {
'user_id': -1
}

headers = self.add_authorization_header(username='contributor')
response = self.app_post_json(
self._prefix, request_body, status=400, headers=headers)

body = response.json
self.assertEqual(body.get('status'), 'error')
errors = body.get('errors')
self.assertIsNotNone(self.get_error(errors, 'user_id'))


class TestUserFollowingUserRest(BaseFollowTest):

def setUp(self): # noqa
super(TestUserFollowingUserRest, self).setUp()
self._prefix = '/users/following-user'

def test_follow_unauthenticated(self):
def test_has_tagged_unauthenticated(self):
self.app.get(self._prefix + '/123', status=403)

def test_following(self):
headers = self.add_authorization_header(username='contributor')
def test_has_tagged(self):
headers = self.add_authorization_header(username='contributor2')
response = self.app.get(
self._prefix + '/{}'.format(self.contributor2.id),
'{}/{}'.format(self._prefix, self.route2.document_id),
status=200, headers=headers)
body = response.json

self.assertTrue(body['is_following'])
self.assertTrue(body['todo'])

def test_following_not(self):
def test_has_tagged_not(self):
headers = self.add_authorization_header(username='contributor')
response = self.app.get(
self._prefix + '/{}'.format(self.moderator.id),
'{}/{}'.format(self._prefix, self.route1.document_id),
status=200, headers=headers)
body = response.json

self.assertFalse(body['is_following'])

def test_following_invalid_user_id(self):
headers = self.add_authorization_header(username='contributor')
response = self.app.get(
self._prefix + '/invalid-user-id',
status=400, headers=headers)

body = response.json
self.assertEqual(body.get('status'), 'error')
errors = body.get('errors')
self.assertIsNotNone(self.get_error(errors, 'id'))

def test_following_wrong_user_id(self):
headers = self.add_authorization_header(username='contributor')
response = self.app.get(
self._prefix + '/9999999999',
status=200, headers=headers)
body = response.json

self.assertFalse(body['is_following'])


class TestUserFollowingRest(BaseFollowTest):

def setUp(self): # noqa
super(TestUserFollowingRest, self).setUp()
self._prefix = '/users/following'

def test_follow_unauthenticated(self):
self.app.get(self._prefix, status=403)

def test_following(self):
headers = self.add_authorization_header(username='contributor')
response = self.app.get(self._prefix, status=200, headers=headers)
body = response.json

following_users = body['following']
self.assertEqual(1, len(following_users))
self.assertEqual(
self.contributor2.id, following_users[0]['document_id'])

def test_following_empty(self):
headers = self.add_authorization_header(username='contributor2')
response = self.app.get(self._prefix, status=200, headers=headers)
body = response.json

following_users = body['following']
self.assertEqual(0, len(following_users))
self.assertFalse(body['todo'])
9 changes: 6 additions & 3 deletions c2corg_api/views/route_tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from c2corg_api.models.route import Route
from c2corg_api.models.tag import RouteTag
from c2corg_api.views import cors_policy, restricted_json_view
from c2corg_api.views.validation import create_int_validator
from colander import MappingSchema, SchemaNode, Integer, required
from cornice.resource import resource
from cornice.validators import colander_body_validator
Expand All @@ -22,7 +23,9 @@ def get_tag_relation(user_id, route_id):
filter(RouteTag.route_id == route_id). \
first()

def validate_route_id(request, **kwargs):
validate_route_id = create_int_validator('route_id')

def validate_route(request, **kwargs):
""" Check that the route exists.
"""
route_id = request.validated['route_id']
Expand All @@ -44,7 +47,7 @@ def __init__(self, request):

@restricted_json_view(
schema=TagSchema(),
validators=[colander_body_validator, validate_route_id])
validators=[colander_body_validator, validate_route])
def post(self):
""" Tag the given route as todo.
Creates a tag relation, so that the authenticated user is
Expand Down Expand Up @@ -76,7 +79,7 @@ def __init__(self, request):

@restricted_json_view(
schema=TagSchema(),
validators=[colander_body_validator, validate_route_id])
validators=[colander_body_validator, validate_route])
def post(self):
""" Untag the given route.
Expand Down

0 comments on commit 6317593

Please sign in to comment.