@webex/plugin-meetings 3.0.0-beta.26 → 3.0.0-beta.261

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 (361) 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 +841 -19
  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/webex-errors.js +28 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +5 -10
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +196 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/enums.js +14 -2
  31. package/dist/controls-options-manager/enums.js.map +1 -1
  32. package/dist/controls-options-manager/index.js +109 -15
  33. package/dist/controls-options-manager/index.js.map +1 -1
  34. package/dist/controls-options-manager/types.js +7 -0
  35. package/dist/controls-options-manager/types.js.map +1 -0
  36. package/dist/controls-options-manager/util.js +309 -18
  37. package/dist/controls-options-manager/util.js.map +1 -1
  38. package/dist/index.js +112 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/interpretation/collection.js +23 -0
  41. package/dist/interpretation/collection.js.map +1 -0
  42. package/dist/interpretation/index.js +366 -0
  43. package/dist/interpretation/index.js.map +1 -0
  44. package/dist/interpretation/siLanguage.js +25 -0
  45. package/dist/interpretation/siLanguage.js.map +1 -0
  46. package/dist/locus-info/controlsUtils.js +91 -2
  47. package/dist/locus-info/controlsUtils.js.map +1 -1
  48. package/dist/locus-info/index.js +381 -62
  49. package/dist/locus-info/index.js.map +1 -1
  50. package/dist/locus-info/infoUtils.js +7 -1
  51. package/dist/locus-info/infoUtils.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +224 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +58 -116
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +60 -121
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/meeting/in-meeting-actions.js +82 -2
  63. package/dist/meeting/in-meeting-actions.js.map +1 -1
  64. package/dist/meeting/index.js +3022 -2795
  65. package/dist/meeting/index.js.map +1 -1
  66. package/dist/meeting/locusMediaRequest.js +292 -0
  67. package/dist/meeting/locusMediaRequest.js.map +1 -0
  68. package/dist/meeting/muteState.js +230 -124
  69. package/dist/meeting/muteState.js.map +1 -1
  70. package/dist/meeting/request.js +256 -196
  71. package/dist/meeting/request.js.map +1 -1
  72. package/dist/meeting/util.js +601 -417
  73. package/dist/meeting/util.js.map +1 -1
  74. package/dist/meeting-info/index.js +70 -7
  75. package/dist/meeting-info/index.js.map +1 -1
  76. package/dist/meeting-info/meeting-info-v2.js +189 -51
  77. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  78. package/dist/meeting-info/util.js +1 -1
  79. package/dist/meeting-info/util.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +36 -36
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +372 -90
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +10 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +209 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/multistream/sendSlotManager.js +233 -0
  125. package/dist/multistream/sendSlotManager.js.map +1 -0
  126. package/dist/reachability/index.js +161 -57
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +17 -8
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reconnection-manager/index.js +199 -154
  131. package/dist/reconnection-manager/index.js.map +1 -1
  132. package/dist/recording-controller/index.js +21 -2
  133. package/dist/recording-controller/index.js.map +1 -1
  134. package/dist/recording-controller/util.js +9 -8
  135. package/dist/recording-controller/util.js.map +1 -1
  136. package/dist/roap/index.js +23 -29
  137. package/dist/roap/index.js.map +1 -1
  138. package/dist/roap/request.js +112 -97
  139. package/dist/roap/request.js.map +1 -1
  140. package/dist/roap/turnDiscovery.js +96 -36
  141. package/dist/roap/turnDiscovery.js.map +1 -1
  142. package/dist/rtcMetrics/constants.js +12 -0
  143. package/dist/rtcMetrics/constants.js.map +1 -0
  144. package/dist/rtcMetrics/index.js +117 -0
  145. package/dist/rtcMetrics/index.js.map +1 -0
  146. package/dist/statsAnalyzer/index.js +51 -34
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  149. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  150. package/dist/types/annotation/annotation.types.d.ts +42 -0
  151. package/dist/types/annotation/constants.d.ts +31 -0
  152. package/dist/types/annotation/index.d.ts +117 -0
  153. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  154. package/dist/types/breakouts/events.d.ts +8 -0
  155. package/dist/types/breakouts/request.d.ts +22 -0
  156. package/dist/types/breakouts/utils.d.ts +15 -0
  157. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  158. package/dist/types/common/queue.d.ts +9 -7
  159. package/dist/types/config.d.ts +1 -6
  160. package/dist/types/constants.d.ts +155 -21
  161. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  162. package/dist/types/controls-options-manager/index.d.ts +17 -1
  163. package/dist/types/controls-options-manager/types.d.ts +43 -0
  164. package/dist/types/controls-options-manager/util.d.ts +1 -7
  165. package/dist/types/index.d.ts +6 -4
  166. package/dist/types/interpretation/collection.d.ts +5 -0
  167. package/dist/types/interpretation/index.d.ts +5 -0
  168. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  169. package/dist/types/locus-info/index.d.ts +57 -4
  170. package/dist/types/locus-info/parser.d.ts +65 -6
  171. package/dist/types/media/index.d.ts +2 -0
  172. package/dist/types/media/properties.d.ts +34 -48
  173. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  174. package/dist/types/meeting/index.d.ts +344 -506
  175. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  176. package/dist/types/meeting/muteState.d.ts +99 -23
  177. package/dist/types/meeting/request.d.ts +72 -43
  178. package/dist/types/meeting/util.d.ts +101 -1
  179. package/dist/types/meeting-info/index.d.ts +13 -1
  180. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  181. package/dist/types/meetings/collection.d.ts +8 -0
  182. package/dist/types/meetings/index.d.ts +86 -12
  183. package/dist/types/meetings/meetings.types.d.ts +4 -0
  184. package/dist/types/member/index.d.ts +13 -0
  185. package/dist/types/member/types.d.ts +32 -0
  186. package/dist/types/members/collection.d.ts +5 -0
  187. package/dist/types/members/index.d.ts +35 -2
  188. package/dist/types/members/request.d.ts +73 -9
  189. package/dist/types/members/types.d.ts +24 -0
  190. package/dist/types/members/util.d.ts +209 -1
  191. package/dist/types/metrics/constants.d.ts +9 -4
  192. package/dist/types/metrics/index.d.ts +4 -119
  193. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  194. package/dist/types/multistream/receiveSlot.d.ts +16 -12
  195. package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
  196. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  197. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  198. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  199. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  200. package/dist/types/reachability/index.d.ts +44 -7
  201. package/dist/types/reachability/request.d.ts +7 -3
  202. package/dist/types/reconnection-manager/index.d.ts +9 -0
  203. package/dist/types/recording-controller/index.d.ts +15 -1
  204. package/dist/types/recording-controller/util.d.ts +5 -4
  205. package/dist/types/roap/request.d.ts +15 -11
  206. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  207. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  208. package/dist/types/rtcMetrics/index.d.ts +47 -0
  209. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  210. package/package.json +23 -20
  211. package/src/annotation/annotation.types.ts +50 -0
  212. package/src/annotation/constants.ts +36 -0
  213. package/src/annotation/index.ts +328 -0
  214. package/src/breakouts/README.md +44 -14
  215. package/src/breakouts/breakout.ts +87 -9
  216. package/src/breakouts/edit-lock-error.ts +25 -0
  217. package/src/breakouts/events.ts +56 -0
  218. package/src/breakouts/index.ts +710 -10
  219. package/src/breakouts/request.ts +55 -0
  220. package/src/breakouts/utils.ts +57 -0
  221. package/src/common/errors/webex-errors.ts +27 -2
  222. package/src/common/logs/logger-proxy.ts +1 -1
  223. package/src/common/queue.ts +22 -8
  224. package/src/config.ts +4 -9
  225. package/src/constants.ts +178 -18
  226. package/src/controls-options-manager/enums.ts +12 -0
  227. package/src/controls-options-manager/index.ts +116 -21
  228. package/src/controls-options-manager/types.ts +59 -0
  229. package/src/controls-options-manager/util.ts +294 -14
  230. package/src/index.ts +40 -0
  231. package/src/interpretation/README.md +60 -0
  232. package/src/interpretation/collection.ts +19 -0
  233. package/src/interpretation/index.ts +332 -0
  234. package/src/interpretation/siLanguage.ts +18 -0
  235. package/src/locus-info/controlsUtils.ts +108 -0
  236. package/src/locus-info/index.ts +412 -59
  237. package/src/locus-info/infoUtils.ts +10 -2
  238. package/src/locus-info/mediaSharesUtils.ts +48 -0
  239. package/src/locus-info/parser.ts +231 -39
  240. package/src/locus-info/selfUtils.ts +81 -5
  241. package/src/media/index.ts +100 -122
  242. package/src/media/properties.ts +70 -108
  243. package/src/meeting/in-meeting-actions.ts +163 -3
  244. package/src/meeting/index.ts +2471 -2306
  245. package/src/meeting/locusMediaRequest.ts +313 -0
  246. package/src/meeting/muteState.ts +229 -131
  247. package/src/meeting/request.ts +172 -121
  248. package/src/meeting/util.ts +588 -394
  249. package/src/meeting-info/index.ts +79 -8
  250. package/src/meeting-info/meeting-info-v2.ts +168 -14
  251. package/src/meeting-info/util.ts +1 -1
  252. package/src/meeting-info/utilv2.ts +23 -23
  253. package/src/meetings/collection.ts +20 -0
  254. package/src/meetings/index.ts +414 -108
  255. package/src/meetings/meetings.types.ts +12 -0
  256. package/src/meetings/request.ts +2 -0
  257. package/src/meetings/util.ts +103 -4
  258. package/src/member/index.ts +49 -0
  259. package/src/member/types.ts +38 -0
  260. package/src/member/util.ts +127 -25
  261. package/src/members/collection.ts +8 -0
  262. package/src/members/index.ts +107 -6
  263. package/src/members/request.ts +97 -17
  264. package/src/members/types.ts +28 -0
  265. package/src/members/util.ts +319 -240
  266. package/src/metrics/constants.ts +9 -4
  267. package/src/metrics/index.ts +1 -490
  268. package/src/multistream/mediaRequestManager.ts +289 -79
  269. package/src/multistream/receiveSlot.ts +55 -18
  270. package/src/multistream/receiveSlotManager.ts +46 -24
  271. package/src/multistream/remoteMedia.ts +27 -2
  272. package/src/multistream/remoteMediaGroup.ts +59 -0
  273. package/src/multistream/remoteMediaManager.ts +148 -30
  274. package/src/multistream/sendSlotManager.ts +170 -0
  275. package/src/reachability/index.ts +165 -37
  276. package/src/reachability/request.ts +17 -8
  277. package/src/reconnection-manager/index.ts +81 -54
  278. package/src/recording-controller/index.ts +20 -3
  279. package/src/recording-controller/util.ts +26 -9
  280. package/src/roap/index.ts +23 -30
  281. package/src/roap/request.ts +100 -104
  282. package/src/roap/turnDiscovery.ts +51 -25
  283. package/src/rtcMetrics/constants.ts +3 -0
  284. package/src/rtcMetrics/index.ts +100 -0
  285. package/src/statsAnalyzer/index.ts +73 -35
  286. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  287. package/test/integration/spec/converged-space-meetings.js +233 -0
  288. package/test/integration/spec/journey.js +320 -261
  289. package/test/integration/spec/space-meeting.js +76 -3
  290. package/test/unit/spec/annotation/index.ts +418 -0
  291. package/test/unit/spec/breakouts/breakout.ts +142 -24
  292. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  293. package/test/unit/spec/breakouts/events.ts +89 -0
  294. package/test/unit/spec/breakouts/index.ts +1545 -48
  295. package/test/unit/spec/breakouts/request.ts +104 -0
  296. package/test/unit/spec/breakouts/utils.js +72 -0
  297. package/test/unit/spec/common/queue.js +31 -2
  298. package/test/unit/spec/controls-options-manager/index.js +163 -0
  299. package/test/unit/spec/controls-options-manager/util.js +576 -60
  300. package/test/unit/spec/fixture/locus.js +1 -0
  301. package/test/unit/spec/interpretation/collection.ts +15 -0
  302. package/test/unit/spec/interpretation/index.ts +589 -0
  303. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  304. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  305. package/test/unit/spec/locus-info/index.js +1283 -33
  306. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  307. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  308. package/test/unit/spec/locus-info/parser.js +62 -22
  309. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  310. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  311. package/test/unit/spec/media/index.ts +104 -37
  312. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  313. package/test/unit/spec/meeting/index.js +4095 -1913
  314. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  315. package/test/unit/spec/meeting/muteState.js +408 -208
  316. package/test/unit/spec/meeting/request.js +440 -45
  317. package/test/unit/spec/meeting/utils.js +679 -64
  318. package/test/unit/spec/meeting-info/index.js +293 -0
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
  320. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  321. package/test/unit/spec/meetings/collection.js +14 -0
  322. package/test/unit/spec/meetings/index.js +941 -151
  323. package/test/unit/spec/meetings/utils.js +206 -2
  324. package/test/unit/spec/member/index.js +58 -4
  325. package/test/unit/spec/member/util.js +479 -35
  326. package/test/unit/spec/members/index.js +319 -1
  327. package/test/unit/spec/members/request.js +206 -27
  328. package/test/unit/spec/members/utils.js +184 -0
  329. package/test/unit/spec/metrics/index.js +1 -50
  330. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  331. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  332. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  333. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  334. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  335. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  336. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  337. package/test/unit/spec/reachability/index.ts +343 -9
  338. package/test/unit/spec/reachability/request.js +68 -0
  339. package/test/unit/spec/reconnection-manager/index.js +84 -9
  340. package/test/unit/spec/recording-controller/index.js +294 -218
  341. package/test/unit/spec/recording-controller/util.js +223 -96
  342. package/test/unit/spec/roap/index.ts +31 -51
  343. package/test/unit/spec/roap/request.ts +203 -85
  344. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  345. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  346. package/test/unit/spec/stats-analyzer/index.js +29 -2
  347. package/test/utils/constants.js +9 -0
  348. package/test/utils/integrationTestUtils.js +46 -0
  349. package/test/utils/testUtils.js +0 -45
  350. package/test/utils/webex-config.js +4 -0
  351. package/test/utils/webex-test-users.js +6 -3
  352. package/dist/meeting/effectsState.js +0 -262
  353. package/dist/meeting/effectsState.js.map +0 -1
  354. package/dist/metrics/config.js +0 -299
  355. package/dist/metrics/config.js.map +0 -1
  356. package/dist/types/meeting/effectsState.d.ts +0 -42
  357. package/dist/types/metrics/config.d.ts +0 -178
  358. package/src/index.js +0 -16
  359. package/src/meeting/effectsState.ts +0 -211
  360. package/src/metrics/config.ts +0 -495
  361. 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,297 @@ 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
