@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
@@ -7,7 +7,7 @@ describe('plugin-meetings', () => {
7
7
  const info = {
8
8
  displayHints: {
9
9
  moderator: ['HINT_1', 'HINT_2'],
10
- joined: ['HINT_3'],
10
+ joined: ['HINT_3', 'VOIP_IS_ENABLED'],
11
11
  coHost: ['HINT_4'],
12
12
  },
13
13
  };
@@ -27,47 +27,66 @@ describe('plugin-meetings', () => {
27
27
  describe('parse', () => {
28
28
  it('only gives includes display hints when user has the correct role', () => {
29
29
  assert.deepEqual(InfoUtils.parse(info, ['MODERATOR']), {
30
- policy: {HINT_3: true},
30
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
31
31
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
32
32
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
33
- userDisplayHints: ['HINT_3', 'HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND'],
33
+ userDisplayHints: [
34
+ 'HINT_3',
35
+ 'VOIP_IS_ENABLED',
36
+ 'HINT_1',
37
+ 'HINT_2',
38
+ 'LOWER_SOMEONE_ELSES_HAND',
39
+ ],
34
40
  });
35
41
 
36
42
  assert.deepEqual(InfoUtils.parse(info, ['MODERATOR', 'COHOST']), {
37
- policy: {HINT_3: true},
43
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
38
44
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
39
45
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
40
- userDisplayHints: ['HINT_3', 'HINT_4', 'LOWER_SOMEONE_ELSES_HAND', 'HINT_1', 'HINT_2'],
46
+ userDisplayHints: [
47
+ 'HINT_3',
48
+ 'VOIP_IS_ENABLED',
49
+ 'HINT_4',
50
+ 'LOWER_SOMEONE_ELSES_HAND',
51
+ 'HINT_1',
52
+ 'HINT_2',
53
+ ],
41
54
  });
42
55
 
43
56
  assert.deepEqual(InfoUtils.parse(info, ['COHOST']), {
44
- policy: {HINT_3: true},
57
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
45
58
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
46
59
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
47
- userDisplayHints: ['HINT_3', 'HINT_4', 'LOWER_SOMEONE_ELSES_HAND'],
60
+ userDisplayHints: ['HINT_3', 'VOIP_IS_ENABLED', 'HINT_4', 'LOWER_SOMEONE_ELSES_HAND'],
48
61
  });
49
62
 
50
63
  assert.deepEqual(InfoUtils.parse(info, []), {
51
- policy: {HINT_3: true},
64
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
52
65
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
53
66
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
54
- userDisplayHints: ['HINT_3'],
67
+ userDisplayHints: ['HINT_3', 'VOIP_IS_ENABLED'],
55
68
  });
56
69
  });
57
70
 
58
- it('only gives includes display hints when user has joined the meeting role', () => {
71
+ it('only includes interstitial display hints when user has not joined the meeting', () => {
59
72
  assert.deepEqual(InfoUtils.parse(info, ['MODERATOR'], false), {
60
- policy: {HINT_3: true},
73
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
61
74
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
62
75
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
63
- userDisplayHints: ['HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND'],
76
+ userDisplayHints: ['VOIP_IS_ENABLED', 'HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND'],
64
77
  });
65
78
 
66
79
  assert.deepEqual(InfoUtils.parse(info, ['MODERATOR'], true), {
67
- policy: {HINT_3: true},
80
+ policy: {HINT_3: true, VOIP_IS_ENABLED: true},
68
81
  moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
69
82
  coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
70
- userDisplayHints: ['HINT_3', 'HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND'],
83
+ userDisplayHints: [
84
+ 'HINT_3',
85
+ 'VOIP_IS_ENABLED',
86
+ 'HINT_1',
87
+ 'HINT_2',
88
+ 'LOWER_SOMEONE_ELSES_HAND',
89
+ ],
71
90
  });
72
91
  });
73
92
 
@@ -96,7 +115,10 @@ describe('plugin-meetings', () => {
96
115
  HINT_2: true,
97
116
  });
98
117
 
99
- assert.deepEqual(InfoUtils.parseDisplayHintSection(info, 'joined'), {HINT_3: true});
118
+ assert.deepEqual(InfoUtils.parseDisplayHintSection(info, 'joined'), {
119
+ HINT_3: true,
120
+ VOIP_IS_ENABLED: true,
121
+ });
100
122
 
101
123
  assert.deepEqual(InfoUtils.parseDisplayHintSection({}, 'joined'), {});
102
124
 
@@ -0,0 +1,32 @@
1
+ import MediaSharesUtils from '@webex/plugin-meetings/src/locus-info/mediaSharesUtils';
2
+ import {assert} from "chai";
3
+ import Sinon from "sinon";
4
+
5
+ describe('getShareInstanceId', () => {
6
+ it('getShareInstanceId return correct shareInstanceId value', () => {
7
+ const stub = Sinon.stub(MediaSharesUtils, 'extractContent').returns({ floor:{shareInstanceId:'shareInstanceId'}});
8
+ const shareInstanceId = MediaSharesUtils.getShareInstanceId();
9
+ assert.equal(shareInstanceId,'shareInstanceId');
10
+ stub.restore();
11
+ });
12
+ });
13
+
14
+ describe('getContentUrl', () => {
15
+ it('getContentUrl return correct url value', () => {
16
+ const stub = Sinon.stub(MediaSharesUtils, 'extractContent').returns({url:'url'});
17
+ const url = MediaSharesUtils.getContentUrl();
18
+ assert.equal(url,'url');
19
+ stub.restore();
20
+ });
21
+ });
22
+
23
+ describe('getContentBeneficiaryDeviceUrl', () => {
24
+ it('getContentBeneficiaryDeviceUrl return correct deviceUrl value', () => {
25
+ const mockContentBeneficiaryDeviceUrl = "https://wdm-a.wbx2.com/wdm/api/v1/devices/e9ffd8a1-1fae-42d1-afbe-013e951f93ab"
26
+ const stub = Sinon.stub(MediaSharesUtils, 'extractContentFloor').returns({ beneficiary: {deviceUrl : mockContentBeneficiaryDeviceUrl}});
27
+ const contentBeneficiaryDeviceUrl = MediaSharesUtils.getContentBeneficiaryDeviceUrl();
28
+ assert.equal(contentBeneficiaryDeviceUrl, mockContentBeneficiaryDeviceUrl);
29
+ stub.restore();
30
+ });
31
+ });
32
+
@@ -238,6 +238,68 @@ describe('locus-info/parser', () => {
238
238
  });
239
239
  });
240
240
 
241
+ describe('Full Locus handling', () => {
242
+ describe('isNewFullLocus', () => {
243
+ let parser;
244
+
245
+ beforeEach(() => {
246
+ parser = new LocusDeltaParser();
247
+ })
248
+ it('returns false if incoming Locus is not valid', () => {
249
+ const fakeInvalidIncomingLocus = {};
250
+
251
+ parser.workingCopy = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [1]}};
252
+
253
+ assert.isFalse(parser.isNewFullLocus(fakeInvalidIncomingLocus));
254
+ });
255
+
256
+ const runCheck = (incomingSequence, currentSequence, expectedResult) => {
257
+ parser.workingCopy = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [1, 2, currentSequence]}};
258
+
259
+ const fakeIncomingLocus = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [1, 10, incomingSequence]}};
260
+
261
+ assert.strictEqual(parser.isNewFullLocus(fakeIncomingLocus), expectedResult);
262
+ }
263
+ it('returns true if there is no working copy', () => {
264
+ const fakeIncomingLocus = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [10]}};
265
+
266
+ // sanity check that we initially have no working copy
267
+ assert.isNull(parser.workingCopy);
268
+
269
+ assert.isTrue(parser.isNewFullLocus(fakeIncomingLocus));
270
+ });
271
+
272
+ it('returns true if new sequence is higher than existing one', () => {
273
+ runCheck(101, 100, true);
274
+ });
275
+
276
+ it('returns false if new sequence is same than existing one', () => {
277
+ runCheck(100, 100, false);
278
+ });
279
+
280
+ it('returns false if new sequence is older than existing one', () => {
281
+ runCheck(99, 100, false);
282
+ });
283
+
284
+ it('returns true if incoming Locus has empty sequence', () => {
285
+ parser.workingCopy = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [1, 2, 3]}};
286
+
287
+ const fakeIncomingLocus = { sequence: {rangeStart: 0, rangeEnd: 0, entries: []}};
288
+
289
+ assert.isTrue(parser.isNewFullLocus(fakeIncomingLocus));
290
+ });
291
+
292
+ it('returns true if working copy has empty sequence', () => {
293
+ parser.workingCopy = { sequence: {rangeStart: 0, rangeEnd: 0, entries: []}};
294
+
295
+ const fakeIncomingLocus = { sequence: {rangeStart: 0, rangeEnd: 0, entries: [1,2,3]}};
296
+
297
+ assert.isTrue(parser.isNewFullLocus(fakeIncomingLocus));
298
+ });
299
+
300
+ })
301
+ });
302
+
241
303
  describe('Invalid Locus objects', () => {
242
304
  let sandbox = null;
243
305
  let parser;
@@ -272,27 +334,5 @@ describe('locus-info/parser', () => {
272
334
 
273
335
  assert.isFalse(result);
274
336
  });
275
-
276
- it('sets parser status to IDLE if workingCopy is invalid', () => {
277
- const {IDLE, WORKING} = LocusDeltaParser.status;
278
-
279
- parser.workingCopy = null;
280
- parser.status = WORKING;
281
-
282
- parser.isValidLocus(loci);
283
-
284
- assert.equal(parser.status, IDLE);
285
- });
286
-
287
- it('sets parser status to IDLE if new loci is invalid', () => {
288
- const {IDLE, WORKING} = LocusDeltaParser.status;
289
-
290
- parser.workingCopy = loci;
291
- parser.status = WORKING;
292
-
293
- parser.isValidLocus(null);
294
-
295
- assert.equal(parser.status, IDLE);
296
- });
297
337
  });
