settings_controller_test.rb 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. require 'test_helper'
  2. class SettingsControllerTest < ActionDispatch::IntegrationTest
  3. setup do
  4. # set accept header
  5. @headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
  6. # create agent
  7. roles = Role.where(name: %w[Admin Agent])
  8. groups = Group.all
  9. UserInfo.current_user_id = 1
  10. @admin_full = User.create!(
  11. login: 'setting-admin',
  12. firstname: 'Setting',
  13. lastname: 'Admin',
  14. email: 'setting-admin@example.com',
  15. password: 'adminpw',
  16. active: true,
  17. roles: roles,
  18. groups: groups,
  19. )
  20. role_api = Role.create!(
  21. name: 'AdminApi',
  22. note: 'To configure your api.',
  23. preferences: {
  24. not: ['Customer'],
  25. },
  26. default_at_signup: false,
  27. updated_by_id: 1,
  28. created_by_id: 1
  29. )
  30. role_api.permission_grant('admin.api')
  31. @admin_api = User.create!(
  32. login: 'setting-admin-api',
  33. firstname: 'Setting',
  34. lastname: 'Admin Api',
  35. email: 'setting-admin-api@example.com',
  36. password: 'adminpw',
  37. active: true,
  38. roles: [role_api],
  39. groups: groups,
  40. )
  41. # create agent
  42. roles = Role.where(name: 'Agent')
  43. @agent = User.create!(
  44. login: 'setting-agent@example.com',
  45. firstname: 'Setting',
  46. lastname: 'Agent',
  47. email: 'setting-agent@example.com',
  48. password: 'agentpw',
  49. active: true,
  50. roles: roles,
  51. groups: groups,
  52. )
  53. # create customer without org
  54. roles = Role.where(name: 'Customer')
  55. @customer_without_org = User.create!(
  56. login: 'setting-customer1@example.com',
  57. firstname: 'Setting',
  58. lastname: 'Customer1',
  59. email: 'setting-customer1@example.com',
  60. password: 'customer1pw',
  61. active: true,
  62. roles: roles,
  63. )
  64. end
  65. test 'settings index with nobody' do
  66. # index
  67. get '/api/v1/settings', params: {}, headers: @headers
  68. assert_response(401)
  69. result = JSON.parse(@response.body)
  70. assert_equal(Hash, result.class)
  71. assert_not(result['settings'])
  72. # show
  73. setting = Setting.find_by(name: 'product_name')
  74. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers
  75. assert_response(401)
  76. result = JSON.parse(@response.body)
  77. assert_equal('authentication failed', result['error'])
  78. end
  79. test 'settings index with admin' do
  80. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('setting-admin@example.com', 'adminpw')
  81. # index
  82. get '/api/v1/settings', params: {}, headers: @headers.merge('Authorization' => credentials)
  83. assert_response(200)
  84. result = JSON.parse(@response.body)
  85. assert_equal(Array, result.class)
  86. assert(result)
  87. hit_api = false
  88. hit_product_name = false
  89. result.each do |setting|
  90. if setting['name'] == 'api_token_access'
  91. hit_api = true
  92. end
  93. if setting['name'] == 'product_name'
  94. hit_product_name = true
  95. end
  96. end
  97. assert_equal(true, hit_api)
  98. assert_equal(true, hit_product_name)
  99. # show
  100. setting = Setting.find_by(name: 'product_name')
  101. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  102. assert_response(200)
  103. result = JSON.parse(@response.body)
  104. assert_equal(Hash, result.class)
  105. assert_equal('product_name', result['name'])
  106. setting = Setting.find_by(name: 'api_token_access')
  107. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  108. assert_response(200)
  109. result = JSON.parse(@response.body)
  110. assert_equal(Hash, result.class)
  111. assert_equal('api_token_access', result['name'])
  112. # update
  113. setting = Setting.find_by(name: 'product_name')
  114. params = {
  115. id: setting.id,
  116. name: 'some_new_name',
  117. preferences: {
  118. permission: ['admin.branding', 'admin.some_new_permission'],
  119. some_new_key: true,
  120. }
  121. }
  122. put "/api/v1/settings/#{setting.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  123. assert_response(200)
  124. result = JSON.parse(@response.body)
  125. assert_equal(Hash, result.class)
  126. assert_equal('product_name', result['name'])
  127. assert_equal(1, result['preferences']['permission'].length)
  128. assert_equal('admin.branding', result['preferences']['permission'][0])
  129. assert_equal(true, result['preferences']['some_new_key'])
  130. # update
  131. setting = Setting.find_by(name: 'api_token_access')
  132. params = {
  133. id: setting.id,
  134. name: 'some_new_name',
  135. preferences: {
  136. permission: ['admin.branding', 'admin.some_new_permission'],
  137. some_new_key: true,
  138. }
  139. }
  140. put "/api/v1/settings/#{setting.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  141. assert_response(200)
  142. result = JSON.parse(@response.body)
  143. assert_equal(Hash, result.class)
  144. assert_equal('api_token_access', result['name'])
  145. assert_equal(1, result['preferences']['permission'].length)
  146. assert_equal('admin.api', result['preferences']['permission'][0])
  147. assert_equal(true, result['preferences']['some_new_key'])
  148. # delete
  149. setting = Setting.find_by(name: 'product_name')
  150. delete "/api/v1/settings/#{setting.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  151. assert_response(401)
  152. result = JSON.parse(@response.body)
  153. assert_equal('Not authorized (feature not possible)', result['error'])
  154. end
  155. test 'settings index with admin-api' do
  156. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('setting-admin-api@example.com', 'adminpw')
  157. # index
  158. get '/api/v1/settings', params: {}, headers: @headers.merge('Authorization' => credentials)
  159. assert_response(200)
  160. result = JSON.parse(@response.body)
  161. assert_equal(Array, result.class)
  162. assert(result)
  163. hit_api = false
  164. hit_product_name = false
  165. result.each do |setting|
  166. if setting['name'] == 'api_token_access'
  167. hit_api = true
  168. end
  169. if setting['name'] == 'product_name'
  170. hit_product_name = true
  171. end
  172. end
  173. assert_equal(true, hit_api)
  174. assert_equal(false, hit_product_name)
  175. # show
  176. setting = Setting.find_by(name: 'product_name')
  177. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  178. assert_response(401)
  179. result = JSON.parse(@response.body)
  180. assert_equal('Not authorized (required ["admin.branding"])', result['error'])
  181. setting = Setting.find_by(name: 'api_token_access')
  182. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  183. assert_response(200)
  184. result = JSON.parse(@response.body)
  185. assert_equal(Hash, result.class)
  186. assert_equal('api_token_access', result['name'])
  187. # update
  188. setting = Setting.find_by(name: 'product_name')
  189. params = {
  190. id: setting.id,
  191. name: 'some_new_name',
  192. preferences: {
  193. permission: ['admin.branding', 'admin.some_new_permission'],
  194. some_new_key: true,
  195. }
  196. }
  197. put "/api/v1/settings/#{setting.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  198. assert_response(401)
  199. result = JSON.parse(@response.body)
  200. assert_equal('Not authorized (required ["admin.branding"])', result['error'])
  201. # update
  202. setting = Setting.find_by(name: 'api_token_access')
  203. params = {
  204. id: setting.id,
  205. name: 'some_new_name',
  206. preferences: {
  207. permission: ['admin.branding', 'admin.some_new_permission'],
  208. some_new_key: true,
  209. }
  210. }
  211. put "/api/v1/settings/#{setting.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  212. assert_response(200)
  213. result = JSON.parse(@response.body)
  214. assert_equal(Hash, result.class)
  215. assert_equal('api_token_access', result['name'])
  216. assert_equal(1, result['preferences']['permission'].length)
  217. assert_equal('admin.api', result['preferences']['permission'][0])
  218. assert_equal(true, result['preferences']['some_new_key'])
  219. # delete
  220. setting = Setting.find_by(name: 'product_name')
  221. delete "/api/v1/settings/#{setting.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  222. assert_response(401)
  223. result = JSON.parse(@response.body)
  224. assert_equal('Not authorized (feature not possible)', result['error'])
  225. end
  226. test 'settings index with agent' do
  227. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('setting-agent@example.com', 'agentpw')
  228. # index
  229. get '/api/v1/settings', params: {}, headers: @headers.merge('Authorization' => credentials)
  230. assert_response(401)
  231. result = JSON.parse(@response.body)
  232. assert_equal(Hash, result.class)
  233. assert_not(result['settings'])
  234. assert_equal('Not authorized (user)!', result['error'])
  235. # show
  236. setting = Setting.find_by(name: 'product_name')
  237. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  238. assert_response(401)
  239. result = JSON.parse(@response.body)
  240. assert_equal('Not authorized (user)!', result['error'])
  241. end
  242. test 'settings index with customer' do
  243. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('setting-customer1@example.com', 'customer1pw')
  244. # index
  245. get '/api/v1/settings', params: {}, headers: @headers.merge('Authorization' => credentials)
  246. assert_response(401)
  247. result = JSON.parse(@response.body)
  248. assert_equal(Hash, result.class)
  249. assert_not(result['settings'])
  250. assert_equal('Not authorized (user)!', result['error'])
  251. # show
  252. setting = Setting.find_by(name: 'product_name')
  253. get "/api/v1/settings/#{setting.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  254. assert_response(401)
  255. result = JSON.parse(@response.body)
  256. assert_equal('Not authorized (user)!', result['error'])
  257. # delete
  258. setting = Setting.find_by(name: 'product_name')
  259. delete "/api/v1/settings/#{setting.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  260. assert_response(401)
  261. result = JSON.parse(@response.body)
  262. assert_equal('Not authorized (user)!', result['error'])
  263. end
  264. end