+ );
371
+ }
372
+ });
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'}};
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
+ }
545
+ });
546
+ } else {
547
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
548
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
549
+ }
550
+ })
258
551
  }
552
+ )
553
+
554
+ it('should send CA metric if meetingId is provided and send CA events is authorized', async () => {
555
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
556
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
557
+
558
+ webex.request.resolves(requestResponse);
559
+
560
+ const result = await meetingInfo.fetchMeetingInfo(
561
+ '1234323',
562
+ _MEETING_ID_,
563
+ null,
564
+ null,
565
+ null,
566
+ null,
567
+ extraParams,
568
+ {meetingId: 'meetingId', sendCAevents: true}
569
+ );
570
+
571
+ assert.calledWith(webex.request, {
572
+ method: 'POST',
573
+ service: WBXAPPAPI_SERVICE,
574
+ resource: 'meetingInfo',
575
+ body: {
576
+ supportHostKey: true,
577
+ supportCountryList: true,
578
+ meetingKey: '1234323',
579
+ ...extraParams,
580
+ },
581
+ });
582
+ assert.deepEqual(result, requestResponse);
583
+ assert(Metrics.sendBehavioralMetric.calledOnce);
584
+ assert.calledWith(
585
+ Metrics.sendBehavioralMetric,
586
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
587
+ );
588
+
589
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
590
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
591
+
592
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
593
+ name: 'internal.client.meetinginfo.request',
594
+ });
595
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
596
+ name: 'client.meetinginfo.request',
597
+ options: {
598
+ meetingId: 'meetingId',
599
+ }
600
+ });
601
+
602
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
603
+ name: 'internal.client.meetinginfo.response',
604
+ });
605
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
606
+ name: 'client.meetinginfo.response',
607
+ payload: {
608
+ identifiers: {
609
+ meetingLookupUrl: result?.url,
610
+ },
611
+ },
612
+ options: {
613
+ meetingId: 'meetingId',
614
+ }
615
+ });
259
616
  });
