Просмотр исходного кода

Maintenance: Port user_csv_import_test.rb to rspec.

Martin Gruner 2 лет назад
Родитель
Сommit
f54ada1fe5

+ 4 - 4
spec/models/concerns/can_csv_import_organization_examples.rb

@@ -2,15 +2,15 @@
 
 
 require 'csv'
 require 'csv'
 
 
-RSpec.shared_examples 'CanCsvImportOrganization', :aggregate_failures do
+RSpec.shared_examples 'CanCsvImport - Organization specific tests', :aggregate_failures do
   describe '.csv_example' do
   describe '.csv_example' do
     before do
     before do
-      described_class.destroy_all
+      Organization.destroy_all
     end
     end
 
 
     context 'when no data avaiable' do
     context 'when no data avaiable' do
       let(:headers) do
       let(:headers) do
-        CSV.parse(described_class.csv_example).shift
+        CSV.parse(Organization.csv_example).shift
       end
       end
 
 
       it 'returns expected headers' do
       it 'returns expected headers' do
@@ -24,7 +24,7 @@ RSpec.shared_examples 'CanCsvImportOrganization', :aggregate_failures do
     let(:try)    { true }
     let(:try)    { true }
     let(:delete) { false }
     let(:delete) { false }
     let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try, delete: delete } }
     let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try, delete: delete } }
-    let(:result) { described_class.csv_import(**params) }
+    let(:result) { Organization.csv_import(**params) }
 
 
     shared_examples 'fails with error' do |errors|
     shared_examples 'fails with error' do |errors|
       shared_examples 'checks error handling' do
       shared_examples 'checks error handling' do

+ 4 - 4
spec/models/concerns/can_csv_import_ticket_examples.rb

@@ -2,15 +2,15 @@
 
 
 require 'csv'
 require 'csv'
 
 
-RSpec.shared_examples 'CanCsvImportTicket', :aggregate_failures do
+RSpec.shared_examples 'CanCsvImport - Ticket specific tests', :aggregate_failures do
   describe '.csv_example' do
   describe '.csv_example' do
     before do
     before do
-      described_class.destroy_all
+      Ticket.destroy_all
     end
     end
 
 
     context 'when no data avaiable' do
     context 'when no data avaiable' do
       let(:headers) do
       let(:headers) do
-        CSV.parse(described_class.csv_example).shift
+        CSV.parse(Ticket.csv_example).shift
       end
       end
 
 
       it 'returns expected headers' do
       it 'returns expected headers' do
@@ -23,7 +23,7 @@ RSpec.shared_examples 'CanCsvImportTicket', :aggregate_failures do
   describe '.csv_import' do
   describe '.csv_import' do
     let(:try)    { true }
     let(:try)    { true }
     let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try } }
     let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try } }
-    let(:result) { described_class.csv_import(**params) }
+    let(:result) { Ticket.csv_import(**params) }
 
 
     shared_examples 'fails with error' do |errors|
     shared_examples 'fails with error' do |errors|
       shared_examples 'checks error handling' do
       shared_examples 'checks error handling' do

+ 231 - 0
spec/models/concerns/can_csv_import_user_examples.rb

