overviews_spec.rb 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe Gql::Queries::Ticket::Overviews, type: :graphql do
  4. context 'when fetching ticket overviews' do
  5. let(:agent) { create(:agent) }
  6. let(:query) do
  7. <<~QUERY
  8. query ticketOverviews($ignoreUserConditions: Boolean!, $withTicketCount: Boolean!) {
  9. ticketOverviews(ignoreUserConditions: $ignoreUserConditions) {
  10. id
  11. name
  12. link
  13. prio
  14. orderBy
  15. orderDirection
  16. organizationShared
  17. outOfOffice
  18. groupBy
  19. groupDirection
  20. viewColumnsRaw
  21. viewColumns {
  22. key
  23. value
  24. }
  25. orderColumns {
  26. key
  27. value
  28. }
  29. active
  30. ticketCount @include(if: $withTicketCount)
  31. }
  32. }
  33. QUERY
  34. end
  35. let(:ignore_user_conditions) { false }
  36. let(:with_ticket_count) { false }
  37. let(:variables) { { withTicketCount: with_ticket_count, ignoreUserConditions: ignore_user_conditions } }
  38. before do
  39. gql.execute(query, variables: variables)
  40. end
  41. context 'with an agent', authenticated_as: :agent do
  42. it 'has agent overview' do
  43. expect(gql.result.data.first).to include('name' => 'My Assigned Tickets', 'link' => 'my_assigned', 'prio' => 1000, 'active' => true, 'groupBy' => nil, 'groupDirection' => nil)
  44. end
  45. it 'has view and order columns' do
  46. expect(gql.result.data.first).to include(
  47. 'viewColumnsRaw' => include('title'),
  48. 'viewColumns' => include({ 'key' => 'title', 'value' => 'Title' }),
  49. 'orderColumns' => include({ 'key' => 'created_at', 'value' => 'Created at' }),
  50. )
  51. end
  52. it 'has shared organization and out of office fields' do
  53. expect(gql.result.data.first).to include(
  54. 'organizationShared' => false,
  55. 'outOfOffice' => false,
  56. )
  57. end
  58. context 'with object attributes and unknown attributes', db_strategy: :reset do
  59. let(:oa) do
  60. create(:object_manager_attribute_text, :required_screen).tap do
  61. ObjectManager::Attribute.migration_execute
  62. end
  63. end
  64. # Change the overview to include an object attribute column and a column that has an unknown field.
  65. let(:overview) do
  66. Overview.find_by('link' => 'my_assigned').tap do |overview|
  67. overview.view = { 's' => [oa.name, 'unknown_field'] }
  68. overview.save!
  69. end
  70. end
  71. let(:with_ticket_count) do
  72. overview
  73. false
  74. end
  75. it 'lists view columns correctly' do
  76. expect(gql.result.data.first).to include(
  77. 'viewColumns' => [ { 'key' => oa.name, 'value' => oa.display }, { 'key' => 'unknown_field', 'value' => nil }],
  78. )
  79. end
  80. end
  81. context 'when not ignoring user conditions' do
  82. it 'does not include replacement tickets overview' do
  83. expect(gql.result.data).not_to include(include('name' => 'My Replacement Tickets', 'outOfOffice' => true))
  84. end
  85. end
  86. context 'when ignoring user conditions' do
  87. let(:ignore_user_conditions) { true }
  88. it 'includes replacement tickets overview' do
  89. expect(gql.result.data).to include(include('name' => 'My Replacement Tickets', 'outOfOffice' => true))
  90. end
  91. end
  92. context 'without ticket count' do
  93. it 'does not include ticketCount field' do
  94. expect(gql.result.data.first).not_to have_key('ticketCount')
  95. end
  96. end
  97. context 'with ticket count' do
  98. let(:with_ticket_count) { true }
  99. it 'includes ticketCount field' do
  100. expect(gql.result.data.first['ticketCount']).to eq(0)
  101. end
  102. end
  103. end
  104. context 'with a customer', authenticated_as: :customer do
  105. let(:customer) { create(:customer) }
  106. it 'has customer overview' do
  107. expect(gql.result.data.first).to include('name' => 'My Tickets', 'link' => 'my_tickets', 'prio' => 1100, 'active' => true,)
  108. end
  109. context 'when not ignoring user conditions' do
  110. it 'does not include shared organization overview' do
  111. expect(gql.result.data).not_to include(include('name' => 'My Organization Tickets', 'organizationShared' => true))
  112. end
  113. end
  114. context 'when ignoring user conditions' do
  115. let(:ignore_user_conditions) { true }
  116. it 'includes replacement tickets overview' do
  117. expect(gql.result.data).to include(include('name' => 'My Organization Tickets', 'organizationShared' => true))
  118. end
  119. end
  120. end
  121. it_behaves_like 'graphql responds with error if unauthenticated'
  122. end
  123. end