260
617
 
618
+ forEach(
619
+ [
620
+ {sendCAevents: true},
621
+ {sendCAevents: false},
622
+ ],
623
+ ({sendCAevents}) => {
624
+ it(`should not send CA metric if meetingId is not provided disregarding if sendCAevents is ${sendCAevents}`, async () => {
625
+ const message = 'a message';
626
+ const meetingInfoData = 'meeting info';
627
+
628
+ webex.request = sinon.stub().rejects({
629
+ statusCode: 403,
630
+ body: {message, code: 403102, data: {meetingInfo: meetingInfoData}},
631
+ url: 'http://api-url.com',
632
+ });
633
+ try {
634
+ await meetingInfo.fetchMeetingInfo(
635
+ '1234323',
636
+ _MEETING_ID_,
637
+ 'abc',
638
+ {
639
+ id: '999',
640
+ code: 'aabbcc11',
641
+ },
642
+ null,
643
+ null,
644
+ undefined,
645
+ {meetingId: undefined, sendCAevents}
646
+ );
647
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
648
+ } catch (err) {
649
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
650
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
651
+ }
652
+ });
653
+ }
654
+ );
655
+
261
656
  it('should throw MeetingInfoV2PasswordError for 403 response', async () => {
262
657
  const FAKE_MEETING_INFO = {blablabla: 'some_fake_meeting_info'};
263
658
 
@@ -328,11 +723,51 @@ describe('plugin-meetings', () => {
328
723
  await runTest(423001, false);
329
724
  });
330
725
  });
