search_spec.rb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. require 'rails_helper'
  2. RSpec.describe 'Search', type: :request, searchindex: true do
  3. let(:group) { create(:group) }
  4. let!(:admin_user) do
  5. create(:admin_user, groups: [Group.lookup(name: 'Users'), group])
  6. end
  7. let!(:agent_user) do
  8. create(:agent_user, firstname: 'Search 1234', groups: [Group.lookup(name: 'Users'), group])
  9. end
  10. let!(:customer_user) do
  11. create(:customer_user)
  12. end
  13. let!(:organization1) do
  14. create(:organization, name: 'Rest Org')
  15. end
  16. let!(:organization2) do
  17. create(:organization, name: 'Rest Org #2')
  18. end
  19. let!(:organization3) do
  20. create(:organization, name: 'Rest Org #3')
  21. end
  22. let!(:organization4) do
  23. create(:organization, name: 'Tes.t. Org')
  24. end
  25. let!(:organization5) do
  26. create(:organization, name: 'ABC_D Org')
  27. end
  28. let!(:customer_user2) do
  29. create(:customer_user, organization: organization1)
  30. end
  31. let!(:customer_user3) do
  32. create(:customer_user, organization: organization1)
  33. end
  34. let!(:ticket1) do
  35. create(:ticket, title: 'test 1234-1', customer: customer_user, group: group)
  36. end
  37. let!(:ticket2) do
  38. create(:ticket, title: 'test 1234-2', customer: customer_user2, group: group)
  39. end
  40. let!(:ticket3) do
  41. create(:ticket, title: 'test 1234-2', customer: customer_user3, group: group)
  42. end
  43. let!(:article1) do
  44. create(:ticket_article, ticket_id: ticket1.id)
  45. end
  46. let!(:article2) do
  47. create(:ticket_article, ticket_id: ticket2.id)
  48. end
  49. let!(:article3) do
  50. create(:ticket_article, ticket_id: ticket3.id)
  51. end
  52. before do
  53. configure_elasticsearch do
  54. travel 1.minute
  55. rebuild_searchindex
  56. # execute background jobs
  57. Scheduler.worker(true)
  58. sleep 6
  59. end
  60. end
  61. describe 'request handling' do
  62. it 'does settings index with nobody' do
  63. params = {
  64. query: 'test 1234',
  65. limit: 2,
  66. }
  67. post '/api/v1/search/ticket', params: params, as: :json
  68. expect(response).to have_http_status(:unauthorized)
  69. expect(json_response).to be_a_kind_of(Hash)
  70. expect(json_response).not_to be_blank
  71. expect(json_response['error']).to eq('authentication failed')
  72. post '/api/v1/search/user', params: params, as: :json
  73. expect(response).to have_http_status(:unauthorized)
  74. expect(json_response).to be_a_kind_of(Hash)
  75. expect(json_response).not_to be_blank
  76. expect(json_response['error']).to eq('authentication failed')
  77. post '/api/v1/search', params: params, as: :json
  78. expect(response).to have_http_status(:unauthorized)
  79. expect(json_response).to be_a_kind_of(Hash)
  80. expect(json_response).not_to be_blank
  81. expect(json_response['error']).to eq('authentication failed')
  82. end
  83. it 'does settings index with admin' do
  84. params = {
  85. query: '1234*',
  86. limit: 1,
  87. }
  88. authenticated_as(admin_user)
  89. post '/api/v1/search', params: params, as: :json
  90. expect(response).to have_http_status(:ok)
  91. expect(json_response).to be_a_kind_of(Hash)
  92. expect(json_response).to be_truthy
  93. expect(json_response['result'][0]['type']).to eq('Ticket')
  94. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  95. expect(json_response['result'][1]['type']).to eq('User')
  96. expect(json_response['result'][1]['id']).to eq(agent_user.id)
  97. expect(json_response['result'][2]).to be_falsey
  98. params = {
  99. query: '1234*',
  100. limit: 10,
  101. }
  102. post '/api/v1/search', params: params, as: :json
  103. expect(response).to have_http_status(:ok)
  104. expect(json_response).to be_a_kind_of(Hash)
  105. expect(json_response).to be_truthy
  106. expect(json_response['result'][0]['type']).to eq('Ticket')
  107. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  108. expect(json_response['result'][1]['type']).to eq('Ticket')
  109. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  110. expect(json_response['result'][2]['type']).to eq('Ticket')
  111. expect(json_response['result'][2]['id']).to eq(ticket1.id)
  112. expect(json_response['result'][3]['type']).to eq('User')
  113. expect(json_response['result'][3]['id']).to eq(agent_user.id)
  114. expect(json_response['result'][4]).to be_falsey
  115. params = {
  116. query: '1234*',
  117. limit: 10,
  118. }
  119. post '/api/v1/search/ticket', params: params, as: :json
  120. expect(response).to have_http_status(:ok)
  121. expect(json_response).to be_a_kind_of(Hash)
  122. expect(json_response).to be_truthy
  123. expect(json_response['result'][0]['type']).to eq('Ticket')
  124. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  125. expect(json_response['result'][1]['type']).to eq('Ticket')
  126. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  127. expect(json_response['result'][2]['type']).to eq('Ticket')
  128. expect(json_response['result'][2]['id']).to eq(ticket1.id)
  129. expect(json_response['result'][3]).to be_falsey
  130. params = {
  131. query: '1234*',
  132. limit: 10,
  133. }
  134. post '/api/v1/search/user', params: params, as: :json
  135. expect(response).to have_http_status(:ok)
  136. expect(json_response).to be_a_kind_of(Hash)
  137. expect(json_response['result'][0]['type']).to eq('User')
  138. expect(json_response['result'][0]['id']).to eq(agent_user.id)
  139. expect(json_response['result'][1]).to be_falsey
  140. end
  141. it 'does settings index with agent' do
  142. params = {
  143. query: '1234*',
  144. limit: 1,
  145. }
  146. authenticated_as(agent_user)
  147. post '/api/v1/search', params: params, as: :json
  148. expect(response).to have_http_status(:ok)
  149. expect(json_response).to be_a_kind_of(Hash)
  150. expect(json_response).to be_truthy
  151. expect(json_response['result'][0]['type']).to eq('Ticket')
  152. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  153. expect(json_response['result'][1]['type']).to eq('User')
  154. expect(json_response['result'][1]['id']).to eq(agent_user.id)
  155. expect(json_response['result'][2]).to be_falsey
  156. params = {
  157. query: '1234*',
  158. limit: 10,
  159. }
  160. post '/api/v1/search', params: params, as: :json
  161. expect(response).to have_http_status(:ok)
  162. expect(json_response).to be_a_kind_of(Hash)
  163. expect(json_response).to be_truthy
  164. expect(json_response['result'][0]['type']).to eq('Ticket')
  165. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  166. expect(json_response['result'][1]['type']).to eq('Ticket')
  167. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  168. expect(json_response['result'][2]['type']).to eq('Ticket')
  169. expect(json_response['result'][2]['id']).to eq(ticket1.id)
  170. expect(json_response['result'][3]['type']).to eq('User')
  171. expect(json_response['result'][3]['id']).to eq(agent_user.id)
  172. expect(json_response['result'][4]).to be_falsey
  173. params = {
  174. query: '1234*',
  175. limit: 10,
  176. }
  177. post '/api/v1/search/ticket', params: params, as: :json
  178. expect(response).to have_http_status(:ok)
  179. expect(json_response).to be_a_kind_of(Hash)
  180. expect(json_response).to be_truthy
  181. expect(json_response['result'][0]['type']).to eq('Ticket')
  182. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  183. expect(json_response['result'][1]['type']).to eq('Ticket')
  184. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  185. expect(json_response['result'][2]['type']).to eq('Ticket')
  186. expect(json_response['result'][2]['id']).to eq(ticket1.id)
  187. expect(json_response['result'][3]).to be_falsey
  188. params = {
  189. query: '1234*',
  190. limit: 10,
  191. }
  192. post '/api/v1/search/user', params: params, as: :json
  193. expect(response).to have_http_status(:ok)
  194. expect(json_response).to be_a_kind_of(Hash)
  195. expect(json_response['result'][0]['type']).to eq('User')
  196. expect(json_response['result'][0]['id']).to eq(agent_user.id)
  197. expect(json_response['result'][1]).to be_falsey
  198. end
  199. it 'does settings index with customer 1' do
  200. params = {
  201. query: '1234*',
  202. limit: 10,
  203. }
  204. authenticated_as(customer_user)
  205. post '/api/v1/search', params: params, as: :json
  206. expect(response).to have_http_status(:ok)
  207. expect(json_response).to be_a_kind_of(Hash)
  208. expect(json_response).to be_truthy
  209. expect(json_response['result'][0]['type']).to eq('Ticket')
  210. expect(json_response['result'][0]['id']).to eq(ticket1.id)
  211. expect(json_response['result'][1]).to be_falsey
  212. params = {
  213. query: '1234*',
  214. limit: 10,
  215. }
  216. post '/api/v1/search/ticket', params: params, as: :json
  217. expect(response).to have_http_status(:ok)
  218. expect(json_response).to be_a_kind_of(Hash)
  219. expect(json_response).to be_truthy
  220. expect(json_response['result'][0]['type']).to eq('Ticket')
  221. expect(json_response['result'][0]['id']).to eq(ticket1.id)
  222. expect(json_response['result'][1]).to be_falsey
  223. params = {
  224. query: '1234*',
  225. limit: 10,
  226. }
  227. post '/api/v1/search/user', params: params, as: :json
  228. expect(response).to have_http_status(:ok)
  229. expect(json_response).to be_a_kind_of(Hash)
  230. expect(json_response['result'][0]).to be_falsey
  231. end
  232. it 'does settings index with customer 2' do
  233. params = {
  234. query: '1234*',
  235. limit: 10,
  236. }
  237. authenticated_as(customer_user2)
  238. post '/api/v1/search', params: params, as: :json
  239. expect(response).to have_http_status(:ok)
  240. expect(json_response).to be_a_kind_of(Hash)
  241. expect(json_response).to be_truthy
  242. expect(json_response['result'][0]['type']).to eq('Ticket')
  243. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  244. expect(json_response['result'][1]['type']).to eq('Ticket')
  245. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  246. expect(json_response['result'][2]).to be_falsey
  247. params = {
  248. query: '1234*',
  249. limit: 10,
  250. }
  251. post '/api/v1/search/ticket', params: params, as: :json
  252. expect(response).to have_http_status(:ok)
  253. expect(json_response).to be_a_kind_of(Hash)
  254. expect(json_response).to be_truthy
  255. expect(json_response['result'][0]['type']).to eq('Ticket')
  256. expect(json_response['result'][0]['id']).to eq(ticket3.id)
  257. expect(json_response['result'][1]['type']).to eq('Ticket')
  258. expect(json_response['result'][1]['id']).to eq(ticket2.id)
  259. expect(json_response['result'][2]).to be_falsey
  260. params = {
  261. query: '1234*',
  262. limit: 10,
  263. }
  264. post '/api/v1/search/user', params: params, as: :json
  265. expect(response).to have_http_status(:ok)
  266. expect(json_response).to be_a_kind_of(Hash)
  267. expect(json_response['result'][0]).to be_falsey
  268. end
  269. # Verify fix for Github issue #2058 - Autocomplete hangs on dot in the new user form
  270. it 'does searching for organization with a dot in its name' do
  271. authenticated_as(agent_user)
  272. get '/api/v1/search/organization?query=tes.', as: :json
  273. expect(response).to have_http_status(:ok)
  274. expect(json_response['result'].size).to eq(1)
  275. expect(json_response['result'][0]['type']).to eq('Organization')
  276. target_id = json_response['result'][0]['id']
  277. expect(json_response['assets']['Organization'][target_id.to_s]['name']).to eq('Tes.t. Org')
  278. end
  279. # Search query H& should correctly match H&M
  280. it 'does searching for organization with _ in its name' do
  281. authenticated_as(agent_user)
  282. get '/api/v1/search/organization?query=abc_', as: :json
  283. expect(response).to have_http_status(:ok)
  284. expect(json_response['result'].size).to eq(1)
  285. expect(json_response['result'][0]['type']).to eq('Organization')
  286. target_id = json_response['result'][0]['id']
  287. expect(json_response['assets']['Organization'][target_id.to_s]['name']).to eq('ABC_D Org')
  288. end
  289. end
  290. end