account-lookup-service 15.5.0-iso.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. package/.circleci/config.yml +11 -0
  2. package/.ncurc.yaml +6 -0
  3. package/.nvmrc +1 -0
  4. package/.nycrc.yml +20 -0
  5. package/.versionrc +15 -0
  6. package/CHANGELOG.md +330 -0
  7. package/CODEOWNERS +38 -0
  8. package/Dockerfile +45 -0
  9. package/LICENSE.md +10 -0
  10. package/README.md +252 -0
  11. package/audit-ci.jsonc +32 -0
  12. package/audit-resolve.json +161 -0
  13. package/config/default.json +109 -0
  14. package/config/knexfile.js +21 -0
  15. package/docker/account-lookup-service/default.json +106 -0
  16. package/docker/account-lookup-service/make-default-json.sh +5 -0
  17. package/docker/account-lookup-service/override.json +15 -0
  18. package/docker/central-ledger/default.json +458 -0
  19. package/docker/config-modifier/account-lookup-service.js +31 -0
  20. package/docker/kafka/consumer.properties +26 -0
  21. package/docker/kafka/producer.properties +45 -0
  22. package/docker/kafka/server.properties +143 -0
  23. package/docker/kafka/tools-log4j.properties +21 -0
  24. package/docker/mock-proxy/Dockerfile +15 -0
  25. package/docker/mock-proxy/package-lock.json +4986 -0
  26. package/docker/mock-proxy/package.json +24 -0
  27. package/docker/mock-proxy/src/config.ts +14 -0
  28. package/docker/mock-proxy/src/server.ts +94 -0
  29. package/docker/mock-proxy/src/utils.ts +29 -0
  30. package/docker/mock-proxy/tsconfig.json +24 -0
  31. package/docker/sql-init/01_permissions.sql +2 -0
  32. package/docker/sql-init-central-ledger/01_permissions.sql +2 -0
  33. package/docker/wait-for/wait-for-account-lookup-service.sh +10 -0
  34. package/docker/wait-for/wait-for-central-ledger.sh +11 -0
  35. package/docker/wait-for/wait-for-kafka.sh +7 -0
  36. package/docker/wait-for/wait-for-ml-api-adapter.sh +9 -0
  37. package/docker/wait-for/wait-for-mockserver.sh +20 -0
  38. package/docker/wait-for/wait-for-mysql-als.sh +14 -0
  39. package/docker/wait-for/wait-for-mysql-central-ledger.sh +11 -0
  40. package/docker/wait-for/wait-for-mysql.sh +11 -0
  41. package/docker/wait-for/wait-for-objstore.sh +12 -0
  42. package/docker/wait-for/wait-for.env +18 -0
  43. package/docker/wait-for/wait-for.sh +81 -0
  44. package/docker-compose.integration.yml +29 -0
  45. package/docker-compose.yml +243 -0
  46. package/jest-int.config.js +8 -0
  47. package/jest.config.js +16 -0
  48. package/jsdoc.json +38 -0
  49. package/migrations/01_currency.js +42 -0
  50. package/migrations/02_endpointType.js +43 -0
  51. package/migrations/03_endpointType-indexes.js +37 -0
  52. package/migrations/04_partyIdType.js +43 -0
  53. package/migrations/05_partyIdType-indexes.js +38 -0
  54. package/migrations/08_oracleEndpoint.js +51 -0
  55. package/migrations/09_oracleEndpoint-indexes.js +41 -0
  56. package/migrations/10_oracleEndpoint-remove-constraints.js +38 -0
  57. package/package.json +180 -0
  58. package/scripts/_wait4_all.js +143 -0
  59. package/scripts/test-functional.sh +76 -0
  60. package/secrets/jwsSigningKey.key +27 -0
  61. package/seeds/currency.js +765 -0
  62. package/seeds/endpointType.js +65 -0
  63. package/seeds/partyIdType.js +79 -0
  64. package/src/api/endpointcache.js +67 -0
  65. package/src/api/health.js +66 -0
  66. package/src/api/index.js +85 -0
  67. package/src/api/oracles/{ID}.js +100 -0
  68. package/src/api/oracles.js +96 -0
  69. package/src/api/participants/{ID}/error.js +44 -0
  70. package/src/api/participants/{ID}.js +44 -0
  71. package/src/api/participants/{Type}/{ID}/error.js +74 -0
  72. package/src/api/participants/{Type}/{ID}/{SubId}/error.js +68 -0
  73. package/src/api/participants/{Type}/{ID}/{SubId}.js +113 -0
  74. package/src/api/participants/{Type}/{ID}.js +133 -0
  75. package/src/api/participants.js +63 -0
  76. package/src/api/parties/{Type}/{ID}/error.js +66 -0
  77. package/src/api/parties/{Type}/{ID}/{SubId}/error.js +56 -0
  78. package/src/api/parties/{Type}/{ID}/{SubId}.js +77 -0
  79. package/src/api/parties/{Type}/{ID}.js +98 -0
  80. package/src/api/routes.js +294 -0
  81. package/src/constants.js +16 -0
  82. package/src/domain/oracle/index.js +33 -0
  83. package/src/domain/oracle/oracle.js +234 -0
  84. package/src/domain/participants/index.js +35 -0
  85. package/src/domain/participants/participants.js +560 -0
  86. package/src/domain/parties/getPartiesByTypeAndID.js +239 -0
  87. package/src/domain/parties/index.js +32 -0
  88. package/src/domain/parties/parties.js +215 -0
  89. package/src/domain/parties/utils.js +84 -0
  90. package/src/domain/timeout/dto.js +48 -0
  91. package/src/domain/timeout/index.js +104 -0
  92. package/src/handlers/TimeoutHandler.js +94 -0
  93. package/src/handlers/index.js +70 -0
  94. package/src/handlers/monitoring/index.js +51 -0
  95. package/src/handlers/monitoring/plugins/health.js +61 -0
  96. package/src/handlers/monitoring/plugins/metrics.js +48 -0
  97. package/src/handlers/register.js +102 -0
  98. package/src/index.js +66 -0
  99. package/src/interface/admin-swagger.yaml +804 -0
  100. package/src/interface/admin_swagger.json +959 -0
  101. package/src/interface/api-swagger-iso20022-parties.yaml +1734 -0
  102. package/src/interface/api-swagger.yaml +1733 -0
  103. package/src/interface/api_swagger.json +3046 -0
  104. package/src/interface/fspiop-rest-v2.0-ISO20022_parties.yaml +2256 -0
  105. package/src/interface/thirdparty/admin-swagger.yaml +808 -0
  106. package/src/interface/thirdparty/admin_swagger.json +961 -0
  107. package/src/interface/thirdparty/api-swagger.yaml +1739 -0
  108. package/src/interface/thirdparty/api_swagger.json +3142 -0
  109. package/src/lib/argv.js +39 -0
  110. package/src/lib/cache.js +126 -0
  111. package/src/lib/config.js +183 -0
  112. package/src/lib/db.js +26 -0
  113. package/src/lib/headers.js +53 -0
  114. package/src/lib/healthCheck/subServiceHealth.js +84 -0
  115. package/src/lib/index.js +11 -0
  116. package/src/lib/migrator.js +17 -0
  117. package/src/lib/requestLogger.js +54 -0
  118. package/src/lib/util.js +66 -0
  119. package/src/metrics/handler.js +33 -0
  120. package/src/metrics/plugin.js +52 -0
  121. package/src/metrics/routes.js +43 -0
  122. package/src/models/currency/currency.js +48 -0
  123. package/src/models/currency/index.js +32 -0
  124. package/src/models/endpointType/endpointType.js +48 -0
  125. package/src/models/endpointType/index.js +32 -0
  126. package/src/models/misc/migrationLock.js +49 -0
  127. package/src/models/oracle/facade.js +341 -0
  128. package/src/models/oracle/index.js +41 -0
  129. package/src/models/oracle/oracleEndpoint.js +192 -0
  130. package/src/models/oracle/oracleEndpointCached.js +108 -0
  131. package/src/models/participantEndpoint/facade.js +238 -0
  132. package/src/models/partyIdType/index.js +32 -0
  133. package/src/models/partyIdType/partyIdType.js +41 -0
  134. package/src/plugins.js +139 -0
  135. package/src/server.js +199 -0
  136. package/test/fixtures/index.js +131 -0
  137. package/test/fixtures/iso.js +110 -0
  138. package/test/integration/.env +8 -0
  139. package/test/integration/api/parties.test.js +137 -0
  140. package/test/integration/constants.js +20 -0
  141. package/test/integration/domain/oracle/index.test.js +324 -0
  142. package/test/integration/domain/timeout/index.test.js +75 -0
  143. package/test/integration/env.sh +15 -0
  144. package/test/integration/example.test.js +12 -0
  145. package/test/integration/models/currency/currency.test.js +68 -0
  146. package/test/integration/plugins.test.js +62 -0
  147. package/test/integration/prepareTestParticipants.js +30 -0
  148. package/test/integration/setup.js +5 -0
  149. package/test/integration-config.json +81 -0
  150. package/test/integration-runner.sh +108 -0
  151. package/test/unit/api/health.test.js +142 -0
  152. package/test/unit/api/oracles/{ID}.test.js +264 -0
  153. package/test/unit/api/oracles.test.js +173 -0
  154. package/test/unit/api/participants/participants.test.js +117 -0
  155. package/test/unit/api/participants/{Type}/{ID}/error.test.js +155 -0
  156. package/test/unit/api/participants/{Type}/{ID}/{SubId}/error.test.js +131 -0
  157. package/test/unit/api/participants/{Type}/{ID}/{SubId}.test.js +377 -0
  158. package/test/unit/api/participants/{Type}/{ID}.test.js +383 -0
  159. package/test/unit/api/participants.test.js +108 -0
  160. package/test/unit/api/parties/endpointcache.test.js +83 -0
  161. package/test/unit/api/parties/parties.test.js +102 -0
  162. package/test/unit/api/parties/{Type}/{ID}/error.test.js +145 -0
  163. package/test/unit/api/parties/{Type}/{ID}/{SubId}/error.test.js +141 -0
  164. package/test/unit/api/parties/{Type}/{ID}/{SubId}.test.js +241 -0
  165. package/test/unit/api/parties/{Type}/{ID}.test.js +240 -0
  166. package/test/unit/domain/oracle/oracle.test.js +505 -0
  167. package/test/unit/domain/participants/participants.test.js +1724 -0
  168. package/test/unit/domain/parties/parties.test.js +940 -0
  169. package/test/unit/domain/timeout/dto.test.js +28 -0
  170. package/test/unit/domain/timeout/index.test.js +81 -0
  171. package/test/unit/handlers/TimeoutHandler.test.js +125 -0
  172. package/test/unit/handlers/index.test.js +56 -0
  173. package/test/unit/handlers/register.test.js +90 -0
  174. package/test/unit/index.test.js +139 -0
  175. package/test/unit/iso20022/partiesValidation.test.js +129 -0
  176. package/test/unit/lib/TransformFacades.test.js +18 -0
  177. package/test/unit/lib/argv.test.js +40 -0
  178. package/test/unit/lib/cache.test.js +172 -0
  179. package/test/unit/lib/config.test.js +108 -0
  180. package/test/unit/lib/healthCheck/subServiceHealth.test.js +89 -0
  181. package/test/unit/lib/migrator.test.js +52 -0
  182. package/test/unit/lib/requestLogger.test.js +115 -0
  183. package/test/unit/lib/util.test.js +68 -0
  184. package/test/unit/mocks.js +66 -0
  185. package/test/unit/models/currency/currency.test.js +91 -0
  186. package/test/unit/models/endpointType/endpointType.test.js +69 -0
  187. package/test/unit/models/misc/migrationLock.test.js +96 -0
  188. package/test/unit/models/oracle/facade.test.js +546 -0
  189. package/test/unit/models/oracle/oracleEndpoint.test.js +409 -0
  190. package/test/unit/models/oracle/oracleEndpointCached.test.js +153 -0
  191. package/test/unit/models/participantEndpoint/facade.test.js +295 -0
  192. package/test/unit/models/partyIdType/partyIdType.test.js +88 -0
  193. package/test/unit/plugins.test.js +89 -0
  194. package/test/unit/setup.js +7 -0
  195. package/test/util/apiClients/AlsApiClient.js +44 -0
  196. package/test/util/apiClients/BasicApiClient.js +34 -0
  197. package/test/util/apiClients/ProxyApiClient.js +25 -0
  198. package/test/util/apiClients/index.js +7 -0
  199. package/test/util/helper.js +332 -0
  200. package/test/util/index.js +11 -0
  201. package/test/util/mockgen.js +43 -0
  202. package/test/util/onboarding.js +132 -0
  203. package/test/util/scripts/addAlsDb.sh +33 -0
  204. package/test/util/scripts/configureMockServer.sh +35 -0
  205. package/test/util/scripts/env.sh +19 -0
  206. package/test/util/scripts/populateTestData.sh +62 -0
  207. package/test/util/scripts/startMockCentralServer.sh +45 -0
  208. package/test/util/scripts/startMockOracleServer.sh +45 -0
  209. package/test/util/testConfig.js +44 -0
