outline-item.test.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { expect } from 'chai'
  2. import sinon from 'sinon'
  3. import { screen, render, fireEvent, waitFor } from '@testing-library/react'
  4. import OutlineItem from '../../../../../frontend/js/features/outline/components/outline-item'
  5. describe('<OutlineItem />', function () {
  6. const jumpToLine = sinon.stub()
  7. afterEach(function () {
  8. jumpToLine.reset()
  9. })
  10. it('renders basic item', function () {
  11. const outlineItem = {
  12. title: 'Test Title',
  13. line: 1,
  14. }
  15. render(<OutlineItem outlineItem={outlineItem} jumpToLine={jumpToLine} />)
  16. screen.getByRole('treeitem', { current: false })
  17. screen.getByRole('button', { name: outlineItem.title })
  18. expect(screen.queryByRole('button', { name: 'Collapse' })).to.not.exist
  19. })
  20. it('collapses and expands', function () {
  21. const outlineItem = {
  22. title: 'Parent',
  23. line: 1,
  24. children: [{ title: 'Child', line: 2 }],
  25. }
  26. render(<OutlineItem outlineItem={outlineItem} jumpToLine={jumpToLine} />)
  27. const collapseButton = screen.getByRole('button', { name: 'Collapse' })
  28. // test that children are rendered
  29. screen.getByRole('button', { name: 'Child' })
  30. fireEvent.click(collapseButton)
  31. screen.getByRole('button', { name: 'Expand' })
  32. expect(screen.queryByRole('button', { name: 'Child' })).to.not.exist
  33. })
  34. it('highlights', function () {
  35. const outlineItem = {
  36. title: 'Parent',
  37. line: 1,
  38. }
  39. render(
  40. <OutlineItem
  41. outlineItem={outlineItem}
  42. jumpToLine={jumpToLine}
  43. highlightedLine={1}
  44. />
  45. )
  46. screen.getByRole('treeitem', { current: true })
  47. })
  48. it('highlights when has collapsed highlighted child', function () {
  49. const outlineItem = {
  50. title: 'Parent',
  51. line: 1,
  52. children: [{ title: 'Child', line: 2 }],
  53. }
  54. render(
  55. <OutlineItem
  56. outlineItem={outlineItem}
  57. jumpToLine={jumpToLine}
  58. highlightedLine={2}
  59. />
  60. )
  61. screen.getByRole('treeitem', { name: 'Parent', current: false })
  62. screen.getByRole('treeitem', { name: 'Child', current: true })
  63. fireEvent.click(screen.getByRole('button', { name: 'Collapse' }))
  64. screen.getByRole('treeitem', { name: 'Parent', current: true })
  65. })
  66. it('click and double-click jump to location', async function () {
  67. const outlineItem = {
  68. title: 'Parent',
  69. line: 1,
  70. }
  71. render(<OutlineItem outlineItem={outlineItem} jumpToLine={jumpToLine} />)
  72. const titleButton = screen.getByRole('button', { name: outlineItem.title })
  73. fireEvent.click(titleButton, { detail: 1 })
  74. await waitFor(() => {
  75. expect(jumpToLine).to.be.calledOnce
  76. expect(jumpToLine).to.be.calledWith(1, false)
  77. })
  78. jumpToLine.reset()
  79. fireEvent.click(titleButton, { detail: 2 })
  80. await waitFor(() => {
  81. expect(jumpToLine).to.be.calledOnce
  82. expect(jumpToLine).to.be.calledWith(1, true)
  83. })
  84. })
  85. })