Skip to content

Commit

Permalink
fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ginsstaahh committed Nov 12, 2018
1 parent b3e5d53 commit 2c04e1d
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 33 deletions.
5 changes: 3 additions & 2 deletions bounce/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ def start(port, secret, pg_host, pg_port, pg_user, pg_password, pg_database,
pg_database, allowed_origin, image_dir)
# Register your new endpoints here
endpoints = [
UsersEndpoint, UserEndpoint, SearchUsersEndpoint, UserImagesEndpoint, ClubsEndpoint,
ClubEndpoint, SearchClubsEndpoint, LoginEndpoint, MembershipEndpoint
UsersEndpoint, UserEndpoint, SearchUsersEndpoint, UserImagesEndpoint,
ClubsEndpoint, ClubEndpoint, SearchClubsEndpoint, LoginEndpoint,
MembershipEndpoint
]
serv = Server(conf, endpoints)
serv.start()
7 changes: 4 additions & 3 deletions bounce/db/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from sqlalchemy import Column, Integer, String, desc, func
from sqlalchemy.orm import relationship
from sqlalchemy.types import TIMESTAMP
from sqlalchemy_utils.types import TSVectorType

from . import BASE

Expand All @@ -28,8 +27,6 @@ class User(BASE):
email = Column('email', String, nullable=False)
created_at = Column(
'created_at', TIMESTAMP, nullable=False, server_default=func.now())
search_vector = Column('search_vector',
TSVectorType('full_name', 'username'))
clubs = relationship('Membership', back_populates='member')

def to_dict(self):
Expand Down Expand Up @@ -71,6 +68,10 @@ def search(session, query=None, page=0, size=MAX_SIZE):
if query:
# show clubs that have a name that matches the query
users = users.filter(User.full_name.ilike(f'%{query}%'))
# TODO: implement search_vector functionality:
# users = users.filter(User.search_vector.match(query))
# Currently search_vector column isn't working properly

else:
# show clubs ordered by most recently created
users = users.order_by(desc(User.created_at))
Expand Down
3 changes: 1 addition & 2 deletions requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@ sqlalchemy==1.2.8
psycopg2==2.7.4
jsonschema==2.6.0
bcrypt==3.1.4
python-jose==3.0.0
sqlalchemy-utils==0.33.3
python-jose==3.0.0
3 changes: 1 addition & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ pycparser==2.18 # via cffi
python-jose==3.0.0
rsa==3.4.2 # via python-jose
sanic==0.7.0
six==1.11.0 # via bcrypt, python-jose, sqlalchemy-utils
sqlalchemy-utils==0.33.3
six==1.11.0 # via bcrypt, python-jose
sqlalchemy==1.2.8
ujson==1.35 # via sanic
uvloop==0.11.2 # via sanic
Expand Down
78 changes: 54 additions & 24 deletions tests/api/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

from bounce.server.api import util


def test_root_handler(server):
_, response = server.app.test_client.get('/')
assert response.status == 200
assert response.body == b'Bounce API accepting requests!'


def test_post_users__success(server):
_, response = server.app.test_client.post(
'/users',
Expand All @@ -22,6 +24,7 @@ def test_post_users__success(server):
}))
assert response.status == 201


