@app-connect/core 1.7.37 → 1.7.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/README.md +17 -16
  2. package/dist/connector/developerPortal.d.ts +6 -0
  3. package/{connector → dist/connector}/developerPortal.js +29 -12
  4. package/dist/connector/mock.d.ts +1 -0
  5. package/{connector → dist/connector}/mock.js +33 -17
  6. package/dist/connector/proxy/engine.d.ts +10 -0
  7. package/dist/connector/proxy/engine.js +222 -0
  8. package/dist/connector/proxy/index.d.ts +5 -0
  9. package/dist/connector/proxy/index.js +511 -0
  10. package/dist/connector/registry.d.ts +1 -0
  11. package/dist/connector/registry.js +243 -0
  12. package/dist/handlers/admin.d.ts +1 -0
  13. package/{handlers → dist/handlers}/admin.js +137 -78
  14. package/dist/handlers/appointment.d.ts +9 -0
  15. package/{handlers → dist/handlers}/appointment.js +58 -29
  16. package/dist/handlers/auth.d.ts +9 -0
  17. package/{handlers → dist/handlers}/auth.js +68 -40
  18. package/dist/handlers/calldown.d.ts +10 -0
  19. package/dist/handlers/calldown.js +134 -0
  20. package/dist/handlers/contact.d.ts +1 -0
  21. package/{handlers → dist/handlers}/contact.js +61 -39
  22. package/dist/handlers/disposition.d.ts +1 -0
  23. package/{handlers → dist/handlers}/disposition.js +20 -10
  24. package/dist/handlers/log.d.ts +1 -0
  25. package/{handlers → dist/handlers}/log.js +91 -124
  26. package/dist/handlers/managedAuth.d.ts +1 -0
  27. package/{handlers → dist/handlers}/managedAuth.js +134 -61
  28. package/dist/handlers/managedOAuth.d.ts +13 -0
  29. package/{handlers → dist/handlers}/managedOAuth.js +102 -30
  30. package/dist/handlers/plugin.d.ts +1 -0
  31. package/{handlers → dist/handlers}/plugin.js +59 -27
  32. package/dist/handlers/user.d.ts +1 -0
  33. package/{handlers → dist/handlers}/user.js +45 -27
  34. package/dist/index.d.ts +1 -0
  35. package/{index.js → dist/index.js} +538 -449
  36. package/dist/jest.config.d.ts +1 -0
  37. package/dist/jest.config.js +65 -0
  38. package/dist/lib/analytics.d.ts +4 -0
  39. package/{lib → dist/lib}/analytics.js +8 -6
  40. package/dist/lib/authSession.d.ts +5 -0
  41. package/{lib → dist/lib}/authSession.js +15 -43
  42. package/dist/lib/cacheCleanup.d.ts +4 -0
  43. package/{lib → dist/lib}/cacheCleanup.js +5 -17
  44. package/dist/lib/callLogComposer.d.ts +109 -0
  45. package/{lib → dist/lib}/callLogComposer.js +157 -197
  46. package/dist/lib/callLogLookup.d.ts +6 -0
  47. package/{lib → dist/lib}/callLogLookup.js +12 -34
  48. package/dist/lib/constants.d.ts +6 -0
  49. package/dist/lib/constants.js +9 -0
  50. package/dist/lib/debugTracer.d.ts +17 -0
  51. package/{lib → dist/lib}/debugTracer.js +7 -83
  52. package/dist/lib/encode.d.ts +3 -0
  53. package/dist/lib/encode.js +50 -0
  54. package/dist/lib/errorHandler.d.ts +7 -0
  55. package/dist/lib/errorHandler.js +161 -0
  56. package/dist/lib/generalErrorMessage.d.ts +7 -0
  57. package/{lib → dist/lib}/generalErrorMessage.js +6 -6
  58. package/dist/lib/jwt.d.ts +4 -0
  59. package/dist/lib/jwt.js +18 -0
  60. package/dist/lib/logger.d.ts +24 -0
  61. package/dist/lib/logger.js +126 -0
  62. package/dist/lib/migrateCallLogsSchema.d.ts +32 -0
  63. package/{lib → dist/lib}/migrateCallLogsSchema.js +75 -160
  64. package/dist/lib/oauth.d.ts +4 -0
  65. package/{lib → dist/lib}/oauth.js +157 -160
  66. package/dist/lib/ringcentral.d.ts +24 -0
  67. package/dist/lib/ringcentral.js +226 -0
  68. package/dist/lib/s3ErrorLogReport.d.ts +4 -0
  69. package/{lib → dist/lib}/s3ErrorLogReport.js +11 -23
  70. package/dist/lib/sharedSMSComposer.d.ts +7 -0
  71. package/{lib → dist/lib}/sharedSMSComposer.js +21 -107
  72. package/dist/lib/util.d.ts +7 -0
  73. package/{lib → dist/lib}/util.js +9 -20
  74. package/dist/mcp/lib/oauthError.d.ts +1 -0
  75. package/dist/mcp/lib/oauthError.js +25 -0
  76. package/dist/mcp/lib/validator.d.ts +1 -0
  77. package/{mcp → dist/mcp}/lib/validator.js +16 -20
  78. package/dist/mcp/lib/widgetSessionToken.d.ts +1 -0
  79. package/dist/mcp/lib/widgetSessionToken.js +46 -0
  80. package/dist/mcp/mcpHandler.d.ts +8 -0
  81. package/{mcp → dist/mcp}/mcpHandler.js +98 -88
  82. package/dist/mcp/tools/cancelAppointment.d.ts +1 -0
  83. package/{mcp → dist/mcp}/tools/cancelAppointment.js +7 -16
  84. package/dist/mcp/tools/checkAuthStatus.d.ts +1 -0
  85. package/{mcp → dist/mcp}/tools/checkAuthStatus.js +21 -14
  86. package/dist/mcp/tools/confirmAppointment.d.ts +1 -0
  87. package/{mcp → dist/mcp}/tools/confirmAppointment.js +7 -16
  88. package/dist/mcp/tools/createAppointment.d.ts +1 -0
  89. package/{mcp → dist/mcp}/tools/createAppointment.js +7 -19
  90. package/dist/mcp/tools/createCallLog.d.ts +1 -0
  91. package/{mcp → dist/mcp}/tools/createCallLog.js +18 -29
  92. package/dist/mcp/tools/createContact.d.ts +1 -0
  93. package/{mcp → dist/mcp}/tools/createContact.js +8 -20
  94. package/dist/mcp/tools/createMessageLog.d.ts +1 -0
  95. package/{mcp → dist/mcp}/tools/createMessageLog.js +14 -26
  96. package/dist/mcp/tools/doAuth.d.ts +1 -0
  97. package/{mcp → dist/mcp}/tools/doAuth.js +17 -13
  98. package/dist/mcp/tools/findContactByName.d.ts +1 -0
  99. package/{mcp → dist/mcp}/tools/findContactByName.js +9 -15
  100. package/dist/mcp/tools/findContactByPhone.d.ts +1 -0
  101. package/{mcp → dist/mcp}/tools/findContactByPhone.js +8 -15
  102. package/dist/mcp/tools/getCallLog.d.ts +1 -0
  103. package/{mcp → dist/mcp}/tools/getCallLog.js +12 -21
  104. package/dist/mcp/tools/getGoogleFilePicker.d.ts +1 -0
  105. package/{mcp → dist/mcp}/tools/getGoogleFilePicker.js +9 -18
  106. package/dist/mcp/tools/getHelp.d.ts +1 -0
  107. package/{mcp → dist/mcp}/tools/getHelp.js +5 -6
  108. package/dist/mcp/tools/getPublicConnectors.d.ts +1 -0
  109. package/{mcp → dist/mcp}/tools/getPublicConnectors.js +19 -18
  110. package/dist/mcp/tools/getSessionInfo.d.ts +1 -0
  111. package/{mcp → dist/mcp}/tools/getSessionInfo.js +10 -16
  112. package/dist/mcp/tools/index.d.ts +8 -0
  113. package/dist/mcp/tools/index.js +50 -0
  114. package/dist/mcp/tools/listAppointments.d.ts +1 -0
  115. package/{mcp → dist/mcp}/tools/listAppointments.js +7 -19
  116. package/dist/mcp/tools/logout.d.ts +1 -0
  117. package/{mcp → dist/mcp}/tools/logout.js +16 -14
  118. package/dist/mcp/tools/rcGetCallLogs.d.ts +1 -0
  119. package/{mcp → dist/mcp}/tools/rcGetCallLogs.js +10 -8
  120. package/dist/mcp/tools/updateAppointment.d.ts +1 -0
  121. package/{mcp → dist/mcp}/tools/updateAppointment.js +17 -22
  122. package/dist/mcp/tools/updateCallLog.d.ts +1 -0
  123. package/{mcp → dist/mcp}/tools/updateCallLog.js +16 -26
  124. package/dist/models/accountDataModel.d.ts +3 -0
  125. package/dist/models/accountDataModel.js +39 -0
  126. package/dist/models/adminConfigModel.d.ts +2 -0
  127. package/dist/models/adminConfigModel.js +39 -0
  128. package/dist/models/cacheModel.d.ts +2 -0
  129. package/{models → dist/models}/cacheModel.js +7 -3
  130. package/dist/models/callDownListModel.d.ts +2 -0
  131. package/{models → dist/models}/callDownListModel.js +8 -4
  132. package/dist/models/callLogModel.d.ts +2 -0
  133. package/dist/models/callLogModel.js +43 -0
  134. package/dist/models/dynamo/connectorSchema.d.ts +2 -0
  135. package/dist/models/dynamo/connectorSchema.js +141 -0
  136. package/dist/models/dynamo/lockSchema.d.ts +2 -0
  137. package/{models → dist/models}/dynamo/lockSchema.js +5 -7
  138. package/dist/models/dynamo/noteCacheSchema.d.ts +2 -0
  139. package/{models → dist/models}/dynamo/noteCacheSchema.js +4 -6
  140. package/dist/models/llmSessionModel.d.ts +2 -0
  141. package/dist/models/llmSessionModel.js +21 -0
  142. package/dist/models/messageLogModel.d.ts +2 -0
  143. package/{models → dist/models}/messageLogModel.js +8 -4
  144. package/dist/models/sequelize.d.ts +2 -0
  145. package/dist/models/sequelize.js +68 -0
  146. package/dist/models/userModel.d.ts +2 -0
  147. package/dist/models/userModel.js +49 -0
  148. package/dist/package.json +100 -0
  149. package/dist/releaseNotes.json +1222 -0
  150. package/dist/tsconfig.json +14 -0
  151. package/dist/types/admin.d.ts +141 -0
  152. package/dist/types/analytics.d.ts +14 -0
  153. package/dist/types/appointment.d.ts +50 -0
  154. package/dist/types/auth.d.ts +137 -0
  155. package/dist/types/authSession.d.ts +35 -0
  156. package/dist/types/cacheCleanup.d.ts +12 -0
  157. package/dist/types/calldown.d.ts +54 -0
  158. package/dist/types/common.d.ts +46 -0
  159. package/dist/types/connector.d.ts +165 -0
  160. package/dist/types/contact.d.ts +125 -0
  161. package/dist/types/errorHandler.d.ts +60 -0
  162. package/dist/types/index.d.ts +76 -0
  163. package/dist/types/json.d.ts +9 -0
  164. package/dist/types/jwt.d.ts +8 -0
  165. package/dist/types/logging.d.ts +224 -0
  166. package/dist/types/managedAuth.d.ts +114 -0
  167. package/dist/types/managedOAuth.d.ts +59 -0
  168. package/dist/types/manifest.d.ts +120 -0
  169. package/dist/types/migration.d.ts +15 -0
  170. package/dist/types/plugin.d.ts +74 -0
  171. package/dist/types/ringcentral.d.ts +61 -0
  172. package/dist/types/s3ErrorLogReport.d.ts +16 -0
  173. package/dist/types/sharedSMSComposer.d.ts +105 -0
  174. package/dist/types/user.d.ts +46 -0
  175. package/dist/types/util.d.ts +7 -0
  176. package/package.json +34 -6
  177. package/releaseNotes.json +8 -0
  178. package/.env.test +0 -5
  179. package/connector/proxy/engine.js +0 -165
  180. package/connector/proxy/index.js +0 -500
  181. package/connector/registry.js +0 -252
  182. package/docs/README.md +0 -50
  183. package/docs/architecture.md +0 -94
  184. package/docs/connectors.md +0 -116
  185. package/docs/handlers.md +0 -128
  186. package/docs/libraries.md +0 -98
  187. package/docs/models.md +0 -146
  188. package/docs/routes.md +0 -119
  189. package/docs/tests.md +0 -73
  190. package/handlers/calldown.js +0 -99
  191. package/jest.config.js +0 -57
  192. package/lib/constants.js +0 -9
  193. package/lib/encode.js +0 -30
  194. package/lib/errorHandler.js +0 -218
  195. package/lib/jwt.js +0 -18
  196. package/lib/logger.js +0 -190
  197. package/lib/ringcentral.js +0 -267
  198. package/mcp/README.md +0 -420
  199. package/mcp/tools/index.js +0 -51
  200. package/mcp/ui/App/App.tsx +0 -358
  201. package/mcp/ui/App/components/AuthInfoForm.tsx +0 -113
  202. package/mcp/ui/App/components/AuthSuccess.tsx +0 -22
  203. package/mcp/ui/App/components/ConnectorList.tsx +0 -82
  204. package/mcp/ui/App/components/DebugPanel.tsx +0 -43
  205. package/mcp/ui/App/components/OAuthConnect.tsx +0 -270
  206. package/mcp/ui/App/lib/callTool.ts +0 -130
  207. package/mcp/ui/App/lib/debugLog.ts +0 -41
  208. package/mcp/ui/App/lib/developerPortal.ts +0 -111
  209. package/mcp/ui/App/main.css +0 -6
  210. package/mcp/ui/App/root.tsx +0 -13
  211. package/mcp/ui/dist/index.html +0 -53
  212. package/mcp/ui/vite.config.ts +0 -16
  213. package/models/accountDataModel.js +0 -34
  214. package/models/adminConfigModel.js +0 -35
  215. package/models/callLogModel.js +0 -39
  216. package/models/dynamo/connectorSchema.js +0 -146
  217. package/models/llmSessionModel.js +0 -17
  218. package/models/sequelize.js +0 -17
  219. package/models/userModel.js +0 -45
  220. package/test/connector/developerPortal.test.js +0 -166
  221. package/test/connector/mock.test.js +0 -131
  222. package/test/connector/proxy/engine.test.js +0 -211
  223. package/test/connector/proxy/index.test.js +0 -525
  224. package/test/connector/proxy/sample.json +0 -162
  225. package/test/connector/registry.test.js +0 -416
  226. package/test/handlers/admin.test.js +0 -960
  227. package/test/handlers/appointment.test.js +0 -260
  228. package/test/handlers/auth.test.js +0 -1096
  229. package/test/handlers/calldown.test.js +0 -310
  230. package/test/handlers/contact.test.js +0 -1014
  231. package/test/handlers/disposition.test.js +0 -396
  232. package/test/handlers/log.test.js +0 -1847
  233. package/test/handlers/managedAuth.test.js +0 -458
  234. package/test/handlers/managedOAuth.test.js +0 -262
  235. package/test/handlers/plugin.test.js +0 -429
  236. package/test/handlers/user.test.js +0 -381
  237. package/test/index.test.js +0 -301
  238. package/test/lib/analytics.test.js +0 -146
  239. package/test/lib/authSession.test.js +0 -173
  240. package/test/lib/cacheCleanup.test.js +0 -127
  241. package/test/lib/callLogComposer.test.js +0 -1231
  242. package/test/lib/debugTracer.test.js +0 -328
  243. package/test/lib/encode.test.js +0 -59
  244. package/test/lib/errorHandler.test.js +0 -246
  245. package/test/lib/generalErrorMessage.test.js +0 -82
  246. package/test/lib/jwt.test.js +0 -176
  247. package/test/lib/logger.test.js +0 -206
  248. package/test/lib/oauth.test.js +0 -359
  249. package/test/lib/ringcentral.test.js +0 -467
  250. package/test/lib/s3ErrorLogReport.test.js +0 -187
  251. package/test/lib/sharedSMSComposer.test.js +0 -1084
  252. package/test/lib/util.test.js +0 -329
  253. package/test/mcp/mcpHandler.test.js +0 -73
  254. package/test/mcp/mcpHandlerMore.test.js +0 -384
  255. package/test/mcp/tools/appointmentTools.test.js +0 -362
  256. package/test/mcp/tools/checkAuthStatus.test.js +0 -83
  257. package/test/mcp/tools/createCallLog.test.js +0 -436
  258. package/test/mcp/tools/createContact.test.js +0 -58
  259. package/test/mcp/tools/createMessageLog.test.js +0 -595
  260. package/test/mcp/tools/doAuth.test.js +0 -113
  261. package/test/mcp/tools/findContactByName.test.js +0 -275
  262. package/test/mcp/tools/findContactByPhone.test.js +0 -296
  263. package/test/mcp/tools/getCallLog.test.js +0 -298
  264. package/test/mcp/tools/getGoogleFilePicker.test.js +0 -281
  265. package/test/mcp/tools/getPublicConnectors.test.js +0 -107
  266. package/test/mcp/tools/getSessionInfo.test.js +0 -127
  267. package/test/mcp/tools/logout.test.js +0 -233
  268. package/test/mcp/tools/rcGetCallLogs.test.js +0 -56
  269. package/test/mcp/tools/updateCallLog.test.js +0 -360
  270. package/test/models/accountDataModel.test.js +0 -98
  271. package/test/models/callDownListModel.test.js +0 -125
  272. package/test/models/dynamo/connectorSchema.test.js +0 -189
  273. package/test/models/dynamo/lockSchema.test.js +0 -37
  274. package/test/models/dynamo/noteCacheSchema.test.js +0 -45
  275. package/test/models/llmSessionModel.test.js +0 -91
  276. package/test/models/models.test.js +0 -660
  277. package/test/routes/calldownRoutes.test.js +0 -224
  278. package/test/routes/coreRouterBroadRoutes.test.js +0 -855
  279. package/test/routes/dispositionRoutes.test.js +0 -192
  280. package/test/routes/managedAuthRoutes.test.js +0 -386
  281. package/test/routes/pluginRoutes.test.js +0 -262
  282. package/test/setup.js +0 -178
  283. /package/{mcp → dist/mcp}/ui/index.html +0 -0
  284. /package/{mcp → dist/mcp}/ui/package-lock.json +0 -0
  285. /package/{mcp → dist/mcp}/ui/package.json +0 -0
  286. /package/{mcp → dist/mcp}/ui/tsconfig.json +0 -0
