use-detach-layout.test.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import { act } from '@testing-library/react-hooks'
  2. import { expect } from 'chai'
  3. import sinon from 'sinon'
  4. import { renderHookWithEditorContext } from '../../helpers/render-with-context'
  5. import sysendTestHelper from '../../helpers/sysend'
  6. import useDetachLayout from '../../../../frontend/js/shared/hooks/use-detach-layout'
  7. describe('useDetachLayout', function () {
  8. let openStub
  9. let closeStub
  10. beforeEach(function () {
  11. window.metaAttributesCache = new Map()
  12. openStub = sinon.stub(window, 'open')
  13. closeStub = sinon.stub(window, 'close')
  14. })
  15. afterEach(function () {
  16. window.metaAttributesCache = new Map()
  17. openStub.restore()
  18. closeStub.restore()
  19. })
  20. it('detaching', async function () {
  21. // 1. create hook in normal mode
  22. const { result } = renderHookWithEditorContext(() => useDetachLayout())
  23. expect(result.current.reattach).to.be.a('function')
  24. expect(result.current.detach).to.be.a('function')
  25. expect(result.current.isLinked).to.be.false
  26. expect(result.current.isLinking).to.be.false
  27. expect(result.current.role).to.be.null
  28. // 2. detach
  29. act(() => {
  30. result.current.detach()
  31. })
  32. expect(result.current.isLinked).to.be.false
  33. expect(result.current.isLinking).to.be.true
  34. expect(result.current.role).to.equal('detacher')
  35. sinon.assert.calledOnce(openStub)
  36. sinon.assert.calledWith(
  37. openStub,
  38. 'https://www.test-overleaf.com/detached',
  39. '_blank'
  40. )
  41. })
  42. it('detacher role', async function () {
  43. window.metaAttributesCache.set('ol-detachRole', 'detacher')
  44. // 1. create hook in detacher mode
  45. const { result } = renderHookWithEditorContext(() => useDetachLayout())
  46. expect(result.current.reattach).to.be.a('function')
  47. expect(result.current.detach).to.be.a('function')
  48. expect(result.current.isLinked).to.be.false
  49. expect(result.current.isLinking).to.be.false
  50. expect(result.current.role).to.equal('detacher')
  51. // 2. simulate connected detached tab
  52. sysendTestHelper.spy.broadcast.resetHistory()
  53. sysendTestHelper.receiveMessage({
  54. role: 'detached',
  55. event: 'connected',
  56. })
  57. expect(sysendTestHelper.getLastBroacastMessage()).to.deep.equal({
  58. role: 'detacher',
  59. event: 'up',
  60. })
  61. expect(result.current.isLinked).to.be.true
  62. expect(result.current.isLinking).to.be.false
  63. expect(result.current.role).to.equal('detacher')
  64. // 3. simulate closed detached tab
  65. sysendTestHelper.spy.broadcast.resetHistory()
  66. sysendTestHelper.receiveMessage({
  67. role: 'detached',
  68. event: 'closed',
  69. })
  70. expect(result.current.isLinked).to.be.false
  71. expect(result.current.isLinking).to.be.false
  72. expect(result.current.role).to.equal('detacher')
  73. // 4. simulate up detached tab
  74. sysendTestHelper.spy.broadcast.resetHistory()
  75. sysendTestHelper.receiveMessage({
  76. role: 'detached',
  77. event: 'up',
  78. })
  79. expect(result.current.isLinked).to.be.true
  80. expect(result.current.isLinking).to.be.false
  81. expect(result.current.role).to.equal('detacher')
  82. // 5. simulate closed detacher tab
  83. sysendTestHelper.spy.broadcast.resetHistory()
  84. sysendTestHelper.receiveMessage({
  85. role: 'detacher',
  86. event: 'closed',
  87. })
  88. expect(result.current.isLinked).to.be.true
  89. expect(result.current.isLinking).to.be.false
  90. expect(result.current.role).to.equal('detacher')
  91. expect(sysendTestHelper.getLastBroacastMessage()).to.deep.equal({
  92. role: 'detacher',
  93. event: 'up',
  94. })
  95. // 6. reattach
  96. sysendTestHelper.spy.broadcast.resetHistory()
  97. act(() => {
  98. result.current.reattach()
  99. })
  100. expect(result.current.isLinked).to.be.false
  101. expect(result.current.isLinking).to.be.false
  102. expect(result.current.role).to.be.null
  103. expect(sysendTestHelper.getLastBroacastMessage()).to.deep.equal({
  104. role: 'detacher',
  105. event: 'reattach',
  106. })
  107. })
  108. it('detached role', async function () {
  109. window.metaAttributesCache.set('ol-detachRole', 'detached')
  110. // 1. create hook in detached mode
  111. const { result } = renderHookWithEditorContext(() => useDetachLayout())
  112. expect(result.current.reattach).to.be.a('function')
  113. expect(result.current.detach).to.be.a('function')
  114. expect(result.current.isLinked).to.be.false
  115. expect(result.current.isLinking).to.be.false
  116. expect(result.current.role).to.equal('detached')
  117. // 2. simulate up detacher tab
  118. sysendTestHelper.spy.broadcast.resetHistory()
  119. sysendTestHelper.receiveMessage({
  120. role: 'detacher',
  121. event: 'up',
  122. })
  123. expect(result.current.isLinked).to.be.true
  124. expect(result.current.isLinking).to.be.false
  125. expect(result.current.role).to.equal('detached')
  126. // 3. simulate closed detacher tab
  127. sysendTestHelper.spy.broadcast.resetHistory()
  128. sysendTestHelper.receiveMessage({
  129. role: 'detacher',
  130. event: 'closed',
  131. })
  132. expect(result.current.isLinked).to.be.false
  133. expect(result.current.isLinking).to.be.false
  134. expect(result.current.role).to.equal('detached')
  135. // 4. simulate up detacher tab
  136. sysendTestHelper.spy.broadcast.resetHistory()
  137. sysendTestHelper.receiveMessage({
  138. role: 'detacher',
  139. event: 'up',
  140. })
  141. expect(result.current.isLinked).to.be.true
  142. expect(result.current.isLinking).to.be.false
  143. expect(result.current.role).to.equal('detached')
  144. // 5. simulate closed detached tab
  145. sysendTestHelper.spy.broadcast.resetHistory()
  146. sysendTestHelper.receiveMessage({
  147. role: 'detached',
  148. event: 'closed',
  149. })
  150. expect(result.current.isLinked).to.be.true
  151. expect(result.current.isLinking).to.be.false
  152. expect(result.current.role).to.equal('detached')
  153. expect(sysendTestHelper.getLastBroacastMessage()).to.deep.equal({
  154. role: 'detached',
  155. event: 'up',
  156. })
  157. // 6. simulate reattach event
  158. sysendTestHelper.spy.broadcast.resetHistory()
  159. sysendTestHelper.receiveMessage({
  160. role: 'detacher',
  161. event: 'reattach',
  162. })
  163. expect(result.current.isLinked).to.be.false
  164. expect(result.current.isLinking).to.be.false
  165. expect(result.current.role).to.equal('detached')
  166. sinon.assert.called(closeStub)
  167. })
  168. })