idoit_controller_test.rb 6.7 KB

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