new-project-button.test.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { fireEvent, screen } from '@testing-library/react'
  2. import { expect } from 'chai'
  3. import fetchMock from 'fetch-mock'
  4. import NewProjectButton from '../../../../../frontend/js/features/project-list/components/new-project-button'
  5. import { renderWithProjectListContext } from '../helpers/render-with-context'
  6. describe('<NewProjectButton />', function () {
  7. beforeEach(function () {
  8. fetchMock.reset()
  9. })
  10. describe('for every user (affiliated and non-affiliated)', function () {
  11. beforeEach(function () {
  12. window.metaAttributesCache.set('ol-ExposedSettings', {
  13. templateLinks: [
  14. {
  15. name: 'Academic Journal',
  16. url: '/gallery/tagged/academic-journal',
  17. },
  18. {
  19. name: 'View All',
  20. url: '/latex/templates',
  21. },
  22. ],
  23. })
  24. renderWithProjectListContext(<NewProjectButton id="test" />)
  25. const newProjectButton = screen.getByRole('button', {
  26. name: 'New Project',
  27. })
  28. fireEvent.click(newProjectButton)
  29. })
  30. afterEach(function () {
  31. window.metaAttributesCache = new Map()
  32. })
  33. it('shows the correct dropdown menu', function () {
  34. // static menu
  35. screen.getByText('Blank Project')
  36. screen.getByText('Example Project')
  37. screen.getByText('Upload Project')
  38. screen.getByText('Import from GitHub')
  39. // static text
  40. screen.getByText('Templates')
  41. // dynamic menu based on templateLinks
  42. screen.getByText('Academic Journal')
  43. screen.getByText('View All')
  44. })
  45. it('open new project modal when clicking at Blank Project', function () {
  46. fireEvent.click(screen.getByRole('menuitem', { name: 'Blank Project' }))
  47. screen.getByPlaceholderText('Project Name')
  48. })
  49. it('open new project modal when clicking at Example Project', function () {
  50. fireEvent.click(screen.getByRole('menuitem', { name: 'Example Project' }))
  51. screen.getByPlaceholderText('Project Name')
  52. })
  53. it('close the new project modal when clicking at the top right "x" button', function () {
  54. fireEvent.click(screen.getByRole('menuitem', { name: 'Blank Project' }))
  55. fireEvent.click(screen.getByRole('button', { name: 'Close' }))
  56. expect(screen.queryByRole('dialog')).to.be.null
  57. })
  58. it('close the new project modal when clicking at the Cancel button', function () {
  59. fireEvent.click(screen.getByRole('menuitem', { name: 'Blank Project' }))
  60. fireEvent.click(screen.getByRole('button', { name: 'Cancel' }))
  61. expect(screen.queryByRole('dialog')).to.be.null
  62. })
  63. })
  64. describe('for affiliated user with custom templates', function () {
  65. beforeEach(function () {
  66. window.metaAttributesCache.set('ol-ExposedSettings', {
  67. templateLinks: [
  68. {
  69. name: 'Academic Journal',
  70. url: '/gallery/tagged/academic-journal',
  71. },
  72. {
  73. name: 'View All',
  74. url: '/latex/templates',
  75. },
  76. ],
  77. })
  78. window.metaAttributesCache.set('ol-portalTemplates', [
  79. {
  80. name: 'Affiliation 1',
  81. url: '/edu/test-new-template',
  82. },
  83. ])
  84. })
  85. afterEach(function () {
  86. window.metaAttributesCache = new Map()
  87. })
  88. it('shows the correct dropdown menu', function () {
  89. renderWithProjectListContext(<NewProjectButton id="test" />)
  90. const newProjectButton = screen.getByRole('button', {
  91. name: 'New Project',
  92. })
  93. fireEvent.click(newProjectButton)
  94. // static menu
  95. screen.getByText('Blank Project')
  96. screen.getByText('Example Project')
  97. screen.getByText('Upload Project')
  98. screen.getByText('Import from GitHub')
  99. // static text for institution templates
  100. screen.getByText('Institution Templates')
  101. // dynamic menu based on portalTemplates
  102. const affiliationTemplate = screen.getByRole('menuitem', {
  103. name: 'Affiliation 1',
  104. })
  105. expect(affiliationTemplate.getAttribute('href')).to.equal(
  106. '/edu/test-new-template#templates'
  107. )
  108. // static text
  109. screen.getByText('Templates')
  110. // dynamic menu based on templateLinks
  111. screen.getByText('Academic Journal')
  112. screen.getByText('View All')
  113. })
  114. })
  115. })