Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cds-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,9 @@ class EventBroker extends cds.MessagingService {
} else {
cds.app.post(webhookBasePath, _validateCertificate.bind(this))
}
cds.app.post(webhookBasePath, express.json())

const limit = cds.server.body_parser?.limit ?? this.options.webhookSizeLimit ?? "1mb"
cds.app.post(webhookBasePath, express.json({ limit }))
cds.app.post(webhookBasePath, this.onEventReceived.bind(this))
}

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
"format": "cloudevents",
"outbox": true,
"webhookPath": "/-/cds/event-broker/webhook",
"webhookSizeLimit": "1mb",
"vcap": {
"label": "event-broker"
}
Expand Down
59 changes: 59 additions & 0 deletions test/event-broker-unit-tests/event-broker-register-webhook.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
describe('event broker webhook endpoint registration', () => {
test.each([
{
name: 'webhookSizeLimit correctly passed to express.json',
webhookPath: '/webhook-test',
webhookSizeLimit: '5mb',
bodyParserLimit: undefined,
expectedLimit: '5mb'
},
{
name: 'body_parser.limit overrides webhookSizeLimit',
webhookPath: '/webhook-test-2',
webhookSizeLimit: '5mb',
bodyParserLimit: '42mb',
expectedLimit: '42mb'
}
])('$name', async ({ webhookPath, webhookSizeLimit, bodyParserLimit, expectedLimit }) => {
// Arrange
const express = require('express')
const originalJson = express.json
let calledLimit
express.json = opts => {
calledLimit = opts.limit
return (req, res, next) => next()
}

const cds = require('@sap/cds')
const originalServer = cds.server
if (bodyParserLimit) {
cds.server = { body_parser: { limit: bodyParserLimit } }
}

const EventBroker = require('../../cds-plugin.js')
const eb = new EventBroker('event-broker')
eb.options = {
webhookPath,
webhookSizeLimit,
credentials: {
ias: { clientId: 'clientId' },
}
}
eb.auth = { kind: 'ias', ias: { credentials: { certificate: 'cert', key: 'key' }, clientId: 'clientId' } }

const useMock = jest.fn()
const postMock = jest.fn()
cds.app = { use: useMock, post: postMock }

// Act
eb.registerWebhookEndpoints()

// Assert
expect(calledLimit).toBe(expectedLimit)

// Cleanup
express.json = originalJson
cds.server = originalServer
})

})