@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280

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 (363) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +763 -31
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/no-meeting-info.js +51 -0
  21. package/dist/common/errors/no-meeting-info.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +28 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +203 -28
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +112 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +383 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +57 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +249 -72
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +58 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +72 -123
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +82 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +3123 -2814
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +292 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +230 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +256 -196
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +601 -417
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +73 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +192 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/util.js +1 -1
  81. package/dist/meeting-info/util.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +36 -36
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +394 -94
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +71 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -6
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +12 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +40 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +39 -36
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +209 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/multistream/sendSlotManager.js +233 -0
  127. package/dist/multistream/sendSlotManager.js.map +1 -0
  128. package/dist/reachability/index.js +225 -59
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +17 -8
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +199 -154
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +23 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +112 -97
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +96 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/index.js +67 -73
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  151. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  152. package/dist/types/annotation/annotation.types.d.ts +42 -0
  153. package/dist/types/annotation/constants.d.ts +31 -0
  154. package/dist/types/annotation/index.d.ts +117 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/request.d.ts +22 -0
  158. package/dist/types/breakouts/utils.d.ts +15 -0
  159. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  160. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  161. package/dist/types/common/queue.d.ts +9 -7
  162. package/dist/types/config.d.ts +1 -6
  163. package/dist/types/constants.d.ts +161 -21
  164. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  165. package/dist/types/controls-options-manager/index.d.ts +17 -1
  166. package/dist/types/controls-options-manager/types.d.ts +43 -0
  167. package/dist/types/controls-options-manager/util.d.ts +1 -7
  168. package/dist/types/index.d.ts +6 -4
  169. package/dist/types/interpretation/collection.d.ts +5 -0
  170. package/dist/types/interpretation/index.d.ts +5 -0
  171. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  172. package/dist/types/locus-info/index.d.ts +57 -4
  173. package/dist/types/locus-info/parser.d.ts +67 -6
  174. package/dist/types/media/index.d.ts +2 -0
  175. package/dist/types/media/properties.d.ts +34 -48
  176. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  177. package/dist/types/meeting/index.d.ts +345 -507
  178. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  179. package/dist/types/meeting/muteState.d.ts +99 -23
  180. package/dist/types/meeting/request.d.ts +72 -43
  181. package/dist/types/meeting/util.d.ts +101 -1
  182. package/dist/types/meeting-info/index.d.ts +13 -1
  183. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/types/meetings/collection.d.ts +8 -0
  185. package/dist/types/meetings/index.d.ts +88 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +13 -0
  188. package/dist/types/member/types.d.ts +32 -0
  189. package/dist/types/members/collection.d.ts +5 -0
  190. package/dist/types/members/index.d.ts +35 -2
  191. package/dist/types/members/request.d.ts +73 -9
  192. package/dist/types/members/types.d.ts +24 -0
  193. package/dist/types/members/util.d.ts +209 -1
  194. package/dist/types/metrics/constants.d.ts +11 -4
  195. package/dist/types/metrics/index.d.ts +4 -119
  196. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  197. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  198. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  199. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  200. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  201. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  202. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  203. package/dist/types/reachability/index.d.ts +61 -7
  204. package/dist/types/reachability/request.d.ts +7 -3
  205. package/dist/types/reconnection-manager/index.d.ts +9 -0
  206. package/dist/types/recording-controller/index.d.ts +15 -1
  207. package/dist/types/recording-controller/util.d.ts +5 -4
  208. package/dist/types/roap/request.d.ts +15 -11
  209. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  210. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  211. package/dist/types/rtcMetrics/index.d.ts +47 -0
  212. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  213. package/package.json +23 -20
  214. package/src/annotation/annotation.types.ts +50 -0
  215. package/src/annotation/constants.ts +36 -0
  216. package/src/annotation/index.ts +328 -0
  217. package/src/breakouts/README.md +44 -14
  218. package/src/breakouts/breakout.ts +87 -9
  219. package/src/breakouts/edit-lock-error.ts +25 -0
  220. package/src/breakouts/events.ts +56 -0
  221. package/src/breakouts/index.ts +646 -18
  222. package/src/breakouts/request.ts +55 -0
  223. package/src/breakouts/utils.ts +57 -0
  224. package/src/common/errors/no-meeting-info.ts +24 -0
  225. package/src/common/errors/webex-errors.ts +27 -2
  226. package/src/common/logs/logger-proxy.ts +1 -1
  227. package/src/common/queue.ts +22 -8
  228. package/src/config.ts +4 -9
  229. package/src/constants.ts +184 -18
  230. package/src/controls-options-manager/enums.ts +12 -0
  231. package/src/controls-options-manager/index.ts +116 -21
  232. package/src/controls-options-manager/types.ts +59 -0
  233. package/src/controls-options-manager/util.ts +294 -14
  234. package/src/index.ts +40 -0
  235. package/src/interpretation/README.md +60 -0
  236. package/src/interpretation/collection.ts +19 -0
  237. package/src/interpretation/index.ts +332 -0
  238. package/src/interpretation/siLanguage.ts +18 -0
  239. package/src/locus-info/controlsUtils.ts +108 -0
  240. package/src/locus-info/index.ts +413 -59
  241. package/src/locus-info/infoUtils.ts +10 -2
  242. package/src/locus-info/mediaSharesUtils.ts +64 -0
  243. package/src/locus-info/parser.ts +258 -47
  244. package/src/locus-info/selfUtils.ts +81 -5
  245. package/src/media/index.ts +100 -122
  246. package/src/media/properties.ts +85 -108
  247. package/src/meeting/in-meeting-actions.ts +163 -3
  248. package/src/meeting/index.ts +2541 -2309
  249. package/src/meeting/locusMediaRequest.ts +313 -0
  250. package/src/meeting/muteState.ts +229 -131
  251. package/src/meeting/request.ts +172 -121
  252. package/src/meeting/util.ts +588 -394
  253. package/src/meeting-info/index.ts +81 -8
  254. package/src/meeting-info/meeting-info-v2.ts +170 -14
  255. package/src/meeting-info/util.ts +1 -1
  256. package/src/meeting-info/utilv2.ts +23 -23
  257. package/src/meetings/collection.ts +20 -0
  258. package/src/meetings/index.ts +428 -108
  259. package/src/meetings/meetings.types.ts +12 -0
  260. package/src/meetings/request.ts +2 -0
  261. package/src/meetings/util.ts +79 -4
  262. package/src/member/index.ts +49 -0
  263. package/src/member/types.ts +38 -0
  264. package/src/member/util.ts +127 -25
  265. package/src/members/collection.ts +8 -0
  266. package/src/members/index.ts +106 -7
  267. package/src/members/request.ts +97 -17
  268. package/src/members/types.ts +28 -0
  269. package/src/members/util.ts +319 -240
  270. package/src/metrics/constants.ts +11 -4
  271. package/src/metrics/index.ts +1 -490
  272. package/src/multistream/mediaRequestManager.ts +289 -79
  273. package/src/multistream/receiveSlot.ts +47 -17
  274. package/src/multistream/receiveSlotManager.ts +34 -24
  275. package/src/multistream/remoteMedia.ts +27 -2
  276. package/src/multistream/remoteMediaGroup.ts +59 -0
  277. package/src/multistream/remoteMediaManager.ts +148 -30
  278. package/src/multistream/sendSlotManager.ts +170 -0
  279. package/src/reachability/index.ts +228 -37
  280. package/src/reachability/request.ts +17 -8
  281. package/src/reconnection-manager/index.ts +81 -54
  282. package/src/recording-controller/index.ts +20 -3
  283. package/src/recording-controller/util.ts +26 -9
  284. package/src/roap/index.ts +23 -30
  285. package/src/roap/request.ts +100 -104
  286. package/src/roap/turnDiscovery.ts +51 -25
  287. package/src/rtcMetrics/constants.ts +3 -0
  288. package/src/rtcMetrics/index.ts +100 -0
  289. package/src/statsAnalyzer/index.ts +88 -88
  290. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  291. package/test/integration/spec/converged-space-meetings.js +60 -3
  292. package/test/integration/spec/journey.js +320 -261
  293. package/test/integration/spec/space-meeting.js +76 -3
  294. package/test/unit/spec/annotation/index.ts +418 -0
  295. package/test/unit/spec/breakouts/breakout.ts +142 -24
  296. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  297. package/test/unit/spec/breakouts/events.ts +89 -0
  298. package/test/unit/spec/breakouts/index.ts +1488 -67
  299. package/test/unit/spec/breakouts/request.ts +104 -0
  300. package/test/unit/spec/breakouts/utils.js +72 -0
  301. package/test/unit/spec/common/queue.js +31 -2
  302. package/test/unit/spec/controls-options-manager/index.js +163 -0
  303. package/test/unit/spec/controls-options-manager/util.js +576 -60
  304. package/test/unit/spec/fixture/locus.js +1 -0
  305. package/test/unit/spec/interpretation/collection.ts +15 -0
  306. package/test/unit/spec/interpretation/index.ts +589 -0
  307. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  308. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  309. package/test/unit/spec/locus-info/index.js +1304 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  312. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  313. package/test/unit/spec/locus-info/parser.js +116 -35
  314. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  315. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  316. package/test/unit/spec/media/index.ts +104 -37
  317. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  318. package/test/unit/spec/meeting/index.js +4515 -1932
  319. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  320. package/test/unit/spec/meeting/muteState.js +408 -208
  321. package/test/unit/spec/meeting/request.js +440 -45
  322. package/test/unit/spec/meeting/utils.js +679 -64
  323. package/test/unit/spec/meeting-info/index.js +295 -0
  324. package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
  325. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  326. package/test/unit/spec/meetings/collection.js +14 -0
  327. package/test/unit/spec/meetings/index.js +1007 -177
  328. package/test/unit/spec/meetings/utils.js +206 -2
  329. package/test/unit/spec/member/index.js +58 -4
  330. package/test/unit/spec/member/util.js +479 -35
  331. package/test/unit/spec/members/index.js +319 -1
  332. package/test/unit/spec/members/request.js +206 -27
  333. package/test/unit/spec/members/utils.js +184 -0
  334. package/test/unit/spec/metrics/index.js +1 -50
  335. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  336. package/test/unit/spec/multistream/receiveSlot.ts +43 -20
  337. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  338. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  339. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  340. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  341. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  342. package/test/unit/spec/reachability/index.ts +549 -9
  343. package/test/unit/spec/reachability/request.js +68 -0
  344. package/test/unit/spec/reconnection-manager/index.js +84 -9
  345. package/test/unit/spec/recording-controller/index.js +294 -218
  346. package/test/unit/spec/recording-controller/util.js +223 -96
  347. package/test/unit/spec/roap/index.ts +31 -51
  348. package/test/unit/spec/roap/request.ts +203 -85
  349. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  350. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  351. package/test/unit/spec/stats-analyzer/index.js +64 -2
  352. package/test/utils/integrationTestUtils.js +46 -0
  353. package/test/utils/testUtils.js +0 -52
  354. package/dist/meeting/effectsState.js +0 -262
  355. package/dist/meeting/effectsState.js.map +0 -1
  356. package/dist/metrics/config.js +0 -299
  357. package/dist/metrics/config.js.map +0 -1
  358. package/dist/types/meeting/effectsState.d.ts +0 -42
  359. package/dist/types/metrics/config.d.ts +0 -178
  360. package/src/index.js +0 -16
  361. package/src/meeting/effectsState.ts +0 -211
  362. package/src/metrics/config.ts +0 -495
  363. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -13,6 +13,7 @@ import {
13
13
  _CONVERSATION_URL_,
14
14
  _SIP_URI_,
15
15
  WBXAPPAPI_SERVICE,
16
+ _LOCUS_ID_,
16
17
  } from '@webex/plugin-meetings/src/constants';
