Skip to content

Commit b2de706

Browse files
start some argument checking and error handling; parameters on get_evaluations, add .travis.yml
1 parent 5c6df64 commit b2de706

File tree

6 files changed

+94
-24
lines changed

6 files changed

+94
-24
lines changed

.travis.yml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Config file for automatic testing at travis-ci.org
2+
3+
language: python
4+
python: 2.7
5+
env:
6+
- TOX_ENV=py27
7+
- TOX_ENV=style
8+
- TOX_ENV=docs
9+
install:
10+
- pip install tox
11+
script:
12+
- tox -e $TOX_ENV

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ WebOb==1.6.0
2020
WebTest==2.0.21
2121
zope.deprecation==4.1.2
2222
zope.interface==4.1.3
23+
colander==1.2

restapi/tests/common.py

+6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import os
22
import unittest
3+
import logging
34
from restapi import protocol
45
from webtest import TestApp
56

67
from restapi import main
78

89

10+
# shut up peewee
11+
peewee_logger = logging.getLogger('peewee')
12+
peewee_logger.setLevel(logging.ERROR)
13+
14+
915
class APITestCase(unittest.TestCase):
1016
"""Base class for testing API functions"""
1117

restapi/tests/test_evaluations.py

+47-12
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33

44

55
class TestEvaluations(APITestCase):
6+
@property
7+
def url_collection(self):
8+
return URL_EVALUATION_COLLECTION.format(contract=self.contract_name)
69

710
def test_workflow(self):
811
# test creating and getting evaluations
912
app = self.app
1013

11-
url_collection = URL_EVALUATION_COLLECTION.format(contract=self.contract_name)
12-
1314
def url_resource(evaluation_id):
1415
return URL_EVALUATION_RESOURCE.format(
1516
contract=self.contract_name,
@@ -20,39 +21,73 @@ def url_resource(evaluation_id):
2021
user = self.contract.create_user()
2122
contribution = self.contract.create_contribution(user=user)
2223

23-
# create a evaluation
24+
# create an evaluation
2425
response = app.post(
25-
url_collection,
26+
self.url_collection,
2627
{
2728
'evaluator_id': user.id,
2829
'contribution_id': contribution.id,
29-
'value': 10,
30+
'value': 1,
3031
}
3132
)
32-
self.assertEqual(response.json['value'], 10)
33+
self.assertEqual(response.json['value'], 1)
3334
evaluation_id = response.json['id']
3435

3536
# get the evaluation info
3637
response = app.get(url_resource(evaluation_id))
3738

3839
# get the evaluation collection
39-
response = app.get(url_collection)
40+
response = app.get(self.url_collection)
4041
self.assertEqual(response.json.get('count'), 1)
4142

4243
def test_evaluation_data(self):
4344
# test that GETting an evaluation returns all expected data
4445
user = self.contract.create_user()
4546
contribution = self.contract.create_contribution(user=user)
46-
value = 3.14
4747
evaluation = self.contract.create_evaluation(
48-
contribution=contribution, value=value, user=user)
48+
contribution=contribution, value=1, user=user)
4949