726
+
727
+ it('should throw an error and not fetch with an "empty" body', async () => {
728
+ const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
729
+ const requestResponse = {statusCode: 200, body};
730
+
731
+ sinon
732
+ .stub(MeetingInfoUtil, 'getDestinationType')
733
+ .returns(Promise.resolve({type: _LOCUS_ID_, destination: '123456'}));
734
+ sinon.stub(MeetingInfoUtil, 'getRequestBody').returns(Promise.resolve(body));
735
+ webex.request.resolves(requestResponse);
736
+
737
+ try {
738
+ await meetingInfo.fetchMeetingInfo({
739
+ type: _LOCUS_ID_,
740
+ });
741
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
742
+ } catch (err) {
743
+ assert.calledWith(
744
+ Metrics.sendBehavioralMetric,
745
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,
746
+ {
747
+ reason: 'Not enough information to fetch meeting info',
748
+ destinationType: _LOCUS_ID_,
749
+ webExMeetingId: undefined,
750
+ sipUri: undefined,
751
+ }
752
+ );
753
+ assert(Metrics.sendBehavioralMetric.calledOnce);
754
+ assert.calledWith(
755
+ Metrics.sendBehavioralMetric,
756
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE
757
+ );
758
+ assert.deepEqual(err.message, 'Not enough information to fetch meeting info');
759
+ }
760
+
761
+ MeetingInfoUtil.getDestinationType.restore();
762
+ MeetingInfoUtil.getRequestBody.restore();
763
+ });
331
764
  });
