Import user accounts from CSV file (#33102).

Patch by Takenori TAKAKI.


git-svn-id: http://svn.redmine.org/redmine/trunk@19799 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Go MAEDA
2020-05-30 04:53:24 +00:00
parent 454bed8143
commit ebf5d219c9
18 changed files with 401 additions and 5 deletions

4
test/fixtures/files/import_users.csv vendored Normal file
View File

@@ -0,0 +1,4 @@
row;login;firstname;lastname;mail;language;admin;auth_source;password;must_change_passwd;status;phone_number
1;user1;One;CSV;user1@somenet.foo;en;yes;;password;yes;active;000-1111-2222
2;user2;Two;Import;user2@somenet.foo;ja;no;;password;no;locked;333-4444-5555
3;user3;Three;User;user3@somenet.foo;-;no;LDAP test server;password;no;registered;666-7777-8888
1 row login firstname lastname mail language admin auth_source password must_change_passwd status phone_number
2 1 user1 One CSV user1@somenet.foo en yes password yes active 000-1111-2222
3 2 user2 Two Import user2@somenet.foo ja no password no locked 333-4444-5555
4 3 user3 Three User user3@somenet.foo - no LDAP test server password no registered 666-7777-8888

1
test/fixtures/views/_partial.html.erb vendored Normal file
View File

@@ -0,0 +1 @@
partial html

View File

@@ -1911,6 +1911,16 @@ class ApplicationHelperTest < Redmine::HelperTest
assert_match(/name="new_issue-[a-z0-9]{8}"/, labelled_form_for(Issue.new){})
end
def test_redner_if_exist_should_be_render_partial
controller.prepend_view_path "test/fixtures/views"
assert_equal "partial html\n", render_if_exist(:partial => 'partial')
end
def test_redner_if_exist_should_be_render_nil
controller.prepend_view_path "test/fixtures/views"
assert_nil render_if_exist(:partial => 'non_exist_partial')
end
private
def wiki_links_with_special_characters

View File

@@ -0,0 +1,162 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2020 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.expand_path('../../test_helper', __FILE__)
class UserImportTest < ActiveSupport::TestCase
include Redmine::I18n
def setup
set_language_if_valid 'en'
User.current = nil
end
def test_authorized
assert UserImport.authorized?(User.find(1)) # admins
assert !UserImport.authorized?(User.find(2)) # dose not admin
assert !UserImport.authorized?(User.find(6)) # dows not admin
end
def test_maps_login
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert_equal 'user1', first.login
assert_equal 'user2', second.login
assert_equal 'user3', third.login
end
def test_maps_firstname
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert_equal 'One', first.firstname
assert_equal 'Two', second.firstname
assert_equal 'Three', third.firstname
end
def test_maps_lastname
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert_equal 'CSV', first.lastname
assert_equal 'Import', second.lastname
assert_equal 'User', third.lastname
end
def test_maps_mail
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert_equal 'user1@somenet.foo', first.mail
assert_equal 'user2@somenet.foo', second.mail
assert_equal 'user3@somenet.foo', third.mail
end
def test_maps_language
default_language = 'fr'
with_settings :default_language => default_language do
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert_equal 'en', first.language
assert_equal 'ja', second.language
assert_equal default_language, third.language
end
end
def test_maps_admin
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert first.admin?
assert_not second.admin?
assert_not third.admin?
end
def test_maps_auth_information
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
# use password
assert User.try_to_login(first.login, 'password', false)
assert User.try_to_login(second.login, 'password', false)
# use auth_source
assert_nil first.auth_source
assert_nil second.auth_source
assert third.auth_source
assert_equal 'LDAP test server', third.auth_source.name
AuthSourceLdap.any_instance.expects(:authenticate).with(third.login, 'ldapassword').returns(true)
assert User.try_to_login(third.login, 'ldapassword', false)
end
def test_map_must_change_password
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert first.must_change_password?
assert_not second.must_change_password?
assert_not third.must_change_password?
end
def test_maps_status
import = generate_import_with_mapping
first, second, third = new_records(User, 3) { import.run }
assert first.active?
assert second.locked?
assert third.registered?
end
def test_maps_custom_fields
phone_number_cf = UserCustomField.find(4)
import = generate_import_with_mapping
import.mapping["cf_#{phone_number_cf.id}"] = '11'
import.save!
first, second, third = new_records(User, 3) { import.run }
assert_equal '000-1111-2222', first.custom_field_value(phone_number_cf)
assert_equal '333-4444-5555', second.custom_field_value(phone_number_cf)
assert_equal '666-7777-8888', third.custom_field_value(phone_number_cf)
end
protected
def generate_import(fixture_name='import_users.csv')
import = UserImport.new
import.user_id = 1
import.file = uploaded_test_file(fixture_name, 'text/csv')
import.save!
import
end
def generate_import_with_mapping(fixture_name='import_users.csv')
import = generate_import(fixture_name)
import.settings = {
'separator' => ';', 'wrapper' => '"', 'encoding' => 'UTF-8',
'mapping' => {
'login' => '1',
'firstname' => '2',
'lastname' => '3',
'mail' => '4',
'language' => '5',
'admin' => '6',
'auth_source' => '7',
'password' => '8',
'must_change_passwd' => '9',
'status' => '10',
}
}
import.save!
import
end
end