17
18
 
18
19
  import Meetings from '@webex/plugin-meetings/src/meetings';
@@ -20,10 +21,12 @@ import MeetingInfo, {
20
21
  MeetingInfoV2PasswordError,
21
22
  MeetingInfoV2CaptchaError,
22
23
  MeetingInfoV2AdhocMeetingError,
24
+ MeetingInfoV2PolicyError,
23
25
  } from '@webex/plugin-meetings/src/meeting-info/meeting-info-v2';
24
26
  import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
25
27
  import Metrics from '@webex/plugin-meetings/src/metrics';
26
28
  import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
29
+ import {forEach} from 'lodash';
27
30
 
28
31
  describe('plugin-meetings', () => {
29
32
  const conversation = {
@@ -120,7 +123,7 @@ describe('plugin-meetings', () => {
120
123
  MeetingInfoUtil.getRequestBody.restore();
121
124
  });
122
125
 
123
- it('should fetch meeting info for the personal meeting room type', async () => {
126
+ it('should fetch meeting info for the personal meeting room type', async () => {
124
127
  const body = {meetingKey: '1234323'};
125
128
  const requestResponse = {statusCode: 200, body};
126
129
 
@@ -211,6 +214,87 @@ describe('plugin-meetings', () => {
211
214
  );
212
215
  });
213
216
 
217
+ it('should fetch meeting info with provided installedOrgID', async () => {
218
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
219
+ const installedOrgID = '123456';
220
+
221
+ webex.request.resolves(requestResponse);
222
+
223
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, installedOrgID);
224
+
225
+ assert.calledWith(webex.request, {
226
+ method: 'POST',
227
+ service: WBXAPPAPI_SERVICE,
228
+ resource: 'meetingInfo',
229
+ body: {
230
+ supportHostKey: true,
231
+ supportCountryList: true,
232
+ meetingKey: '1234323',
233
+ installedOrgID,
234
+ },
235
+ });
236
+ assert.deepEqual(result, requestResponse);
237
+ assert(Metrics.sendBehavioralMetric.calledOnce);
238
+ assert.calledWith(
239
+ Metrics.sendBehavioralMetric,
240
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
241
+ );
242
+ });
243
+
244
+ it('should fetch meeting info with provided locusId', async () => {
245
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
246
+ const locusId = 'eccd5c1b-d42d-35e3-a1b9-3021030a6d84';
247
+
248
+ webex.request.resolves(requestResponse);
249
+
250
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, locusId);
251
+
252
+ assert.calledWith(webex.request, {
253
+ method: 'POST',
254
+ service: WBXAPPAPI_SERVICE,
255
+ resource: 'meetingInfo',
256
+ body: {
257
+ supportHostKey: true,
258
+ supportCountryList: true,
259
+ meetingKey: '1234323',
260
+ locusId,
261
+ },
262
+ });
263
+ assert.deepEqual(result, requestResponse);
264
+ assert(Metrics.sendBehavioralMetric.calledOnce);
265
+ assert.calledWith(
266
+ Metrics.sendBehavioralMetric,
267
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
268
+ );
269
+ });
270
+
271
+ it('should fetch meeting info with provided extraParams', async () => {
272
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
273
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
274
+
275
+ webex.request.resolves(requestResponse);
276
+
277
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, extraParams);
278
+
279
+ assert.calledWith(webex.request, {
280
+ method: 'POST',
281
+ service: WBXAPPAPI_SERVICE,
282
+ resource: 'meetingInfo',
283
+ body: {
284
+ supportHostKey: true,
285
+ supportCountryList: true,
286
+ meetingKey: '1234323',
287
+ ...extraParams,
288
+ },
289
+ });
290
+ assert.deepEqual(result, requestResponse);
291
+ assert(Metrics.sendBehavioralMetric.calledOnce);
292
+ assert.calledWith(
293
+ Metrics.sendBehavioralMetric,
294
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
295
+ );
296
+ });
297
+
214
298
  it('create adhoc meeting when conversationUrl passed with enableAdhocMeetings toggle', async () => {
215
299
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
216
300
  await meetingInfo.fetchMeetingInfo('conversationUrl', _CONVERSATION_URL_);
@@ -220,6 +304,29 @@ describe('plugin-meetings', () => {
220
304
  meetingInfo.createAdhocSpaceMeeting.restore();
221
305
  });
222
306
 
307
+ it('create adhoc meeting when conversationUrl and installedOrgID passed with enableAdhocMeetings toggle', async () => {
308
+ sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
309
+
310
+ const installedOrgID = '12345'
311
+
312
+ await meetingInfo.fetchMeetingInfo(
313
+ 'conversationUrl',
314
+ _CONVERSATION_URL_,
315
+ null,
316
+ null,
317
+ installedOrgID
318
+ );
319
+
320
+ assert.calledOnceWithExactly(
321
+ meetingInfo.createAdhocSpaceMeeting,
322
+ 'conversationUrl',
323
+ installedOrgID
324
+ );
325
+ assert.notCalled(webex.request);
326
+ meetingInfo.createAdhocSpaceMeeting.restore();
327
+ });
328
+
329
+
223
330
  it('should not call createAdhocSpaceMeeting if enableAdhocMeetings toggle is off', async () => {
224
331
  webex.config.meetings.experimental.enableAdhocMeetings = false;
225
332
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
@@ -245,7 +352,7 @@ describe('plugin-meetings', () => {
245
352
  it('should throw an error MeetingInfoV2AdhocMeetingError if not able to start adhoc meeting for a conversation', async () => {
246
353
  webex.config.meetings.experimental.enableAdhocMeetings = true;
247
354
 
248
- webex.request = sinon.stub().rejects({statusCode: 403, body: {code: 400000}});
355
+ webex.request = sinon.stub().rejects({stack: 'a stack', message: 'a message', statusCode: 403, body: {code: 400000}});
249
356
  try {
250
357
  await meetingInfo.createAdhocSpaceMeeting('conversationUrl');
251
358
  } catch (err) {
@@ -255,9 +362,301 @@ describe('plugin-meetings', () => {
255
362
  'Failed starting the adhoc meeting, Please contact support team , code=400000'
256
363
  );
257
364
  assert.equal(err.wbxAppApiCode, 400000);
365
+ assert(Metrics.sendBehavioralMetric.calledOnce);
366
+ assert.calledWith(
367
+ Metrics.sendBehavioralMetric,
368
+ BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,
369
+ {reason: 'a message', stack: 'a stack'}
370
+ );
258
371
  }
259
372
  });
260
373
 
374
+ forEach(
375
+ [
376
+ {errorCode: 403049, sendCAevents: false},
377
+ {errorCode: 403049, sendCAevents: true},
378
+ {errorCode: 403049},
379
+ {errorCode: 403104, sendCAevents: false},
380
+ {errorCode: 403104, sendCAevents: true},
381
+ {errorCode: 403104},
382
+ {errorCode: 403103, sendCAevents: false},
383
+ {errorCode: 403103, sendCAevents: true},
384
+ {errorCode: 403103},
385
+ {errorCode: 403048, sendCAevents: false},
386
+ {errorCode: 403048, sendCAevents: true},
387
+ {errorCode: 403048},
388
+ {errorCode: 403102, sendCAevents: false},
389
+ {errorCode: 403102, sendCAevents: true},
390
+ {errorCode: 403102},
391
+ {errorCode: 403101, sendCAevents: false},
392
+ {errorCode: 403101, sendCAevents: true},
393
+ {errorCode: 403101},
394
+ ],
395
+ ({errorCode, sendCAevents}) => {
396
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
397
+ const message = 'a message';
398
+ const meetingInfoData = 'meeting info';
399
+
400
+ webex.request = sinon.stub().rejects({
401
+ statusCode: 403,
402
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
403
+ url: 'http://api-url.com',
404
+ });
405
+ try {
406
+ await meetingInfo.fetchMeetingInfo(
407
+ '1234323',
408
+ _MEETING_ID_,
409
+ 'abc',
410
+ {
411
+ id: '999',
412
+ code: 'aabbcc11',
413
+ },
414
+ null,
415
+ null,
416
+ {},
417
+ {meetingId: 'meeting-id', sendCAevents}
418
+ );
419
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
420
+ } catch (err) {
421
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
422
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
423
+
424
+ if (sendCAevents) {
425
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
426
+ name: 'internal.client.meetinginfo.request',
427
+ });
428
+
429
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
430
+ name: 'client.meetinginfo.request',
431
+ options: {
432
+ meetingId: 'meeting-id'
433
+ },
434
+ });
435
+
436
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
437
+ name: 'internal.client.meetinginfo.response',
438
+ });
439
+
440
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
441
+ name: 'client.meetinginfo.response',
442
+ payload: {
443
+ identifiers: {
444
+ meetingLookupUrl: 'http://api-url.com',
445
+ },
446
+ },
447
+ options: {
448
+ meetingId: 'meeting-id',
449
+ rawError: {
450
+ statusCode: 403,
451
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
452
+ url: 'http://api-url.com',
453
+ },
454
+ },
455
+ });
456
+ } else {
457
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
458
+ }
459
+
460
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
461
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
462
+ assert.equal(err.wbxAppApiCode, errorCode);
463
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
464
+ assert(Metrics.sendBehavioralMetric.calledOnce);
465
+ assert.calledWith(
466
+ Metrics.sendBehavioralMetric,
467
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
468
+ {code: errorCode}
469
+ );
470
+ }
471
+ });
472
+ }
473
+ );
474
+
475
+ forEach(
476
+ [
477
+ {meetingId: '123', sendCAevents: true, shouldSendCAevents: true},
478
+ {sendCAevents: true, shouldSendCAevents: false},
479
+ {meetingId: '123', sendCAevents: false, shouldSendCAevents: false},
480
+ {shouldSendCAevents: false},
481
+ ],
482
+ ({meetingId, sendCAevents, shouldSendCAevents}) => {
483
+ it('should send CA metric if meetingId is provided and send CA events is authorized', async () => {
484
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323', meetingId: '123', confID: '321'}};
485
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
486
+
487
+ webex.request.resolves(requestResponse);
488
+
489
+ const result = await meetingInfo.fetchMeetingInfo(
490
+ '1234323',
491
+ _MEETING_ID_,
492
+ null,
493
+ null,
494
+ null,
495
+ null,
496
+ extraParams,
497
+ {meetingId, sendCAevents}
498
+ );
499
+
500
+ assert.calledWith(webex.request, {
501
+ method: 'POST',
502
+ service: WBXAPPAPI_SERVICE,
503
+ resource: 'meetingInfo',
504
+ body: {
505
+ supportHostKey: true,
506
+ supportCountryList: true,
507
+ meetingKey: '1234323',
508
+ ...extraParams,
509
+ },
510
+ });
511
+ assert.deepEqual(result, requestResponse);
512
+ assert(Metrics.sendBehavioralMetric.calledOnce);
513
+ assert.calledWith(
514
+ Metrics.sendBehavioralMetric,
515
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
516
+ );
517
+
518
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
519
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
520
+
521
+ if(shouldSendCAevents) {
522
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
523
+ name: 'internal.client.meetinginfo.request',
524
+ });
525
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
526
+ name: 'client.meetinginfo.request',
527
+ options: {
528
+ meetingId,
529
+ }
530
+ });
531
+
532
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
533
+ name: 'internal.client.meetinginfo.response',
534
+ });
535
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
536
+ name: 'client.meetinginfo.response',
537
+ payload: {
538
+ identifiers: {
539
+ meetingLookupUrl: result?.url,
540
+ },
541
+ },
542
+ options: {
543
+ meetingId,
544
+ globalMeetingId: requestResponse.body?.meetingId,
545
+ webexConferenceIdStr: requestResponse.body?.confID,
546
+ }
547
+ });
548
+ } else {
549
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
550
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
551
+ }
552
+ })
553
+ }
554
+ )
555
+
556
+ it('should send CA metric if meetingId is provided and send CA events is authorized', async () => {
557
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323', confID: '123', meetingId: '321'}};
558
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
559
+
560
+ webex.request.resolves(requestResponse);
561
+
562
+ const result = await meetingInfo.fetchMeetingInfo(
563
+ '1234323',
564
+ _MEETING_ID_,
565
+ null,
566
+ null,
567
+ null,
568
+ null,
569
+ extraParams,
570
+ {meetingId: 'meetingId', sendCAevents: true}
571
+ );
572
+
573
+ assert.calledWith(webex.request, {
574
+ method: 'POST',
575
+ service: WBXAPPAPI_SERVICE,
576
+ resource: 'meetingInfo',
577
+ body: {
578
+ supportHostKey: true,
579
+ supportCountryList: true,
580
+ meetingKey: '1234323',
581
+ ...extraParams,
582
+ },
583
+ });
584
+ assert.deepEqual(result, requestResponse);
585
+ assert(Metrics.sendBehavioralMetric.calledOnce);
586
+ assert.calledWith(
587
+ Metrics.sendBehavioralMetric,
588
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
589
+ );
590
+
591
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
592
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
593
+
594
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
595
+ name: 'internal.client.meetinginfo.request',
596
+ });
597
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
598
+ name: 'client.meetinginfo.request',
599
+ options: {
600
+ meetingId: 'meetingId',
601
+ }
602
+ });
603
+
604
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
605
+ name: 'internal.client.meetinginfo.response',
606
+ });
607
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
608
+ name: 'client.meetinginfo.response',
609
+ payload: {
610
+ identifiers: {
611
+ meetingLookupUrl: result?.url,
612
+ },
613
+ },
614
+ options: {
615
+ meetingId: 'meetingId',
616
+ globalMeetingId: requestResponse.body?.meetingId,
617
+ webexConferenceIdStr: requestResponse.body?.confID,
618
+ }
619
+ });
620
+ });
621
+
622
+ forEach(
623
+ [
624
+ {sendCAevents: true},
625
+ {sendCAevents: false},
626
+ ],
627
+ ({sendCAevents}) => {
628
+ it(`should not send CA metric if meetingId is not provided disregarding if sendCAevents is ${sendCAevents}`, async () => {
629
+ const message = 'a message';
630
+ const meetingInfoData = 'meeting info';
631
+
632
+ webex.request = sinon.stub().rejects({
633
+ statusCode: 403,
634
+ body: {message, code: 403102, data: {meetingInfo: meetingInfoData}},
635
+ url: 'http://api-url.com',
636
+ });
637
+ try {
638
+ await meetingInfo.fetchMeetingInfo(
639
+ '1234323',
640
+ _MEETING_ID_,
641
+ 'abc',
642
+ {
643
+ id: '999',
644
+ code: 'aabbcc11',
645
+ },
646
+ null,
647
+ null,
648
+ undefined,
649
+ {meetingId: undefined, sendCAevents}
650
+ );
651
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
652
+ } catch (err) {
653
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
654
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
655
+ }
656
+ });
657
+ }
658
+ );
659
+
261
660
  it('should throw MeetingInfoV2PasswordError for 403 response', async () => {
262
661
  const FAKE_MEETING_INFO = {blablabla: 'some_fake_meeting_info'};
263
662
 
@@ -328,11 +727,51 @@ describe('plugin-meetings', () => {
328
727
  await runTest(423001, false);
329
728
  });
330
729
  });
