overviews_spec.rb 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe Ticket::Overviews do
  4. describe '.all' do
  5. let(:views) { described_class.all(current_user: current_user).map(&:name) }
  6. shared_examples 'containing' do |overview|
  7. it "returns #{overview}" do
  8. expect(views).to include(overview)
  9. end
  10. end
  11. shared_examples 'not containing' do |overview|
  12. it "doesn't return #{overview}" do
  13. expect(views).not_to include(overview)
  14. end
  15. end
  16. context 'when Agent' do
  17. let(:current_user) { create(:agent) }
  18. it_behaves_like 'containing', 'Open Tickets'
  19. it_behaves_like 'not containing', 'My Tickets'
  20. it_behaves_like 'not containing', 'My Organization Tickets'
  21. end
  22. context 'when Agent is also Customer' do
  23. let(:current_user) { create(:agent_and_customer, :with_org) }
  24. it_behaves_like 'containing', 'Open Tickets'
  25. it_behaves_like 'containing', 'My Tickets'
  26. it_behaves_like 'containing', 'My Organization Tickets'
  27. end
  28. context 'when Customer' do
  29. let(:current_user) { create(:customer, :with_org) }
  30. it_behaves_like 'not containing', 'Open Tickets'
  31. it_behaves_like 'containing', 'My Tickets'
  32. it_behaves_like 'containing', 'My Organization Tickets'
  33. end
  34. end
  35. describe '.index' do
  36. # https://github.com/zammad/zammad/issues/1769
  37. it 'does not return multiple results for a single ticket' do
  38. user = create(:user)
  39. source_ticket = create(:ticket, customer: user, created_by_id: user.id)
  40. source_ticket2 = create(:ticket, customer: user, created_by_id: user.id)
  41. # create some articles
  42. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf1@blubselector.de', created_by_id: user.id)
  43. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf2@blubselector.de', created_by_id: user.id)
  44. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf3@blubselector.de', created_by_id: user.id)
  45. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf3@blubselector.de', created_by_id: user.id)
  46. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf4@blubselector.de', created_by_id: user.id)
  47. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf5@blubselector.de', created_by_id: user.id)
  48. condition = {
  49. 'article.from' => {
  50. operator: 'contains',
  51. value: 'blubselector.de',
  52. },
  53. }
  54. overview = create(:overview, condition: condition)
  55. result = described_class.index(user)
  56. result = result.select { |x| x[:overview][:name] == overview.name }
  57. expect(result.count).to eq(1)
  58. expect(result[0][:count]).to eq(2)
  59. expect(result[0][:tickets].count).to eq(2)
  60. end
  61. # https://github.com/zammad/zammad/issues/3853
  62. context 'with specific group permissions' do
  63. let(:group_read) { create(:group) }
  64. let(:group_overview) { create(:group) }
  65. let(:user) { create(:agent) }
  66. let(:ticket_read) { create(:ticket, group: group_read) }
  67. let(:ticket_overview) { create(:ticket, group: group_overview) }
  68. before do
  69. user.group_names_access_map = {
  70. group_read.name => %w[read],
  71. group_overview.name => %w[read overview],
  72. }
  73. create(:mention, mentionable: ticket_read, user: user)
  74. create(:mention, mentionable: ticket_overview, user: user)
  75. end
  76. it 'displays the correct amount of tickets in the sidebar' do
  77. result = described_class.index(user, ['my_subscribed_tickets'])
  78. expect(result.first[:count]).to eq(2)
  79. end
  80. it 'displays the correct amount of tickets in the list' do
  81. result = described_class.index(user, ['my_subscribed_tickets'])
  82. expect(result.first[:tickets].pluck(:id)).to eq([ticket_read.id, ticket_overview.id])
  83. end
  84. end
  85. end
  86. describe 'Mentions:' do
  87. let(:group_read) { create(:group) }
  88. let(:user_read) { create(:agent) }
  89. let(:ticket) { create(:ticket, group: group_read) }
  90. before do
  91. user_read.group_names_access_map = {
  92. group_read.name => 'read',
  93. }
  94. end
  95. it 'does show read only tickets in overview because user is mentioned' do
  96. create(:mention, mentionable: ticket, user: user_read)
  97. result = described_class.index(user_read, ['my_subscribed_tickets'])
  98. expect(result.first[:tickets].pluck(:id)).to eq([ticket.id])
  99. end
  100. it 'does not show read only tickets in overview' do
  101. result = described_class.index(user_read, ['my_subscribed_tickets'])
  102. expect(result.first[:tickets]).to eq([])
  103. end
  104. end
  105. describe '.tickets_for_overview' do
  106. it 'does not return multiple results for a single ticket' do
  107. user = create(:user)
  108. source_ticket = create(:ticket, customer: user, created_by_id: user.id)
  109. source_ticket2 = create(:ticket, customer: user, created_by_id: user.id)
  110. # create some articles
  111. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf1@blubselector.de', created_by_id: user.id)
  112. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf2@blubselector.de', created_by_id: user.id)
  113. create(:ticket_article, ticket_id: source_ticket.id, from: 'asdf3@blubselector.de', created_by_id: user.id)
  114. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf3@blubselector.de', created_by_id: user.id)
  115. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf4@blubselector.de', created_by_id: user.id)
  116. create(:ticket_article, ticket_id: source_ticket2.id, from: 'asdf5@blubselector.de', created_by_id: user.id)
  117. condition = {
  118. 'article.from' => {
  119. operator: 'contains',
  120. value: 'blubselector.de',
  121. },
  122. }
  123. overview = create(:overview, condition: condition)
  124. result = described_class.tickets_for_overview(overview, user)
  125. expect(described_class.tickets_for_overview(overview, user).unscope(:order).count(:all).count).to eq(2)
  126. expect(result.pluck(:id)).to contain_exactly(source_ticket.id, source_ticket2.id)
  127. end
  128. context 'with specific group permissions' do
  129. let(:group_read) { create(:group) }
  130. let(:group_overview) { create(:group) }
  131. let(:user) { create(:agent) }
  132. let(:ticket_read) { create(:ticket, group: group_read) }
  133. let(:ticket_overview) { create(:ticket, group: group_overview) }
  134. let(:overview) { create(:overview) }
  135. before do
  136. user.group_names_access_map = {
  137. group_read.name => %w[read],
  138. group_overview.name => %w[read overview],
  139. }
  140. create(:mention, mentionable: ticket_read, user: user)
  141. create(:mention, mentionable: ticket_overview, user: user)
  142. end
  143. it 'displays all tickets when mentioned' do
  144. overview.update!(condition: { 'ticket.mention_user_ids' => { operator: 'is', value: user.id } })
  145. result = described_class.tickets_for_overview(overview, user)
  146. expect(result.pluck(:id)).to contain_exactly(ticket_read.id, ticket_overview.id)
  147. end
  148. it 'displays only overview-permitted tickets without mentions' do
  149. result = described_class.tickets_for_overview(overview, user)
  150. expect(result.pluck(:id)).to contain_exactly(ticket_overview.id)
  151. end
  152. context 'when mentions are used for conditions' do
  153. let(:group_read) { create(:group) }
  154. let(:user_read) { create(:agent) }
  155. let(:ticket) { create(:ticket, group: group_read) }
  156. let(:overview) { create(:overview) }
  157. before do
  158. user_read.group_names_access_map = {
  159. group_read.name => 'read',
  160. }
  161. end
  162. it 'does show read only tickets in overview because user is mentioned' do
  163. create(:mention, mentionable: ticket, user: user_read)
  164. overview.update!(condition: { 'ticket.mention_user_ids' => { operator: 'is', value: user_read.id } })
  165. result = described_class.tickets_for_overview(overview, user_read)
  166. expect(result.pluck(:id)).to eq([ticket.id])
  167. end
  168. it 'does not show read only tickets in overview' do
  169. result = described_class.tickets_for_overview(overview, user_read)
  170. expect(result.pluck(:id)).to be_empty
  171. end
  172. end
  173. end
  174. end
  175. end