test.jsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. // @flow
  15. import React from 'react'
  16. import { shallow } from 'enzyme'
  17. import sinon from 'sinon'
  18. import TW from '../../../utils/TestWrapper'
  19. import type { User } from '../../../types/User'
  20. import type { Project, Role } from '../../../types/Project'
  21. import ProjectMemberModal from '.'
  22. type Props = {
  23. loading: boolean,
  24. users: User[],
  25. projects: Project[],
  26. onRequestClose: () => void,
  27. onAddClick: (user: User, isNew: boolean, roles: Role[]) => void,
  28. roles: Role[],
  29. }
  30. const wrap = (props: Props) => new TW(shallow(<ProjectMemberModal {...props} />), 'pmModal')
  31. const users: User[] = [
  32. { id: 'user-1', name: 'User 1', email: '', project: { id: '', name: '' } },
  33. { id: 'user-2', name: 'User 2', email: '', project: { id: '', name: '' } },
  34. ]
  35. const projects: Project[] = [
  36. { id: 'project-1', name: 'Project 1' },
  37. { id: 'project-2', name: 'Project 2' },
  38. ]
  39. const roles: Role[] = [
  40. { id: 'role-1', name: 'Role 1' },
  41. { id: 'role-2', name: 'Role 2' },
  42. { id: 'role-3', name: 'Role 3' },
  43. ]
  44. describe('ProjectMemberModal Component', () => {
  45. it('renders existing user form', () => {
  46. let wrapper = wrap({
  47. loading: false,
  48. users,
  49. projects,
  50. roles,
  51. onRequestClose: () => { },
  52. onAddClick: () => { },
  53. })
  54. expect(wrapper.find('users').prop('items')[1].value).toBe(users[1].id)
  55. expect(wrapper.find('roles').prop('items')[1].value).toBe(roles[1].id)
  56. expect(wrapper.find('users').prop('highlight')).toBe(false)
  57. expect(wrapper.find('roles').prop('highlight')).toBe(false)
  58. expect(wrapper.find('users').prop('disabled')).toBe(false)
  59. expect(wrapper.find('roles').prop('disabled')).toBe(false)
  60. })
  61. it('highlights required fields in existing user form', () => {
  62. let wrapper = wrap({
  63. loading: false,
  64. users,
  65. projects,
  66. roles,
  67. onRequestClose: () => { },
  68. onAddClick: () => { },
  69. })
  70. expect(wrapper.find('users').length).toBe(1)
  71. wrapper.find('addButton').click()
  72. expect(wrapper.find('users').prop('highlight')).toBe(true)
  73. expect(wrapper.find('roles').prop('highlight')).toBe(true)
  74. })
  75. it('renders new user form and highlights required', () => {
  76. let wrapper = wrap({
  77. loading: false,
  78. users,
  79. projects,
  80. roles,
  81. onRequestClose: () => { },
  82. onAddClick: () => { },
  83. })
  84. wrapper.find('formToggle').simulate('change', { value: 'new' })
  85. expect(wrapper.find('users').length).toBe(0)
  86. expect(wrapper.find('field-username').prop('highlight')).toBe(false)
  87. expect(wrapper.find('field-description').prop('highlight')).toBe(false)
  88. expect(wrapper.find('field-Primary Project').prop('highlight')).toBe(false)
  89. expect(wrapper.find('roles').prop('highlight')).toBe(false)
  90. expect(wrapper.find('field-password').prop('highlight')).toBe(false)
  91. expect(wrapper.find('field-confirm_password').prop('highlight')).toBe(false)
  92. expect(wrapper.find('field-Email').prop('highlight')).toBe(false)
  93. wrapper.find('addButton').click()
  94. expect(wrapper.find('field-username').prop('highlight')).toBe(true)
  95. expect(wrapper.find('field-description').prop('highlight')).toBe(false)
  96. expect(wrapper.find('field-Primary Project').prop('highlight')).toBe(false)
  97. expect(wrapper.find('roles').prop('highlight')).toBe(true)
  98. expect(wrapper.find('field-password').prop('highlight')).toBe(true)
  99. expect(wrapper.find('field-confirm_password').prop('highlight')).toBe(false)
  100. expect(wrapper.find('field-Email').prop('highlight')).toBe(false)
  101. })
  102. it('dispatches add click with correct data', () => {
  103. let onAddClick = sinon.spy()
  104. let wrapper = wrap({
  105. loading: false,
  106. users,
  107. projects,
  108. roles,
  109. onRequestClose: () => { },
  110. onAddClick,
  111. })
  112. wrapper.find('formToggle').simulate('change', { value: 'new' })
  113. wrapper.find('field-username').simulate('change', 'new-username')
  114. wrapper.find('roles').simulate('change', 'role-2')
  115. wrapper.find('roles').simulate('change', 'role-1')
  116. wrapper.find('roles').simulate('change', 'role-2')
  117. wrapper.find('roles').simulate('change', 'role-3')
  118. wrapper.find('field-password').simulate('change', 'new-password')
  119. wrapper.find('field-confirm_password').simulate('change', 'new-password')
  120. wrapper.find('addButton').click()
  121. let userArg = onAddClick.args[0][0]
  122. let rolesArg: Role[] = onAddClick.args[0][2]
  123. expect(userArg.name).toBe('new-username')
  124. expect(userArg.password).toBe('new-password')
  125. expect(rolesArg.length).toBe(2)
  126. expect(rolesArg[0].id).toBe('role-1')
  127. expect(rolesArg[1].id).toBe('role-3')
  128. })
  129. it('disabled on loading', () => {
  130. let wrapper = wrap({
  131. loading: true,
  132. users,
  133. projects,
  134. roles,
  135. onRequestClose: () => { },
  136. onAddClick: () => { },
  137. })
  138. expect(wrapper.find('users').prop('disabled')).toBe(true)
  139. expect(wrapper.find('roles').prop('disabled')).toBe(true)
  140. })
  141. })