298
338
  });
@@ -66,6 +66,15 @@ export const self = {
66
66
  },
67
67
  ],
68
68
  mediaSessionsExternal: false,
69
+ replaces: [
70
+ {
71
+ breakoutMoveId: 'e5caeb2c-ffcc-4e06-a08a-1122e7710398',
72
+ lastActive: '2023-05-04T07:14:32.068Z',
73
+ locusUrl: 'https://locus-alpha-apdx.prod.meetapi.webex.com/locus/api/v1/loci/495061ca-7b3c-3b77-85ff-4e1bd58600d1',
74
+ replacedAt: '2023-05-04T07:16:04.905Z',
75
+ sessionId: 'be3147d4-c318-86d8-7611-8d24beaaca8d',
76
+ }
77
+ ],
69
78
  state: 'JOINED',
70
79
  intent: {type: ''},
71
80
  intents: [null],
@@ -109,6 +118,10 @@ export const self = {
109
118
  requestedToUnmute: false,
110
119
  meta: {},
111
120
  },
121
+ video: {
122
+ muted: false,
123
+ meta: {},
124
+ },
112
125
  breakout: {
113
126
  sessions: {
114
127
  active: [
@@ -116,7 +129,7 @@ export const self = {
116
129
  name: 'Breakout session 2',
117
130
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
118
131
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
119
- sessionType: 'BREAKOUT'
132
+ sessionType: 'BREAKOUT',
120
133
  },
121
134
  ],
122
135
  allowed: [
@@ -124,14 +137,24 @@ export const self = {
124
137
  name: 'Breakout session 2',
125
138
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
126
139
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
127
- sessionType: 'BREAKOUT'
140
+ sessionType: 'BREAKOUT',
128
141
  },
129
- ]
142
+ ],
130
143
  },
