Skip to content

Commit 4fd6d33

Browse files
committed
updated unit tests & readme
1 parent 4165c4d commit 4fd6d33

File tree

2 files changed

+225
-55
lines changed

2 files changed

+225
-55
lines changed

README.md

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
# apex-graphql-query
22

3-
A simple library for building GraphQL queries in Salesforce's Apex Language. *Currently only offers parital support.*
3+
A simple library for building GraphQL queries in Salesforce's Apex Language.
44

5-
## Example:
5+
*some use cases still not supported*
66

7+
## Examples:
8+
9+
### Query
710
``` graphql
811
{
912
human(id: "1000") {
1013
name
1114
height
1215
address {
13-
city
14-
country
16+
city
17+
country
1518
}
1619
}
1720
}
@@ -23,14 +26,82 @@ A simple library for building GraphQL queries in Salesforce's Apex Language. *C
2326
GraphQLNode human = new GraphQLNode('human')
2427
.setArguments(new GraphQLArgument('id', '1000'))
2528
.add(new Object[]{
26-
'name',
27-
'height',
28-
new GraphQLNode('address')
29-
.add(new Object[]{ 'city', 'country' })
29+
'name',
30+
'height',
31+
new GraphQLNode('address')
32+
.add(new Object[]{ 'city', 'country' })
3033
});
31-
String qry = human.build();
34+
35+
// create GraphQLQuery without Variables
36+
GraphQLQuery qry = new GraphQLQuery(human, null);
37+
System.debug(qry.query);
38+
```
39+
40+
### Operations
41+
42+
``` graphql
43+
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
44+
createReview(episode: $ep, review: $review) {
45+
stars
46+
commentary
47+
}
48+
}
49+
```
50+
51+
``` json
52+
{
53+
"ep": "JEDI",
54+
"review": {
55+
"stars": 5,
56+
"commentary": "This is a great movie!"
57+
}
58+
}
3259
```
3360