@@ -0,0 +1,377 @@
1
+ /*****
2
+ License
3
+ --------------
4
+ Copyright © 2017 Bill & Melinda Gates Foundation
5
+ The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8
+ Contributors
9
+ --------------
10
+ This is the official list of the Mojaloop project contributors for this file.
11
+ Names of the original copyright holders (individuals or organizations)
12
+ should be listed with a '*' in the first column. People who have
13
+ contributed from an organization can be listed under the organization
14
+ that actually holds the copyright for their contributions (see the
15
+ Gates Foundation organization for an example). Those individuals should have
16
+ their names indented and be marked with a '-'. Email address can be added
17
+ optionally within square brackets <email>.
18
+ * Gates Foundation
19
+ - Name Surname <name.surname@gatesfoundation.com>
20
+
21
+ * ModusBox
22
+ - Steven Oderayi <steven.oderayi@modusbox.com>
23
+
24
+ --------------
25
+ ******/
26
+
27
+ 'use strict'
28
+
29
+ const Sinon = require('sinon')
30
+ const getPort = require('get-port')
31
+ const ErrorHandler = require('@mojaloop/central-services-error-handling')
32
+ const requestUtil = require('@mojaloop/central-services-shared').Util.Request
33
+ const Enums = require('@mojaloop/central-services-shared').Enum
34
+ const Db = require('../../../../../../src/lib/db')
35
+ const oracleEndpointCached = require('../../../../../../src/models/oracle/oracleEndpointCached')
36
+ const participant = require('../../../../../../src/models/participantEndpoint/facade')
37
+ const participants = require('../../../../../../src/domain/participants')
38
+ const requestLogger = require('../../../../../../src/lib/requestLogger')
39
+ const Helper = require('../../../../../util/helper')
40
+ const initServer = require('../../../../../../src/server').initializeApi
41
+ const Logger = require('@mojaloop/central-services-logger')
42
+ const Config = require('../../../../../../src/lib/config')
43
+
44
+ Logger.isDebugEnabled = jest.fn(() => true)
45
+ Logger.isErrorEnabled = jest.fn(() => true)
46
+ Logger.isInfoEnabled = jest.fn(() => true)
47
+ let server
48
+ let sandbox
49
+
50
+ describe('/participants/{Type}/{ID}/{SubId}', () => {
51
+ beforeAll(async () => {
52
+ sandbox = Sinon.createSandbox()
53
+ sandbox.stub(Db, 'connect').returns(Promise.resolve({}))
54
+ sandbox.stub(requestLogger, 'logRequest').returns({})
55
+ sandbox.stub(requestLogger, 'logResponse').returns({})
56
+ Config.API_PORT = await getPort()
57
+ server = await initServer(Config)
58
+ })
59
+
60
+ afterAll(async () => {
61
+ await server.stop()
62
+ sandbox.restore()
63
+ })
64
+
65
+ describe('GET /participants', () => {
66
+ it('returns 202 when getParticipantsByTypeAndID resolves', async () => {
67
+ // Arrange
68
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'get')
69
+ const options = {
70
+ method: 'get',
71
+ url: mock.request.path,
72
+ headers: Helper.defaultSwitchHeaders
73
+ }
74
+ sandbox.stub(participants, 'getParticipantsByTypeAndID').resolves({})
75
+
76
+ // Act
77
+ const response = await server.inject(options)
78
+
79
+ // Assert
80
+ expect(response.statusCode).toBe(202)
81
+ expect(participants.getParticipantsByTypeAndID.callCount).toBe(1)
82
+ expect(participants.getParticipantsByTypeAndID.getCall(0).returnValue).resolves.toStrictEqual({})
83
+
84
+ // Cleanup
85
+ participants.getParticipantsByTypeAndID.restore()
86
+ })
87
+
88
+ it('getParticipantsByTypeAndID sends an async 3204 for invalid party id on response with status 400', async () => {
89
+ // Arrange
90
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'get')
91
+ const options = {
92
+ method: 'get',
93
+ url: mock.request.path,
94
+ headers: Helper.defaultSwitchHeaders
95
+ }
96
+
97
+ const badRequestError = ErrorHandler.Factory.createFSPIOPError(
98
+ ErrorHandler.Enums.FSPIOPErrorCodes.DESTINATION_COMMUNICATION_ERROR,
99
+ 'Failed to send HTTP request to host',
100
+ {},
101
+ {},
102
+ [{ key: 'status', value: 400 }]
103
+ )
104
+ const stubs = [
105
+ sandbox.stub(participant, 'sendErrorToParticipant').resolves({}),
106
+ sandbox.stub(participant, 'validateParticipant').resolves(true),
107
+ sandbox.stub(oracleEndpointCached, 'getOracleEndpointByType').resolves(['whatever']),
108
+ sandbox.stub(requestUtil, 'sendRequest').rejects(badRequestError)
109
+ ]
110
+ const response = await server.inject(options)
111
+ const errorCallStub = stubs[0]
112
+
113
+ // Assert
114
+ expect(errorCallStub.args[0][2].errorInformation.errorCode).toBe('3204')
115
+ expect(errorCallStub.args[0][1]).toBe(Enums.EndPoints.FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTICIPANT_SUB_ID_PUT_ERROR)
116
+ expect(response.statusCode).toBe(202)
117
+
118
+ // Cleanup
119
+ stubs.forEach(s => s.restore())
120
+ })
121
+
122
+ // Added error 404 to cover a special case of the Mowali implementation
123
+ // which uses mojaloop/als-oracle-pathfinder and currently returns 404.
124
+ it('getParticipantsByTypeAndID sends an async 3201 for invalid party id on response with status 404', async () => {
125
+ // Arrange
126
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'get')
127
+ const options = {
128
+ method: 'get',
129
+ url: mock.request.path,
130
+ headers: Helper.defaultSwitchHeaders
131
+ }
132
+
133
+ const badRequestError = ErrorHandler.Factory.createFSPIOPError(
134
+ ErrorHandler.Enums.FSPIOPErrorCodes.DESTINATION_COMMUNICATION_ERROR,
135
+ 'Failed to send HTTP request to host',
136
+ {},
137
+ {},
138
+ [{ key: 'status', value: 404 }]
139
+ )
140
+ const stubs = [
141
+ sandbox.stub(participant, 'sendErrorToParticipant').resolves({}),
142
+ sandbox.stub(participant, 'validateParticipant').resolves(true),
143
+ sandbox.stub(oracleEndpointCached, 'getOracleEndpointByType').resolves(['whatever']),
144
+ sandbox.stub(requestUtil, 'sendRequest').rejects(badRequestError)
145
+ ]
146
+ const response = await server.inject(options)
147
+ const errorCallStub = stubs[0]
148
+
149
+ // Assert
150
+ expect(errorCallStub.args[0][2].errorInformation.errorCode).toBe('3201')
151
+ expect(errorCallStub.args[0][1]).toBe(Enums.EndPoints.FspEndpointTypes.FSPIOP_CALLBACK_URL_PARTICIPANT_SUB_ID_PUT_ERROR)
152
+ expect(response.statusCode).toBe(202)
153
+
154
+ // Cleanup
155
+ stubs.forEach(s => s.restore())
156
+ })
157
+
158
+ it('return 202 when getParticipantsByTypeAndID rejects with an unknown error', async () => {
159
+ // Arrange
160
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'get')
161
+ const options = {
162
+ method: 'get',
163
+ url: mock.request.path,
164
+ headers: Helper.defaultSwitchHeaders
165
+ }
166
+ const throwError = new Error('Unknown error')
167
+ sandbox.stub(participants, 'getParticipantsByTypeAndID').rejects(throwError)
168
+
169
+ // Act
170
+ const response = await server.inject(options)
171
+
172
+ // Assert
173
+ expect(response.statusCode).toBe(202)
174
+ expect(participants.getParticipantsByTypeAndID.callCount).toBe(1)
175
+ expect(participants.getParticipantsByTypeAndID.getCall(0).returnValue).rejects.toStrictEqual(throwError)
176
+
177
+ // Cleanup
178
+ participants.getParticipantsByTypeAndID.restore()
179
+ })
180
+ })
181
+
182
+ describe('POST /participants', () => {
183
+ it('returns 202 when postParticipants resolves', async () => {
184
+ // Arrange
185
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'post')
186
+ const options = {
187
+ method: 'post',
188
+ url: mock.request.path,
189
+ headers: Helper.defaultSwitchHeaders,
190
+ payload: mock.request.body
191
+ }
192
+ sandbox.stub(participants, 'postParticipants').resolves({})
193
+
194
+ // Act
195
+ const response = await server.inject(options)
196
+
197
+ // Assert
198
+ expect(response.statusCode).toBe(202)
199
+ expect(participants.postParticipants.callCount).toBe(1)
200
+ expect(participants.postParticipants.getCall(0).returnValue).resolves.toStrictEqual({})
201
+
202
+ // Cleanup
203
+ participants.postParticipants.restore()
204
+ })
205
+
206
+ it('returns 202 when postParticipants rejects with an unknown error', async () => {
207
+ // Arrange
208
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'post')
209
+ const options = {
210
+ method: 'post',
211
+ url: mock.request.path,
212
+ headers: Helper.defaultSwitchHeaders,
213
+ payload: mock.request.body
214
+ }
215
+ const throwError = new Error('Unknown error')
216
+ sandbox.stub(participants, 'postParticipants').rejects(throwError)
217
+
218
+ // Act
219
+ const response = await server.inject(options)
220
+
221
+ // Assert
222
+ expect(response.statusCode).toBe(202)
223
+ expect(participants.postParticipants.callCount).toBe(1)
224
+ expect(participants.postParticipants.getCall(0).returnValue).rejects.toStrictEqual(throwError)
225
+
226
+ // Cleanup
227
+ participants.postParticipants.restore()
228
+ })
229
+ })
230
+
231
+ describe('PUT /participants', () => {
232
+ it('returns 200 when putParticipantsByTypeAndID resolves', async () => {
233
+ // Arrange
234
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'put')
235
+ const options = {
236
+ method: 'put',
237
+ url: mock.request.path,
238
+ headers: Helper.defaultSwitchHeaders,
239
+ payload: mock.request.body
240
+ }
241
+ sandbox.stub(participants, 'putParticipantsByTypeAndID').resolves({})
242
+
243
+ // Act
244
+ const response = await server.inject(options)
245
+
246
+ // Assert
247
+ expect(response.statusCode).toBe(200)
248
+ expect(participants.putParticipantsByTypeAndID.callCount).toBe(1)
249
+ expect(participants.putParticipantsByTypeAndID.getCall(0).returnValue).resolves.toStrictEqual({})
250
+
251
+ // Cleanup
252
+ participants.putParticipantsByTypeAndID.restore()
253
+ })
254
+
255
+ it('returns 200 when putParticipantsByTypeAndID rejects with an unknown error', async () => {
256
+ // Arrange
257
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'put')
258
+ const options = {
259
+ method: 'put',
260
+ url: mock.request.path,
261
+ headers: Helper.defaultSwitchHeaders,
262
+ payload: mock.request.body
263
+ }
264
+ const throwError = new Error('Unknown error')
265
+ sandbox.stub(participants, 'putParticipantsByTypeAndID').rejects(throwError)
266
+
267
+ // Act
268
+ const response = await server.inject(options)
269
+
270
+ // Assert
271
+ expect(response.statusCode).toBe(200)
272
+ expect(participants.putParticipantsByTypeAndID.callCount).toBe(1)
273
+ expect(participants.putParticipantsByTypeAndID.getCall(0).returnValue).rejects.toStrictEqual(throwError)
274
+
275
+ // Cleanup
276
+ participants.putParticipantsByTypeAndID.restore()
277
+ })
278
+ })
279
+
280
+ describe('PUT /error', () => {
281
+ it('returns 200 when putParticipantsErrorByTypeAndID resolves', async () => {
282
+ // Arrange
283
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}/error', 'put')
284
+ const options = {
285
+ method: 'put',
286
+ url: mock.request.path,
287
+ headers: Helper.defaultSwitchHeaders,
288
+ payload: mock.request.body
289
+ }
290
+ sandbox.stub(participants, 'putParticipantsErrorByTypeAndID').resolves({})
291
+
292
+ // Act
293
+ const response = await server.inject(options)
294
+
295
+ // Assert
296
+ expect(response.statusCode).toBe(200)
297
+ expect(participants.putParticipantsErrorByTypeAndID.callCount).toBe(1)
298
+ expect(participants.putParticipantsErrorByTypeAndID.getCall(0).returnValue).resolves.toStrictEqual({})
299
+
300
+ // Cleanup
301
+ participants.putParticipantsErrorByTypeAndID.restore()
302
+ })
303
+
304
+ it('returns 200 when putParticipantsErrorByTypeAndID rejects with an unknown error', async () => {
305
+ // Arrange
306
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}/error', 'put')
307
+ const options = {
308
+ method: 'put',
309
+ url: mock.request.path,
310
+ headers: Helper.defaultSwitchHeaders,
311
+ payload: mock.request.body
312
+ }
313
+ const throwError = new Error('Unknown error')
314
+ sandbox.stub(participants, 'putParticipantsErrorByTypeAndID').rejects(throwError)
315
+
316
+ // Act
317
+ const response = await server.inject(options)
318
+
319
+ // Assert
320
+ expect(response.statusCode).toBe(200)
321
+ expect(participants.putParticipantsErrorByTypeAndID.callCount).toBe(1)
322
+ expect(participants.putParticipantsErrorByTypeAndID.getCall(0).returnValue).rejects.toStrictEqual(throwError)
323
+
324
+ // Cleanup
325
+ participants.putParticipantsErrorByTypeAndID.restore()
326
+ })
327
+ })
328
+
329
+ describe('DELETE /participants', () => {
330
+ it('returns 202 when deleteParticipants resolves', async () => {
331
+ // Arrange
332
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'delete')
333
+ const options = {
334
+ method: 'delete',
335
+ url: mock.request.path,
336
+ headers: Helper.defaultSwitchHeaders,
337
+ payload: mock.request.body
338
+ }
339
+ sandbox.stub(participants, 'deleteParticipants').resolves({})
340
+
341
+ // Act
342
+ const response = await server.inject(options)
343
+
344
+ // Assert
345
+ expect(response.statusCode).toBe(202)
346
+ expect(participants.deleteParticipants.callCount).toBe(1)
347
+ expect(participants.deleteParticipants.getCall(0).returnValue).resolves.toStrictEqual({})
348
+
349
+ // Cleanup
350
+ participants.deleteParticipants.restore()
351
+ })
352
+
353
+ it('returns 202 when deleteParticipants rejects with an unknown error', async () => {
354
+ // Arrange
355
+ const mock = await Helper.generateMockRequest('/participants/{Type}/{ID}/{SubId}', 'delete')
356
+ const options = {
357
+ method: 'delete',
358
+ url: mock.request.path,
359
+ headers: Helper.defaultSwitchHeaders,
360
+ payload: mock.request.body
361
+ }
362
+ const throwError = new Error('Unknown error')
363
+ sandbox.stub(participants, 'deleteParticipants').rejects(throwError)
364
+
365
+ // Act
366
+ const response = await server.inject(options)
367
+
368
+ // Assert
369
+ expect(response.statusCode).toBe(202)
370
+ expect(participants.deleteParticipants.callCount).toBe(1)
371
+ expect(participants.deleteParticipants.getCall(0).returnValue).rejects.toStrictEqual(throwError)
372
+
373
+ // Cleanup
374
+ participants.deleteParticipants.restore()
375
+ })
376
+ })
377
+ })