Skip to content

Commit ae30f00

Browse files
committed
Add SQLAlchemyList and SQLAlchemyMutation types
This brings default support for fields filtering and ordering on queries and mutations.
1 parent ecd9a91 commit ae30f00

File tree

7 files changed

+747
-27
lines changed

7 files changed

+747
-27
lines changed

graphene_sqlalchemy/mutations.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from graphene_sqlalchemy.types import SQLAlchemyMutation
2+
3+
4+
def create(of_type):
5+
class CreateModel(SQLAlchemyMutation):
6+
class Meta:
7+
model = of_type._meta.model
8+
create = True
9+
Output = of_type
10+
return CreateModel.Field()
11+
12+
13+
def update(of_type):
14+
class UpdateModel(SQLAlchemyMutation):
15+
class Meta:
16+
model = of_type._meta.model
17+
Output = of_type
18+
return UpdateModel.Field()
19+
20+
21+
def delete(of_type):
22+
class DeleteModel(SQLAlchemyMutation):
23+
class Meta:
24+
model = of_type._meta.model
25+
delete = True
26+
Output = of_type
27+
return DeleteModel.Field()

graphene_sqlalchemy/tests/conftest.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import pytest
2+
from sqlalchemy import create_engine
3+
4+
5+
@pytest.fixture(scope='session')
6+
def db():
7+
return create_engine('sqlite:///test_sqlalchemy.sqlite3')
+239
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
import graphene
2+
import pytest
3+
from sqlalchemy.orm import scoped_session, sessionmaker
4+
5+
from graphene_sqlalchemy import SQLAlchemyObjectType
6+
from graphene_sqlalchemy.mutations import create, delete, update
7+
from graphene_sqlalchemy.registry import reset_global_registry
8+
from graphene_sqlalchemy.tests.models import Base, Reporter
9+
10+
11+
@pytest.yield_fixture(scope='function')
12+
def session(db):
13+
reset_global_registry()
14+
connection = db.engine.connect()
15+
transaction = connection.begin()
16+
Base.metadata.create_all(connection)
17+
18+
# options = dict(bind=connection, binds={})
19+
session_factory = sessionmaker(bind=connection)
20+
session = scoped_session(session_factory)
21+
22+
yield session
23+
24+
# Finalize test here
25+
transaction.rollback()
26+
connection.close()
27+
session.remove()
28+
29+
30+
def setup_fixtures(session):
31+
reporter = Reporter(first_name='ABC', last_name='def')
32+
session.add(reporter)
33+
reporter2 = Reporter(first_name='CBA', last_name='fed')
34+
session.add(reporter2)
35+
session.commit()
36+
37+
38+
def test_should_create_with_create_field(session):
39+
class ReporterType(SQLAlchemyObjectType):
40+
class Meta:
41+
model = Reporter
42+
43+
class Query(graphene.ObjectType):
44+
reporters = graphene.List(ReporterType)
45+
46+
def resolve_reporters(self, *args, **kwargs):
47+
return session.query(Reporter)
48+
49+
class Mutation(graphene.ObjectType):
50+
createReporter = create(ReporterType)
51+
52+
query = '''
53+
query ReporterQuery {
54+
reporters {
55+
firstName,
56+
lastName,
57+
email
58+
}
59+
}
60+
'''
61+
expected = {
62+
'reporters': []
63+
}
64+
schema = graphene.Schema(query=Query, mutation=Mutation)
65+
result = schema.execute(query)
66+
assert not result.errors
67+
assert result.data == expected
68+
69+
query = '''
70+
mutation createReporter{
71+
createReporter (firstName: "ABC", lastName: "def") {
72+
firstName,
73+
lastName,
74+
email
75+
}
76+
}
77+
'''
78+
expected = {
79+
'createReporter': {
80+
'firstName': 'ABC',
81+
'lastName': 'def',
82+
'email': None,
83+
}
84+
}
85+
schema = graphene.Schema(query=Query, mutation=Mutation)
86+
result = schema.execute(query, context_value={'session': session})
87+
assert not result.errors
88+
assert result.data == expected
89+
90+
91+
def test_should_delete_with_delete_field(session):
92+
setup_fixtures(session)
93+
94+
class ReporterType(SQLAlchemyObjectType):
95+
class Meta:
96+
model = Reporter
97+
98+
class Query(graphene.ObjectType):
99+
reporters = graphene.List(ReporterType)
100+
101+
def resolve_reporters(self, *args, **kwargs):
102+
return session.query(Reporter)
103+
104+
class Mutation(graphene.ObjectType):
105+
deleteReporter = delete(ReporterType)
106+
107+
query = '''
108+
query ReporterQuery {
109+
reporters {
110+
firstName,
111+
lastName,
112+
email
113+
}
114+
}
115+
'''
116+
expected = {
117+
'reporters': [{
118+
'firstName': 'ABC',
119+
'lastName': 'def',
120+
'email': None
121+
},
122+
{
123+
'firstName': 'CBA',
124+
'lastName': 'fed',
125+
'email': None
126+
}]
127+
}
128+
schema = graphene.Schema(query=Query, mutation=Mutation)
129+
result = schema.execute(query)
130+
assert not result.errors
131+
assert result.data == expected
132+
133+
query = '''
134+
mutation deleteReporter {
135+
deleteReporter (id: 1) {
136+
firstName,
137+
lastName,
138+
email
139+
}
140+
}
141+
'''
142+
expected = {
143+
'deleteReporter': {
144+
'firstName': 'ABC',
145+
'lastName': 'def',
146+
'email': None,
147+
}
148+
}
149+
schema = graphene.Schema(query=Query, mutation=Mutation)
150+
result = schema.execute(query, context_value={'session': session})
151+
assert not result.errors
152+
assert result.data == expected
153+
154+
query = '''
155+
query ReporterQuery {
156+
reporters {
157+
firstName,
158+
lastName,
159+
email
160+
}
161+
}
162+
'''
163+
expected = {
164+
'reporters': [
165+
{
166+
'firstName': 'CBA',
167+
'lastName': 'fed',
168+
'email': None
169+
}]
170+
}
171+
schema = graphene.Schema(query=Query, mutation=Mutation)
172+
result = schema.execute(query)
173+
assert not result.errors
174+
assert result.data == expected
175+
176+
177+
def test_should_update_with_update_field(session):
178+
setup_fixtures(session)
179+
180+
class ReporterType(SQLAlchemyObjectType):
181+
class Meta:
182+
model = Reporter
183+
184+
class Query(graphene.ObjectType):
185+
reporters = graphene.List(ReporterType)
186+
187+
def resolve_reporters(self, *args, **kwargs):
188+
return session.query(Reporter)
189+
190+
class Mutation(graphene.ObjectType):
191+
updateReporter = update(ReporterType)
192+
193+
query = '''
194+
mutation updateReporter {
195+
updateReporter (id: 1, lastName: "updated", email: "[email protected]") {
196+
firstName,
197+
lastName,
198+
email
199+
}
200+
}
201+
'''
202+
expected = {
203+
'updateReporter': {
204+
'firstName': 'ABC',
205+
'lastName': 'updated',
206+
'email': '[email protected]',
207+
}
208+
}
209+
schema = graphene.Schema(query=Query, mutation=Mutation)
210+
result = schema.execute(query, context_value={'session': session})
211+
assert not result.errors
212+
assert result.data == expected
213+
214+
query = '''
215+
query ReporterQuery {
216+
reporters {
217+
firstName,
218+
lastName,
219+
email
220+
}
221+
}
222+
'''
223+
expected = {
224+
'reporters': [
225+
{
226+
'firstName': 'ABC',
227+
'lastName': 'updated',
228+
'email': '[email protected]',
229+
},
230+
{
231+
'firstName': 'CBA',
232+
'lastName': 'fed',
233+
'email': None
234+
}]
235+
}
236+
schema = graphene.Schema(query=Query, mutation=Mutation)
237+
result = schema.execute(query)
238+
assert not result.errors
239+
assert result.data == expected

0 commit comments

Comments
 (0)