61+
**Equivalent Apex**
62+
``` java
63+
64+
//Variable DTOs
65+
public class CreateReviewForEpisode{
66+
public String ep { get; set; }
67+
public Review review { get; set; }
68+
}
69+
70+
public class Review{
71+
public Integer stars { get; set; }
72+
public String commentary { get; set; }
73+
}
74+
75+
//Mutation Query
76+
GraphQLNode node = new GraphQLNode('CreateReviewForEpisode')
77+
.setOperation('mutation')
78+
.addArguments(new GraphQLArgument('$ep', 'Episode!', true))
79+
.addArguments(new GraphQLArgument('$review', 'ReviewInput!', true))
80+
.add(
81+
new GraphQLNode('createReview')
82+
.addArguments(new GraphQLArgument[]{
83+
new GraphQLArgument('episode', '$ep', true),
84+
new GraphQLArgument('review', '$review', true)
85+
})
86+
.add(new Object[]{'stars', 'commentary'})
87+
);
88+
89+
CreateReviewForEpisode createReviewVariables = new CreateReviewForEpisode();
90+
createReviewVariables.ep = 'JEDI';
91+
createReviewVariables.review = new Review();
92+
createReviewVariables.review.stars = 5;
93+
createReviewVariables.review.commentary = 'This is a great movie!';
94+
95+
// create GraphQLQuery with Variables
96+
GraphQLQuery qry = new GraphQLQuery(node, createReviewVariables);
97+
String payload = JSON.serialize(qry);
98+
99+
//... POST payload to graphQL service endpoint
100+
```
101+
### Additional Usage
102+
103+
See [Unit Tests](https://github.com/ChuckJonas/apex-graphql-query/blob/master/force-app/main/default/classes/GraphQLQueryTests.cls) for more usage examples.
104+
34105
## Deployment
35106

36107
Choose your own Adventure:
Lines changed: 145 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,156 @@
1+
// Tests using modified examples from https://graphql.org/learn/queries/
12
@isTest
23
public class GraphQLQueryTests {
34

5+
// {
6+
// hero {
7+
// name
8+
// }
9+
// }
410
@isTest
5-
private static void readmeExample(){
6-
GraphQLNode human = new GraphQLNode('human')
7-
.addArguments(new GraphQLArgument('id', '1000'))
8-
.add(new Object[]{
9-
'name',
10-
'height',
11-
new GraphQLNode('address')
12-
.add(new Object[]{ 'city', 'country' })
13-
});
14-
GraphQLQuery qry = new GraphQLQuery(human, null);
11+
private static void simpleNode(){
12+
GraphQLNode node = new GraphQLNode('hero')
13+
.add('name');
14+
GraphQLQuery qry = new GraphQLQuery(node, null);
15+
System.assertEquals('{hero{name}}', qry.query.deleteWhitespace());
1516
}
1617

18+
// {
19+
// hero(name: "luke skywalker") {
20+
// id
21+
// }
22+
// }
23+
@isTest
24+
private static void testStringArg(){
25+
GraphQLNode node = new GraphQLNode('hero')
26+
.addArguments(new GraphQLArgument('name', 'luke skywalker'))
27+
.add('id');
28+
GraphQLQuery qry = new GraphQLQuery(node, null);
29+
System.assertEquals('{hero(name:\"luke skywalker\"){id}}', qry.query.remove('\n'));
30+
}
1731

32+
// {
33+
// hero(id: 1000) {
34+
// name
35+
// }
36+
// }
1837
@isTest
19-
private static void simpleNode(){
20-
GraphQLNode n = new GraphQLNode('hello')
21-
.add('world');
22-
System.assertEquals('hello{world}', n.build().deleteWhitespace());
38+
private static void testNumberArg(){
39+
GraphQLNode node = new GraphQLNode('hero')
40+
.addArguments(new GraphQLArgument('id', 1000))
41+
.add('name');
42+
GraphQLQuery qry = new GraphQLQuery(node, null);
43+
System.assertEquals('{hero(id:1000){name}}', qry.query.remove('\n'));
2344
}
2445

46+
// {
47+
// hero(isJedi: true) {
48+
// name
49+
// }
50+
// }
2551
@isTest
26-
private static void testSimpleArgs(){
27-
GraphQLNode n = new GraphQLNode('hello')
28-
.addArguments(new GraphQLArgument('key', 'value'))
29-
.add('world');
30-
System.assertEquals('hello(key:\"value\"){world}', n.build().deleteWhitespace());
52+
private static void testBooleanArg(){
53+
GraphQLNode node = new GraphQLNode('hero')
54+
.addArguments(new GraphQLArgument('isJedi', true))
55+
.add('name');
56+
GraphQLQuery qry = new GraphQLQuery(node, null);
57+
System.assertEquals('{hero(isJedi:true){name}}', qry.query.remove('\n'));
3158
}
3259

60+
// {
61+
// hero(episode: EMPIRE) {
62+
// name
63+
// }
64+
// }
3365
@isTest
34-
private static void testChildArgs(){
35-
GraphQLNode n = new GraphQLNode('hello')
36-
.addArguments(new GraphQLArgument('input', new GraphQLArgument[]{
37-
new GraphQLArgument('key1', 'value1'),
38-
new GraphQLArgument('key2', 'value2')
66+
private static void testStringVariableArg(){
67+
GraphQLNode node = new GraphQLNode('hero')
68+
.addArguments(new GraphQLArgument('episode', 'EMPIRE', true))
69+
.add('name');
70+
GraphQLQuery qry = new GraphQLQuery(node, null);
71+
System.assertEquals('{hero(episode:EMPIRE){name}}', qry.query.remove('\n'));
72+
}
73+
74+
// {
75+
// hero(attr: {droid: false, weapon: "lightsaber"}) {
76+
// name
77+
// }
78+
// }
79+
@isTest
80+
private static void testNestedArgs(){
81+
GraphQLNode node = new GraphQLNode('hero')
82+
.addArguments(new GraphQLArgument('attr', new GraphQLArgument[]{
83+
new GraphQLArgument('droid', false),
84+
new GraphQLArgument('weapon', 'lightsaber')
3985
}))
40-
.add('world');
41-
System.assertEquals('hello(input:{key1:\"value1\", key2:\"value2\"}){world}', n.build().remove('\n'));
86+
.add('name');
87+
GraphQLQuery qry = new GraphQLQuery(node, null);
88+
System.assertEquals('{hero(attr:{droid:false, weapon:\"lightsaber\"}){name}}', qry.query.remove('\n'));
4289
}
4390

91+
// {
92+
// hero(episode: EMPIRE, dies: true}) {
93+
// name
94+
// }
95+
// }
4496
@isTest
45-
private static void testMultipleTopLevelArgs(){
46-
GraphQLNode n = new GraphQLNode('hero')
97+
private static void testMultipleArgs(){
98+
GraphQLNode node = new GraphQLNode('hero')
4799
.addArguments(new GraphQLArgument[]{
48100
new GraphQLArgument('episode', 'EMPIRE', true),
49-
new GraphQLArgument('robot', true)
101+
new GraphQLArgument('dies', true)
50102
})
51103
.add('name');
52-
53-
System.assertEquals('hero(episode:EMPIRE, robot:true){name}', n.build().remove('\n'));
104+
GraphQLQuery qry = new GraphQLQuery(node, null);
105+
System.assertEquals('{hero(episode:EMPIRE, dies:true){name}}', qry.query.remove('\n'));
54106
}
55107

108+
// {
109+
// hero {
110+
// attr {
111+
// weapon
112+
// }
113+
// }
114+
// }
56115
@isTest
57-
private static void testChildNode(){
58-
GraphQLNode n = new GraphQLNode('message')
116+
private static void testNestedNode(){
117+
GraphQLNode node = new GraphQLNode('hero')
59118
.add(
60-
new GraphQLNode('hello').add('world')
119+
new GraphQLNode('attr').add('weapon')
61120
);
62-
System.assertEquals('message{hello{world}}', n.build().deleteWhitespace());
121+
GraphQLQuery qry = new GraphQLQuery(node, null);
122+
System.assertEquals('{hero{attr{weapon}}}', qry.query.remove('\n'));
63123
}
64124

125+
// {
126+
// hero {
127+
// name
128+
// ... on Droid {
129+
// primaryFunction
130+
// }
131+
// }
132+
// }
65133
@isTest
66134
private static void testChildOnType(){
67-
GraphQLNode n = new GraphQLNode('foo')
135+
GraphQLNode node = new GraphQLNode('hero')
68136
.add(new Object[]{
69-
new GraphQLNode('bar')
137+
'name',
138+
new GraphQLNode('Droid')
70139
.setTypeFragment(true)
71-
.add('x')
140+
.add('primaryFunction')
72141
});
73-
System.assertEquals('foo{... on bar{x}}', n.build().remove('\n'));
142+
GraphQLQuery qry = new GraphQLQuery(node, null);
143+
System.assertEquals('{hero{name... on Droid{primaryFunction}}}', qry.query.remove('\n'));
74144
}
75145

146+
// {
147+
// empireHero: hero(episode: EMPIRE) {
148+
// name
149+
// }
150+
// jediHero: hero(episode: JEDI) {
151+
// name
152+
// }
153+
// }
76154
@isTest
77155
private static void testAlias(){
78156
GraphQLNode[] nodes = new GraphQLNode[]{
@@ -98,6 +176,14 @@ public class GraphQLQueryTests {
98176
// commentary
99177
// }
100178
// }
179+
// == Variables ==
180+
// {
181+
// "ep": "JEDI",
182+
// "review": {
183+
// "stars": 5,
184+
// "commentary": "This is a great movie!"
185+
// }
186+
// }
101187
@isTest
102188
private static void testOperation(){
103189
GraphQLNode node = new GraphQLNode('CreateReviewForEpisode')
@@ -113,17 +199,30 @@ public class GraphQLQueryTests {
113199
.add(new Object[]{'stars', 'commentary'})
114200
);
115201

116-
TestVariables test = new TestVariables();
117-
GraphQLQuery qry = new GraphQLQuery(node, test);
202+
CreateReviewForEpisode createReviewVariables = new CreateReviewForEpisode();
203+
createReviewVariables.ep = 'JEDI';
204+
createReviewVariables.review = new Review();
205+
createReviewVariables.review.stars = 5;
206+
createReviewVariables.review.commentary = 'This is a great movie!';
207+
GraphQLQuery qry = new GraphQLQuery(node, createReviewVariables);
208+
String payload = JSON.serialize(qry);
118209
System.assertEquals(
119-
'mutation CreateReviewForEpisode($ep:Episode!, $review:ReviewInput!){ createReview(episode:$ep, review:$review){ stars commentary } }',
120-
qry.query.replace('\n', ' ').trim()
210+
'{"variables":{"review":{"stars":5,"commentary":"This is a great movie!"},"ep":"JEDI"},"query":"mutation CreateReviewForEpisode($ep:Episode!, $review:ReviewInput!){\\ncreateReview(episode:$ep, review:$review){\\nstars\\ncommentary\\n}\\n}\\n"}',
211+
payload
121212
);
122213
}
123214

215+
/* DTO for testOperation mutation test */
216+
public class CreateReviewForEpisode
217+
{
218+
public String ep { get; set; }
219+
public Review review { get; set; }
220+
}
124221

125-
private class TestVariables {
126-
public String foo;
127-
public Decimal bar;
222+
public class Review
223+
{
224+
public Integer stars { get; set; }
225+
public String commentary { get; set; }
128226
}
227+
129228
}

0 commit comments

Comments
 (0)