Skip to content

Commit

Permalink
When serviceData fails validation, include the service class in the s…
Browse files Browse the repository at this point in the history
…tack trace (#4266)

This should make it easier to debug #3784.
  • Loading branch information
paulmelnikow authored Oct 28, 2019
1 parent 50a2660 commit 7e0976c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 15 deletions.
8 changes: 7 additions & 1 deletion core/base-service/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,12 @@ class BaseService {
throw new Error(`Handler not implemented for ${this.constructor.name}`)
}

// Making this an instance method ensures debuggability.
// https://github.com/badges/shields/issues/3784
_validateServiceData(serviceData) {
Joi.assert(serviceData, serviceDataSchema)
}

_handleError(error) {
if (error instanceof NotFound || error instanceof InvalidParameter) {
trace.logTrace('outbound', emojic.noGoodWoman, 'Handled error', error)
Expand Down Expand Up @@ -379,7 +385,7 @@ class BaseService {
namedParams,
transformedQueryParams
)
Joi.assert(serviceData, serviceDataSchema)
serviceInstance._validateServiceData(serviceData)
} catch (error) {
serviceError = error
}
Expand Down
46 changes: 32 additions & 14 deletions core/base-service/base.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,27 +192,45 @@ describe('BaseService', function() {
})
})

it('Throws a validation error on invalid data', async function() {
context('On invalid data', function() {
class ThrowingService extends DummyService {
async handle() {
return {
some: 'nonsense',
}
}
}
try {
await ThrowingService.invoke(
{},
{ handleInternalErrors: false },
{ namedParamA: 'bar.bar.bar' }
)
expect.fail('Expected to throw')
} catch (e) {
expect(e.name).to.equal('ValidationError')
expect(e.details.map(({ message }) => message)).to.deep.equal([
'"message" is required',
])
}

it('Throws a validation error on invalid data', async function() {
try {
await ThrowingService.invoke(
{},
{ handleInternalErrors: false },
{ namedParamA: 'bar.bar.bar' }
)
expect.fail('Expected to throw')
} catch (e) {
expect(e.name).to.equal('ValidationError')
expect(e.details.map(({ message }) => message)).to.deep.equal([
'"message" is required',
])
}
})

// Ensure debuggabillity.
// https://github.com/badges/shields/issues/3784
it('Includes the service class in the stack trace', async function() {
try {
await ThrowingService.invoke(
{},
{ handleInternalErrors: false },
{ namedParamA: 'bar.bar.bar' }
)
expect.fail('Expected to throw')
} catch (e) {
expect(e.stack).to.include('ThrowingService._validateServiceData')
}
})
})
})

Expand Down

0 comments on commit 7e0976c

Please sign in to comment.