@webex/plugin-meetings 3.0.0-beta.27 → 3.0.0-beta.271

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 (362) 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 +381 -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 +224 -63
  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 +3118 -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 +70 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +189 -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 -5
  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 +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  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 +51 -34
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  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 +65 -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 +16 -12
  198. package/dist/types/multistream/receiveSlotManager.d.ts +19 -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 +412 -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 +231 -39
  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 +2526 -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 +79 -8
  254. package/src/meeting-info/meeting-info-v2.ts +168 -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 +107 -6
  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 +55 -18
  274. package/src/multistream/receiveSlotManager.ts +46 -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 +73 -35
  290. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  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 +1283 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  312. package/test/unit/spec/locus-info/parser.js +62 -22
  313. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  314. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  315. package/test/unit/spec/media/index.ts +104 -37
  316. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  317. package/test/unit/spec/meeting/index.js +4307 -1938
  318. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  319. package/test/unit/spec/meeting/muteState.js +408 -208
  320. package/test/unit/spec/meeting/request.js +440 -45
  321. package/test/unit/spec/meeting/utils.js +679 -64
  322. package/test/unit/spec/meeting-info/index.js +293 -0
  323. package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
  324. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  325. package/test/unit/spec/meetings/collection.js +14 -0
  326. package/test/unit/spec/meetings/index.js +1007 -177
  327. package/test/unit/spec/meetings/utils.js +206 -2
  328. package/test/unit/spec/member/index.js +58 -4
  329. package/test/unit/spec/member/util.js +479 -35
  330. package/test/unit/spec/members/index.js +319 -1
  331. package/test/unit/spec/members/request.js +206 -27
  332. package/test/unit/spec/members/utils.js +184 -0
  333. package/test/unit/spec/metrics/index.js +1 -50
  334. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  335. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  336. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  337. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  338. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  339. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  340. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  341. package/test/unit/spec/reachability/index.ts +549 -9
  342. package/test/unit/spec/reachability/request.js +68 -0
  343. package/test/unit/spec/reconnection-manager/index.js +84 -9
  344. package/test/unit/spec/recording-controller/index.js +294 -218
  345. package/test/unit/spec/recording-controller/util.js +223 -96
  346. package/test/unit/spec/roap/index.ts +31 -51
  347. package/test/unit/spec/roap/request.ts +203 -85
  348. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  349. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  350. package/test/unit/spec/stats-analyzer/index.js +29 -2
  351. package/test/utils/integrationTestUtils.js +46 -0
  352. package/test/utils/testUtils.js +0 -52
  353. package/dist/meeting/effectsState.js +0 -262
  354. package/dist/meeting/effectsState.js.map +0 -1
  355. package/dist/metrics/config.js +0 -299
  356. package/dist/metrics/config.js.map +0 -1
  357. package/dist/types/meeting/effectsState.d.ts +0 -42
  358. package/dist/types/metrics/config.d.ts +0 -178
  359. package/src/index.js +0 -16
  360. package/src/meeting/effectsState.ts +0 -211
  361. package/src/metrics/config.ts +0 -495
  362. 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
  });