@@ -0,0 +1,231 @@
+# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
+
+require 'csv'
+
+RSpec.shared_examples 'CanCsvImport - User specific tests', :aggregate_failures do
+  describe '.csv_example' do
+    context 'when no data avaiable' do
+      let(:headers) do
+        CSV.parse(User.csv_example).shift
+      end
+
+      it 'returns expected headers' do
+        expect(headers).to start_with('id', 'login', 'firstname', 'lastname', 'email')
+        expect(headers).to include('organization')
+      end
+    end
+  end
+
+  describe '.csv_import' do
+    let(:try)    { true }
+    let(:delete) { false }
+    let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try, delete: delete } }
+    let(:result) { User.csv_import(**params) }
+
+    shared_examples 'fails with error' do |errors|
+      shared_examples 'checks error handling' do
+        it 'returns error(s)' do
+          expect(result).to include({ try: try, result: 'failed', errors: errors })
+        end
+
+        it 'does not import users' do
+          # Any single failure will cause the entire import to be aborted.
+          expect { result }.not_to change(User, :count)
+        end
+      end
+      context 'with :try' do
+        include_examples 'checks error handling'
+      end
+
+      context 'without :try' do
+        let(:try) { false }
+
+        include_examples 'checks error handling'
+      end
+    end
+
+    context 'with empty string' do
+      let(:csv_string) { '' }
+
+      include_examples 'fails with error', ['Unable to parse empty file/string for User.']
+    end
+
+    context 'with just CSV header line' do
+      let(:csv_string) { "login;firstname;lastname;email;active;\n" }
+
+      include_examples 'fails with error', ['No records found in file/string for User.']
+    end
+
+    context 'without required lookup header' do
+      let(:csv_string) { "firstname;lastname;active;\nfirstname-simple-import1;lastname-simple-import1;;true\nfirstname-simple-import2;lastname-simple-import2;false\n" }
+
+      include_examples 'fails with error', ['No lookup column like id,login,email for User found.']
+    end
+
+    context 'with invalid id' do
+      let(: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" }
+
+      include_examples 'fails with error', ["Line 1: unknown User with id '999999999'."]
+    end
+
+    context 'with readonly id' do
+      let(: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" }
+
+      include_examples 'fails with error', ["Line 1: unable to update User with id '1'."]
+    end
+
+    context 'with invalid attributes' do
+      let(: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" }
+
+      include_examples 'fails with error', [
+        "Line 1: Unable to create record - unknown attribute 'firstname2' for User.",
+        "Line 2: Unable to create record - unknown attribute 'firstname2' for User.",
+      ]
+    end
+
+    context 'with delete' do
+      let(: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" }
+      let(:delete)     { true }
+
+      include_examples 'fails with error', ['Delete is not possible for User.']
+    end
+
+    context 'with duplicates' do
+      let(: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" }
+
+      include_examples 'fails with error', ['Line 3: duplicate record found.']
+    end
+
+    context 'with references to nonexisting organizations' do
+      let(: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" }
+
+      include_examples 'fails with error', [
+        "Line 1: No lookup value found for 'organization': \"organization-reference-import1\"",
+        "Line 2: No lookup value found for 'organization': \"organization-reference-import2\"",
+      ]
+
+      context 'when organizations are available' do
+        before do
+          create(:organization, name: 'organization-reference-import1')
+          create(:organization, name: 'organization-reference-import2')
+        end
+
+        let(:try) { false }
+        let(:first_user)   { User.last(3).first }
+        let(:second_user)  { User.last(3).second }
+        let(:third_user)   { User.last }
+
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success' })
+          expect(result[:records].count).to be(3)
+        end
+
+        it 'does import users' do
+          expect { result }.to change(User, :count).by(3)
+          expect(first_user.organization.name).to eq('organization-reference-import1')
+          expect(second_user.organization.name).to eq('organization-reference-import2')
+          expect(third_user.organization.name).to eq('Zammad Foundation')
+        end
+      end
+    end
+
+    context 'with valid import data' do
+      let(: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" }
+      let(:csv_string_without_email) { "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;;false\n" }
+      let(:second_result)            { User.csv_import(**params) }
+      let(:second_params)            { { string: second_csv_string, parse_params: { col_sep: ';' }, try: try, delete: delete } }
+
+      context 'with :try' do
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success' })
+          expect(result[:records].count).to be(2)
+        end
+
+        it 'does not import users' do
+          expect { result }.not_to change(User, :count)
+        end
+      end
+
+      context 'without :try' do
+        let(:try) { false }
+        let(:first_user)  { User.last(2).first }
+        let(:second_user) { User.last }
+
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success', records: have_attributes(count: 2), stats: { created: 2, updated: 0 } })
+          expect(second_result).to include({ try: try, result: 'success', records: have_attributes(count: 2), stats: { created: 0, updated: 2 } })
+        end
+
+        it 'does import users' do
+          expect { result }.to change(User, :count).by(2)
+          expect(first_user).to have_attributes(
+            login:     'user-simple-import1',
+            firstname: 'firstname-simple-import1',
+            lastname:  'lastname-simple-import1',
+            email:     'user-simple-import1@example.com',
+            active:    true,
+          )
+          expect(second_user).to have_attributes(
+            login:     'user-simple-import2',
+            firstname: 'firstname-simple-import2',
+            lastname:  'lastname-simple-import2',
+            email:     'user-simple-import2@example.com',
+            active:    false,
+          )
+
+          expect { second_result }.not_to change(User, :count)
+
+          expect(first_user.reload).to have_attributes(
+            login:     'user-simple-import1',
+            firstname: 'firstname-simple-import1',
+            lastname:  'lastname-simple-import1',
+            email:     'user-simple-import1@example.com',
+            active:    true,
+          )
+          # Email is still present, though missing in CSV.
+          expect(second_user.reload).to have_attributes(
+            login:     'user-simple-import2',
+            firstname: 'firstname-simple-import2',
+            lastname:  'lastname-simple-import2',
+            email:     'user-simple-import2@example.com',
+            active:    false,
+          )
+        end
+      end
+    end
+
+    context 'with roles and fixed params' do
+      let(:result) { User.csv_import(**params, fixed_params: { note: 'some note' }) }
+      let(: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" }
+
+      context 'with :try' do
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success' })
+          expect(result[:records].count).to be(2)
+        end
+
+        it 'does not import users' do
+          expect { result }.not_to change(User, :count)
+        end
+      end
+
+      context 'without :try' do
+        let(:try)         { false }
+        let(:first_user)  { User.last(2).first }
+        let(:second_user) { User.last }
+
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success', records: have_attributes(count: 2), stats: { created: 2, updated: 0 } })
+        end
+
+        it 'does import users with roles' do
+          expect { result }.to change(User, :count).by(2)
+          expect(first_user.roles.count).to be(1)
+          expect(first_user.note).to eq('some note')
+          expect(second_user.roles.count).to be(2)
+          expect(second_user.note).to eq('some note')
+        end
+      end
+    end
+  end
+end

+ 1 - 1
spec/models/organization_spec.rb

@@ -16,7 +16,7 @@ RSpec.describe Organization, type: :model do
 
 
   it_behaves_like 'ApplicationModel', can_assets: { associations: :members }
   it_behaves_like 'ApplicationModel', can_assets: { associations: :members }
   it_behaves_like 'CanCsvImport', unique_attributes: 'name'
   it_behaves_like 'CanCsvImport', unique_attributes: 'name'
-  it_behaves_like 'CanCsvImportOrganization'
+  include_examples 'CanCsvImport - Organization specific tests'
   it_behaves_like 'HasHistory'
   it_behaves_like 'HasHistory'
   it_behaves_like 'HasSearchIndexBackend', indexed_factory: :organization
   it_behaves_like 'HasSearchIndexBackend', indexed_factory: :organization
   it_behaves_like 'HasXssSanitizedNote', model_factory: :organization
   it_behaves_like 'HasXssSanitizedNote', model_factory: :organization

+ 1 - 1
spec/models/ticket_spec.rb

@@ -25,7 +25,7 @@ RSpec.describe Ticket, type: :model do
   it_behaves_like 'ApplicationModel'
   it_behaves_like 'ApplicationModel'
   it_behaves_like 'CanBeImported'
   it_behaves_like 'CanBeImported'
   it_behaves_like 'CanCsvImport'
   it_behaves_like 'CanCsvImport'
-  it_behaves_like 'CanCsvImportTicket'
+  include_examples 'CanCsvImport - Ticket specific tests'
   it_behaves_like 'ChecksCoreWorkflow'
   it_behaves_like 'ChecksCoreWorkflow'
   it_behaves_like 'HasHistory', history_relation_object: ['Ticket::Article', 'Mention', 'Ticket::SharedDraftZoom']
   it_behaves_like 'HasHistory', history_relation_object: ['Ticket::Article', 'Mention', 'Ticket::SharedDraftZoom']
   it_behaves_like 'HasTags'
   it_behaves_like 'HasTags'

+ 4 - 0
spec/models/user_spec.rb

@@ -9,6 +9,8 @@ require 'models/concerns/has_groups_permissions_examples'
 require 'models/concerns/has_xss_sanitized_note_examples'
 require 'models/concerns/has_xss_sanitized_note_examples'
 require 'models/concerns/has_image_sanitized_note_examples'
 require 'models/concerns/has_image_sanitized_note_examples'
 require 'models/concerns/can_be_imported_examples'
 require 'models/concerns/can_be_imported_examples'
+require 'models/concerns/can_csv_import_examples'
+require 'models/concerns/can_csv_import_user_examples'
 require 'models/concerns/has_object_manager_attributes_examples'
 require 'models/concerns/has_object_manager_attributes_examples'
 require 'models/user/can_lookup_search_index_attributes_examples'
 require 'models/user/can_lookup_search_index_attributes_examples'
 require 'models/user/performs_geo_lookup_examples'
 require 'models/user/performs_geo_lookup_examples'
@@ -29,6 +31,8 @@ RSpec.describe User, type: :model do
   it_behaves_like 'HasImageSanitizedNote', model_factory: :user
   it_behaves_like 'HasImageSanitizedNote', model_factory: :user
   it_behaves_like 'HasGroups and Permissions', group_access_no_permission_factory: :user
   it_behaves_like 'HasGroups and Permissions', group_access_no_permission_factory: :user
   it_behaves_like 'CanBeImported'
   it_behaves_like 'CanBeImported'
+  # it_behaves_like 'CanCsvImport', unique_attributes: 'email'
+  include_examples 'CanCsvImport - User specific tests'
   it_behaves_like 'HasObjectManagerAttributes'
   it_behaves_like 'HasObjectManagerAttributes'
   it_behaves_like 'CanLookupSearchIndexAttributes'
   it_behaves_like 'CanLookupSearchIndexAttributes'
   it_behaves_like 'HasTaskbars'
   it_behaves_like 'HasTaskbars'

+ 0 - 537
test/unit/user_csv_import_test.rb

@@ -1,537 +0,0 @@
-# Copyright (C) 2012-2023 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