332
765
 
333
766
  describe('createAdhocSpaceMeeting', () => {
334
- it('Make a request to /instantSpace when conversationUrl', async () => {
335
- const conversationUrl = 'https://conversationUrl/xxx';
767
+ const conversationUrl = 'https://conversationUrl/xxx';
768
+ const installedOrgID = '12345';
769
+
770
+ const setup = () => {
336
771
  const invitee = [];
337
772
 
338
773
  invitee.push({
@@ -345,7 +780,13 @@ describe('plugin-meetings', () => {
345
780
  ciUserUuid: conversation.participants.items[1].entryUUID,
346
781
  });
347
782
 
348
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
783
+ return {invitee}
784
+ }
785
+
786
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
787
+ const {invitee} = setup();
788
+
789
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
349
790
 
350
791
  assert.calledWith(
351
792
  webex.internal.conversation.get,
@@ -366,7 +807,78 @@ describe('plugin-meetings', () => {
366
807
  });
367
808
  assert(Metrics.sendBehavioralMetric.calledOnce);
368
809
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
810
+ assert.deepEqual(result, {
811
+ body: {},
812
+ statusCode: 200
813
+ });
369
814
  });
815
+
816
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
817
+ const {invitee} = setup();
818
+
819
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
820
+
821
+ assert.calledWith(
822
+ webex.internal.conversation.get,
823
+ {url: conversationUrl},
824
+ {includeParticipants: true, disableTransform: true}
825
+ );
826
+
827
+ assert.calledWith(webex.request, {
828
+ method: 'POST',
829
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
830
+ body: {
831
+ title: conversation.displayName,
832
+ spaceUrl: conversation.url,
833
+ keyUrl: conversation.encryptionKeyUrl,
834
+ kroUrl: conversation.kmsResourceObjectUrl,
835
+ invitees: invitee,
836
+ installedOrgID,
837
+ },
838
+ });
839
+ assert(Metrics.sendBehavioralMetric.calledOnce);
840
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
841
+ });
842
+
843
+
844
+ forEach(
845
+ [
846
+ {errorCode: 403049},
847
+ {errorCode: 403104},
848
+ {errorCode: 403103},
849
+ {errorCode: 403048},
850
+ {errorCode: 403102},
851
+ {errorCode: 403101},
852
+ ],
853
+ ({errorCode}) => {
854
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
855
+ const message = 'a message';
856
+ const meetingInfoData = 'meeting info';
857
+
858
+ webex.request = sinon.stub().rejects({
859
+ statusCode: 403,
860
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
861
+ });
862
+ try {
863
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
864
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
865
+ } catch (err) {
866
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
867
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
868
+ assert.equal(err.wbxAppApiCode, errorCode);
869
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
870
+
871
+ assert(Metrics.sendBehavioralMetric.calledOnce);
872
+ assert.calledWith(
873
+ Metrics.sendBehavioralMetric,
874
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
875
+ {code: errorCode}
876
+ );
877
+
878
+ }
879
+ });
880
+ }
881
+ );
370
882
  });
371
883
  });
372
884
  });
@@ -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
  });