rtm-manager-adapter.test.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
  2. import { RtmManagerAdapter } from '../../src/managers/rtm-manager-adapter'
  3. import { SttError } from '../../src/core/stt-error'
  4. describe('RtmManagerAdapter', () => {
  5. let manager: RtmManagerAdapter
  6. beforeEach(() => {
  7. manager = new RtmManagerAdapter()
  8. })
  9. afterEach(async () => {
  10. if (manager.isJoined) {
  11. await manager.destroy()
  12. }
  13. })
  14. describe('join', () => {
  15. it('should join successfully with valid config', async () => {
  16. const config = {
  17. channel: 'test-channel',
  18. userId: 'test-user',
  19. userName: 'Test User',
  20. }
  21. await manager.join(config)
  22. expect(manager.isJoined).toBe(true)
  23. expect(manager.config).toEqual(config)
  24. expect(manager.userId).toBe('test-user')
  25. expect(manager.channel).toBe('test-channel')
  26. expect(manager.userList).toHaveLength(1)
  27. expect(manager.userList[0]).toEqual({
  28. userId: 'test-user',
  29. userName: 'Test User',
  30. })
  31. })
  32. it('should throw error when config is invalid', async () => {
  33. const config = {
  34. channel: '',
  35. userId: '',
  36. userName: '',
  37. }
  38. await expect(manager.join(config)).rejects.toThrow(SttError)
  39. await expect(manager.join(config)).rejects.toThrow(
  40. 'Missing required configuration parameters'
  41. )
  42. })
  43. it('should throw error when already joined', async () => {
  44. const config = {
  45. channel: 'test-channel',
  46. userId: 'test-user',
  47. userName: 'Test User',
  48. }
  49. await manager.join(config)
  50. await expect(manager.join(config)).rejects.toThrow(SttError)
  51. await expect(manager.join(config)).rejects.toThrow(
  52. 'RTM manager is already joined to a channel'
  53. )
  54. })
  55. it('should emit connected event', async () => {
  56. const connectedHandler = vi.fn()
  57. manager.on('connected', connectedHandler)
  58. const config = {
  59. channel: 'test-channel',
  60. userId: 'test-user',
  61. userName: 'Test User',
  62. }
  63. await manager.join(config)
  64. expect(connectedHandler).toHaveBeenCalledTimes(1)
  65. expect(connectedHandler).toHaveBeenCalledWith({
  66. channel: 'test-channel',
  67. userId: 'test-user',
  68. })
  69. })
  70. })
  71. describe('updateSttData', () => {
  72. it('should update STT data when joined', async () => {
  73. await manager.join({
  74. channel: 'test-channel',
  75. userId: 'test-user',
  76. userName: 'Test User',
  77. })
  78. const updatingHandler = vi.fn()
  79. const updatedHandler = vi.fn()
  80. manager.on('metadataUpdating', updatingHandler)
  81. manager.on('metadataUpdated', updatedHandler)
  82. const data = {
  83. status: 'start',
  84. taskId: 'test-task-id',
  85. }
  86. await manager.updateSttData(data)
  87. expect(updatingHandler).toHaveBeenCalledTimes(1)
  88. expect(updatingHandler).toHaveBeenCalledWith({ data })
  89. expect(updatedHandler).toHaveBeenCalledTimes(1)
  90. expect(updatedHandler).toHaveBeenCalledWith({ data })
  91. })
  92. it('should throw error when not joined', async () => {
  93. const data = {
  94. status: 'start',
  95. taskId: 'test-task-id',
  96. }
  97. await expect(manager.updateSttData(data)).rejects.toThrow(SttError)
  98. await expect(manager.updateSttData(data)).rejects.toThrow(
  99. 'RTM manager must be joined to a channel before updating STT data'
  100. )
  101. })
  102. })
  103. describe('acquireLock', () => {
  104. it('should acquire lock when joined', async () => {
  105. await manager.join({
  106. channel: 'test-channel',
  107. userId: 'test-user',
  108. userName: 'Test User',
  109. })
  110. const acquiringHandler = vi.fn()
  111. const acquiredHandler = vi.fn()
  112. manager.on('lockAcquiring', acquiringHandler)
  113. manager.on('lockAcquired', acquiredHandler)
  114. await manager.acquireLock()
  115. expect(acquiringHandler).toHaveBeenCalledTimes(1)
  116. expect(acquiredHandler).toHaveBeenCalledTimes(1)
  117. })
  118. it('should throw error when not joined', async () => {
  119. await expect(manager.acquireLock()).rejects.toThrow(SttError)
  120. await expect(manager.acquireLock()).rejects.toThrow(
  121. 'RTM manager must be joined to a channel before acquiring lock'
  122. )
  123. })
  124. })
  125. describe('releaseLock', () => {
  126. it('should release lock when joined', async () => {
  127. await manager.join({
  128. channel: 'test-channel',
  129. userId: 'test-user',
  130. userName: 'Test User',
  131. })
  132. const releasingHandler = vi.fn()
  133. const releasedHandler = vi.fn()
  134. manager.on('lockReleasing', releasingHandler)
  135. manager.on('lockReleased', releasedHandler)
  136. await manager.releaseLock()
  137. expect(releasingHandler).toHaveBeenCalledTimes(1)
  138. expect(releasedHandler).toHaveBeenCalledTimes(1)
  139. })
  140. it('should throw error when not joined', async () => {
  141. await expect(manager.releaseLock()).rejects.toThrow(SttError)
  142. await expect(manager.releaseLock()).rejects.toThrow(
  143. 'RTM manager must be joined to a channel before releasing lock'
  144. )
  145. })
  146. })
  147. describe('destroy', () => {
  148. it('should destroy manager successfully', async () => {
  149. await manager.join({
  150. channel: 'test-channel',
  151. userId: 'test-user',
  152. userName: 'Test User',
  153. })
  154. const destroyingHandler = vi.fn()
  155. const destroyedHandler = vi.fn()
  156. manager.on('destroying', destroyingHandler)
  157. manager.on('destroyed', destroyedHandler)
  158. await manager.destroy()
  159. expect(manager.isJoined).toBe(false)
  160. expect(manager.config).toBeUndefined()
  161. expect(manager.userList).toHaveLength(0)
  162. expect(destroyingHandler).toHaveBeenCalledTimes(1)
  163. expect(destroyedHandler).toHaveBeenCalledTimes(1)
  164. })
  165. it('should handle destroy when not joined', async () => {
  166. await expect(manager.destroy()).resolves.not.toThrow()
  167. })
  168. })
  169. })