5050
url = URL_EVALUATION_RESOURCE.format(id=evaluation.id, contract=self.contract_name)
5151
info = self.app.get(url).json
52-
self.assertEqual(info['value'], value)
52+
self.assertEqual(info['value'], 1)
5353
self.assertEqual(info['contribution']['id'], contribution.id)
54-
self.assertEqual(info['contribution']['score'], 0.0)
54+
self.assertEqual(info['contribution']['score'], 1.0)
5555
self.assertEqual(info['contribution']['engaged_reputation'], user.reputation)
5656
self.assertEqual(info['evaluator']['id'], user.id)
57-
self.assertEqual(info['evaluator']['tokens'], 49)
57+
self.assertEqual(info['evaluator']['tokens'], 99)
5858
self.assertEqual(info['evaluator']['reputation'], 1)
59+
60+
def test_evaluation_collection_get(self):
61+
# add some data
62+
user0 = self.contract.create_user()
63+
user1 = self.contract.create_user()
64+
contribution0 = self.contract.create_contribution(user=user0)
65+
contribution1 = self.contract.create_contribution(user=user1)
66+
self.contract.create_evaluation(contribution=contribution0, value=1, user=user0)
67+
self.contract.create_evaluation(contribution=contribution0, value=1, user=user1)
68+
self.contract.create_evaluation(contribution=contribution1, value=1, user=user0)
69+
70+
response = self.app.get(self.url_collection)
71+
self.assertEqual(response.json.get('count'), 3)
72+
response = self.app.get(self.url_collection, {'contribution_id': contribution0.id})
73+
self.assertEqual(response.json.get('count'), 2)
74+
response = self.app.get(self.url_collection, {'contributor_id': user0.id})
75+
self.assertEqual(response.json.get('count'), 2)
76+
response = self.app.get(self.url_collection, {'contributor_id': user1.id})
77+
self.assertEqual(response.json.get('count'), 1)
78+
79+
def test_evaluation_errors(self):
80+
user = self.contract.create_user()
81+
contribution = self.contract.create_contribution(user=user)
82+
83+
# try to create an evaluation with an illegal value
84+
response = self.app.post(
85+
self.url_collection,
86+
{
87+
'evaluator_id': user.id,
88+
'contribution_id': contribution.id,
89+
'value': 10000,
90+
},
91+
expect_errors=True,
92+
)
93+
self.assertTrue(response.status, 'xx')

restapi/views/evaluations.py

+27-12
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,34 @@
22

33
import config
44
from utils import get_contract
5-
5+
from colander import MappingSchema, SchemaNode, Float, Integer
66

77
evaluation_collection_service = Service(name='Evaluation Collection', path=config.URL_EVALUATION_COLLECTION, description="Evaluations")
88
evaluation_resource_service = Service(name='Evaluation Resource', path=config.URL_EVALUATION_RESOURCE, description="Evaluations")
99

1010

11-
@evaluation_collection_service.get(validators=(get_contract,))
11+
class EvaluationCollectionGetSchema(MappingSchema):
12+
contribution_id = SchemaNode(Integer(), location='querystring', type='int', missing=None)
13+
contributor_id = SchemaNode(Integer(), location='querystring', type='int', missing=None)
14+
15+
16+
@evaluation_collection_service.get(validators=(get_contract,), schema=EvaluationCollectionGetSchema)
1217
def collection_get(request):
1318
"""Get a list of users"""
14-
evaluations = request.contract.get_evaluations()
19+
evaluations = request.contract.get_evaluations(**request.validated)
1520
return {
1621
'count': len(evaluations),
1722
'items': [evaluation_to_dict(evaluation, request) for evaluation in evaluations],
1823
}
1924

2025

21-
@evaluation_collection_service.post(validators=(get_contract,))
26+
class Evaluationschema(MappingSchema):
27+
value = SchemaNode(Float(), location='body', type='int')
28+
evaluator_id = SchemaNode(Integer(), location='body', type='int')
29+
contribution_id = SchemaNode(Integer(), location='body', type='int')
30+
31+
32+
@evaluation_collection_service.post(validators=(get_contract,), schema=Evaluationschema)
2233
def collection_post(request):
2334
"""Create a new evaluation.
2435
@@ -37,14 +48,18 @@ def collection_post(request):
3748
information about the added evaluation
3849
3950
"""
40-
user = request.contract.get_user(request.POST['evaluator_id'])
41-
contribution = request.contract.get_contribution(request.POST['contribution_id'])
42-
value = request.POST['value']
43-
evaluation = request.contract.create_evaluation(
44-
user=user,
45-
contribution=contribution,
46-
value=value,
47-
)
51+
user = request.contract.get_user(request.validated['evaluator_id'])
52+
contribution = request.contract.get_contribution(request.validated['contribution_id'])
53+
value = request.validated['value']
54+
try:
55+
evaluation = request.contract.create_evaluation(
56+
user=user,
57+
contribution=contribution,
58+
value=value,
59+
)
60+
except ValueError as error:
61+
request.errors.add('query', 'value error', unicode(error))
62+
return
4863
return evaluation_to_dict(evaluation, request)
4964

5065

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
'cornice',
2121
'backfeed-protocol',
2222
'BeautifulSoup4',
23+
'colander',
2324
]
2425

2526
setup(

0 commit comments

Comments
 (0)