search_spec.rb 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe Gql::Queries::Search, type: :graphql do
  4. context 'when performing generic searches' do
  5. let(:group) { create(:group) }
  6. let(:organization) { create(:organization, name: search) }
  7. let(:agent) { create(:agent, firstname: search, groups: [ticket.group]) }
  8. let!(:ticket) do
  9. create(:ticket, title: search, organization: organization).tap do |ticket|
  10. # Article required to find ticket via SQL
  11. create(:ticket_article, ticket: ticket)
  12. end
  13. end
  14. let(:search) { SecureRandom.uuid }
  15. let(:query) do
  16. <<~QUERY
  17. query search($query: String!) {
  18. search(query: $query) {
  19. ... on Ticket {
  20. __typename
  21. number
  22. title
  23. }
  24. ... on User {
  25. __typename
  26. firstname
  27. lastname
  28. }
  29. ... on Organization {
  30. __typename
  31. name
  32. }
  33. }
  34. }
  35. QUERY
  36. end
  37. let(:variables) { { query: search } }
  38. let(:es_setup) do
  39. Setting.set('es_url', nil)
  40. end
  41. before do
  42. es_setup
  43. gql.execute(query, variables: variables)
  44. end
  45. shared_examples 'test search query' do
  46. context 'with an agent', authenticated_as: :agent do
  47. let(:expected_result) do
  48. [
  49. { '__typename' => 'Organization', 'name' => organization.name },
  50. { '__typename' => 'User', 'firstname' => agent.firstname, 'lastname' => agent.lastname },
  51. { '__typename' => 'Ticket', 'number' => ticket.number, 'title' => ticket.title },
  52. ]
  53. end
  54. it 'finds expected objects' do
  55. expect(gql.result.data).to eq(expected_result)
  56. end
  57. end
  58. context 'with a customer', authenticated_as: :customer do
  59. let(:customer) { create(:customer, firstname: search, organization: organization) }
  60. let(:expected_result) do
  61. [
  62. { '__typename' => 'Organization', 'name' => organization.name },
  63. ]
  64. end
  65. it 'finds only objects available to the customer' do
  66. expect(gql.result.data).to eq(expected_result)
  67. end
  68. end
  69. end
  70. context 'without search index' do
  71. include_examples 'test search query'
  72. end
  73. context 'with search index', searchindex: true do
  74. let(:es_setup) do
  75. configure_elasticsearch
  76. rebuild_searchindex
  77. end
  78. include_examples 'test search query'
  79. end
  80. it_behaves_like 'graphql responds with error if unauthenticated'
  81. end
  82. end