trabajo-afectivo/test/unit/user_csv_import_test.rb
2022-01-01 14:38:12 +01:00

537 lines
20 KiB
Ruby

# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
require 'test_helper'
class UserCsvImportTest < ActiveSupport::TestCase
test 'import example verify' do
csv_string = User.csv_example
rows = CSV.parse(csv_string)
header = rows.shift
assert_equal('id', header[0])
assert_equal('login', header[1])
assert_equal('firstname', header[2])
assert_equal('lastname', header[3])
assert_equal('email', header[4])
assert(header.include?('organization'))
end
test 'empty payload' do
csv_string = ''
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_nil(result[:records])
assert_equal('failed', result[:result])
assert_equal('Unable to parse empty file/string for User.', result[:errors][0])
csv_string = "login;firstname;lastname;email;active;\n"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert(result[:records].blank?)
assert_equal('failed', result[:result])
assert_equal('No records found in file/string for User.', result[:errors][0])
end
test 'verify required lookup headers' do
csv_string = "firstname;lastname;active;\nfirstname-simple-import1;lastname-simple-import1;;true\nfirstname-simple-import2;lastname-simple-import2;false\n"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal('failed', result[:result])
assert_equal('No lookup column like id,login,email for User found.', result[:errors][0])
end
test 'simple import' do
count = User.count
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
assert_equal(2, result[:stats][:created])
assert_equal(0, result[:stats][:updated])
assert_equal(count, User.count)
assert_nil(User.find_by(login: 'user-simple-import1'))
assert_nil(User.find_by(login: 'user-simple-import2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
assert_equal(2, result[:stats][:created])
assert_equal(0, result[:stats][:updated])
assert_equal(count + 2, User.count)
user1 = User.find_by(login: 'user-simple-import1')
assert(user1)
assert_equal(user1.login, 'user-simple-import1')
assert_equal(user1.firstname, 'firstname-simple-import1')
assert_equal(user1.lastname, 'lastname-simple-import1')
assert_equal(user1.email, 'user-simple-import1@example.com')
assert_equal(user1.active, true)
user2 = User.find_by(login: 'user-simple-import2')
assert(user2)
assert_equal(user2.login, 'user-simple-import2')
assert_equal(user2.firstname, 'firstname-simple-import2')
assert_equal(user2.lastname, 'lastname-simple-import2')
assert_equal(user2.email, 'user-simple-import2@example.com')
assert_equal(user2.active, false)
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
assert_equal(0, result[:stats][:created])
assert_equal(2, result[:stats][:updated])
assert_equal(count + 2, User.count)
user1_1 = user1
user1 = User.find_by(login: 'user-simple-import1')
assert(user1)
assert_equal(user1.login, 'user-simple-import1')
assert_equal(user1.firstname, 'firstname-simple-import1')
assert_equal(user1.lastname, 'lastname-simple-import1')
assert_equal(user1.email, 'user-simple-import1@example.com')
assert_equal(user1.active, true)
assert_equal(user1.updated_at, user1_1.updated_at)
user2_1 = user2
user2 = User.find_by(login: 'user-simple-import2')
assert(user2)
assert_equal(user2.login, 'user-simple-import2')
assert_equal(user2.firstname, 'firstname-simple-import2')
assert_equal(user2.lastname, 'lastname-simple-import2')
assert_equal(user2.email, 'user-simple-import2@example.com')
assert_equal(user2.active, false)
assert_equal(user2.updated_at, user2_1.updated_at)
travel 2.seconds
csv_string = "login;firstname;lastname;email;active;\n ;firstname-simple-import1;lastname-simple-import1;user-simple-IMPORT1@example.com ;true\n user-simple-import2\t;firstname-simple-import2;lastname-simple-import2;;false\n"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal(0, result[:stats][:created])
assert_equal(2, result[:stats][:updated])
assert_equal('success', result[:result])
assert_equal(count + 2, User.count)
user1_1 = user1
user1 = User.find_by(email: 'user-simple-import1@example.com')
assert(user1)
assert_equal(user1.login, 'user-simple-import1@example.com')
assert_equal(user1.firstname, 'firstname-simple-import1')
assert_equal(user1.lastname, 'lastname-simple-import1')
assert_equal(user1.email, 'user-simple-import1@example.com')
assert_equal(user1.active, true)
assert_not_equal(user1.updated_at, user1_1.updated_at)
user2_1 = user2
user2 = User.find_by(login: 'user-simple-import2')
assert(user2)
assert_equal(user2.login, 'user-simple-import2')
assert_equal(user2.firstname, 'firstname-simple-import2')
assert_equal(user2.lastname, 'lastname-simple-import2')
assert_equal(user2.email, 'user-simple-import2@example.com')
assert_equal(user2.active, false)
assert_equal(user2.updated_at, user2_1.updated_at)
user1.destroy!
user2.destroy!
end
test 'simple import with invalid id' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(1, result[:errors].count)
assert_equal('failed', result[:result])
assert_equal("Line 1: unknown User with id '999999999'.", result[:errors][0])
assert_nil(User.find_by(login: 'user-simple-invalid_id-import1'))
assert_nil(User.find_by(login: 'user-simple-invalid_id-import2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(1, result[:records].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-simple-invalid_id-import1'))
# any single failure will cause the entire import to be aborted
assert_nil(User.find_by(login: 'user-simple-invalid_id-import2'))
end
test 'simple import with read only id' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(1, result[:errors].count)
assert_equal('failed', result[:result])
assert_equal("Line 1: unable to update User with id '1'.", result[:errors][0])
assert_nil(User.find_by(login: 'user-simple-readonly_id-import1'))
assert_nil(User.find_by(login: 'user-simple-readonly_id-import2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(1, result[:records].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-simple-readonly_id-import1'))
# any single failure will cause the entire import to be aborted
assert_nil(User.find_by(login: 'user-simple-readonly_id-import2'))
end
test 'simple import with roles' do
UserInfo.current_user_id = 1
admin = User.create_or_update(
login: 'admin1@example.com',
firstname: 'Admin',
lastname: '1',
email: 'admin1@example.com',
password: 'agentpw',
active: true,
roles: Role.where(name: 'Admin'),
)
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
assert_nil(User.find_by(login: 'user-role-import1'))
assert_nil(User.find_by(login: 'user-role-import2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
user1 = User.find_by(login: 'user-role-import1')
assert(user1)
assert_equal(user1.login, 'user-role-import1')
assert_equal(user1.firstname, 'firstname-role-import1')
assert_equal(user1.lastname, 'lastname-role-import1')
assert_equal(user1.email, 'user-role-import1@example.com')
assert_equal(user1.roles.count, 1)
user2 = User.find_by(login: 'user-role-import2')
assert(user2)
assert_equal(user2.login, 'user-role-import2')
assert_equal(user2.firstname, 'firstname-role-import2')
assert_equal(user2.lastname, 'lastname-role-import2')
assert_equal(user2.email, 'user-role-import2@example.com')
assert_equal(user2.roles.count, 2)
user1.destroy!
user2.destroy!
admin.destroy!
end
test 'simple import + fixed params' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
fixed_params: {
note: 'some note',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
assert_nil(User.find_by(login: 'user-simple-import-fixed1'))
assert_nil(User.find_by(login: 'user-simple-import-fixed2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
fixed_params: {
note: 'some note',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal('success', result[:result])
user1 = User.find_by(login: 'user-simple-import-fixed1')
user2 = User.find_by(login: 'user-simple-import-fixed2')
assert(user1)
assert_equal('some note', user1.note)
assert_equal('user-simple-import-fixed1', user1.login)
assert_equal('firstname-simple-import-fixed1', user1.firstname)
assert_equal('lastname-simple-import-fixed1', user1.lastname)
assert_equal('user-simple-import-fixed1@example.com', user1.email)
assert(user2)
assert_equal('some note', user2.note)
assert_equal('user-simple-import-fixed2', user2.login)
assert_equal('firstname-simple-import-fixed2', user2.firstname)
assert_equal('lastname-simple-import-fixed2', user2.lastname)
assert_equal('user-simple-import-fixed2@example.com', user2.email)
user1.destroy!
user2.destroy!
end
test 'duplicate import' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:records].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-duplicate-import1'))
assert_nil(User.find_by(login: 'user-duplicate-import2'))
assert_nil(User.find_by(login: 'user-duplicate-import3'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:records].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-duplicate-import1'))
assert_nil(User.find_by(login: 'user-duplicate-import2'))
assert_nil(User.find_by(login: 'user-duplicate-import3'))
end
test 'invalid attributes' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:errors].count)
assert_equal('failed', result[:result])
assert_equal("Line 1: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][0])
assert_equal("Line 2: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][1])
assert_nil(User.find_by(login: 'user-invalid-import1'))
assert_nil(User.find_by(login: 'user-invalid-import2'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:errors].count)
assert_equal('failed', result[:result])
assert_equal("Line 1: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][0])
assert_equal("Line 2: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][1])
assert_nil(User.find_by(login: 'user-invalid-import1'))
assert_nil(User.find_by(login: 'user-invalid-import2'))
end
test 'reference import' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(2, result[:errors].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-reference-import1'))
assert_nil(User.find_by(login: 'user-reference-import2'))
assert_nil(User.find_by(login: 'user-reference-import3'))
assert_equal("Line 1: No lookup value found for 'organization': \"organization-reference-import1\"", result[:errors][0])
assert_equal("Line 2: No lookup value found for 'organization': \"organization-reference-import2\"", result[:errors][1])
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(2, result[:errors].count)
assert_equal('failed', result[:result])
assert_nil(User.find_by(login: 'user-reference-import1'))
assert_nil(User.find_by(login: 'user-reference-import2'))
assert_nil(User.find_by(login: 'user-reference-import3'))
assert_equal("Line 1: No lookup value found for 'organization': \"organization-reference-import1\"", result[:errors][0])
assert_equal("Line 2: No lookup value found for 'organization': \"organization-reference-import2\"", result[:errors][1])
UserInfo.current_user_id = 1
orgaization1 = Organization.create_if_not_exists(name: 'organization-reference-import1')
orgaization2 = Organization.create_if_not_exists(name: 'organization-reference-import2')
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
)
assert_equal(true, result[:try])
assert_equal(0, result[:errors].count)
assert_equal('success', result[:result])
assert_nil(User.find_by(login: 'user-reference-import1'))
assert_nil(User.find_by(login: 'user-reference-import2'))
# any single failure will cause the entire import to be aborted
assert_nil(User.find_by(login: 'user-reference-import3'))
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: false,
)
assert_equal(false, result[:try])
assert_equal(0, result[:errors].count)
assert_equal('success', result[:result])
assert(User.find_by(login: 'user-reference-import1'))
assert(User.find_by(login: 'user-reference-import2'))
assert(User.find_by(login: 'user-reference-import3'))
User.find_by(login: 'user-reference-import1').destroy!
User.find_by(login: 'user-reference-import2').destroy!
User.find_by(login: 'user-reference-import3').destroy!
orgaization1.destroy!
orgaization2.destroy!
end
test 'simple import with delete' do
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"
result = User.csv_import(
string: csv_string,
parse_params: {
col_sep: ';',
},
try: true,
delete: true,
)
assert_equal(true, result[:try])
assert_equal('failed', result[:result])
assert_equal('Delete is not possible for User.', result[:errors][0])
end
end