def test_post_users__failure(server):
_, response = server.app.test_client.post(
'/users',
Expand All @@ -33,6 +36,7 @@ def test_post_users__failure(server):
assert response.status == 400
assert 'error' in response.json


def test_put_user__success(server):
username = 'test'
token = util.create_jwt(1, server.config.secret)
Expand All @@ -50,6 +54,7 @@ def test_put_user__success(server):
assert response.json['id'] == 1
assert isinstance(response.json['created_at'], int)


def test_put_user__failure(server):
username = 'test'
token = util.create_jwt(1, server.config.secret)
Expand All @@ -63,10 +68,11 @@ def test_put_user__failure(server):


def test_paginate_users__success(server):
# add dummy data to search for in database
# add 3 dummy data entries to search for in database.
# In total there's 4 with one coming from previous tests.
user_info = [[
'matt', 'ginsstaahh', 'matthewgin10@gmail.com', 'Val1dPassword!'
], ['david', 'dwu', 'dwu10@gmail.com', 'Val1dPassword!'],
'matt gin', 'ginsstaahh', 'matthewgin10@gmail.com', 'Val1dPassword!'
], ['gin', 'ginsstaahh221', 'matt.gin@hotmail.com', 'Val1dPassword!'],
['bruno', 'bfcbachman', 'bruno@gmail.com', 'Val1dPassword!']]
for full_name, username, email, password in user_info:
server.app.test_client.post(
Expand All @@ -86,13 +92,10 @@ def test_paginate_users__success(server):


def test_search_users__success(server):
_, response = server.app.test_client.get('/users/search?query=matt')
_, response = server.app.test_client.get('/users/search?query=gin')
assert response.status == 200
body = response.json
assert len(body.get('results')) == 1
assert body.get('results')[0]['full_name'] == 'matt'
assert body.get('results')[0]['username'] == 'ginsstaahh'
assert body.get('results')[0]['email'] == 'matthewgin10@gmail.com'
assert len(body.get('results')) == 2


def test_get_user__success(server):
Expand All @@ -104,10 +107,12 @@ def test_get_user__success(server):
assert response.json['id'] == 1
assert isinstance(response.json['created_at'], int)


def test_get_user__failure(server):
_, response = server.app.test_client.get('/users/doesnotexist')
assert response.status == 404


def test_put_users_update_password__success(server):
username = 'test'
token = util.create_jwt(1, server.config.secret)
Expand All @@ -120,6 +125,7 @@ def test_put_users_update_password__success(server):
headers={'Authorization': token})
assert response.status == 200


def test_put_users_update_password__failure(server):
username = 'test'
token = util.create_jwt(1, server.config.secret)
Expand All @@ -140,6 +146,7 @@ def test_put_users_update_password__failure(server):
headers={'Authorization': token})
assert response.status == 401


def test_login__success(server):
_, response = server.app.test_client.post(
'/auth/login',
Expand All @@ -150,6 +157,7 @@ def test_login__success(server):
assert response.status == 200
assert isinstance(response.json['token'], str)


def test_login__failure(server):
_, response = server.app.test_client.post(
'/auth/login',
Expand All @@ -159,18 +167,21 @@ def test_login__failure(server):
}))
assert response.status == 401


def test_delete_user__success(server):
token = util.create_jwt(1, server.config.secret)
_, response = server.app.test_client.delete(
'/users/test', headers={'Authorization': token})
assert response.status == 204


def test_delete_user__failure(server):
token = util.create_jwt(1, server.config.secret)
_, response = server.app.test_client.delete(
'/users/doesnotexist', headers={'Authorization': token})
assert response.status == 404


def test_post_clubs__success(server):
_, response = server.app.test_client.post(
'/clubs',
Expand All @@ -184,6 +195,7 @@ def test_post_clubs__success(server):
}))
assert response.status == 201


