new-project-button.test.tsx 4.1 KB

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