Fixed issue #2329 - Unable to import (update) users with email addresses als lookup index written in upper letters.
This commit is contained in:
parent
27dfeacf1d
commit
13b3b841d5
19 changed files with 289 additions and 42 deletions
|
@ -1320,6 +1320,7 @@ class App.Import extends App.ControllerModal
|
||||||
params.set('try', true)
|
params.set('try', true)
|
||||||
if _.isEmpty(params.get('data'))
|
if _.isEmpty(params.get('data'))
|
||||||
params.delete('data')
|
params.delete('data')
|
||||||
|
@formDisable(e)
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'csv_import'
|
id: 'csv_import'
|
||||||
type: 'POST'
|
type: 'POST'
|
||||||
|
@ -1341,6 +1342,14 @@ class App.Import extends App.ControllerModal
|
||||||
return
|
return
|
||||||
@data = data
|
@data = data
|
||||||
@update()
|
@update()
|
||||||
|
@formEnable(e)
|
||||||
|
error: (data) =>
|
||||||
|
details = data.responseJSON || {}
|
||||||
|
@notify
|
||||||
|
type: 'error'
|
||||||
|
msg: App.i18n.translateContent(details.error_human || details.error || 'Unable to import!')
|
||||||
|
timeout: 6000
|
||||||
|
@formEnable(e)
|
||||||
)
|
)
|
||||||
|
|
||||||
class App.ImportTryResult extends App.ControllerModal
|
class App.ImportTryResult extends App.ControllerModal
|
||||||
|
@ -1361,10 +1370,23 @@ class App.ImportTryResult extends App.ControllerModal
|
||||||
import_example_url: "#{@baseUrl}/import"
|
import_example_url: "#{@baseUrl}/import"
|
||||||
result: @result
|
result: @result
|
||||||
))
|
))
|
||||||
|
|
||||||
|
# check if data is processing...
|
||||||
|
if @data
|
||||||
|
result = App.view("#{@templateDirectory}/result")(
|
||||||
|
@data
|
||||||
|
)
|
||||||
|
content.find('.js-error').html(result)
|
||||||
|
if result
|
||||||
|
content.find('.js-error').removeClass('hide')
|
||||||
|
else
|
||||||
|
content.find('.js-error').addClass('hide')
|
||||||
|
|
||||||
content
|
content
|
||||||
|
|
||||||
onSubmit: (e) =>
|
onSubmit: (e) =>
|
||||||
@params.set('try', false)
|
@params.set('try', false)
|
||||||
|
@formDisable(e)
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'csv_import'
|
id: 'csv_import'
|
||||||
type: 'POST'
|
type: 'POST'
|
||||||
|
@ -1386,6 +1408,14 @@ class App.ImportTryResult extends App.ControllerModal
|
||||||
return
|
return
|
||||||
@data = data
|
@data = data
|
||||||
@update()
|
@update()
|
||||||
|
@formEnable(e)
|
||||||
|
error: (data) =>
|
||||||
|
details = data.responseJSON || {}
|
||||||
|
@notify
|
||||||
|
type: 'error'
|
||||||
|
msg: App.i18n.translateContent(details.error_human || details.error || 'Unable to import!')
|
||||||
|
timeout: 6000
|
||||||
|
@formEnable(e)
|
||||||
)
|
)
|
||||||
|
|
||||||
class App.ImportResult extends App.ControllerModal
|
class App.ImportResult extends App.ControllerModal
|
||||||
|
|
|
@ -349,7 +349,12 @@ curl http://localhost/api/v1/organization/{id} -v -u #{login}:#{password} -H "Co
|
||||||
# @response_message 401 Invalid session.
|
# @response_message 401 Invalid session.
|
||||||
def import_start
|
def import_start
|
||||||
permission_check('admin.user')
|
permission_check('admin.user')
|
||||||
string = params[:data] || params[:file].read.force_encoding('utf-8')
|
string = params[:data]
|
||||||
|
if string.blank? && params[:file].present?
|
||||||
|
string = params[:file].read.force_encoding('utf-8')
|
||||||
|
end
|
||||||
|
raise Exceptions::UnprocessableEntity, 'No source data submitted!' if string.blank?
|
||||||
|
|
||||||
result = Organization.csv_import(
|
result = Organization.csv_import(
|
||||||
string: string,
|
string: string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
|
|
|
@ -186,7 +186,12 @@ curl http://localhost/api/v1/text_modules.json -v -u #{login}:#{password} -H "Co
|
||||||
# @response_message 401 Invalid session.
|
# @response_message 401 Invalid session.
|
||||||
def import_start
|
def import_start
|
||||||
permission_check('admin.text_module')
|
permission_check('admin.text_module')
|
||||||
string = params[:data] || params[:file].read.force_encoding('utf-8')
|
string = params[:data]
|
||||||
|
if string.blank? && params[:file].present?
|
||||||
|
string = params[:file].read.force_encoding('utf-8')
|
||||||
|
end
|
||||||
|
raise Exceptions::UnprocessableEntity, 'No source data submitted!' if string.blank?
|
||||||
|
|
||||||
result = TextModule.csv_import(
|
result = TextModule.csv_import(
|
||||||
string: string,
|
string: string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
|
|
|
@ -318,8 +318,14 @@ class TicketArticlesController < ApplicationController
|
||||||
raise 'Only can import tickets if system is in import mode.'
|
raise 'Only can import tickets if system is in import mode.'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
string = params[:data]
|
||||||
|
if string.blank? && params[:file].present?
|
||||||
|
string = params[:file].read.force_encoding('utf-8')
|
||||||
|
end
|
||||||
|
raise Exceptions::UnprocessableEntity, 'No source data submitted!' if string.blank?
|
||||||
|
|
||||||
result = Ticket::Article.csv_import(
|
result = Ticket::Article.csv_import(
|
||||||
string: params[:file].read.force_encoding('utf-8'),
|
string: string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
col_sep: ';',
|
col_sep: ';',
|
||||||
},
|
},
|
||||||
|
|
|
@ -641,7 +641,12 @@ class TicketsController < ApplicationController
|
||||||
raise 'Only can import tickets if system is in import mode.'
|
raise 'Only can import tickets if system is in import mode.'
|
||||||
end
|
end
|
||||||
|
|
||||||
string = params[:data] || params[:file].read.force_encoding('utf-8')
|
string = params[:data]
|
||||||
|
if string.blank? && params[:file].present?
|
||||||
|
string = params[:file].read.force_encoding('utf-8')
|
||||||
|
end
|
||||||
|
raise Exceptions::UnprocessableEntity, 'No source data submitted!' if string.blank?
|
||||||
|
|
||||||
result = Ticket.csv_import(
|
result = Ticket.csv_import(
|
||||||
string: string,
|
string: string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
|
|
|
@ -1043,7 +1043,12 @@ curl http://localhost/api/v1/users/avatar -v -u #{login}:#{password} -H "Content
|
||||||
# @response_message 401 Invalid session.
|
# @response_message 401 Invalid session.
|
||||||
def import_start
|
def import_start
|
||||||
permission_check('admin.user')
|
permission_check('admin.user')
|
||||||
string = params[:data] || params[:file].read.force_encoding('utf-8')
|
string = params[:data]
|
||||||
|
if string.blank? && params[:file].present?
|
||||||
|
string = params[:file].read.force_encoding('utf-8')
|
||||||
|
end
|
||||||
|
raise Exceptions::UnprocessableEntity, 'No source data submitted!' if string.blank?
|
||||||
|
|
||||||
result = User.csv_import(
|
result = User.csv_import(
|
||||||
string: string,
|
string: string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
|
|
|
@ -20,20 +20,33 @@ returns
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def lookup(**attr)
|
def lookup(**attr)
|
||||||
|
raise ArgumentError, "Multiple lookup attributes given (#{attr.keys.join(', ')}), only support (#{lookup_keys.join(', ')})" if attr.many?
|
||||||
|
|
||||||
attr.transform_keys!(&:to_sym).slice!(*lookup_keys)
|
attr.transform_keys!(&:to_sym).slice!(*lookup_keys)
|
||||||
raise ArgumentError, "Valid lookup attribute required (#{lookup_keys.join(', ')})" if attr.empty?
|
raise ArgumentError, "Valid lookup attribute required (#{lookup_keys.join(', ')})" if attr.empty?
|
||||||
raise ArgumentError, "Multiple lookup attributes given (#{attr.keys.join(', ')})" if attr.many?
|
|
||||||
|
|
||||||
record = cache_get(attr.values.first)
|
record = cache_get(attr.values.first)
|
||||||
record ||= find_and_save_to_cache_by(attr)
|
record ||= find_and_save_to_cache_by(attr)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
=begin
|
||||||
|
|
||||||
|
return possible lookup keys for model
|
||||||
|
|
||||||
|
result = Model.lookup_keys
|
||||||
|
|
||||||
|
returns
|
||||||
|
|
||||||
|
[:id, :name] # or fror users [:id, :login, :email]
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
def lookup_keys
|
def lookup_keys
|
||||||
@lookup_keys ||= %i[id name login email number] & attribute_names.map(&:to_sym)
|
@lookup_keys ||= %i[id name login email number] & attribute_names.map(&:to_sym)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
def find_and_save_to_cache_by(attr)
|
def find_and_save_to_cache_by(attr)
|
||||||
if !Rails.application.config.db_case_sensitive && string_key?(attr.keys.first)
|
if !Rails.application.config.db_case_sensitive && string_key?(attr.keys.first)
|
||||||
where(attr).find { |r| r[attr.keys.first] == attr.values.first }
|
where(attr).find { |r| r[attr.keys.first] == attr.values.first }
|
||||||
|
|
|
@ -118,6 +118,17 @@ returns
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# check if min one lookup key exists
|
||||||
|
if header.count == (header - lookup_keys.map(&:to_s)).count
|
||||||
|
errors.push "No lookup column like #{lookup_keys.map(&:to_s).join(',')} for #{new.class} found."
|
||||||
|
result = {
|
||||||
|
errors: errors,
|
||||||
|
try: try,
|
||||||
|
result: 'failed',
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
# get payload based on csv
|
# get payload based on csv
|
||||||
payload = []
|
payload = []
|
||||||
rows.each do |row|
|
rows.each do |row|
|
||||||
|
@ -172,11 +183,15 @@ returns
|
||||||
payload.each do |attributes|
|
payload.each do |attributes|
|
||||||
line_count += 1
|
line_count += 1
|
||||||
record = nil
|
record = nil
|
||||||
%i[id number name login email].each do |lookup_by|
|
lookup_keys.each do |lookup_by|
|
||||||
next if !attributes[lookup_by]
|
next if attributes[lookup_by].blank?
|
||||||
|
|
||||||
params = {}
|
params = {}
|
||||||
params[lookup_by] = attributes[lookup_by]
|
params[lookup_by] = if %i[email login].include?(lookup_by)
|
||||||
|
attributes[lookup_by].downcase
|
||||||
|
else
|
||||||
|
attributes[lookup_by]
|
||||||
|
end
|
||||||
record = lookup(params)
|
record = lookup(params)
|
||||||
break if record
|
break if record
|
||||||
end
|
end
|
||||||
|
@ -199,6 +214,7 @@ returns
|
||||||
end
|
end
|
||||||
|
|
||||||
# create object
|
# create object
|
||||||
|
BulkImportInfo.enable
|
||||||
Transaction.execute(disable_notification: true, reset_user_id: true) do
|
Transaction.execute(disable_notification: true, reset_user_id: true) do
|
||||||
UserInfo.current_user_id = clean_params[:updated_by_id] || clean_params[:created_by_id]
|
UserInfo.current_user_id = clean_params[:updated_by_id] || clean_params[:created_by_id]
|
||||||
if !record || delete == true
|
if !record || delete == true
|
||||||
|
@ -217,7 +233,7 @@ returns
|
||||||
record.associations_from_param(attributes)
|
record.associations_from_param(attributes)
|
||||||
record.save!
|
record.save!
|
||||||
rescue => e
|
rescue => e
|
||||||
errors.push "Line #{line_count}: #{e.message}"
|
errors.push "Line #{line_count}: Unable to create record - #{e.message}"
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -234,14 +250,20 @@ returns
|
||||||
|
|
||||||
record.with_lock do
|
record.with_lock do
|
||||||
record.associations_from_param(attributes)
|
record.associations_from_param(attributes)
|
||||||
record.update!(clean_params)
|
clean_params.each do |key, value|
|
||||||
|
record[key] = value
|
||||||
|
end
|
||||||
|
next if !record.changed?
|
||||||
|
|
||||||
|
record.save!
|
||||||
end
|
end
|
||||||
rescue => e
|
rescue => e
|
||||||
errors.push "Line #{line_count}: #{e.message}"
|
errors.push "Line #{line_count}: Unable to update record - #{e.message}"
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
BulkImportInfo.disable
|
||||||
|
|
||||||
records.push record
|
records.push record
|
||||||
end
|
end
|
||||||
|
@ -258,7 +280,6 @@ returns
|
||||||
try: try,
|
try: try,
|
||||||
result: result,
|
result: result,
|
||||||
}
|
}
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
|
@ -9,6 +9,9 @@ module Cti
|
||||||
after_commit :update_cti_logs, on: :destroy
|
after_commit :update_cti_logs, on: :destroy
|
||||||
after_commit :update_cti_logs_with_fg_optimization, on: :create
|
after_commit :update_cti_logs_with_fg_optimization, on: :create
|
||||||
|
|
||||||
|
skip_callback :commit, :after, :update_cti_logs, if: -> { BulkImportInfo.enabled? }
|
||||||
|
skip_callback :commit, :after, :update_cti_logs_with_fg_optimization, if: -> { BulkImportInfo.enabled? }
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
Cti::CallerId.maybe_add(
|
Cti::CallerId.maybe_add(
|
||||||
|
|
|
@ -21,12 +21,15 @@ class User < ApplicationModel
|
||||||
|
|
||||||
before_validation :check_name, :check_email, :check_login, :ensure_uniq_email, :ensure_password, :ensure_roles, :ensure_identifier
|
before_validation :check_name, :check_email, :check_login, :ensure_uniq_email, :ensure_password, :ensure_roles, :ensure_identifier
|
||||||
before_validation :check_mail_delivery_failed, on: :update
|
before_validation :check_mail_delivery_failed, on: :update
|
||||||
before_create :check_preferences_default, :validate_preferences, :validate_ooo, :domain_based_assignment, :set_locale
|
before_create :check_preferences_default, :validate_preferences, :validate_ooo, :domain_based_assignment, :set_locale
|
||||||
before_update :check_preferences_default, :validate_preferences, :validate_ooo, :reset_login_failed, :validate_agent_limit_by_attributes, :last_admin_check_by_attribute
|
before_update :check_preferences_default, :validate_preferences, :validate_ooo, :reset_login_failed, :validate_agent_limit_by_attributes, :last_admin_check_by_attribute
|
||||||
after_create :avatar_for_email_check
|
after_create :avatar_for_email_check
|
||||||
after_update :avatar_for_email_check
|
after_update :avatar_for_email_check
|
||||||
after_commit :update_caller_id
|
after_commit :update_caller_id
|
||||||
before_destroy :destroy_longer_required_objects
|
before_destroy :destroy_longer_required_objects
|
||||||
|
|
||||||
|
skip_callback :create, :after, :avatar_for_email_check, if: -> { BulkImportInfo.enabled? }
|
||||||
|
skip_callback :update, :after, :avatar_for_email_check, if: -> { BulkImportInfo.enabled? }
|
||||||
|
|
||||||
store :preferences
|
store :preferences
|
||||||
|
|
||||||
|
|
13
lib/bulk_import_info.rb
Normal file
13
lib/bulk_import_info.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module BulkImportInfo
|
||||||
|
def self.enabled?
|
||||||
|
Thread.current[:bulk_import]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.enable
|
||||||
|
Thread.current[:bulk_import] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.disable
|
||||||
|
Thread.current[:bulk_import] = false
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,8 +4,8 @@ RSpec.shared_examples 'CanLookup' do
|
||||||
describe '::lookup' do
|
describe '::lookup' do
|
||||||
let(:subject) { described_class }
|
let(:subject) { described_class }
|
||||||
let(:ensure_instance) { create(subject.to_s.downcase) if subject.none? }
|
let(:ensure_instance) { create(subject.to_s.downcase) if subject.none? }
|
||||||
let(:string_attributes) { (%i[name login email number] & subject.attribute_names.map(&:to_sym)) }
|
let(:string_attributes) { subject.lookup_keys }
|
||||||
let(:non_attributes) { (%i[id name login email number] - subject.attribute_names.map(&:to_sym)) }
|
let(:non_attributes) { (subject.attribute_names.map(&:to_sym) - subject.lookup_keys) }
|
||||||
let(:lookup_id) { 1 }
|
let(:lookup_id) { 1 }
|
||||||
let(:cache_key) { "#{subject}::#{lookup_id}" }
|
let(:cache_key) { "#{subject}::#{lookup_id}" }
|
||||||
let(:cache_expiry_param) { { expires_in: 7.days } }
|
let(:cache_expiry_param) { { expires_in: 7.days } }
|
||||||
|
@ -35,7 +35,7 @@ RSpec.shared_examples 'CanLookup' do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'accepts exactly one attribute-value pair' do
|
it 'accepts exactly one attribute-value pair' do
|
||||||
expect { subject.lookup(:id => lookup_id, string_attributes.sample => 'foo') }
|
expect { subject.lookup(id: lookup_id, some_attribute: 'foo') }
|
||||||
.to raise_error(ArgumentError)
|
.to raise_error(ArgumentError)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -69,5 +69,10 @@ RSpec.shared_examples 'CanLookup' do
|
||||||
.to have_received(:read)
|
.to have_received(:read)
|
||||||
.with(cache_key)
|
.with(cache_key)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'verify lookup keys' do
|
||||||
|
expect(subject.lookup_keys).to match_array((%i[id name login email number] & subject.attribute_names.map(&:to_sym)))
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -512,8 +512,8 @@ RSpec.describe 'Organization', type: :request, searchindex: true do
|
||||||
expect(json_response['records'].count).to eq(2)
|
expect(json_response['records'].count).to eq(2)
|
||||||
expect(json_response['result']).to eq('failed')
|
expect(json_response['result']).to eq('failed')
|
||||||
expect(json_response['errors'].count).to eq(2)
|
expect(json_response['errors'].count).to eq(2)
|
||||||
expect(json_response['errors'][0]).to eq("Line 1: unknown attribute 'name2' for Organization.")
|
expect(json_response['errors'][0]).to eq("Line 1: Unable to create record - unknown attribute 'name2' for Organization.")
|
||||||
expect(json_response['errors'][1]).to eq("Line 2: unknown attribute 'name2' for Organization.")
|
expect(json_response['errors'][1]).to eq("Line 2: Unable to create record - unknown attribute 'name2' for Organization.")
|
||||||
|
|
||||||
# valid file try
|
# valid file try
|
||||||
csv_file_path = Rails.root.join('test', 'data', 'csv', 'organization_simple.csv')
|
csv_file_path = Rails.root.join('test', 'data', 'csv', 'organization_simple.csv')
|
||||||
|
|
|
@ -59,8 +59,8 @@ RSpec.describe 'Text Module', type: :request do
|
||||||
expect(json_response['records'].count).to eq(2)
|
expect(json_response['records'].count).to eq(2)
|
||||||
expect(json_response['result']).to eq('failed')
|
expect(json_response['result']).to eq('failed')
|
||||||
expect(json_response['errors'].count).to eq(2)
|
expect(json_response['errors'].count).to eq(2)
|
||||||
expect(json_response['errors'][0]).to eq("Line 1: unknown attribute 'keywords2' for TextModule.")
|
expect(json_response['errors'][0]).to eq("Line 1: Unable to create record - unknown attribute 'keywords2' for TextModule.")
|
||||||
expect(json_response['errors'][1]).to eq("Line 2: unknown attribute 'keywords2' for TextModule.")
|
expect(json_response['errors'][1]).to eq("Line 2: Unable to create record - unknown attribute 'keywords2' for TextModule.")
|
||||||
|
|
||||||
# valid file try
|
# valid file try
|
||||||
csv_file_path = Rails.root.join('test', 'data', 'csv', 'text_module_simple.csv')
|
csv_file_path = Rails.root.join('test', 'data', 'csv', 'text_module_simple.csv')
|
||||||
|
|
|
@ -872,8 +872,8 @@ RSpec.describe 'User', type: :request, searchindex: true do
|
||||||
expect(json_response['records'].count).to eq(2)
|
expect(json_response['records'].count).to eq(2)
|
||||||
expect(json_response['result']).to eq('failed')
|
expect(json_response['result']).to eq('failed')
|
||||||
expect(json_response['errors'].count).to eq(2)
|
expect(json_response['errors'].count).to eq(2)
|
||||||
expect(json_response['errors'][0]).to eq("Line 1: unknown attribute 'firstname2' for User.")
|
expect(json_response['errors'][0]).to eq("Line 1: Unable to create record - unknown attribute 'firstname2' for User.")
|
||||||
expect(json_response['errors'][1]).to eq("Line 2: unknown attribute 'firstname2' for User.")
|
expect(json_response['errors'][1]).to eq("Line 2: Unable to create record - unknown attribute 'firstname2' for User.")
|
||||||
|
|
||||||
# valid file try
|
# valid file try
|
||||||
csv_file_path = Rails.root.join('test', 'data', 'csv', 'user_simple.csv')
|
csv_file_path = Rails.root.join('test', 'data', 'csv', 'user_simple.csv')
|
||||||
|
|
|
@ -45,6 +45,20 @@ class OrganizationCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal('No records found in file/string for Organization.', result[:errors][0])
|
assert_equal('No records found in file/string for Organization.', result[:errors][0])
|
||||||
end
|
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 = Organization.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,name for Organization found.', result[:errors][0])
|
||||||
|
end
|
||||||
|
|
||||||
test 'simple import' do
|
test 'simple import' do
|
||||||
|
|
||||||
csv_string = "id;name;shared;domain;domain_assignment;active;note\n;org-simple-import1;true;org-simple-import1.example.com;false;true;some note1\n;org-simple-import2;true;org-simple-import2.example.com;false;false;some note2\n"
|
csv_string = "id;name;shared;domain;domain_assignment;active;note\n;org-simple-import1;true;org-simple-import1.example.com;false;true;some note1\n;org-simple-import2;true;org-simple-import2.example.com;false;false;some note2\n"
|
||||||
|
@ -210,8 +224,8 @@ class OrganizationCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(true, result[:try])
|
assert_equal(true, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'not existing' for Organization.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'not existing' for Organization.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'not existing' for Organization.", result[:errors][1])
|
assert_equal("Line 2: Unable to create record - unknown attribute 'not existing' for Organization.", result[:errors][1])
|
||||||
|
|
||||||
assert_nil(Organization.find_by(name: 'organization-invalid-import1'))
|
assert_nil(Organization.find_by(name: 'organization-invalid-import1'))
|
||||||
assert_nil(Organization.find_by(name: 'organization-invalid-import2'))
|
assert_nil(Organization.find_by(name: 'organization-invalid-import2'))
|
||||||
|
@ -226,8 +240,8 @@ class OrganizationCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(false, result[:try])
|
assert_equal(false, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'not existing' for Organization.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'not existing' for Organization.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'not existing' for Organization.", result[:errors][1])
|
assert_equal("Line 2: Unable to create record - unknown attribute 'not existing' for Organization.", result[:errors][1])
|
||||||
|
|
||||||
assert_nil(Organization.find_by(name: 'organization-invalid-import1'))
|
assert_nil(Organization.find_by(name: 'organization-invalid-import1'))
|
||||||
assert_nil(Organization.find_by(name: 'organization-invalid-import2'))
|
assert_nil(Organization.find_by(name: 'organization-invalid-import2'))
|
||||||
|
|
|
@ -49,6 +49,20 @@ class TextModuleCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal('No records found in file/string for TextModule.', result[:errors][0])
|
assert_equal('No records found in file/string for TextModule.', result[:errors][0])
|
||||||
end
|
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 = TextModule.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,name for TextModule found.', result[:errors][0])
|
||||||
|
end
|
||||||
|
|
||||||
test 'simple import' do
|
test 'simple import' do
|
||||||
TextModule.create!(
|
TextModule.create!(
|
||||||
name: 'nsome name1',
|
name: 'nsome name1',
|
||||||
|
|
|
@ -49,6 +49,20 @@ class TicketCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal('No records found in file/string for Ticket.', result[:errors][0])
|
assert_equal('No records found in file/string for Ticket.', result[:errors][0])
|
||||||
end
|
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 = Ticket.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,number for Ticket found.', result[:errors][0])
|
||||||
|
end
|
||||||
|
|
||||||
test 'simple import' do
|
test 'simple import' do
|
||||||
|
|
||||||
csv_string = "id;number;title;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note2\n"
|
csv_string = "id;number;title;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note2\n"
|
||||||
|
@ -173,8 +187,8 @@ class TicketCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(true, result[:try])
|
assert_equal(true, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'not_existing' for Ticket.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'not_existing' for Ticket.", result[:errors][1])
|
assert_equal("Line 2: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][1])
|
||||||
|
|
||||||
assert_nil(Ticket.find_by(number: '123456'))
|
assert_nil(Ticket.find_by(number: '123456'))
|
||||||
assert_nil(Ticket.find_by(number: '123457'))
|
assert_nil(Ticket.find_by(number: '123457'))
|
||||||
|
@ -189,8 +203,8 @@ class TicketCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(false, result[:try])
|
assert_equal(false, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'not_existing' for Ticket.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'not_existing' for Ticket.", result[:errors][1])
|
assert_equal("Line 2: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][1])
|
||||||
|
|
||||||
assert_nil(Ticket.find_by(number: '123456'))
|
assert_nil(Ticket.find_by(number: '123456'))
|
||||||
assert_nil(Ticket.find_by(number: '123457'))
|
assert_nil(Ticket.find_by(number: '123457'))
|
||||||
|
|
|
@ -44,9 +44,24 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal('No records found in file/string for User.', result[:errors][0])
|
assert_equal('No records found in file/string for User.', result[:errors][0])
|
||||||
end
|
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
|
test 'simple import' do
|
||||||
|
|
||||||
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"
|
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(
|
result = User.csv_import(
|
||||||
string: csv_string,
|
string: csv_string,
|
||||||
parse_params: {
|
parse_params: {
|
||||||
|
@ -57,6 +72,9 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(true, result[:try])
|
assert_equal(true, result[:try])
|
||||||
assert_equal(2, result[:records].count)
|
assert_equal(2, result[:records].count)
|
||||||
assert_equal('success', result[:result])
|
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-import1'))
|
||||||
assert_nil(User.find_by(login: 'user-simple-import2'))
|
assert_nil(User.find_by(login: 'user-simple-import2'))
|
||||||
|
@ -71,6 +89,9 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(false, result[:try])
|
assert_equal(false, result[:try])
|
||||||
assert_equal(2, result[:records].count)
|
assert_equal(2, result[:records].count)
|
||||||
assert_equal('success', result[:result])
|
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')
|
user1 = User.find_by(login: 'user-simple-import1')
|
||||||
assert(user1)
|
assert(user1)
|
||||||
|
@ -87,6 +108,76 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(user2.email, 'user-simple-import2@example.com')
|
assert_equal(user2.email, 'user-simple-import2@example.com')
|
||||||
assert_equal(user2.active, false)
|
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 = user2
|
||||||
|
user2_1 = 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 = user2
|
||||||
|
user2_1 = 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!
|
user1.destroy!
|
||||||
user2.destroy!
|
user2.destroy!
|
||||||
end
|
end
|
||||||
|
@ -340,8 +431,8 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(true, result[:try])
|
assert_equal(true, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'firstname2' for User.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'firstname2' for User.", result[:errors][1])
|
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-import1'))
|
||||||
assert_nil(User.find_by(login: 'user-invalid-import2'))
|
assert_nil(User.find_by(login: 'user-invalid-import2'))
|
||||||
|
@ -356,8 +447,8 @@ class UserCsvImportTest < ActiveSupport::TestCase
|
||||||
assert_equal(false, result[:try])
|
assert_equal(false, result[:try])
|
||||||
assert_equal(2, result[:errors].count)
|
assert_equal(2, result[:errors].count)
|
||||||
assert_equal('failed', result[:result])
|
assert_equal('failed', result[:result])
|
||||||
assert_equal("Line 1: unknown attribute 'firstname2' for User.", result[:errors][0])
|
assert_equal("Line 1: Unable to create record - unknown attribute 'firstname2' for User.", result[:errors][0])
|
||||||
assert_equal("Line 2: unknown attribute 'firstname2' for User.", result[:errors][1])
|
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-import1'))
|
||||||
assert_nil(User.find_by(login: 'user-invalid-import2'))
|
assert_nil(User.find_by(login: 'user-invalid-import2'))
|
||||||
|
|
Loading…
Reference in a new issue