editing-avatar.spec.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import { ExtendedRenderResult } from '@tests/support/components'
  3. import { visitView } from '@tests/support/components/visitView'
  4. import { mockAccount } from '@tests/support/mock-account'
  5. import { defineComponent } from 'vue'
  6. vi.mock('vue-advanced-cropper', () => {
  7. const Cropper = defineComponent({
  8. emits: ['change'],
  9. mounted() {
  10. this.$emit('change', {
  11. canvas: {
  12. toDataURL() {
  13. return 'cropped image url'
  14. },
  15. },
  16. })
  17. },
  18. template: '<div></div>',
  19. })
  20. return {
  21. Cropper,
  22. }
  23. })
  24. // TODO should check API in the future, made a separate function,
  25. // so it will be easier to migrate
  26. const checkResult = async (view: ExtendedRenderResult, state: any) => {
  27. vi.spyOn(console, 'log').mockImplementation(() => ({}))
  28. await view.events.click(view.getByText('Save'))
  29. expect(console.log).toHaveBeenCalledWith('save image', state)
  30. }
  31. describe('editing avatar', () => {
  32. beforeEach(() => {
  33. mockAccount({
  34. firstname: 'John',
  35. })
  36. })
  37. afterEach(() => {
  38. vi.spyOn(console, 'log').mockRestore()
  39. })
  40. it('can remove avatar', async () => {
  41. const view = await visitView('/account/avatar')
  42. await view.events.click(view.getByText('Delete'))
  43. await checkResult(view, { deleted: true, image: '' })
  44. })
  45. it('can upload image from camera', async () => {
  46. const view = await visitView('/account/avatar')
  47. const file = new File([], 'test.jpg', { type: 'image/jpeg' })
  48. await view.events.upload(view.getByTestId('fileCameraInput'), file)
  49. await checkResult(view, { deleted: false, image: 'cropped image url' })
  50. })
  51. it('can upload image from gallery', async () => {
  52. const view = await visitView('/account/avatar')
  53. const file = new File([], 'test.jpg', { type: 'image/jpeg' })
  54. await view.events.upload(view.getByTestId('fileGalleryInput'), file)
  55. await checkResult(view, { deleted: false, image: 'cropped image url' })
  56. })
  57. it('even after deleting it has an image', async () => {
  58. const view = await visitView('/account/avatar')
  59. const file = new File([], 'test.jpg', { type: 'image/jpeg' })
  60. await view.events.click(view.getByText('Delete'))
  61. await view.events.upload(view.getByTestId('fileGalleryInput'), file)
  62. await checkResult(view, { deleted: false, image: 'cropped image url' })
  63. })
  64. it('after selecting image i can delete my avatar', async () => {
  65. const view = await visitView('/account/avatar')
  66. const file = new File([], 'test.jpg', { type: 'image/jpeg' })
  67. await view.events.upload(view.getByTestId('fileGalleryInput'), file)
  68. await view.events.click(view.getByText('Delete'))
  69. await checkResult(view, { deleted: true, image: '' })
  70. })
  71. })