test.tsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. Copyright (C) 2017 Cloudbase Solutions SRL
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Affero General Public License as
  5. published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Affero General Public License for more details.
  11. You should have received a copy of the GNU Affero General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. import React from 'react'
  15. import { shallow } from 'enzyme'
  16. import sinon from 'sinon'
  17. import TW from '@src/utils/TestWrapper'
  18. import type { User } from '@src/@types/User'
  19. import type { Project, Role } from '@src/@types/Project'
  20. import ProjectMemberModal from '.'
  21. type Props = {
  22. loading: boolean,
  23. users: User[],
  24. projects: Project[],
  25. onRequestClose: () => void,
  26. onAddClick: (user: User, isNew: boolean, roles: Role[]) => void,
  27. roles: Role[],
  28. }
  29. const wrap = (props: Props) => new TW(shallow(<ProjectMemberModal {...props} />), 'pmModal')
  30. const users: User[] = [
  31. { id: 'user-1', name: 'User 1', email: '', project: { id: '', name: '' } },
  32. { id: 'user-2', name: 'User 2', email: '', project: { id: '', name: '' } },
  33. ]
  34. const projects: Project[] = [
  35. { id: 'project-1', name: 'Project 1' },
  36. { id: 'project-2', name: 'Project 2' },
  37. ]
  38. const roles: Role[] = [
  39. { id: 'role-1', name: 'Role 1' },
  40. { id: 'role-2', name: 'Role 2' },
  41. { id: 'role-3', name: 'Role 3' },
  42. ]
  43. describe('ProjectMemberModal Component', () => {
  44. it('renders existing user form', () => {
  45. let wrapper = wrap({
  46. loading: false,
  47. users,
  48. projects,
  49. roles,
  50. onRequestClose: () => { },
  51. onAddClick: () => { },
  52. })
  53. expect(wrapper.find('users').prop('items')[1].value).toBe(users[1].id)
  54. expect(wrapper.find('roles').prop('enum')[1].id).toBe(roles[1].id)
  55. expect(wrapper.find('users').prop('highlight')).toBe(false)
  56. expect(wrapper.find('roles').prop('highlight')).toBe(false)
  57. expect(wrapper.find('users').prop('disabled')).toBe(false)
  58. expect(wrapper.find('roles').prop('disabled')).toBe(false)
  59. })
  60. it('highlights required fields in existing user form', () => {
  61. let wrapper = wrap({
  62. loading: false,
  63. users,
  64. projects,
  65. roles,
  66. onRequestClose: () => { },
  67. onAddClick: () => { },
  68. })
  69. expect(wrapper.find('users').length).toBe(1)
  70. wrapper.find('addButton').click()
  71. expect(wrapper.find('users').prop('highlight')).toBe(true)
  72. expect(wrapper.find('roles').prop('highlight')).toBe(true)
  73. })
  74. it('renders new user form and highlights required', () => {
  75. let wrapper = wrap({
  76. loading: false,
  77. users,
  78. projects,
  79. roles,
  80. onRequestClose: () => { },
  81. onAddClick: () => { },
  82. })
  83. wrapper.find('formToggle').simulate('change', { value: 'new' })
  84. expect(wrapper.find('users').length).toBe(0)
  85. expect(wrapper.find('field-username').prop('highlight')).toBe(false)
  86. expect(wrapper.find('field-description').prop('highlight')).toBe(false)
  87. expect(wrapper.find('field-Primary Project').prop('highlight')).toBe(false)
  88. expect(wrapper.find('roles').prop('highlight')).toBe(false)
  89. expect(wrapper.find('field-password').prop('highlight')).toBe(false)
  90. expect(wrapper.find('field-confirm_password').prop('highlight')).toBe(false)
  91. expect(wrapper.find('field-Email').prop('highlight')).toBe(false)
  92. wrapper.find('addButton').click()
  93. expect(wrapper.find('field-username').prop('highlight')).toBe(true)
  94. expect(wrapper.find('field-description').prop('highlight')).toBe(false)
  95. expect(wrapper.find('field-Primary Project').prop('highlight')).toBe(false)
  96. expect(wrapper.find('roles').prop('highlight')).toBe(true)
  97. expect(wrapper.find('field-password').prop('highlight')).toBe(true)
  98. expect(wrapper.find('field-confirm_password').prop('highlight')).toBe(false)
  99. expect(wrapper.find('field-Email').prop('highlight')).toBe(false)
  100. })
  101. it('dispatches add click with correct data', () => {
  102. let onAddClick = sinon.spy()
  103. let wrapper = wrap({
  104. loading: false,
  105. users,
  106. projects,
  107. roles,
  108. onRequestClose: () => { },
  109. onAddClick,
  110. })
  111. wrapper.find('formToggle').simulate('change', { value: 'new' })
  112. wrapper.find('field-username').simulate('change', 'new-username')
  113. wrapper.find('roles').simulate('change', 'role-2')
  114. wrapper.find('roles').simulate('change', 'role-1')
  115. wrapper.find('roles').simulate('change', 'role-2')
  116. wrapper.find('roles').simulate('change', 'role-3')
  117. wrapper.find('field-password').simulate('change', 'new-password')
  118. wrapper.find('field-confirm_password').simulate('change', 'new-password')
  119. wrapper.find('addButton').click()
  120. let userArg = onAddClick.args[0][0]
  121. let rolesArg: Role[] = onAddClick.args[0][2]
  122. expect(userArg.name).toBe('new-username')
  123. expect(userArg.password).toBe('new-password')
  124. expect(rolesArg.length).toBe(2)
  125. expect(rolesArg[0].id).toBe('role-1')
  126. expect(rolesArg[1].id).toBe('role-3')
  127. })
  128. it('disabled on loading', () => {
  129. let wrapper = wrap({
  130. loading: true,
  131. users,
  132. projects,
  133. roles,
  134. onRequestClose: () => { },
  135. onAddClick: () => { },
  136. })
  137. expect(wrapper.find('users').prop('disabled')).toBe(true)
  138. expect(wrapper.find('roles').prop('disabled')).toBe(true)
  139. })
  140. })