user_csv_import_test.rb 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. require 'test_helper'
  2. class UserCsvImportTest < ActiveSupport::TestCase
  3. test 'import example verify' do
  4. csv_string = User.csv_example
  5. rows = CSV.parse(csv_string)
  6. header = rows.shift
  7. assert_equal('id', header[0])
  8. assert_equal('login', header[1])
  9. assert_equal('firstname', header[2])
  10. assert_equal('lastname', header[3])
  11. assert_equal('email', header[4])
  12. assert(header.include?('organization'))
  13. end
  14. test 'empty payload' do
  15. csv_string = ''
  16. result = User.csv_import(
  17. string: csv_string,
  18. parse_params: {
  19. col_sep: ';',
  20. },
  21. try: true,
  22. )
  23. assert_equal(true, result[:try])
  24. assert_nil(result[:records])
  25. assert_equal('failed', result[:result])
  26. assert_equal('Unable to parse empty file/string for User.', result[:errors][0])
  27. csv_string = "login;firstname;lastname;email;active;\n"
  28. result = User.csv_import(
  29. string: csv_string,
  30. parse_params: {
  31. col_sep: ';',
  32. },
  33. try: true,
  34. )
  35. assert_equal(true, result[:try])
  36. assert(result[:records].blank?)
  37. assert_equal('failed', result[:result])
  38. assert_equal('No records found in file/string for User.', result[:errors][0])
  39. end
  40. test 'simple import' do
  41. csv_string = "login;firstname;lastname;email;active;\nuser-simple-import1;firstname-simple-import1;lastname-simple-import1;user-simple-import1@example.com;true\nuser-simple-import2;firstname-simple-import2;lastname-simple-import2;user-simple-import2@example.com;false\n"
  42. result = User.csv_import(
  43. string: csv_string,
  44. parse_params: {
  45. col_sep: ';',
  46. },
  47. try: true,
  48. )
  49. assert_equal(true, result[:try])
  50. assert_equal(2, result[:records].count)
  51. assert_equal('success', result[:result])
  52. assert_nil(User.find_by(login: 'user-simple-import1'))
  53. assert_nil(User.find_by(login: 'user-simple-import2'))
  54. result = User.csv_import(
  55. string: csv_string,
  56. parse_params: {
  57. col_sep: ';',
  58. },
  59. try: false,
  60. )
  61. assert_equal(false, result[:try])
  62. assert_equal(2, result[:records].count)
  63. assert_equal('success', result[:result])
  64. user1 = User.find_by(login: 'user-simple-import1')
  65. assert(user1)
  66. assert_equal(user1.login, 'user-simple-import1')
  67. assert_equal(user1.firstname, 'firstname-simple-import1')
  68. assert_equal(user1.lastname, 'lastname-simple-import1')
  69. assert_equal(user1.email, 'user-simple-import1@example.com')
  70. assert_equal(user1.active, true)
  71. user2 = User.find_by(login: 'user-simple-import2')
  72. assert(user2)
  73. assert_equal(user2.login, 'user-simple-import2')
  74. assert_equal(user2.firstname, 'firstname-simple-import2')
  75. assert_equal(user2.lastname, 'lastname-simple-import2')
  76. assert_equal(user2.email, 'user-simple-import2@example.com')
  77. assert_equal(user2.active, false)
  78. user1.destroy!
  79. user2.destroy!
  80. end
  81. test 'simple import with invalid id' do
  82. csv_string = "id;login;firstname;lastname;email;active;\n999999999;user-simple-invalid_id-import1;firstname-simple-import1;lastname-simple-import1;user-simple-invalid_id-import1@example.com;true\n;user-simple-invalid_id-import2;firstname-simple-import2;lastname-simple-import2;user-simple-invalid_id-import2@example.com;false\n"
  83. result = User.csv_import(
  84. string: csv_string,
  85. parse_params: {
  86. col_sep: ';',
  87. },
  88. try: true,
  89. )
  90. assert_equal(true, result[:try])
  91. assert_equal(1, result[:errors].count)
  92. assert_equal('failed', result[:result])
  93. assert_equal("Line 1: unknown record with id '999999999' for User.", result[:errors][0])
  94. assert_nil(User.find_by(login: 'user-simple-invalid_id-import1'))
  95. assert_nil(User.find_by(login: 'user-simple-invalid_id-import2'))
  96. result = User.csv_import(
  97. string: csv_string,
  98. parse_params: {
  99. col_sep: ';',
  100. },
  101. try: false,
  102. )
  103. assert_equal(false, result[:try])
  104. assert_equal(1, result[:records].count)
  105. assert_equal('failed', result[:result])
  106. assert_nil(User.find_by(login: 'user-simple-invalid_id-import1'))
  107. user2 = User.find_by(login: 'user-simple-invalid_id-import2')
  108. assert(user2)
  109. assert_equal(user2.login, 'user-simple-invalid_id-import2')
  110. assert_equal(user2.firstname, 'firstname-simple-import2')
  111. assert_equal(user2.lastname, 'lastname-simple-import2')
  112. assert_equal(user2.email, 'user-simple-invalid_id-import2@example.com')
  113. assert_equal(user2.active, false)
  114. user2.destroy!
  115. end
  116. test 'simple import with read only id' do
  117. csv_string = "id;login;firstname;lastname;email;active;\n1;user-simple-readonly_id-import1;firstname-simple-import1;lastname-simple-import1;user-simple-readonly_id-import1@example.com;true\n;user-simple-readonly_id-import2;firstname-simple-import2;lastname-simple-import2;user-simple-readonly_id-import2@example.com;false\n"
  118. result = User.csv_import(
  119. string: csv_string,
  120. parse_params: {
  121. col_sep: ';',
  122. },
  123. try: true,
  124. )
  125. assert_equal(true, result[:try])
  126. assert_equal(1, result[:errors].count)
  127. assert_equal('failed', result[:result])
  128. assert_equal("Line 1: unable to update record with id '1' for User.", result[:errors][0])
  129. assert_nil(User.find_by(login: 'user-simple-readonly_id-import1'))
  130. assert_nil(User.find_by(login: 'user-simple-readonly_id-import2'))
  131. result = User.csv_import(
  132. string: csv_string,
  133. parse_params: {
  134. col_sep: ';',
  135. },
  136. try: false,
  137. )
  138. assert_equal(false, result[:try])
  139. assert_equal(1, result[:records].count)
  140. assert_equal('failed', result[:result])
  141. assert_nil(User.find_by(login: 'user-simple-readonly_id-import1'))
  142. user2 = User.find_by(login: 'user-simple-readonly_id-import2')
  143. assert(user2)
  144. assert_equal(user2.login, 'user-simple-readonly_id-import2')
  145. assert_equal(user2.firstname, 'firstname-simple-import2')
  146. assert_equal(user2.lastname, 'lastname-simple-import2')
  147. assert_equal(user2.email, 'user-simple-readonly_id-import2@example.com')
  148. assert_equal(user2.active, false)
  149. user2.destroy!
  150. end
  151. test 'simple import with roles' do
  152. UserInfo.current_user_id = 1
  153. admin = User.create_or_update(
  154. login: 'admin1@example.com',
  155. firstname: 'Admin',
  156. lastname: '1',
  157. email: 'admin1@example.com',
  158. password: 'agentpw',
  159. active: true,
  160. roles: Role.where(name: 'Admin'),
  161. )
  162. csv_string = "login;firstname;lastname;email;roles;\nuser-role-import1;firstname-role-import1;lastname-role-import1;user-role-import1@example.com;Customer;\nuser-role-import2;firstname-role-import2;lastname-role-import2;user-role-import2@example.com;Agent\n;;;;Admin"
  163. result = User.csv_import(
  164. string: csv_string,
  165. parse_params: {
  166. col_sep: ';',
  167. },
  168. try: true,
  169. )
  170. assert_equal(true, result[:try])
  171. assert_equal(2, result[:records].count)
  172. assert_equal('success', result[:result])
  173. assert_nil(User.find_by(login: 'user-role-import1'))
  174. assert_nil(User.find_by(login: 'user-role-import2'))
  175. result = User.csv_import(
  176. string: csv_string,
  177. parse_params: {
  178. col_sep: ';',
  179. },
  180. try: false,
  181. )
  182. assert_equal(false, result[:try])
  183. assert_equal(2, result[:records].count)
  184. assert_equal('success', result[:result])
  185. user1 = User.find_by(login: 'user-role-import1')
  186. assert(user1)
  187. assert_equal(user1.login, 'user-role-import1')
  188. assert_equal(user1.firstname, 'firstname-role-import1')
  189. assert_equal(user1.lastname, 'lastname-role-import1')
  190. assert_equal(user1.email, 'user-role-import1@example.com')
  191. assert_equal(user1.roles.count, 1)
  192. user2 = User.find_by(login: 'user-role-import2')
  193. assert(user2)
  194. assert_equal(user2.login, 'user-role-import2')
  195. assert_equal(user2.firstname, 'firstname-role-import2')
  196. assert_equal(user2.lastname, 'lastname-role-import2')
  197. assert_equal(user2.email, 'user-role-import2@example.com')
  198. assert_equal(user2.roles.count, 2)
  199. user1.destroy!
  200. user2.destroy!
  201. admin.destroy!
  202. end
  203. test 'simple import + fixed params' do
  204. csv_string = "login;firstname;lastname;email\nuser-simple-import-fixed1;firstname-simple-import-fixed1;lastname-simple-import-fixed1;user-simple-import-fixed1@example.com\nuser-simple-import-fixed2;firstname-simple-import-fixed2;lastname-simple-import-fixed2;user-simple-import-fixed2@example.com\n"
  205. result = User.csv_import(
  206. string: csv_string,
  207. parse_params: {
  208. col_sep: ';',
  209. },
  210. fixed_params: {
  211. note: 'some note',
  212. },
  213. try: true,
  214. )
  215. assert_equal(true, result[:try])
  216. assert_equal(2, result[:records].count)
  217. assert_equal('success', result[:result])
  218. assert_nil(User.find_by(login: 'user-simple-import-fixed1'))
  219. assert_nil(User.find_by(login: 'user-simple-import-fixed2'))
  220. result = User.csv_import(
  221. string: csv_string,
  222. parse_params: {
  223. col_sep: ';',
  224. },
  225. fixed_params: {
  226. note: 'some note',
  227. },
  228. try: false,
  229. )
  230. assert_equal(false, result[:try])
  231. assert_equal(2, result[:records].count)
  232. assert_equal('success', result[:result])
  233. user1 = User.find_by(login: 'user-simple-import-fixed1')
  234. user2 = User.find_by(login: 'user-simple-import-fixed2')
  235. assert(user1)
  236. assert_equal('some note', user1.note)
  237. assert_equal('user-simple-import-fixed1', user1.login)
  238. assert_equal('firstname-simple-import-fixed1', user1.firstname)
  239. assert_equal('lastname-simple-import-fixed1', user1.lastname)
  240. assert_equal('user-simple-import-fixed1@example.com', user1.email)
  241. assert(user2)
  242. assert_equal('some note', user2.note)
  243. assert_equal('user-simple-import-fixed2', user2.login)
  244. assert_equal('firstname-simple-import-fixed2', user2.firstname)
  245. assert_equal('lastname-simple-import-fixed2', user2.lastname)
  246. assert_equal('user-simple-import-fixed2@example.com', user2.email)
  247. user1.destroy!
  248. user2.destroy!
  249. end
  250. test 'duplicate import' do
  251. csv_string = "login;firstname;lastname;email\nuser-duplicate-import1;firstname-duplicate-import1;firstname-duplicate-import1;user-duplicate-import1@example.com\nuser-duplicate-import2;firstname-duplicate-import2;firstname-duplicate-import2;user-duplicate-import2@example.com\nuser-duplicate-import2;firstname-duplicate-import3;firstname-duplicate-import3;user-duplicate-import3@example.com"
  252. result = User.csv_import(
  253. string: csv_string,
  254. parse_params: {
  255. col_sep: ';',
  256. },
  257. try: true,
  258. )
  259. assert_equal(true, result[:try])
  260. assert_equal(3, result[:records].count)
  261. assert_equal('success', result[:result])
  262. assert_nil(User.find_by(login: 'user-duplicate-import1'))
  263. assert_nil(User.find_by(login: 'user-duplicate-import2'))
  264. assert_nil(User.find_by(login: 'user-duplicate-import3'))
  265. result = User.csv_import(
  266. string: csv_string,
  267. parse_params: {
  268. col_sep: ';',
  269. },
  270. try: false,
  271. )
  272. assert_equal(false, result[:try])
  273. assert_equal(3, result[:records].count)
  274. assert_equal('success', result[:result])
  275. assert(User.find_by(login: 'user-duplicate-import1'))
  276. assert(User.find_by(login: 'user-duplicate-import2'))
  277. assert_nil(User.find_by(login: 'user-duplicate-import3'))
  278. User.find_by(login: 'user-duplicate-import1').destroy!
  279. User.find_by(login: 'user-duplicate-import2').destroy!
  280. end
  281. test 'invalid attributes' do
  282. csv_string = "login;firstname2;lastname;email\nuser-invalid-import1;firstname-invalid-import1;firstname-invalid-import1;user-invalid-import1@example.com\nuser-invalid-import2;firstname-invalid-import2;firstname-invalid-import2;user-invalid-import2@example.com\n"
  283. result = User.csv_import(
  284. string: csv_string,
  285. parse_params: {
  286. col_sep: ';',
  287. },
  288. try: true,
  289. )
  290. assert_equal(true, result[:try])
  291. assert_equal(2, result[:errors].count)
  292. assert_equal('failed', result[:result])
  293. assert_equal("Line 1: unknown attribute 'firstname2' for User.", result[:errors][0])
  294. assert_equal("Line 2: unknown attribute 'firstname2' for User.", result[:errors][1])
  295. assert_nil(User.find_by(login: 'user-invalid-import1'))
  296. assert_nil(User.find_by(login: 'user-invalid-import2'))
  297. result = User.csv_import(
  298. string: csv_string,
  299. parse_params: {
  300. col_sep: ';',
  301. },
  302. try: false,
  303. )
  304. assert_equal(false, result[:try])
  305. assert_equal(2, result[:errors].count)
  306. assert_equal('failed', result[:result])
  307. assert_equal("Line 1: unknown attribute 'firstname2' for User.", result[:errors][0])
  308. assert_equal("Line 2: unknown attribute 'firstname2' for User.", result[:errors][1])
  309. assert_nil(User.find_by(login: 'user-invalid-import1'))
  310. assert_nil(User.find_by(login: 'user-invalid-import2'))
  311. end
  312. test 'reference import' do
  313. csv_string = "login;firstname;lastname;email;organization\nuser-reference-import1;firstname-reference-import1;firstname-reference-import1;user-reference-import1@example.com;organization-reference-import1\nuser-reference-import2;firstname-reference-import2;firstname-reference-import2;user-reference-import2@example.com;organization-reference-import2\nuser-reference-import3;firstname-reference-import3;firstname-reference-import3;user-reference-import3@example.com;Zammad Foundation\n"
  314. result = User.csv_import(
  315. string: csv_string,
  316. parse_params: {
  317. col_sep: ';',
  318. },
  319. try: true,
  320. )
  321. assert_equal(true, result[:try])
  322. assert_equal(2, result[:errors].count)
  323. assert_equal('failed', result[:result])
  324. assert_nil(User.find_by(login: 'user-reference-import1'))
  325. assert_nil(User.find_by(login: 'user-reference-import2'))
  326. assert_nil(User.find_by(login: 'user-reference-import3'))
  327. assert_equal("Line 1: No lookup value found for 'organization': \"organization-reference-import1\"", result[:errors][0])
  328. assert_equal("Line 2: No lookup value found for 'organization': \"organization-reference-import2\"", result[:errors][1])
  329. result = User.csv_import(
  330. string: csv_string,
  331. parse_params: {
  332. col_sep: ';',
  333. },
  334. try: false,
  335. )
  336. assert_equal(false, result[:try])
  337. assert_equal(2, result[:errors].count)
  338. assert_equal('failed', result[:result])
  339. assert_nil(User.find_by(login: 'user-reference-import1'))
  340. assert_nil(User.find_by(login: 'user-reference-import2'))
  341. assert(User.find_by(login: 'user-reference-import3'))
  342. assert_equal("Line 1: No lookup value found for 'organization': \"organization-reference-import1\"", result[:errors][0])
  343. assert_equal("Line 2: No lookup value found for 'organization': \"organization-reference-import2\"", result[:errors][1])
  344. UserInfo.current_user_id = 1
  345. orgaization1 = Organization.create_if_not_exists(name: 'organization-reference-import1')
  346. orgaization2 = Organization.create_if_not_exists(name: 'organization-reference-import2')
  347. result = User.csv_import(
  348. string: csv_string,
  349. parse_params: {
  350. col_sep: ';',
  351. },
  352. try: true,
  353. )
  354. assert_equal(true, result[:try])
  355. assert_equal(0, result[:errors].count)
  356. assert_equal('success', result[:result])
  357. assert_nil(User.find_by(login: 'user-reference-import1'))
  358. assert_nil(User.find_by(login: 'user-reference-import2'))
  359. assert(User.find_by(login: 'user-reference-import3'))
  360. result = User.csv_import(
  361. string: csv_string,
  362. parse_params: {
  363. col_sep: ';',
  364. },
  365. try: false,
  366. )
  367. assert_equal(false, result[:try])
  368. assert_equal(0, result[:errors].count)
  369. assert_equal('success', result[:result])
  370. assert(User.find_by(login: 'user-reference-import1'))
  371. assert(User.find_by(login: 'user-reference-import2'))
  372. assert(User.find_by(login: 'user-reference-import3'))
  373. User.find_by(login: 'user-reference-import1').destroy!
  374. User.find_by(login: 'user-reference-import2').destroy!
  375. User.find_by(login: 'user-reference-import3').destroy!
  376. orgaization1.destroy!
  377. orgaization2.destroy!
  378. end
  379. test 'simple import with delete' do
  380. csv_string = "login;firstname;lastname;email\nuser-simple-import-fixed1;firstname-simple-import-fixed1;lastname-simple-import-fixed1;user-simple-import-fixed1@example.com\nuser-simple-import-fixed2;firstname-simple-import-fixed2;lastname-simple-import-fixed2;user-simple-import-fixed2@example.com\n"
  381. result = User.csv_import(
  382. string: csv_string,
  383. parse_params: {
  384. col_sep: ';',
  385. },
  386. try: true,
  387. delete: true,
  388. )
  389. assert_equal(true, result[:try])
  390. assert_equal('failed', result[:result])
  391. assert_equal('Delete is not possible for User.', result[:errors][0])
  392. end
  393. end