131
144
  meta: {
132
145
  modifiedBy: '347ef89e-e1be-40a3-849c-731bdd935e62',
133
146
  lastModified: '2023-01-10T10:10:06.813Z',
134
- readOnly: true
147
+ readOnly: true,
148
+ },
149
+ },
150
+ interpretation: {
151
+ originalLanguage: 'en',
152
+ sourceLanguage: 'en',
153
+ targetLanguage: 'cn',
154
+ order: 0,
155
+ isActive: true,
156
+ meta: {
157
+ lastModified: '2023-07-11T01:57:31.040Z',
135
158
  }
136
159
  },
137
160
  localRecord: {
@@ -39,7 +39,7 @@ describe('plugin-meetings', () => {
39
39
  name: 'Breakout session 2',
40
40
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
41
41
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
42
- sessionType: 'BREAKOUT'
42
+ sessionType: 'BREAKOUT',
43
43
  },
44
44
  ],
45
45
  allowed: [
@@ -47,9 +47,9 @@ describe('plugin-meetings', () => {
47
47
  name: 'Breakout session 2',
48
48
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
49
49
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
50
- sessionType: 'BREAKOUT'
50
+ sessionType: 'BREAKOUT',
51
51
  },
52
- ]
52
+ ],
53
53
  });
54
54
  });
