test.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 moment from 'moment'
  18. import sinon from 'sinon'
  19. import Schedule from '.'
  20. const wrap = props => shallow(<Schedule {...props} />)
  21. let schedules = [
  22. { id: 's-1', schedule: { dom: 4, dow: 3, month: 2, hour: 13, minute: 29 }, expiration_date: new Date(2017, 10, 27, 17, 19) },
  23. { id: 's-2', enabled: true, schedule: { dom: 2, dow: 3, month: 2, hour: 13, minute: 29 }, expiration_date: new Date() },
  24. ]
  25. describe('Schedule Component', () => {
  26. it('renders no schedules', () => {
  27. let wrapper = wrap({ schedules: [] })
  28. expect(wrapper.html().indexOf('This Replica has no Schedules.') > -1).toBe(true)
  29. })
  30. it('dispaches no schedules `Add schedule` click', () => {
  31. let onAddScheduleClick = sinon.spy()
  32. let wrapper = wrap({ onAddScheduleClick })
  33. wrapper.find('Button').simulate('click')
  34. expect(onAddScheduleClick.calledOnce).toBe(true)
  35. })
  36. it('renders correct number of schedules', () => {
  37. let wrapper = wrap({ schedules })
  38. expect(wrapper.find('ScheduleItem').length).toBe(schedules.length)
  39. })
  40. it('dispatches timezone change', () => {
  41. let onTimezoneChange = sinon.spy()
  42. let wrapper = wrap({ schedules, onTimezoneChange })
  43. let dropdown = wrapper.findWhere(w => w.prop('data-test-id') === 'timezoneDropdown')
  44. dropdown.simulate('change', { value: schedules[0] })
  45. expect(onTimezoneChange.calledOnce).toBe(true)
  46. })
  47. it('dispatches Add schedule click from list of schedules with local timezone', () => {
  48. let onAddScheduleClick = sinon.spy()
  49. let wrapper = wrap({ schedules, onAddScheduleClick, timezone: 'local' })
  50. wrapper.findWhere(w => w.prop('data-test-id') === 'addScheduleButton').simulate('click')
  51. let localHours = moment(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate())).add(new Date().getTimezoneOffset(), 'minutes').hours()
  52. expect(onAddScheduleClick.args[0][0].schedule.hour).toBe(localHours)
  53. })
  54. it('renders correct timezone in footer', () => {
  55. let wrapper = wrap({ schedules, timezone: 'utc' })
  56. expect(wrapper.findWhere(w => w.prop('data-test-id') === 'timezoneDropdown').prop('selectedItem')).toBe('utc')
  57. })
  58. it('has add button disabled while adding a schedule', () => {
  59. let wrapper = wrap({ schedules, adding: true })
  60. expect(wrapper.findWhere(w => w.prop('data-test-id') === 'addScheduleButton').prop('disabled')).toBe(true)
  61. })
  62. it('renders loading', () => {
  63. let wrapper = wrap({ schedules: [], loading: true })
  64. expect(wrapper.find('StatusImage').prop('loading')).toBe(true)
  65. })
  66. // @TODO: move to `ScheduleItem`
  67. // it('shows options modal', () => {
  68. // let wrapper = wrap({ schedules })
  69. // wrapper.findWhere(w => w.name() === 'Button' && w.html().indexOf('•••') > -1).at(0).simulate('click')
  70. // expect(wrapper.find('Modal').prop('isOpen')).toBe(true)
  71. // })
  72. // it('renders correct enabled / disabled', () => {
  73. // let wrapper = wrap({ schedules })
  74. // let enabledSwitches = wrapper.findWhere(w => w.name() === 'Switch' && w.prop('noLabel'))
  75. // expect(enabledSwitches.at(0).prop('checked')).toBe(false)
  76. // expect(enabledSwitches.at(1).prop('checked')).toBe(true)
  77. // })
  78. // it('renders correct month, day of month, day of week, hour, minute and expiration date', () => {
  79. // let wrapper = wrap({ schedules })
  80. // expect(wrapper.find('Styled(Dropdown)').at(0).prop('selectedItem').value).toBe(2)
  81. // expect(wrapper.find('Styled(Dropdown)').at(1).prop('selectedItem').value).toBe(4)
  82. // expect(wrapper.find('Styled(Dropdown)').at(2).prop('selectedItem').value).toBe(3)
  83. // expect(wrapper.find('Styled(Dropdown)').at(3).prop('selectedItem').value).toBe(13)
  84. // expect(wrapper.find('Styled(Dropdown)').at(4).prop('selectedItem').value).toBe(29)
  85. // expect(wrapper.find('DatetimePicker').at(0).prop('value').toString()).toBe('Mon Nov 27 2017 17:19:00 GMT+0200')
  86. // })
  87. // it('renders correct hour with local timezone', () => {
  88. // let wrapper = wrap({ schedules, timezone: 'local' })
  89. // expect(wrapper.find('Styled(Dropdown)').at(3).prop('selectedItem').value).toBe(15)
  90. // })
  91. })