outline-item.test.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. matchesHighlightedLine
  45. />
  46. )
  47. screen.getByRole('treeitem', { current: true })
  48. })
  49. it('highlights when has collapsed highlighted child', function () {
  50. const outlineItem = {
  51. title: 'Parent',
  52. line: 1,
  53. children: [{ title: 'Child', line: 2 }],
  54. }
  55. render(
  56. <OutlineItem
  57. outlineItem={outlineItem}
  58. jumpToLine={jumpToLine}
  59. highlightedLine={2}
  60. containsHighlightedLine
  61. />
  62. )
  63. screen.getByRole('treeitem', { name: 'Parent', current: false })
  64. screen.getByRole('treeitem', { name: 'Child', current: true })
  65. fireEvent.click(screen.getByRole('button', { name: 'Collapse' }))
  66. screen.getByRole('treeitem', { name: 'Parent', current: true })
  67. })
  68. it('click and double-click jump to location', async function () {
  69. const outlineItem = {
  70. title: 'Parent',
  71. line: 1,
  72. }
  73. render(<OutlineItem outlineItem={outlineItem} jumpToLine={jumpToLine} />)
  74. const titleButton = screen.getByRole('button', { name: outlineItem.title })
  75. fireEvent.click(titleButton, { detail: 1 })
  76. await waitFor(() => {
  77. expect(jumpToLine).to.be.calledOnce
  78. expect(jumpToLine).to.be.calledWith(1, false)
  79. })
  80. jumpToLine.reset()
  81. fireEvent.click(titleButton, { detail: 2 })
  82. await waitFor(() => {
  83. expect(jumpToLine).to.be.calledOnce
  84. expect(jumpToLine).to.be.calledWith(1, true)
  85. })
  86. })
  87. })