730
+
731
+ it('should throw an error and not fetch with an "empty" body', async () => {
732
+ const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
733
+ const requestResponse = {statusCode: 200, body};
734
+
735
+ sinon
736
+ .stub(MeetingInfoUtil, 'getDestinationType')
737
+ .returns(Promise.resolve({type: _LOCUS_ID_, destination: '123456'}));
738
+ sinon.stub(MeetingInfoUtil, 'getRequestBody').returns(Promise.resolve(body));
739
+ webex.request.resolves(requestResponse);
740
+
741
+ try {
742
+ await meetingInfo.fetchMeetingInfo({
743
+ type: _LOCUS_ID_,
744
+ });
745
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
746
+ } catch (err) {
747
+ assert.calledWith(
748
+ Metrics.sendBehavioralMetric,
749
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,
750
+ {
751
+ reason: 'Not enough information to fetch meeting info',
752
+ destinationType: _LOCUS_ID_,
753
+ webExMeetingId: undefined,
754
+ sipUri: undefined,
755
+ }
756
+ );
757
+ assert(Metrics.sendBehavioralMetric.calledOnce);
758
+ assert.calledWith(
759
+ Metrics.sendBehavioralMetric,
760
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE
761
+ );
762
+ assert.deepEqual(err.message, 'Not enough information to fetch meeting info');
763
+ }
764
+
765
+ MeetingInfoUtil.getDestinationType.restore();
766
+ MeetingInfoUtil.getRequestBody.restore();
767
+ });
331
768
  });
