idoit_controller_test.rb 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. require 'test_helper'
  2. require 'webmock/minitest'
  3. class IdoitControllerTest < ActionDispatch::IntegrationTest
  4. setup do
  5. stub_request(:any, 'https://images.zammad.com/api/v1/person/image')
  6. .to_return(status: 404, body: '', headers: {})
  7. @token = 'some_token'
  8. @endpoint = 'https://idoit.example.com/i-doit/'
  9. @headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
  10. Setting.set('idoit_integration', true)
  11. Setting.set('idoit_config', {
  12. api_token: @token,
  13. endpoint: @endpoint,
  14. client_id: '',
  15. })
  16. groups = Group.where(name: 'Users')
  17. roles = Role.where(name: %w[Agent])
  18. agent = User.create_or_update(
  19. login: 'idoit-agent@example.com',
  20. firstname: 'E',
  21. lastname: 'S',
  22. email: 'idoit-agent@example.com',
  23. password: 'agentpw',
  24. active: true,
  25. roles: roles,
  26. groups: groups,
  27. updated_by_id: 1,
  28. created_by_id: 1,
  29. )
  30. roles = Role.where(name: %w[Agent Admin])
  31. admin = User.create_or_update(
  32. login: 'idoit-admin@example.com',
  33. firstname: 'E',
  34. lastname: 'S',
  35. email: 'idoit-admin@example.com',
  36. password: 'adminpw',
  37. active: true,
  38. roles: roles,
  39. groups: groups,
  40. updated_by_id: 1,
  41. created_by_id: 1,
  42. )
  43. customer1 = User.create_or_update(
  44. login: 'ticket-idoit-customer1@example.com',
  45. firstname: 'CallerId',
  46. lastname: 'Customer1',
  47. email: 'ticket-idoit-customer1@example.com',
  48. password: 'customerpw',
  49. active: true,
  50. updated_by_id: 1,
  51. created_by_id: 1,
  52. )
  53. end
  54. test 'unclear urls' do
  55. agent_credentials = ActionController::HttpAuthentication::Basic.encode_credentials('idoit-agent@example.com', 'agentpw')
  56. params = {
  57. api_token: @token,
  58. endpoint: @endpoint,
  59. client_id: '',
  60. }
  61. post '/api/v1/integration/idoit/verify', params: params.to_json, headers: @headers.merge('Authorization' => agent_credentials)
  62. assert_response(401)
  63. result = JSON.parse(@response.body)
  64. assert_equal(Hash, result.class)
  65. assert_not(result.blank?)
  66. assert_equal('Not authorized (user)!', result['error'])
  67. stub_request(:post, "#{@endpoint}src/jsonrpc.php")
  68. .with(body: "{\"method\":\"cmdb.object_types\",\"params\":{\"apikey\":\"#{@token}\"},\"version\":\"2.0\"}")
  69. .to_return(status: 200, body: read_messaage('object_types_response'), headers: {})
  70. admin_credentials = ActionController::HttpAuthentication::Basic.encode_credentials('idoit-admin@example.com', 'adminpw')
  71. params = {
  72. api_token: @token,
  73. endpoint: @endpoint,
  74. client_id: '',
  75. }
  76. post '/api/v1/integration/idoit/verify', params: params.to_json, headers: @headers.merge('Authorization' => admin_credentials)
  77. assert_response(200)
  78. result = JSON.parse(@response.body)
  79. assert_equal(Hash, result.class)
  80. assert_not(result.blank?)
  81. assert_equal('ok', result['result'])
  82. assert(result['response'])
  83. assert_equal('2.0', result['response']['jsonrpc'])
  84. assert(result['response']['result'])
  85. params = {
  86. api_token: @token,
  87. endpoint: " #{@endpoint}/",
  88. client_id: '',
  89. }
  90. post '/api/v1/integration/idoit/verify', params: params.to_json, headers: @headers.merge('Authorization' => admin_credentials)
  91. assert_response(200)
  92. result = JSON.parse(@response.body)
  93. assert_equal(Hash, result.class)
  94. assert_not(result.blank?)
  95. assert_equal('ok', result['result'])
  96. assert(result['response'])
  97. assert_equal('2.0', result['response']['jsonrpc'])
  98. assert(result['response']['result'])
  99. end
  100. test 'list all object types' do
  101. stub_request(:post, "#{@endpoint}src/jsonrpc.php")
  102. .with(body: "{\"method\":\"cmdb.object_types\",\"params\":{\"apikey\":\"#{@token}\"},\"version\":\"2.0\"}")
  103. .to_return(status: 200, body: read_messaage('object_types_response'), headers: {})
  104. agent_credentials = ActionController::HttpAuthentication::Basic.encode_credentials('idoit-agent@example.com', 'agentpw')
  105. params = {
  106. method: 'cmdb.object_types',
  107. }
  108. post '/api/v1/integration/idoit', params: params.to_json, headers: @headers.merge('Authorization' => agent_credentials)
  109. assert_response(200)
  110. result = JSON.parse(@response.body)
  111. assert_equal(Hash, result.class)
  112. assert_not(result.blank?)
  113. assert_equal('ok', result['result'])
  114. assert(result['response'])
  115. assert_equal('2.0', result['response']['jsonrpc'])
  116. assert(result['response']['result'])
  117. assert_equal('1', result['response']['result'][0]['id'])
  118. assert_equal('System service', result['response']['result'][0]['title'])
  119. admin_credentials = ActionController::HttpAuthentication::Basic.encode_credentials('idoit-admin@example.com', 'adminpw')
  120. params = {
  121. method: 'cmdb.object_types',
  122. }
  123. post '/api/v1/integration/idoit', params: params.to_json, headers: @headers.merge('Authorization' => admin_credentials)
  124. assert_response(200)
  125. result = JSON.parse(@response.body)
  126. assert_equal(Hash, result.class)
  127. assert_not(result.blank?)
  128. assert_equal('ok', result['result'])
  129. assert(result['response'])
  130. assert_equal('2.0', result['response']['jsonrpc'])
  131. assert(result['response']['result'])
  132. assert_equal('1', result['response']['result'][0]['id'])
  133. assert_equal('System service', result['response']['result'][0]['title'])
  134. end
  135. test 'query objects' do
  136. stub_request(:post, "#{@endpoint}src/jsonrpc.php")
  137. .with(body: "{\"method\":\"cmdb.objects\",\"params\":{\"apikey\":\"#{@token}\",\"filter\":{\"ids\":[\"33\"]}},\"version\":\"2.0\"}")
  138. .to_return(status: 200, body: read_messaage('object_types_filter_response'), headers: {})
  139. agent_credentials = ActionController::HttpAuthentication::Basic.encode_credentials('idoit-agent@example.com', 'agentpw')
  140. params = {
  141. method: 'cmdb.objects',
  142. filter: {
  143. ids: ['33']
  144. },
  145. }
  146. post '/api/v1/integration/idoit', params: params.to_json, headers: @headers.merge('Authorization' => agent_credentials)
  147. assert_response(200)
  148. result = JSON.parse(@response.body)
  149. assert_equal(Hash, result.class)
  150. assert_not(result.blank?)
  151. assert_equal('ok', result['result'])
  152. assert(result['response'])
  153. assert_equal('2.0', result['response']['jsonrpc'])
  154. assert(result['response']['result'])
  155. assert_equal('26', result['response']['result'][0]['id'])
  156. assert_equal('demo.example.com', result['response']['result'][0]['title'])
  157. assert_equal('Virtual server', result['response']['result'][0]['type_title'])
  158. assert_equal('in operation', result['response']['result'][0]['cmdb_status_title'])
  159. end
  160. def read_messaage(file)
  161. File.read("test/fixtures/idoit/#{file}.json")
  162. end
  163. end