Skip to content

Commit b9f128f

Browse files
author
Colton Provias
committed
All tests are passing, but they are probably wrong anyway.
1 parent 124de98 commit b9f128f

4 files changed

Lines changed: 42 additions & 21 deletions

File tree

sqlalchemy_jsonapi/serializer.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -744,10 +744,13 @@ def get_relationship(self, session, query, model, resource, relationship):
744744
RelationshipActions.GET)(resource)
745745

746746
if relationship.direction == MANYTOONE:
747-
try:
748-
response.data['data'] = self._render_short_instance(related)
749-
except PermissionDeniedError:
747+
if related == None:
750748
response.data['data'] = None
749+
else:
750+
try:
751+
response.data['data'] = self._render_short_instance(related)
752+
except PermissionDeniedError:
753+
response.data['data'] = None
751754
else:
752755
response.data['data'] = []
753756
for item in related:
@@ -824,12 +827,16 @@ def patch_relationship(self, session, json_data, model, resource,
824827
item['type'],
825828
item['id'],
826829
Permissions.EDIT)
827-
remote = item.__mapper__.relationships[remote_side]
830+
remote = to_relate.__mapper__.relationships[remote_side]
828831

829832
if remote.direction == MANYTOONE:
830-
check_permission(item, remote_side, Permissions.EDIT)
833+
check_permission(to_relate,
834+
remote_side,
835+
Permissions.EDIT)
831836
else:
832-
check_permission(item, remote_side, Permissions.CREATE)
837+
check_permission(to_relate,
838+
remote_side,
839+
Permissions.CREATE)
833840
appender(resource, to_relate)
834841
session.commit()
835842
except KeyError:
@@ -911,8 +918,11 @@ def patch_resource(self, session, json_data, model, resource):
911918
session.rollback()
912919
raise ValidationError(str(e.orig))
913920
except AssertionError as e:
921+
session.rollback()
914922
raise ValidationError(e.msg)
915-
923+
except TypeError as e:
924+
session.rollback()
925+
raise ValidationError('Incompatible data type')
916926
return self.get_resource(
917927
session,
918928
{},
@@ -1046,7 +1056,11 @@ def post_collection(self, session, data, model):
10461056
session.rollback()
10471057
raise ValidationError(str(e.orig))
10481058
except AssertionError as e:
1059+
session.rollback()
10491060
raise ValidationError(e.msg)
1061+
except TypeError as e:
1062+
session.rollback()
1063+
raise ValidationError('In compatible data type')
10501064
session.refresh(resource)
10511065
response = self.get_resource(
10521066
session,
@@ -1090,7 +1104,7 @@ def post_relationship(self, session, json_data, model, resource,
10901104
'{} must be an array'.format(relationship.key))
10911105

10921106
for item in json_data['data']:
1093-
if not {'type', 'id'} in set(item.keys()):
1107+
if {'type', 'id'} != set(item.keys()):
10941108
raise BadRequestError(
10951109
'{} must have type and id keys'
10961110
.format(relationship.key))
@@ -1120,11 +1134,12 @@ def post_relationship(self, session, json_data, model, resource,
11201134
except KeyError:
11211135
raise ValidationError('Incompatible type provided')
11221136

1123-
return self.get_resource(
1137+
return self.get_relationship(
11241138
session,
11251139
{},
11261140
{
11271141
'api_type': model.__jsonapi_type__,
1128-
'obj_id': resource.id
1142+
'obj_id': resource.id,
1143+
'relationship': relationship.key
11291144
}
11301145
)

sqlalchemy_jsonapi/tests/app.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from uuid import uuid4
99

10-
from flask import Flask
10+
from flask import Flask, request
1111
from flask_sqlalchemy import SQLAlchemy
1212
from sqlalchemy import Boolean, Column, ForeignKey, Unicode, UnicodeText
1313
from sqlalchemy.ext.hybrid import hybrid_property
@@ -78,6 +78,12 @@ def view_password(self):
7878
""" Never let the password be seen. """
7979
return False
8080

81+
@permission_test(Permissions.EDIT)
82+
def prevent_edit(self):
83+
if request.view_args['api_type'] == 'posts':
84+
return True
85+
return False
86+
8187
@permission_test(Permissions.DELETE)
8288
def allow_delete(self):
8389
""" Just like a popular social media site, we won't delete users. """

sqlalchemy_jsonapi/tests/test_relationship_delete.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from sqlalchemy_jsonapi.errors import (
55
BadRequestError, PermissionDeniedError, RelationshipNotFoundError,
6-
ResourceNotFoundError, ToManyExpectedError, MissingContentTypeError)
6+
ResourceNotFoundError, ToManyExpectedError, MissingContentTypeError, ValidationError)
77

88

99
def test_200_on_deletion_from_to_many(comment, client):
@@ -38,17 +38,17 @@ def test_404_on_relationship_not_found(post, client):
3838
def test_403_on_permission_denied(user, client):
3939
client.delete('/api/users/{}/relationships/logs/'.format(
4040
user.id),
41-
data='{}',
41+
data='{"data": []}',
4242
content_type='application/vnd.api+json').validate(
4343
403, PermissionDeniedError)
4444

4545

4646
def test_409_on_to_one_provided(post, client):
4747
client.delete('/api/posts/{}/relationships/author/'.format(
4848
post.id),
49-
data='{}',
49+
data='{"data": {}}',
5050
content_type='application/vnd.api+json').validate(
51-
409, ToManyExpectedError)
51+
409, ValidationError)
5252

5353

5454
def test_409_missing_content_type_header(post, client):

sqlalchemy_jsonapi/tests/test_resource_patch.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ def test_404_related_resource_not_found(client, post):
7070
client.patch('/api/posts/{}/'.format(post.id),
7171
data=json.dumps(payload),
7272
content_type='application/vnd.api+json').validate(
73-
404, RelatedResourceNotFoundError)
73+
404, ResourceNotFoundError)
7474

7575

76-
def test_404_field_not_found(client, post, user):
76+
def test_400_field_not_found(client, post, user):
7777
payload = {
7878
'data': {
7979
'type': 'posts',
@@ -91,7 +91,7 @@ def test_404_field_not_found(client, post, user):
9191
client.patch('/api/posts/{}/'.format(post.id),
9292
data=json.dumps(payload),
9393
content_type='application/vnd.api+json').validate(
94-
404, RelationshipNotFoundError)
94+
400, BadRequestError)
9595

9696

9797
def test_409_type_mismatch_to_one(client, post, user):
@@ -115,7 +115,7 @@ def test_409_type_mismatch_to_one(client, post, user):
115115
409, ValidationError)
116116

117117

118-
def test_409_type_mismatch_to_many(client, post, user):
118+
def test_400_type_mismatch_to_many(client, post, user):
119119
payload = {
120120
'data': {
121121
'type': 'posts',
@@ -133,7 +133,7 @@ def test_409_type_mismatch_to_many(client, post, user):
133133
client.patch('/api/posts/{}/'.format(post.id),
134134
data=json.dumps(payload),
135135
content_type='application/vnd.api+json').validate(
136-
409, ValidationError)
136+
400, BadRequestError)
137137

138138

139139
def test_409_validation_failed(client, post, user):
@@ -181,7 +181,7 @@ def test_400_type_does_not_match_endpoint(client, post, user):
181181
client.patch('/api/posts/{}/'.format(post.id),
182182
data=json.dumps(payload),
183183
content_type='application/vnd.api+json').validate(
184-
400, MissingTypeError)
184+
400, BadRequestError)
185185

186186

187187
def test_403_permission_denied(user, client):

0 commit comments

Comments
 (0)