332
769
 
333
770
  describe('createAdhocSpaceMeeting', () => {
334
- it('Make a request to /instantSpace when conversationUrl', async () => {
335
- const conversationUrl = 'https://conversationUrl/xxx';
771
+ const conversationUrl = 'https://conversationUrl/xxx';
772
+ const installedOrgID = '12345';
773
+
774
+ const setup = () => {
336
775
  const invitee = [];
337
776
 
338
777
  invitee.push({
@@ -345,7 +784,13 @@ describe('plugin-meetings', () => {
345
784
  ciUserUuid: conversation.participants.items[1].entryUUID,
346
785
  });
347
786
 
348
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
787
+ return {invitee}
788
+ }
789
+
790
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
791
+ const {invitee} = setup();
792
+
793
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
349
794
 
350
795
  assert.calledWith(
351
796
  webex.internal.conversation.get,
@@ -366,7 +811,78 @@ describe('plugin-meetings', () => {
366
811
  });
367
812
  assert(Metrics.sendBehavioralMetric.calledOnce);
368
813
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
814
+ assert.deepEqual(result, {
815
+ body: {},
816
+ statusCode: 200
817
+ });
369
818
  });
819
+
820
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
821
+ const {invitee} = setup();
822
+
823
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
824
+
825
+ assert.calledWith(
826
+ webex.internal.conversation.get,
827
+ {url: conversationUrl},
828
+ {includeParticipants: true, disableTransform: true}
829
+ );
830
+
831
+ assert.calledWith(webex.request, {
832
+ method: 'POST',
833
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
834
+ body: {
835
+ title: conversation.displayName,
836
+ spaceUrl: conversation.url,
837
+ keyUrl: conversation.encryptionKeyUrl,
838
+ kroUrl: conversation.kmsResourceObjectUrl,
839
+ invitees: invitee,
840
+ installedOrgID,
841
+ },
842
+ });
843
+ assert(Metrics.sendBehavioralMetric.calledOnce);
844
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
845
+ });
846
+
847
+
848
+ forEach(
849
+ [
850
+ {errorCode: 403049},
851
+ {errorCode: 403104},
852
+ {errorCode: 403103},
853
+ {errorCode: 403048},
854
+ {errorCode: 403102},
855
+ {errorCode: 403101},
856
+ ],
857
+ ({errorCode}) => {
858
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
859
+ const message = 'a message';
860
+ const meetingInfoData = 'meeting info';
861
+
862
+ webex.request = sinon.stub().rejects({
863
+ statusCode: 403,
864
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
865
+ });
866
+ try {
867
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
868
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
869
+ } catch (err) {
870
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
871
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
872
+ assert.equal(err.wbxAppApiCode, errorCode);
873
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
874
+
875
+ assert(Metrics.sendBehavioralMetric.calledOnce);
876
+ assert.calledWith(
877
+ Metrics.sendBehavioralMetric,
878
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
879
+ {code: errorCode}
880
+ );
881
+
882
+ }
883
+ });
884
+ }
885
+ );
370
886
  });
