You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SpeakerStatsCollector.spec.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import EventEmitter from 'events';
  2. import JitsiConference from '../../JitsiConference';
  3. import * as JitsiConferenceEvents from '../../JitsiConferenceEvents';
  4. import JitsiParticipant from '../../JitsiParticipant';
  5. import SpeakerStats from './SpeakerStats';
  6. import SpeakerStatsCollector from './SpeakerStatsCollector';
  7. const mockMyId = 1;
  8. const mockRemoteUser = {
  9. id: 2,
  10. name: 'foo'
  11. };
  12. /**
  13. * Mock object to be used in place of a real conference.
  14. *
  15. * @constructor
  16. */
  17. function MockConference() {
  18. this.eventEmitter = new EventEmitter();
  19. }
  20. MockConference.prototype = Object.create(JitsiConference.prototype);
  21. MockConference.prototype.constructor = JitsiConference;
  22. /**
  23. * Mock object to be used in place of a real JitsiParticipant.
  24. *
  25. * @constructor
  26. * @param {string|number} id - An id for the mock user.
  27. * @param {string} name - A name for the mock user.
  28. * @returns {void}
  29. */
  30. function MockJitsiParticipant(id, name) {
  31. this._jid = id;
  32. this._displayName = name;
  33. }
  34. MockJitsiParticipant.prototype = Object.create(JitsiParticipant.prototype);
  35. MockJitsiParticipant.prototype.constructor = JitsiParticipant;
  36. describe('SpeakerStatsCollector', () => {
  37. let mockConference, speakerStatsCollector;
  38. beforeEach(() => {
  39. mockConference = new MockConference();
  40. spyOn(mockConference, 'myUserId').and.returnValue(mockMyId);
  41. speakerStatsCollector = new SpeakerStatsCollector(mockConference);
  42. mockConference.eventEmitter.emit(
  43. JitsiConferenceEvents.USER_JOINED,
  44. mockRemoteUser.id,
  45. new MockJitsiParticipant(mockRemoteUser.id, mockRemoteUser.name)
  46. );
  47. });
  48. it('automatically adds the current user', () => {
  49. const stats = speakerStatsCollector.getStats();
  50. const currentUserStats = stats[mockMyId];
  51. expect(currentUserStats instanceof SpeakerStats).toBe(true);
  52. });
  53. it('adds joined users to the stats', () => {
  54. const stats = speakerStatsCollector.getStats();
  55. const remoteUserStats = stats[mockRemoteUser.id];
  56. expect(remoteUserStats).toBeTruthy();
  57. expect(remoteUserStats instanceof SpeakerStats).toBe(true);
  58. expect(remoteUserStats.getDisplayName()).toBe(mockRemoteUser.name);
  59. });
  60. describe('on user name change', () => {
  61. it('updates the username', () => {
  62. const newName = `new-${mockRemoteUser.name}`;
  63. mockConference.eventEmitter.emit(
  64. JitsiConferenceEvents.DISPLAY_NAME_CHANGED,
  65. mockRemoteUser.id,
  66. newName
  67. );
  68. const stats = speakerStatsCollector.getStats();
  69. const remoteUserStats = stats[mockRemoteUser.id];
  70. expect(remoteUserStats.getDisplayName()).toBe(newName);
  71. });
  72. });
  73. describe('on user leave', () => {
  74. it('retains the user stats but marks the user as left', () => {
  75. mockConference.eventEmitter.emit(
  76. JitsiConferenceEvents.USER_LEFT,
  77. mockRemoteUser.id
  78. );
  79. const stats = speakerStatsCollector.getStats();
  80. const remoteUserStats = stats[mockRemoteUser.id];
  81. expect(remoteUserStats.hasLeft()).toBe(true);
  82. });
  83. });
  84. describe('on dominant speaker change', () => {
  85. it('updates models to reflect the new dominant speaker', () => {
  86. const stats = speakerStatsCollector.getStats();
  87. const remoteUserStats = stats[mockRemoteUser.id];
  88. const currentUserStats = stats[mockMyId];
  89. mockConference.eventEmitter.emit(
  90. JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED,
  91. mockRemoteUser.id
  92. );
  93. expect(remoteUserStats.isDominantSpeaker()).toBe(true);
  94. expect(currentUserStats.isDominantSpeaker()).toBe(false);
  95. mockConference.eventEmitter.emit(
  96. JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED,
  97. mockMyId
  98. );
  99. expect(remoteUserStats.isDominantSpeaker()).toBe(false);
  100. expect(currentUserStats.isDominantSpeaker()).toBe(true);
  101. });
  102. });
  103. });