elasticsearch_test.rb 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. # encoding: utf-8
  2. # rubocop:disable UselessAssignment
  3. require 'integration_test_helper'
  4. class ElasticsearchTest < ActiveSupport::TestCase
  5. # set config
  6. if !ENV['ES_URL']
  7. raise "ERROR: Need ES_URL - hint ES_URL='http://172.0.0.1:9200'"
  8. end
  9. Setting.set('es_url', ENV['ES_URL'])
  10. if !ENV['ES_INDEX']
  11. raise "ERROR: Need ES_INDEX - hint ES_INDEX='estest.local_zammad'"
  12. end
  13. Setting.set('es_index', ENV['ES_INDEX'])
  14. # Setting.set('es_url', 'http://172.0.0.1:9200')
  15. # Setting.set('es_index', 'estest.local_zammad')
  16. # Setting.set('es_user', 'elasticsearch')
  17. # Setting.set('es_password', 'zammad')
  18. # set max attachment size in mb
  19. Setting.set('es_attachment_max_size_in_mb', 1 )
  20. # drop/create indexes
  21. #Rake::Task["searchindex:drop"].execute
  22. #Rake::Task["searchindex:create"].execute
  23. system('rake searchindex:rebuild')
  24. groups = Group.where( name: 'Users' )
  25. roles = Role.where( name: 'Agent' )
  26. agent = User.create_or_update(
  27. login: 'es-agent@example.com',
  28. firstname: 'E',
  29. lastname: 'S',
  30. email: 'es-agent@example.com',
  31. password: 'agentpw',
  32. active: true,
  33. roles: roles,
  34. groups: groups,
  35. updated_by_id: 1,
  36. created_by_id: 1,
  37. )
  38. group_without_access = Group.create_if_not_exists(
  39. name: 'WithoutAccess',
  40. note: 'Test for not access check.',
  41. updated_by_id: 1,
  42. created_by_id: 1
  43. )
  44. roles = Role.where( name: 'Customer' )
  45. organization1 = Organization.create_if_not_exists(
  46. name: 'Customer Organization Update',
  47. updated_by_id: 1,
  48. created_by_id: 1,
  49. )
  50. customer1 = User.create_or_update(
  51. login: 'es-customer1@example.com',
  52. firstname: 'ES',
  53. lastname: 'Customer1',
  54. email: 'es-customer1@example.com',
  55. password: 'customerpw',
  56. active: true,
  57. organization_id: organization1.id,
  58. roles: roles,
  59. updated_by_id: 1,
  60. created_by_id: 1,
  61. )
  62. sleep 1
  63. customer2 = User.create_or_update(
  64. login: 'es-customer2@example.com',
  65. firstname: 'ES',
  66. lastname: 'Customer2',
  67. email: 'es-customer2@example.com',
  68. password: 'customerpw',
  69. active: true,
  70. organization_id: organization1.id,
  71. roles: roles,
  72. updated_by_id: 1,
  73. created_by_id: 1,
  74. )
  75. sleep 1
  76. customer3 = User.create_or_update(
  77. login: 'es-customer3@example.com',
  78. firstname: 'ES',
  79. lastname: 'Customer3',
  80. email: 'es-customer3@example.com',
  81. password: 'customerpw',
  82. active: true,
  83. roles: roles,
  84. updated_by_id: 1,
  85. created_by_id: 1,
  86. )
  87. # check tickets and search it
  88. test 'a - tickets' do
  89. ticket1 = Ticket.create(
  90. title: "some title\n äöüß",
  91. group: Group.lookup( name: 'Users'),
  92. customer_id: customer1.id,
  93. state: Ticket::State.lookup( name: 'new' ),
  94. priority: Ticket::Priority.lookup( name: '2 normal' ),
  95. updated_by_id: 1,
  96. created_by_id: 1,
  97. )
  98. article1 = Ticket::Article.create(
  99. ticket_id: ticket1.id,
  100. from: 'some_sender@example.com',
  101. to: 'some_recipient@example.com',
  102. subject: 'some subject',
  103. message_id: 'some@id',
  104. body: 'some message',
  105. internal: false,
  106. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  107. type: Ticket::Article::Type.where(name: 'email').first,
  108. updated_by_id: 1,
  109. created_by_id: 1,
  110. )
  111. # add attachments which should get index / .txt
  112. # "some normal text"
  113. Store.add(
  114. object: 'Ticket::Article',
  115. o_id: article1.id,
  116. data: File.open("#{Rails.root}/test/fixtures/es-normal.txt", 'rb') { |file| file.read },
  117. filename: 'es-normal.txt',
  118. preferences: {},
  119. created_by_id: 1,
  120. )
  121. # add attachments which should get index / .pdf
  122. # "Zammad Test77"
  123. Store.add(
  124. object: 'Ticket::Article',
  125. o_id: article1.id,
  126. data: File.open("#{Rails.root}/test/fixtures/es-pdf1.pdf", 'rb') { |file| file.read },
  127. filename: 'es-pdf1.pdf',
  128. preferences: {},
  129. created_by_id: 1,
  130. )
  131. # add attachments which should get index / .box
  132. # "Old programmers never die test99"
  133. Store.add(
  134. object: 'Ticket::Article',
  135. o_id: article1.id,
  136. data: File.open("#{Rails.root}/test/fixtures/es-box1.box", 'rb') { |file| file.read },
  137. filename: 'mail1.box',
  138. preferences: {},
  139. created_by_id: 1,
  140. )
  141. # add to big attachment which should not get index
  142. # "some too big text88"
  143. Store.add(
  144. object: 'Ticket::Article',
  145. o_id: article1.id,
  146. data: File.open("#{Rails.root}/test/fixtures/es-too-big.txt", 'rb') { |file| file.read },
  147. filename: 'es-too-big.txt',
  148. preferences: {},
  149. created_by_id: 1,
  150. )
  151. sleep 1
  152. ticket2 = Ticket.create(
  153. title: 'something else',
  154. group: Group.lookup( name: 'Users'),
  155. customer_id: customer2.id,
  156. state: Ticket::State.lookup( name: 'open' ),
  157. priority: Ticket::Priority.lookup( name: '2 normal' ),
  158. updated_by_id: 1,
  159. created_by_id: 1,
  160. )
  161. article2 = Ticket::Article.create(
  162. ticket_id: ticket2.id,
  163. from: 'some_sender@example.org',
  164. to: 'some_recipient@example.org',
  165. subject: 'some subject2 / autobahn what else?',
  166. message_id: 'some@id',
  167. body: 'some other message <b>with s<u>t</u>rong text<b>',
  168. content_type: 'text/html',
  169. internal: false,
  170. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  171. type: Ticket::Article::Type.where(name: 'email').first,
  172. updated_by_id: 1,
  173. created_by_id: 1,
  174. )
  175. sleep 1
  176. ticket3 = Ticket.create(
  177. title: 'something else',
  178. group: Group.lookup( name: 'WithoutAccess'),
  179. customer_id: customer3.id,
  180. state: Ticket::State.lookup( name: 'open' ),
  181. priority: Ticket::Priority.lookup( name: '2 normal' ),
  182. updated_by_id: 1,
  183. created_by_id: 1,
  184. )
  185. article3 = Ticket::Article.create(
  186. ticket_id: ticket3.id,
  187. from: 'some_sender@example.org',
  188. to: 'some_recipient@example.org',
  189. subject: 'some subject3',
  190. message_id: 'some@id',
  191. body: 'some other message 3 / kindergarden what else?',
  192. internal: false,
  193. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  194. type: Ticket::Article::Type.where(name: 'email').first,
  195. updated_by_id: 1,
  196. created_by_id: 1,
  197. )
  198. # execute background jobs
  199. #puts Delayed::Job.all.inspect
  200. Delayed::Worker.new.work_off
  201. sleep 6
  202. # search as agent
  203. # search for article data
  204. result = Ticket.search(
  205. current_user: agent,
  206. query: 'autobahn',
  207. limit: 15,
  208. )
  209. assert(!result.empty?, 'result exists not')
  210. assert(result[0], 'record 1')
  211. assert(!result[1], 'record 2')
  212. assert_equal(result[0].id, ticket2.id)
  213. # search for html content
  214. result = Ticket.search(
  215. current_user: agent,
  216. query: 'strong',
  217. limit: 15,
  218. )
  219. assert(!result.empty?, 'result exists not')
  220. assert(result[0], 'record 1')
  221. assert(!result[1], 'record 2')
  222. assert_equal(result[0].id, ticket2.id)
  223. # search for indexed attachment
  224. result = Ticket.search(
  225. current_user: agent,
  226. query: '"some normal text66"',
  227. limit: 15,
  228. )
  229. assert(result[0], 'record 1')
  230. assert_equal(result[0].id, ticket1.id)
  231. result = Ticket.search(
  232. current_user: agent,
  233. query: 'test77',
  234. limit: 15,
  235. )
  236. assert(result[0], 'record 1')
  237. assert_equal(result[0].id, ticket1.id)
  238. # search for not indexed attachment
  239. result = Ticket.search(
  240. current_user: agent,
  241. query: 'test88',
  242. limit: 15,
  243. )
  244. assert(!result[0], 'record 1')
  245. result = Ticket.search(
  246. current_user: agent,
  247. query: 'test99',
  248. limit: 15,
  249. )
  250. assert(!result[0], 'record 1')
  251. # search for ticket with no permissions
  252. result = Ticket.search(
  253. current_user: agent,
  254. query: 'kindergarden',
  255. limit: 15,
  256. )
  257. assert(result.empty?, 'result should be empty')
  258. assert(!result[0], 'record 1')
  259. # search as customer1
  260. result = Ticket.search(
  261. current_user: customer1,
  262. query: 'title OR else',
  263. limit: 15,
  264. )
  265. assert(!result.empty?, 'result exists not')
  266. assert(result[0], 'record 1')
  267. assert(result[1], 'record 2')
  268. assert(!result[2], 'record 3')
  269. assert_equal(result[0].id, ticket2.id)
  270. assert_equal(result[1].id, ticket1.id)
  271. # search as customer2
  272. result = Ticket.search(
  273. current_user: customer2,
  274. query: 'title OR else',
  275. limit: 15,
  276. )
  277. assert(!result.empty?, 'result exists not')
  278. assert(result[0], 'record 1')
  279. assert(result[1], 'record 2')
  280. assert(!result[2], 'record 3')
  281. assert_equal(result[0].id, ticket2.id)
  282. assert_equal(result[1].id, ticket1.id)
  283. # search as customer3
  284. result = Ticket.search(
  285. current_user: customer3,
  286. query: 'title OR else',
  287. limit: 15,
  288. )
  289. assert(!result.empty?, 'result exists not')
  290. assert(result[0], 'record 1')
  291. assert(!result[1], 'record 2')
  292. assert_equal(result[0].id, ticket3.id)
  293. end
  294. # check users and search it
  295. test 'b - users' do
  296. # search as agent
  297. result = User.search(
  298. current_user: agent,
  299. query: 'customer1',
  300. limit: 15,
  301. )
  302. assert(!result.empty?, 'result should not be empty')
  303. assert(result[0], 'record 1')
  304. assert(!result[1], 'record 2')
  305. assert_equal(result[0].id, customer1.id)
  306. # search as customer1
  307. result = User.search(
  308. current_user: customer1,
  309. query: 'customer1',
  310. limit: 15,
  311. )
  312. assert(result.empty?, 'result should be empty')
  313. assert(!result[0], 'record 1')
  314. end
  315. end