Skip to content
This repository has been archived by the owner on May 31, 2019. It is now read-only.

Commit

Permalink
fix: add extra context to pre and post hook payload
Browse files Browse the repository at this point in the history
  • Loading branch information
Dara Hayes committed Aug 15, 2018
1 parent 932ebd6 commit 7f7dd78
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 15 deletions.
2 changes: 1 addition & 1 deletion server/lib/resolvers/resolverMapper.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const _ = require('lodash')
const axios = require('axios')
const resolverBuilders = require('./builders')
const { compile } = require('./compiler')
const { wrapResolverWithPublish } = require('./wrapResolverWithPublisher')
const axios = require('axios')
const { wrapResolverWithHooks } = require('./wrapResolverWithHooks')

module.exports = function (dataSources, resolverMappings, pubsub) {
Expand Down
24 changes: 20 additions & 4 deletions server/lib/resolvers/wrapResolverWithHooks.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
const _ = require('lodash')
const {log} = require('../util/logger')
const { log, buildPath } = require('../util/logger')

exports.wrapResolverWithHooks = function wrapResolverWithHooks (resolverFn, resolverMapping, requestObject) {
exports.wrapResolverWithHooks = function wrapResolverWithHooks (resolverFn, resolverMapping, httpClient) {
return (obj, args, context, info) => {
return new Promise(async (resolve, reject) => {
if (resolverMapping.preHook && !_.isEmpty(resolverMapping.preHook)) {
requestObject.post(resolverMapping.preHook, {args})
const payload = {
hookType: 'preHook',
operationType: info.operation.operation,
fieldName: info.fieldname,
parentTypeName: info.parentType.name,
path: buildPath(info.path),
args: args
}
httpClient.post(resolverMapping.preHook, payload)
.then(function (response) {
log.info(response)
})
Expand All @@ -23,7 +31,15 @@ exports.wrapResolverWithHooks = function wrapResolverWithHooks (resolverFn, reso
}
}).then(function (result) {
if (resolverMapping.postHook && !_.isEmpty(resolverMapping.postHook)) {
requestObject.post(resolverMapping.postHook, {result})
const payload = {
hookType: 'postHook',
operationType: info.operation.operation,
fieldName: info.fieldname,
parentTypeName: info.parentType.name,
path: buildPath(info.path),
result: result
}
httpClient.post(resolverMapping.postHook, payload)
.then(function (response) {
log.info(response)
})
Expand Down
54 changes: 44 additions & 10 deletions server/lib/resolvers/wrapResolverWithHooks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,85 @@ const {test} = require('ava')
const {wrapResolverWithHooks} = require('./wrapResolverWithHooks')

test('it should check the prehoook url', t => {
// mock arguments for a GraphQL resolver function
const obj = {}
const args = { hello: 'world' }
const context = {}
const info = {
operation: {
operation: 'someOperation'
},
parentType: {
name: 'someName'
},
fieldName: 'someField'
}

let expectedResolverResult = 'some result'

let originalResolver = function () {
return new Promise((resolve) => {
return resolve()
return resolve(expectedResolverResult)
})
}

const resolverMapping = {
preHook: 'http://prehook.com'
}

const requestObject = {
post: function (url) {
const httpClient = {
post: function (url, payload) {
t.deepEqual(url, 'http://prehook.com')
t.deepEqual(payload.args, args)
return new Promise(function (resolve, reject) { })
}
}

const wrappedResolver = wrapResolverWithHooks(originalResolver, resolverMapping, requestObject)
const wrappedResolver = wrapResolverWithHooks(originalResolver, resolverMapping, httpClient)

t.truthy(wrappedResolver)
t.deepEqual(typeof wrappedResolver, 'function')
return wrappedResolver()
return wrappedResolver(obj, args, context, info)
})

test('it should check the posthoook url', t => {
// mock arguments for a GraphQL resolver function
const obj = {}
const args = { hello: 'world' }
const context = {}
const info = {
operation: {
operation: 'someOperation'
},
parentType: {
name: 'someName'
},
fieldName: 'someField'
}

let expectedResolverResult = 'some result'

let originalResolver = function () {
return new Promise((resolve) => {
return resolve()
return resolve(expectedResolverResult)
})
}

const resolverMapping = {
postHook: 'http://posthook.com'
}

const requestObject = {
post: function (url) {
const httpClient = {
post: function (url, payload) {
t.deepEqual(url, 'http://posthook.com')
t.deepEqual(payload.result, expectedResolverResult)
return new Promise(function (resolve, reject) { })
}
}

const wrappedResolver = wrapResolverWithHooks(originalResolver, resolverMapping, requestObject)
const wrappedResolver = wrapResolverWithHooks(originalResolver, resolverMapping, httpClient)

t.truthy(wrappedResolver)
t.deepEqual(typeof wrappedResolver, 'function')
return wrappedResolver()
return wrappedResolver(obj, args, context, info)
})

0 comments on commit 7f7dd78

Please sign in to comment.