55
55
 
@@ -76,9 +76,12 @@ describe('plugin-meetings', () => {
76
76
  });
77
77
  });
78
78
 
79
- describe('getBreakouts', () => {
79
+ describe('getBreakoutSessions', () => {
80
80
  it('should return breakout sessions', () => {
81
- assert.deepEqual(SelfUtils.getBreakouts({controls: {breakout: {sessions: 'SESSIONS'}}}), 'SESSIONS');
81
+ assert.deepEqual(
82
+ SelfUtils.getBreakoutSessions({controls: {breakout: {sessions: 'SESSIONS'}}}),
83
+ 'SESSIONS'
84
+ );
82
85
  });
83
86
  });
84
87
 
@@ -91,10 +94,11 @@ describe('plugin-meetings', () => {
91
94
  name: 'Breakout session 2',
92
95
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
93
96
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
94
- sessionType: 'BREAKOUT'
97
+ sessionType: 'BREAKOUT',
95
98
  },
96
- ]
97
- }
99
+ ],
100
+ },
101
+ breakout: {},
98
102
  };
99
103
  const previous = {
100
104
  breakoutSessions: {
@@ -103,10 +107,11 @@ describe('plugin-meetings', () => {
103
107
  name: 'Breakout session 2',
104
108
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
105
109
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
106
- sessionType: 'BREAKOUT'
110
+ sessionType: 'BREAKOUT',
107
111
  },
108
- ]
109
- }
112
+ ],
113
+ },
114
+ breakout: {},
110
115
  };
111
116
 
112
117
  assert.isTrue(SelfUtils.breakoutsChanged(previous, current));
@@ -120,10 +125,11 @@ describe('plugin-meetings', () => {
120
125
  name: 'Breakout session 2',
121
126
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
122
127
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
123
- sessionType: 'BREAKOUT'
128
+ sessionType: 'BREAKOUT',
124
129
  },
125
- ]
126
- }
130
+ ],
131
+ },
132
+ breakout: {},
127
133
  };
128
134
  const previous = {
129
135
  breakoutSessions: {
@@ -132,10 +138,33 @@ describe('plugin-meetings', () => {
132
138
  name: 'Breakout session 2',
133
139
  groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
134
140
  sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
135
- sessionType: 'BREAKOUT'
141
+ sessionType: 'BREAKOUT',
136
142
  },
137
- ]
138
- }
143
+ ],
144
+ },
145
+ breakout: {},
146
+ };
147
+
148
+ assert.isFalse(SelfUtils.breakoutsChanged(previous, current));
149
+ });
150
+
151
+ it('should return false if no breakouts in current', () => {
152
+ const current = {
153
+ breakoutSessions: {
154
+ },
155
+ };
156
+ const previous = {
157
+ breakoutSessions: {
158
+ active: [
159
+ {
160
+ name: 'Breakout session 2',
161
+ groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
162
+ sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
163
+ sessionType: 'BREAKOUT',
164
+ },
165
+ ],
166
+ },
167
+ breakout: {},
139
168
  };
140
169
 
141
170
  assert.isFalse(SelfUtils.breakoutsChanged(previous, current));
@@ -222,6 +251,55 @@ describe('plugin-meetings', () => {
222
251
  assert.equal(updates.canNotViewTheParticipantListChanged, false);
223
252
  });
224
253
  });