371
887
  });
372
888
  });
@@ -150,6 +150,7 @@ describe('plugin-meetings', () => {
150
150
  });
151
151
 
152
152
  describe('#getRequestBody', () => {
153
+
153
154
  it('for _PERSONAL_ROOM_', () => {
154
155
  const res = MeetingInfoUtil.getRequestBody({
155
156
  type: _PERSONAL_ROOM_,
@@ -219,6 +220,26 @@ describe('plugin-meetings', () => {
219
220
  'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280'
220
221
  );
221
222
  });
223
+
224
+ it('allows for extra params to be provided', () => {
225
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
226
+
227
+ const res = MeetingInfoUtil.getRequestBody({
228
+ type: _CONVERSATION_URL_,
229
+ destination: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
230
+ extraParams,
231
+ });
232
+
233
+ assert.deepEqual(
234
+ res,
235
+ {
236
+ conversationUrl: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
237
+ supportHostKey: true,
238
+ supportCountryList: true,
239
+ ...extraParams,
240
+ }
241
+ );
242
+ });
222
243
  });
223
244
 
224
245
  describe('#getWebexSite', () => {
@@ -48,5 +48,19 @@ describe('plugin-meetings', () => {
48
48
  assert.deepEqual(meetingCollection.getByKey('value', 'test'), {value: 'test', id: uuid1});
49
49
  });
50
50
  });
51
+
52
+ describe('#getActiveBreakoutLocus', () => {
53
+ beforeEach(() => {
54
+ meetingCollection.meetings.test = {breakouts: {url: 'url', isActiveBreakout: true}, id: uuid1};
55
+ });
56
+ it('return null if empty breakoutUrl', () => {
57
+ assert.deepEqual(meetingCollection.getActiveBreakoutLocus(), null);
58
+ });
59
+
60
+ it('should get the meeting which joined breakout by breakoutUrl', () => {
61
+ assert.deepEqual(meetingCollection.getActiveBreakoutLocus('url'), {
62
+ breakouts: {url: 'url', isActiveBreakout: true}, id: uuid1});
63
+ });
64
+ });
51
65
  });
52
66
  });