outline-item.test.js 2.8 KB

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