def test_post_clubs__failure(server):
_, response = server.app.test_client.post(
'/clubs',
Expand All @@ -198,6 +210,7 @@ def test_post_clubs__failure(server):
assert response.status == 409
assert 'error' in response.json


def test_put_club__success(server):
_, response = server.app.test_client.put(
'/clubs/test',
Expand All @@ -211,13 +224,15 @@ def test_put_club__success(server):
assert response.json['id'] == 1
assert isinstance(response.json['created_at'], int)


def test_put_club__failure(server):
_, response = server.app.test_client.put(
'/clubs/newtest', data=json.dumps({
'garbage': True
}))
assert response.status == 400


def test_get_club__success(server):
_, response = server.app.test_client.get('/clubs/newtest')
assert response.status == 200
Expand All @@ -226,14 +241,17 @@ def test_get_club__success(server):
assert response.json['id'] == 1
assert isinstance(response.json['created_at'], int)


def test_get_club__failure(server):
_, response = server.app.test_client.get('/clubs/doesnotexist')
assert response.status == 404


def test_delete_club__success(server):
_, response = server.app.test_client.delete('/clubs/test')
assert response.status == 204


def test_paginate_clubs__success(server):
# add dummy data to search for in database
club_info = [['UBC Launch Pad', 'software engineering team'],
Expand All @@ -256,6 +274,7 @@ def test_paginate_clubs__success(server):
assert body.get('page') == 0
assert body.get('total_pages') == 2


def test_search_clubs__success(server):
_, response = server.app.test_client.get('/clubs/search?query=UBC')
assert response.status == 200
Expand All @@ -266,6 +285,7 @@ def test_search_clubs__success(server):
assert body.get('results')[1]['name'] == 'UBC biomed'
assert body.get('results')[1]['description'] == 'something else'


def test_put_user_image__success(server):
# POST a dummy user to add a profile image to
server.app.test_client.post(
Expand All @@ -276,31 +296,32 @@ def test_put_user_image__success(server):
'email': 'test@test.com',
'password': 'Val1dPassword!'
}))
token = util.create_jwt(2, server.config.secret)
token = util.create_jwt(5, server.config.secret)
data = FormData()
data.add_field('image', open('tests/testdata/large-logo.png', 'rb'))
_, response = server.app.test_client.put(
'/users/2/images/profile',
'/users/5/images/profile',
data=data,
headers={
'Authorization': token,
})
assert response.status == 200


def test_put_user_image__failure(server):
token = util.create_jwt(3, server.config.secret)
token = util.create_jwt(6, server.config.secret)
data = FormData()
# No such user
_, response = server.app.test_client.put(
'/users/3/images/profile',
'/users/6/images/profile',
data=data,
headers={
'Authorization': token,
})
assert response.status == 404
# Forbidden (the user is trying to update another user's image)
_, response = server.app.test_client.put(
'/users/2/images/profile',
'/users/5/images/profile',
data=data,
headers={
'Authorization': token,
Expand All @@ -309,44 +330,49 @@ def test_put_user_image__failure(server):
# Invalid image name
token = util.create_jwt(2, server.config.secret)
_, response = server.app.test_client.put(
'/users/2/images/$%^&*(',
'/users/5/images/$%^&*(',
data=data,
headers={
'Authorization': token,
})
assert response.status == 400


def test_get_user_image__success(server):
_, response = server.app.test_client.get('/users/2/images/profile')
_, response = server.app.test_client.get('/users/5/images/profile')
assert response.status == 200


def test_get_user_image__failure(server):
_, response = server.app.test_client.get('/users/3/images/profile')
_, response = server.app.test_client.get('/users/6/images/profile')
assert response.status == 404


def test_delete_user_image__success(server):
token = util.create_jwt(2, server.config.secret)
token = util.create_jwt(5, server.config.secret)
_, response = server.app.test_client.delete(
'/users/2/images/profile', headers={
'/users/5/images/profile', headers={
'Authorization': token,
})
assert response.status == 200


def test_delete_user_image__failure(server):
token = util.create_jwt(3, server.config.secret)
token = util.create_jwt(6, server.config.secret)
# No such image
_, response = server.app.test_client.delete(
'/users/3/images/profile', headers={
'/users/6/images/profile', headers={
'Authorization': token,
})
assert response.status == 404
# Forbidden (user is trying to delete another user's image)
_, response = server.app.test_client.delete(
'/users/2/images/profile', headers={
'/users/5/images/profile', headers={
'Authorization': token,
})
assert response.status == 403


def test_put_memberships__success(server):
_, response = server.app.test_client.post(
'/users',
Expand All @@ -362,29 +388,33 @@ def test_put_memberships__success(server):
'/memberships/newtest?user_id=2', headers={'Authorization': token})
assert response.status == 201


def test_put_memberships__failure(server):
token = util.create_jwt(2, server.config.secret)
_, response = server.app.test_client.put(
'/memberships/doesnotexist?user_id=2',
headers={'Authorization': token})
assert response.status == 400


def test_get_memberships__success(server):
_, response = server.app.test_client.get('/memberships/newtest?user_id=2')
assert response.status == 200
assert len(response.json) == 1
membership = response.json['results'][0]
assert membership['user_id'] == 2
assert membership['full_name'] == 'Test Guy'
assert membership['username'] == 'test'
assert membership['full_name'] == 'matt gin'
assert membership['username'] == 'ginsstaahh'
assert isinstance(membership['created_at'], int)


def test_delete_membership__failure(server):
token = util.create_jwt(1, server.config.secret)
token = util.create_jwt(3, server.config.secret)
_, response = server.app.test_client.delete(
'/memberships/newtest?user_id=2', headers={'Authorization': token})
assert response.status == 403


def test_delete_membership__success(server):
token = util.create_jwt(2, server.config.secret)
_, response = server.app.test_client.delete(
Expand Down
Loading

0 comments on commit 2c04e1d

Please sign in to comment.