@@ -1,260 +0,0 @@
1
- jest.mock('../../models/userModel', () => ({
2
- UserModel: {
3
- findByPk: jest.fn()
4
- }
5
- }));
6
- jest.mock('../../connector/registry', () => ({
7
- getConnector: jest.fn()
8
- }));
9
- jest.mock('../../lib/oauth', () => ({
10
- getOAuthApp: jest.fn(() => ({ app: true })),
11
- checkAndRefreshAccessToken: jest.fn()
12
- }));
13
- jest.mock('../../models/dynamo/connectorSchema', () => ({
14
- Connector: {
15
- getProxyConfig: jest.fn()
16
- }
17
- }));
18
-
19
- const appointmentHandler = require('../../handlers/appointment');
20
- const { UserModel } = require('../../models/userModel');
21
- const connectorRegistry = require('../../connector/registry');
22
- const oauth = require('../../lib/oauth');
23
- const { Connector } = require('../../models/dynamo/connectorSchema');
24
-
25
- describe('Appointment Handler', () => {
26
- const baseUser = {
27
- id: 'user-1',
28
- hostname: 'crm.example.com',
29
- accessToken: 'access-token',
30
- platformAdditionalInfo: {}
31
- };
32
-
33
- beforeEach(() => {
34
- jest.clearAllMocks();
35
- });
36
-
37
- function mockApiKeyConnector(overrides = {}) {
38
- const connector = {
39
- getAuthType: jest.fn().mockResolvedValue('apiKey'),
40
- getBasicAuth: jest.fn(() => 'encoded-key'),
41
- listAppointments: jest.fn().mockResolvedValue({ appointments: [{ id: 'appt-1' }] }),
42
- createAppointment: jest.fn().mockResolvedValue({ appointmentId: 'appt-2', appointment: { id: 'appt-2' } }),
43
- updateAppointment: jest.fn().mockResolvedValue({ appointment: { id: 'appt-3' } }),
44
- refreshAppointment: jest.fn().mockResolvedValue({ appointment: { id: 'appt-4' } }),
45
- confirmAppointment: jest.fn().mockResolvedValue({ appointment: { id: 'appt-5' } }),
46
- cancelAppointment: jest.fn().mockResolvedValue({ appointment: { id: 'appt-6' } }),
47
- ...overrides
48
- };
49
- connectorRegistry.getConnector.mockReturnValue(connector);
50
- return connector;
51
- }
52
-
53
- test('returns database warning when user lookup fails', async () => {
54
- UserModel.findByPk.mockRejectedValueOnce(new Error('db unavailable'));
55
-
56
- const result = await appointmentHandler.listAppointments({
57
- platform: 'testCRM',
58
- userId: 'user-1'
59
- });
60
-
61
- expect(result.successful).toBe(false);
62
- expect(result.returnMessage.messageType).toBe('warning');
63
- expect(result.returnMessage.message).toBe('Database operation failed');
64
- });
65
-
66
- test('returns warning when user is missing or session has no token', async () => {
67
- UserModel.findByPk.mockResolvedValueOnce(null);
68
-
69
- await expect(appointmentHandler.listAppointments({
70
- platform: 'testCRM',
71
- userId: 'missing-user'
72
- })).resolves.toMatchObject({
73
- successful: false,
74
- returnMessage: {
75
- message: 'User not found'
76
- }
77
- });
78
-
79
- UserModel.findByPk.mockResolvedValueOnce({ id: 'user-1' });
80
- const noTokenResult = await appointmentHandler.createAppointment({
81
- platform: 'testCRM',
82
- userId: 'user-1',
83
- payload: { title: 'Meeting' }
84
- });
85
-
86
- expect(noTokenResult.successful).toBe(false);
87
- expect(noTokenResult.returnMessage.message).toBe('User not found');
88
- });
89
-
90
- test('listAppointments resolves oauth auth with proxy config and returns connector result', async () => {
91
- const user = {
92
- ...baseUser,
93
- platformAdditionalInfo: {
94
- proxyId: 'proxy-1',
95
- tokenUrl: 'https://token.example.com'
96
- }
97
- };
98
- const refreshedUser = {
99
- ...user,
100
- accessToken: 'fresh-token'
101
- };
102
- const connector = {
103
- getAuthType: jest.fn().mockResolvedValue('oauth'),
104
- getOauthInfo: jest.fn().mockResolvedValue({ tokenUrl: 'https://token.example.com' }),
105
- listAppointments: jest.fn().mockResolvedValue({
106
- appointments: [{ id: 'appt-1' }],
107
- returnMessage: {
108
- messageType: 'success',
109
- message: 'Listed'
110
- }
111
- })
112
- };
113
- UserModel.findByPk.mockResolvedValue(user);
114
- Connector.getProxyConfig.mockResolvedValue({ id: 'proxy-1' });
115
- oauth.checkAndRefreshAccessToken.mockResolvedValue(refreshedUser);
116
- connectorRegistry.getConnector.mockReturnValue(connector);
117
-
118
- const result = await appointmentHandler.listAppointments({
119
- platform: 'testCRM',
120
- userId: 'user-1',
121
- range: { startDate: '2026-07-01' },
122
- mineOnly: true,
123
- forceSync: true
124
- });
125
-
126
- expect(connector.getOauthInfo).toHaveBeenCalledWith({
127
- tokenUrl: 'https://token.example.com',
128
- hostname: 'crm.example.com',
129
- proxyId: 'proxy-1',
130
- proxyConfig: { id: 'proxy-1' }
131
- });
132
- expect(connector.listAppointments).toHaveBeenCalledWith({
133
- user: refreshedUser,
134
- authHeader: 'Bearer fresh-token',
135
- range: { startDate: '2026-07-01' },
136
- mineOnly: true,
137
- forceSync: true,
138
- proxyConfig: { id: 'proxy-1' }
139
- });
140
- expect(result).toMatchObject({
141
- successful: true,
142
- appointments: [{ id: 'appt-1' }]
143
- });
144
- });
145
-
146
- test('oauth auth returns revoke response when token refresh fails', async () => {
147
- const connector = {
148
- getAuthType: jest.fn().mockResolvedValue('oauth'),
149
- getOauthInfo: jest.fn().mockResolvedValue({})
150
- };
151
- UserModel.findByPk.mockResolvedValue(baseUser);
152
- connectorRegistry.getConnector.mockReturnValue(connector);
153
- oauth.checkAndRefreshAccessToken.mockResolvedValue(null);
154
-
155
- const result = await appointmentHandler.createAppointment({
156
- platform: 'testCRM',
157
- userId: 'user-1',
158
- payload: { title: 'Meeting' }
159
- });
160
-
161
- expect(result).toMatchObject({
162
- successful: false,
163
- isRevokeUserSession: true,
164
- returnMessage: {
165
- message: 'User session expired. Please connect again.'
166
- }
167
- });
168
- });
169
-
170
- test('apiKey auth is used by create, update, refresh, confirm, and cancel operations', async () => {
171
- UserModel.findByPk.mockResolvedValue(baseUser);
172
- const connector = mockApiKeyConnector();
173
-
174
- const createResult = await appointmentHandler.createAppointment({
175
- platform: 'testCRM',
176
- userId: 'user-1',
177
- payload: { title: 'Create' }
178
- });
179
- const updateResult = await appointmentHandler.updateAppointment({
180
- platform: 'testCRM',
181
- userId: 'user-1',
182
- appointmentId: 'appt-2',
183
- patchBody: { title: 'Update' }
184
- });
185
- const refreshResult = await appointmentHandler.refreshAppointment({
186
- platform: 'testCRM',
187
- userId: 'user-1',
188
- appointmentId: 'appt-3'
189
- });
190
- const confirmResult = await appointmentHandler.confirmAppointment({
191
- platform: 'testCRM',
192
- userId: 'user-1',
193
- appointmentId: 'appt-4'
194
- });
195
- const cancelResult = await appointmentHandler.cancelAppointment({
196
- platform: 'testCRM',
197
- userId: 'user-1',
198
- appointmentId: 'appt-5'
199
- });
200
-
201
- expect(createResult.appointmentId).toBe('appt-2');
202
- expect(updateResult.appointment).toEqual({ id: 'appt-3' });
203
- expect(refreshResult.appointment).toEqual({ id: 'appt-4' });
204
- expect(confirmResult.appointment).toEqual({ id: 'appt-5' });
205
- expect(cancelResult.appointment).toEqual({ id: 'appt-6' });
206
- expect(connector.getBasicAuth).toHaveBeenCalledWith({ apiKey: 'access-token' });
207
- expect(connector.createAppointment).toHaveBeenCalledWith({
208
- user: baseUser,
209
- authHeader: 'Basic encoded-key',
210
- payload: { title: 'Create' },
211
- proxyConfig: null
212
- });
213
- expect(connector.updateAppointment).toHaveBeenCalledWith({
214
- user: baseUser,
215
- authHeader: 'Basic encoded-key',
216
- appointmentId: 'appt-2',
217
- patchBody: { title: 'Update' },
218
- proxyConfig: null
219
- });
220
- expect(connector.refreshAppointment).toHaveBeenCalledWith({
221
- user: baseUser,
222
- authHeader: 'Basic encoded-key',
223
- appointmentId: 'appt-3',
224
- proxyConfig: null
225
- });
226
- expect(connector.confirmAppointment).toHaveBeenCalledWith({
227
- user: baseUser,
228
- authHeader: 'Basic encoded-key',
229
- appointmentId: 'appt-4',
230
- proxyConfig: null
231
- });
232
- expect(connector.cancelAppointment).toHaveBeenCalledWith({
233
- user: baseUser,
234
- authHeader: 'Basic encoded-key',
235
- appointmentId: 'appt-5',
236
- proxyConfig: null
237
- });
238
- });
239
-
240
- test('operation errors are mapped through API error handler', async () => {
241
- UserModel.findByPk.mockResolvedValue(baseUser);
242
- mockApiKeyConnector({
243
- updateAppointment: jest.fn().mockRejectedValue({
244
- response: {
245
- status: 429
246
- }
247
- })
248
- });
249
-
250
- const result = await appointmentHandler.updateAppointment({
251
- platform: 'testCRM',
252
- userId: 'user-1',
253
- appointmentId: 'appt-2',
254
- patchBody: { title: 'Update' }
255
- });
256
-
257
- expect(result.successful).toBe(false);
258
- expect(result.returnMessage.messageType).toBe('warning');
259
- });
260
- });