254
+
255
+ describe('localAudioUnmuteRequestedByServer', () => {
256
+ it('should return localAudioUnmuteRequestedByServer = false when requestedToUnmute = false', () => {
257
+ const clonedSelf = cloneDeep(self);
258
+
259
+ const {updates} = SelfUtils.getSelves(self, clonedSelf);
260
+
261
+ assert.equal(updates.localAudioUnmuteRequestedByServer, false);
262
+ });
263
+
264
+ it('should return localAudioUnmuteRequestedByServer = true when first request is made with requestedToUnmute = true', () => {
265
+ const clonedSelf = cloneDeep(self);
266
+
267
+ //request to unmute with timestamp
268
+ clonedSelf.controls.audio.requestedToUnmute = true;
269
+ clonedSelf.controls.audio.lastModifiedRequestedToUnmute = '2023-06-16T18:25:04.369Z';
270
+
271
+ const {updates} = SelfUtils.getSelves(self, clonedSelf);
272
+
273
+ assert.equal(updates.localAudioUnmuteRequestedByServer, true);
274
+ });
275
+
276
+ it('should return localAudioUnmuteRequestedByServer = true when requestedToUnmute = true and new requests lastModifiedRequestedToUnmute timestamp is greater than old one', () => {
277
+ self.controls.audio.requestedToUnmute = true;
278
+ self.controls.audio.lastModifiedRequestedToUnmute = '2023-06-16T18:25:04.369Z';
279
+ const clonedSelf = cloneDeep(self);
280
+
281
+ //request to unmute with timestamp
282
+ clonedSelf.controls.audio.requestedToUnmute = true;
283
+ clonedSelf.controls.audio.lastModifiedRequestedToUnmute = '2023-06-16T19:25:04.369Z';
284
+
285
+ const {updates} = SelfUtils.getSelves(self, clonedSelf);
286
+
287
+ assert.equal(updates.localAudioUnmuteRequestedByServer, true);
288
+ });
289
+
290
+ it('should return localAudioUnmuteRequestedByServer = false when requestedToUnmute but lastModifiedRequestedToUnmute timestamps are same', () => {
291
+ self.controls.audio.requestedToUnmute = true;
292
+ self.controls.audio.lastModifiedRequestedToUnmute = '2023-06-16T18:25:04.369Z';
293
+ const clonedSelf = cloneDeep(self);
294
+
295
+ clonedSelf.controls.audio.requestedToUnmute = true;
296
+ clonedSelf.controls.audio.lastModifiedRequestedToUnmute = '2023-06-16T18:25:04.369Z'
297
+
298
+ const {updates} = SelfUtils.getSelves(self, clonedSelf);
299
+
300
+ assert.equal(updates.localAudioUnmuteRequestedByServer, false);
301
+ });
302
+ });
225
303
  });
226
304
 
227
305
  describe('isSharingBlocked', () => {
@@ -266,4 +344,117 @@ describe('plugin-meetings', () => {
266
344
  assert.deepEqual(SelfUtils.isJoined(customSelf), false);
267
345
  });
268
346
  });
