avatar_spec.rb 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe 'Mobile > Account > Avatar', app: :mobile, type: :system do
  4. context 'when on Account > Avatar page', authenticated_as: :agent do
  5. let(:agent) { create(:agent, firstname: 'Jane', lastname: 'Doe') }
  6. let(:route) { '/account/avatar' }
  7. let(:initial_buttons) do
  8. [
  9. {
  10. name: 'Library',
  11. disabled: false,
  12. },
  13. {
  14. name: 'Camera',
  15. disabled: false,
  16. },
  17. {
  18. name: 'Delete',
  19. disabled: true,
  20. },
  21. ]
  22. end
  23. before do
  24. visit route
  25. end
  26. def wait_for_avatar
  27. expect(page).to have_css('[data-test-id="common-avatar"]')
  28. expect(page).to have_button('Library')
  29. end
  30. context 'when initial state is checked' do
  31. it 'shows the initials of the agent' do
  32. wait_for_avatar
  33. expect(find('[data-test-id="common-avatar"]')).to have_text('JD')
  34. end
  35. it 'shows buttons for uploading + deleting avatars' do
  36. wait_for_avatar
  37. initial_buttons.each do |button|
  38. expect(page).to have_button(button[:name], disabled: button[:disabled])
  39. end
  40. end
  41. end
  42. context 'when a new avatar is uploaded' do
  43. it 'can upload a new avatar' do
  44. wait_for_avatar
  45. expect(page).to have_no_button('Save')
  46. find('input[data-test-id="fileGalleryInput"]', visible: :all).set(Rails.root.join('test/data/image/1000x1000.png'))
  47. expect(page).to have_button('Save')
  48. find_button('Save').click
  49. expect(page).to have_no_button('Save')
  50. expect(page).to have_button('Delete', disabled: false)
  51. store = Store.find(Avatar.last.store_resize_id)
  52. img_url = "data:#{store.preferences['Mime-Type']};base64,#{Base64.strict_encode64(store.content)}"
  53. avatar_element_style = find('[data-test-id="common-avatar"]').style('background-image')
  54. expect(avatar_element_style['background-image']).to eq("url(\"#{img_url}\")")
  55. end
  56. end
  57. context 'when an avatar is already uploaded', authenticated_as: :authenticate do
  58. let(:base64_img) { Base64.decode64(Rails.root.join('test/data/image/1000x1000.png').read) }
  59. let(:avatar) do
  60. avatar = Avatar.add(
  61. object: 'User',
  62. o_id: agent.id,
  63. full: {
  64. content: base64_img,
  65. mime_type: 'image/png',
  66. },
  67. resize: {
  68. content: base64_img,
  69. mime_type: 'image/png',
  70. },
  71. source: "upload #{Time.zone.now}",
  72. deletable: true,
  73. created_by_id: agent.id,
  74. updated_by_id: agent.id,
  75. )
  76. agent.update!(image: avatar.store_hash)
  77. avatar
  78. end
  79. let(:background_image) do
  80. store = Store.find(avatar.store_resize_id)
  81. "data:#{store.preferences['Mime-Type']};base64,#{Base64.strict_encode64(store.content)}"
  82. end
  83. def authenticate
  84. avatar
  85. agent
  86. end
  87. it 'displays the avatar' do
  88. avatar_element_style = find('[data-test-id="common-avatar"]').style('background-image')
  89. expect(avatar_element_style['background-image']).to eq("url(\"#{background_image}\")")
  90. end
  91. context 'when on Account page' do
  92. let(:route) { '/account' }
  93. it 'displays the avatar in the footer' do
  94. avatar_element_style = find('footer [data-test-id="common-avatar"]').style('background-image')
  95. background_image_api_url = "/api/v1/users/image/#{avatar.store_hash}"
  96. expect(avatar_element_style['background-image']).to match(%r{#{background_image_api_url}})
  97. end
  98. end
  99. it 'can delete an existing avatar' do
  100. expect(page).to have_css('[data-test-id="common-avatar"]')
  101. expect(page).to have_button('Delete', disabled: false)
  102. find_button('Delete').click
  103. expect(page).to have_button('Delete avatar')
  104. find_button('Delete avatar').click
  105. expect(find('[data-test-id="common-avatar"]')).to have_text('JD')
  106. expect(page).to have_button('Delete', disabled: true)
  107. end
  108. end
  109. end
  110. end