diff --git a/addon-test-support/-private/mock-server.js b/addon-test-support/-private/mock-server.js
index f4fb0095..123a94d4 100644
--- a/addon-test-support/-private/mock-server.js
+++ b/addon-test-support/-private/mock-server.js
@@ -28,7 +28,7 @@ let mockServer = {
});
},
- post(path, body = {}) {
+ post(path, body) {
return new MockPost({ path, body });
},
diff --git a/index.js b/index.js
index 128bd29b..91d638bf 100644
--- a/index.js
+++ b/index.js
@@ -45,7 +45,7 @@ module.exports = {
app.post('/__mock-request', bodyParser.json(), (req, res) => {
let mock = nock(req.headers.origin)
.persist()
- .intercept(req.body.path, req.body.method)
+ .intercept(req.body.path, req.body.method, req.body.body)
.reply(req.body.statusCode, req.body.response);
res.json({ mocks: mock.pendingMocks() });
diff --git a/package.json b/package.json
index 1f9e7cc2..c54ec7c2 100644
--- a/package.json
+++ b/package.json
@@ -26,8 +26,8 @@
"ember-cli-babel": "^6.6.0",
"fastboot": "^1.2.1",
"jquery-param": "^1.0.1",
- "resolve": "^1.10.0",
"nock": "^10.0.6",
+ "resolve": "^1.10.0",
"whatwg-fetch": "^3.0.0"
},
"devDependencies": {
diff --git a/tests/dummy/app/pods/examples/network/graphql/simple/route.js b/tests/dummy/app/pods/examples/network/graphql/simple/route.js
new file mode 100644
index 00000000..67b1c734
--- /dev/null
+++ b/tests/dummy/app/pods/examples/network/graphql/simple/route.js
@@ -0,0 +1,12 @@
+import Route from '@ember/routing/route';
+import { inject as service } from '@ember/service';
+
+export default Route.extend({
+ graphql: service(),
+
+ model() {
+ let query = `{ hello }`;
+ return this.get('graphql').request({ query });
+ }
+
+});
diff --git a/tests/dummy/app/pods/examples/network/graphql/simple/template.hbs b/tests/dummy/app/pods/examples/network/graphql/simple/template.hbs
new file mode 100644
index 00000000..99ac66c4
--- /dev/null
+++ b/tests/dummy/app/pods/examples/network/graphql/simple/template.hbs
@@ -0,0 +1,5 @@
+The hello response from the server:
+
+
+ {{model.hello}}
+
diff --git a/tests/dummy/app/pods/examples/network/graphql/variables/route.js b/tests/dummy/app/pods/examples/network/graphql/variables/route.js
new file mode 100644
index 00000000..709de958
--- /dev/null
+++ b/tests/dummy/app/pods/examples/network/graphql/variables/route.js
@@ -0,0 +1,23 @@
+import Route from '@ember/routing/route';
+import { inject as service } from '@ember/service';
+
+export default Route.extend({
+ graphql: service(),
+
+ model(params) {
+ let query = `query FindHero($id: String!) {
+ hero(id: $id) {
+ id,
+ name
+ }
+ }`;
+
+ return this.get('graphql').request({
+ query,
+ variables: {
+ id: params.id
+ }
+ });
+ }
+
+});
diff --git a/tests/dummy/app/pods/examples/network/graphql/variables/template.hbs b/tests/dummy/app/pods/examples/network/graphql/variables/template.hbs
new file mode 100644
index 00000000..9061395a
--- /dev/null
+++ b/tests/dummy/app/pods/examples/network/graphql/variables/template.hbs
@@ -0,0 +1,9 @@
+The hero response from the server:
+
+
+ {{model.id}}
+
+
+
+ {{model.name}}
+
diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js
index 40077fb8..7fbc8ba6 100644
--- a/tests/dummy/app/router.js
+++ b/tests/dummy/app/router.js
@@ -33,6 +33,11 @@ Router.map(function() {
this.route('post', { path: ':post_id' });
});
+ this.route('graphql', function() {
+ this.route('simple');
+ this.route('variables', { path: 'variables/:id' });
+ });
+
this.route('other', function() {
this.route('get-request');
this.route('post-request');
diff --git a/tests/dummy/app/services/graphql.js b/tests/dummy/app/services/graphql.js
new file mode 100644
index 00000000..95ca27b2
--- /dev/null
+++ b/tests/dummy/app/services/graphql.js
@@ -0,0 +1,29 @@
+import Service from '@ember/service';
+import fetch from 'fetch';
+
+export default Service.extend({
+ async request({ query, variables }) {
+ let body = { query };
+
+ if (variables) {
+ body.variables = variables;
+ }
+
+ let response = await fetch('/graphql', {
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ },
+ body: JSON.stringify(body)
+ });
+
+ let { data, errors } = await response.json();
+
+ if (errors) {
+ throw errors;
+ } else {
+ return data;
+ }
+ }
+});
diff --git a/tests/fastboot/graphql-mocking-test.js b/tests/fastboot/graphql-mocking-test.js
new file mode 100644
index 00000000..3fcc85a7
--- /dev/null
+++ b/tests/fastboot/graphql-mocking-test.js
@@ -0,0 +1,92 @@
+import { module, test } from 'qunit';
+import { setup, visit, mockServer } from 'ember-cli-fastboot-testing/test-support';
+
+module('Fastboot | graphql mocking', function(hooks) {
+ setup(hooks);
+
+ test('it can mock a graphql request', async function(assert) {
+ await mockServer
+ .post('/graphql', {
+ query: "{ hello }"
+ })
+ .reply({
+ data: {
+ hello: "Hello world!"
+ }
+ });
+
+ await visit('/examples/network/graphql/simple');
+
+ assert.dom('[data-test-id="hello"]').hasText("Hello world!");
+ });
+
+ test('it can mock multiple graphql requests with variables', async function(assert) {
+ let query = `query FindHero($id: String!) {
+ hero(id: $id) {
+ id,
+ name
+ }
+ }`;
+
+ let heros = [{
+ id: "123",
+ name: "Luke Skywalker"
+ },{
+ id: "456",
+ name: "Han Solo"
+ }];
+
+ for (let hero of heros) {
+ await mockServer.post('/graphql', {
+ query,
+ variables: { id: hero.id }
+ })
+ .reply({ data: hero });
+ }
+
+ await visit('/examples/network/graphql/variables/123');
+
+ assert.dom('[data-test-id="id"]').hasText("123");
+ assert.dom('[data-test-id="name"]').hasText("Luke Skywalker");
+
+ await visit('/examples/network/graphql/variables/456');
+
+ assert.dom('[data-test-id="id"]').hasText("456");
+ assert.dom('[data-test-id="name"]').hasText("Han Solo");
+ });
+
+ test('it can mock a graphql request with a regex variable', async function(assert) {
+ let query = `query FindHero($id: String!) {
+ hero(id: $id) {
+ id,
+ name
+ }
+ }`;
+
+ let heros = [{
+ id: "123",
+ name: "Luke Skywalker"
+ },{
+ id: "456",
+ name: "Han Solo"
+ }];
+
+ for (let hero of heros) {
+ await mockServer.post('/graphql', {
+ query,
+ variables: { id: hero.id }
+ })
+ .reply({ data: hero });
+ }
+
+ await visit('/examples/network/graphql/variables/123');
+
+ assert.dom('[data-test-id="id"]').hasText("123");
+ assert.dom('[data-test-id="name"]').hasText("Luke Skywalker");
+
+ await visit('/examples/network/graphql/variables/456');
+
+ assert.dom('[data-test-id="id"]').hasText("456");
+ assert.dom('[data-test-id="name"]').hasText("Han Solo");
+ });
+});