347
+
348
+ describe('videoMutedByOthersChanged', () => {
349
+ it('returns true if changed', () => {
350
+ assert.equal(
351
+ SelfUtils.videoMutedByOthersChanged({remoteVideoMuted: true}, {remoteVideoMuted: false}),
352
+ true
353
+ );
354
+ });
355
+
356
+ it('returns true if changed from undefined', () => {
357
+ assert.equal(SelfUtils.videoMutedByOthersChanged({}, {remoteVideoMuted: false}), true);
358
+ });
359
+
360
+ it('returns false if not changed', () => {
361
+ assert.equal(
362
+ SelfUtils.videoMutedByOthersChanged({remoteVideoMuted: false}, {remoteVideoMuted: false}),
363
+ false
364
+ );
365
+ });
366
+ });
367
+
368
+ describe('getReplacedBreakoutMoveId', () => {
369
+ const deviceId = 'https://wdm-a.wbx2.com/wdm/api/v1/devices/20eabde3-4254-48da-9a24';
370
+ const breakoutMoveId = 'e5caeb2c-ffcc-4e06-a08a-1122e7710398';
371
+ const clonedSelf = cloneDeep(self);
372
+
373
+ it('get breakoutMoveId works', () => {
374
+
375
+ assert.deepEqual(SelfUtils.getReplacedBreakoutMoveId(self, deviceId), breakoutMoveId);
376
+
377
+ });
378
+
379
+ it('replaces is empty', () => {
380
+
381
+ clonedSelf.devices[0].replaces = undefined;
382
+ assert.deepEqual(SelfUtils.getReplacedBreakoutMoveId(clonedSelf, deviceId), null);
383
+
384
+ });
385
+
386
+ it('no self or self.devices is not array', () => {
387
+
388
+ assert.deepEqual(SelfUtils.getReplacedBreakoutMoveId(undefined, deviceId), null);
389
+
390
+ clonedSelf.devices = {
391
+ url: 'https://wdm-a.wbx2.com/wdm/api/v1/devices/20eabde3-4254-48da-9a24',
392
+ deviceType: 'WEB',
393
+ mediaSessionsExternal: false,
394
+ replaces: [
395
+ {
396
+ breakoutMoveId: 'e5caeb2c-ffcc-4e06-a08a-1122e7710398',
397
+ lastActive: '2023-05-04T07:14:32.068Z',
398
+ locusUrl: 'https://locus-alpha-apdx.prod.meetapi.webex.com/locus/api/v1/loci/495061ca-7b3c-3b77-85ff-4e1bd58600d1',
399
+ replacedAt: '2023-05-04T07:16:04.905Z',
400
+ sessionId: 'be3147d4-c318-86d8-7611-8d24beaaca8d',
401
+ }
402
+ ],
403
+ state: 'JOINED',
404
+ };
405
+ assert.deepEqual(SelfUtils.getReplacedBreakoutMoveId(clonedSelf, deviceId), null);
406
+ });
407
+ });
408
+
409
+ describe('isRolesChanged', () => {
410
+ it('should return false if new self is null', () => {
411
+ const parsedSelf = SelfUtils.parse(self);
412
+
413
+ assert.deepEqual(SelfUtils.isRolesChanged(parsedSelf, null), false);
414
+ });
415
+
416
+ it('should return true if self roles has changed', () => {
417
+ const parsedSelf = SelfUtils.parse(self);
418
+ const clonedSelf = cloneDeep(parsedSelf);
419
+
420
+ clonedSelf.roles = ['COHOST'];
421
+
422
+ assert.deepEqual(SelfUtils.isRolesChanged(parsedSelf, clonedSelf), true);
423
+ });
424
+
425
+ it('should return false if self roles has not changed', () => {
426
+ const parsedSelf = SelfUtils.parse(self);
427
+ const clonedSelf = cloneDeep(parsedSelf);
428
+
429
+ clonedSelf.roles = ['PRESENTER'];
430
+
431
+ assert.deepEqual(SelfUtils.isRolesChanged(parsedSelf, clonedSelf), false);
432
+ });
433
+ });
434
+
435
+ describe('interpretationChanged', () => {
436
+ it('should return false if new self is null', () => {
437
+ const parsedSelf = SelfUtils.parse(self);
438
+
439
+ assert.deepEqual(SelfUtils.interpretationChanged(parsedSelf, null), false);
440
+ });
441
+
442
+ it('should return true if interpretation info has changed', () => {
443
+ const parsedSelf = SelfUtils.parse(self);
444
+ const clonedSelf = cloneDeep(parsedSelf);
445
+
446
+ clonedSelf.interpretation.sourceLanguage = 'ja';
447
+
448
+ assert.deepEqual(SelfUtils.interpretationChanged(parsedSelf, clonedSelf), true);
449
+ });
450
+
451
+ it('should return false if interpretation info has not changed', () => {
452
+ const parsedSelf = SelfUtils.parse(self);
453
+ const clonedSelf = cloneDeep(parsedSelf);
454
+
455
+ clonedSelf.interpretation.sourceLanguage = 'en';
456
+
457
+ assert.deepEqual(SelfUtils.interpretationChanged(parsedSelf, clonedSelf), false);
458
+ });
459
+ });
269
460
  });