# -*- coding: utf-8 -*-
require 'al-test-utils'
class TestBase < Test::Unit::TestCase
include AlTestUtils
priority :must
def test_search_colon_value
make_temporary_group(:cn => "temp:group") do |group|
assert_equal("temp:group", group.cn)
assert_not_nil(@group_class.find("temp:group"))
end
end
priority :normal
def test_lower_case_object_class
fixture_file = fixture("lower_case_object_class_schema.rb")
schema_entries = eval(File.read(fixture_file))
schema = ActiveLdap::Schema.new(schema_entries)
target_class = Class.new(ActiveLdap::Base) do
ldap_mapping :dn_attribute => "umpn",
:prefix => "cn=site",
:classes => ['top', 'umphone', 'umphonenumber']
end
target_class.connection.instance_variable_set("@schema", schema)
target_class.connection.instance_variable_set("@entry_attributes", {})
target = target_class.send(:instantiate,
[
"umpn=1.555.5551234,#{target_class.base}",
{
"umpn" => "1.555.5551234",
"objectclass" => ["top",
"umphone",
"umphonenumber"],
}
])
assert_equal("1.555.5551234", target.umpn)
end
def test_set_and_get_false
user = @user_class.new
user.sn = false
assert_equal(false, user.sn)
end
def test_modify_entry_with_attribute_with_nested_options
make_temporary_user(:simple => true) do |user,|
user.sn = ["Yamada",
{"lang-ja" => ["山田",
{"phonetic" => ["やまだ"]}]}]
assert_nothing_raised do
user.save!
end
end
end
def test_add_entry_with_attribute_with_nested_options
ensure_delete_user("temp-user") do |uid,|
user = @user_class.new
user.cn = uid
user.uid = uid
user.uid_number = 1000
user.gid_number = 1000
user.home_directory = "/home/#{uid}"
assert_not_predicate(user, :valid?)
user.sn = ["Yamada",
{"lang-ja" => ["山田",
{"phonetic" => ["やまだ"]}]}]
assert_predicate(user, :valid?)
assert_nothing_raised do
user.save!
end
end
end
def test_attributes
make_temporary_group do |group|
assert_equal({
"cn" => group.cn,
"gidNumber" => group.gidNumber,
"objectClass" => group.classes,
},
group.attributes)
end
end
def test_rename_with_superior
make_ou("sub,ou=users")
make_temporary_user(:simple => true) do |user,|
user.id = "user2,ou=sub,#{@user_class.base}"
assert_true(user.save)
found_user = nil
assert_nothing_raised do
found_user = @user_class.find("user2")
end
base = @user_class.base
assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
found_user.dn.to_s)
end
end
def test_rename
make_temporary_user(:simple => true) do |user,|
assert_not_equal("user2", user.id)
assert_raise(ActiveLdap::EntryNotFound) do
@user_class.find("user2")
end
user.id = "user2"
assert_true(user.save)
assert_equal("user2", user.id)
found_user = nil
assert_nothing_raised do
found_user = @user_class.find("user2")
end
assert_equal("user2", found_user.id)
end
end
def test_operational_attributes
make_temporary_group do |group|
dn, attributes = @group_class.search(:attributes => ["*"])[0]
normal_attributes = attributes.keys
dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
operational_attributes = attributes.keys - normal_attributes
operational_attribute = operational_attributes[0]
group = @group_class.find(:first, :attributes => ["*", "+"])
operational_attribute_value = group[operational_attribute]
assert_not_nil(operational_attribute_value)
group.save!
assert_equal(operational_attribute_value, group[operational_attribute])
end
end
def test_destroy_mixed_tree_by_instance
make_ou("base")
_entry_class = entry_class("ou=base")
_ou_class = ou_class("ou=base")
_dc_class = dc_class("ou=base")
root1 = _ou_class.create("root1")
_ou_class.create(:ou => "child1", :parent => root1)
_ou_class.create(:ou => "child2", :parent => root1)
_dc_class.create(:dc => "domain", :o => "domain", :parent => root1)
_ou_class.create(:ou => "child3", :parent => root1)
_ou_class.create("root2")
assert_equal(["base",
"root1", "child1", "child2", "domain", "child3",
"root2"],
_entry_class.find(:all).collect(&:id))
assert_raise(ActiveLdap::DeleteError) do
root1.destroy_all
end
assert_equal(["base", "root1", "domain", "root2"],
_entry_class.find(:all).collect(&:id))
end
def test_delete_mixed_tree_by_instance
make_ou("base")
_entry_class = entry_class("ou=base")
_ou_class = ou_class("ou=base")
_dc_class = dc_class("ou=base")
root1 = _ou_class.create("root1")
_ou_class.create(:ou => "child1", :parent => root1)
_ou_class.create(:ou => "child2", :parent => root1)
_dc_class.create(:dc => "domain", :o => "domain", :parent => root1)
_ou_class.create(:ou => "child3", :parent => root1)
_ou_class.create("root2")
assert_equal(["base",
"root1", "child1", "child2", "domain", "child3",
"root2"],
_entry_class.find(:all).collect(&:id))
assert_raise(ActiveLdap::DeleteError) do
root1.delete_all
end
assert_equal(["base", "root1", "domain", "root2"],
_entry_class.find(:all).collect(&:id))
end
def test_delete_tree
make_ou("base")
_ou_class = ou_class("ou=base")
root1 = _ou_class.create("root1")
_ou_class.create(:ou => "child1", :parent => root1)
_ou_class.create(:ou => "child2", :parent => root1)
_ou_class.create("root2")
assert_equal(["base", "root1", "child1", "child2", "root2"],
_ou_class.find(:all).collect(&:ou))
_ou_class.delete_all(:base => root1.dn)
assert_equal(["base", "root2"],
_ou_class.find(:all).collect(&:ou))
end
def test_delete_mixed_tree
make_ou("base")
_ou_class = ou_class("ou=base")
domain_class = Class.new(ActiveLdap::Base)
domain_class.ldap_mapping :dn_attribute => "dc",
:prefix => "",
:classes => ['domain']
root1 = _ou_class.create("root1")
child1 = _ou_class.create(:ou => "child1", :parent => root1)
domain_class.create(:dc => "domain1", :parent => child1)
_ou_class.create(:ou => "grandchild1", :parent => child1)
child2 = _ou_class.create(:ou => "child2", :parent => root1)
domain_class.create(:dc => "domain2", :parent => child2)
_ou_class.create("root2")
entry_class = Class.new(ActiveLdap::Base)
entry_class.ldap_mapping :prefix => "ou=base",
:classes => ["top"]
entry_class.dn_attribute = nil
assert_equal(["base", "root1", "child1", "domain1", "grandchild1",
"child2", "domain2", "root2"],
entry_class.find(:all).collect(&:id))
entry_class.delete_all(nil, :base => child2.dn)
assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"],
entry_class.find(:all).collect(&:id))
end
def test_first
make_temporary_user(:simple => true) do |user1,|
make_temporary_user(:simple => true) do |user2,|
assert_equal(user1, @user_class.find(:first))
assert_equal(user2, @user_class.find(:first, user2.cn))
end
end
end
def test_last
make_temporary_user(:simple => true) do |user1,|
make_temporary_user(:simple => true) do |user2,|
assert_equal(user2, @user_class.find(:last))
assert_equal(user1, @user_class.find(:last, user1.cn))
end
end
end
def test_convenient_operation_methods
make_temporary_user(:simple => true) do |user1,|
make_temporary_user(:simple => true) do |user2,|
assert_equal(user1, @user_class.first)
assert_equal(user2, @user_class.last)
assert_equal([user1, user2], @user_class.all)
end
end
end
def test_set_attributes_with_a_blank_value_in_values
make_temporary_user(:simple => true) do |user,|
user.attributes = {"description" => ["a", "b", ""]}
assert(user.save)
end
end
def test_set_attributes_with_a_blank_value
make_temporary_user(:simple => true) do |user,|
user.attributes = {"description" => [""]}
assert(user.save)
end
end
def test_create_invalid
user = @user_class.create
assert_not_predicate(user.errors, :empty?)
end
def test_id_with_invalid_dn_attribute_value
user = @user_class.new("#")
assert_equal("#", user.uid)
assert_equal("#", user.id)
end
def test_non_string_dn_attribute_value
user = @user_class.new("uidNumber=10110")
user.uid = user.cn = user.sn = "test-user"
user.gid_number = 10000
user.home_directory = "/home/test-user"
assert_nothing_raised do
user.save!
end
end
def test_set_dn_with_unnormalized_dn_attribute
make_temporary_user do |user,|
assert_not_equal("ZZZ", user.cn)
user.dn = "CN=ZZZ"
assert_equal("ZZZ", user.cn)
end
end
def test_destroy_with_empty_base_and_prefix_of_class
make_temporary_user do |user,|
base = user.class.base
prefix = user.class.prefix
begin
user.class.base = ""
user.class.prefix = ""
user.base = base
user.destroy
ensure
user.class.base = base
user.class.prefix = prefix
end
end
end
def test_empty_base_of_class
make_temporary_user do |user,|
user.class.prefix = ""
user.class.base = ""
user.base = "dc=net"
assert_equal("dc=net", user.base)
end
end
def test_search_value_with_no_dn_attribute
make_temporary_user do |user1,|
make_temporary_user do |user2,|
options = {:attribute => "seeAlso", :value => user2.dn}
assert_equal([],
user1.class.find(:all, options).collect(&:dn))
user1.see_also = user2.dn
user1.save!
assert_equal([user1.dn],
user1.class.find(:all, options).collect(&:dn))
end
end
end
def test_to_s
make_temporary_group do |group|
assert_equal(group.to_s, group.to_ldif)
end
end
def test_to_ldif
make_temporary_group do |group|
assert_to_ldif(group)
group.gidNumber += 1
group.description = ["Description", {"en" => "Description(en)"}]
assert_to_ldif(group)
end
end
def test_save_with_changes
make_temporary_user do |user, password|
user.cn += "!!!"
assert_true(detect_modify(user) {user.save})
end
end
def test_save_without_changes
make_temporary_user do |user, password|
assert_false(detect_modify(user) {user.save})
end
end
def test_normalize_dn_attribute
make_ou("Ous")
ou_class = Class.new(ActiveLdap::Base)
ou_class.ldap_mapping(:dn_attribute => "OU",
:prefix => "ou=OUS",
:classes => ["top", "organizationalUnit"])
ou_class.new("ou1").save!
ou_class.new("ou2").save!
ou1 = ou_class.find("ou1")
assert_equal("ou1", ou1.ou)
assert_equal("ou=ou1,#{ou_class.base}", ou1.dn)
ou2 = ou_class.find("ou2")
assert_equal("ou2", ou2.ou)
assert_equal("ou=ou2,#{ou_class.base}", ou2.dn)
end
def test_excluded_classes
mapping = {:classes => ["person"]}
person_class = Class.new(@user_class)
person_class.ldap_mapping(mapping)
person_class.prefix = nil
no_organizational_person_class = Class.new(@user_class)
no_organizational_person_mapping =
mapping.merge(:excluded_classes => ["organizationalPerson"])
no_organizational_person_class.ldap_mapping(no_organizational_person_mapping)
no_organizational_person_class.prefix = nil
no_simple_person_class = Class.new(@user_class)
no_simple_person_mapping =
mapping.merge(:excluded_classes => ['shadowAccount', 'inetOrgPerson',
"organizationalPerson"])
no_simple_person_class.ldap_mapping(no_simple_person_mapping)
no_simple_person_class.prefix = nil
make_temporary_user do |user1,|
make_temporary_user(:simple => true) do |user2,|
assert_equal([user1.dn, user2.dn].sort,
person_class.find(:all).collect(&:dn).sort)
no_organizational_people = no_organizational_person_class.find(:all)
assert_equal([user2.dn].sort,
no_organizational_people.collect(&:dn).sort)
assert_equal([user2.dn].sort,
no_simple_person_class.find(:all).collect(&:dn).sort)
end
end
end
def test_new_with_dn
cn = "XXX"
dn = "cn=#{cn},#{@user_class.base}"
user = @user_class.new(ActiveLdap::DN.parse(dn))
assert_equal(cn, user.cn)
assert_equal(dn, user.dn)
end
def test_dn_attribute_per_instance_with_invalid_value
user = @user_class.new
assert_equal("uid", user.dn_attribute)
user.dn = nil
assert_equal("uid", user.dn_attribute)
assert_nil(user.uid)
user.dn = ""
assert_equal("uid", user.dn_attribute)
assert_nil(user.uid)
end
def test_dn_attribute_per_instance
user = @user_class.new
assert_equal("uid", user.dn_attribute)
assert_nil(user.uid)
user.dn = "cn=xxx"
assert_equal("cn", user.dn_attribute)
assert_nil(user.uid)
assert_equal("xxx", user.cn)
assert_equal("cn=xxx,#{@user_class.base}", user.dn)
assert_equal("uid", @user_class.new.dn_attribute)
user.dn = "ZZZ"
assert_equal("cn", user.dn_attribute)
assert_nil(user.uid)
assert_equal("ZZZ", user.cn)
assert_equal("cn=ZZZ,#{@user_class.base}", user.dn)
user.dn = "uid=aaa"
assert_equal("uid", user.dn_attribute)
assert_equal("aaa", user.uid)
assert_equal("ZZZ", user.cn)
assert_equal("uid=aaa,#{@user_class.base}", user.dn)
end
def test_case_insensitive_nested_ou
ou_class("ou=Users").new("Sub").save!
make_temporary_user(:uid => "test-user,ou=SUB") do |user, password|
sub_user_class = Class.new(@user_class)
sub_user_class.ldap_mapping :prefix => "ou=sub"
assert_equal(dn("uid=test-user,ou=sub,#{@user_class.base}"),
sub_user_class.find(user.uid).dn)
end
end
def test_nested_ou
make_ou("units")
units = ou_class("ou=units")
units.new("one").save!
units.new("two").save!
units.new("three").save!
ous = units.find(:all, :scope => :sub).collect {|unit| unit.ou}
assert_equal(["one", "two", "three", "units"].sort, ous.sort)
ous = units.find(:all, :scope => :base).collect {|unit| unit.ou}
assert_equal(["units"].sort, ous.sort)
ous = units.find(:all, :scope => :one).collect {|unit| unit.ou}
assert_equal(["one", "two", "three"].sort, ous.sort)
end
def test_initialize_with_recommended_classes
mapping = {
:dn_attribute => "cn",
:prefix => "",
:scope => :one,
:classes => ["person"],
}
person_class = Class.new(ActiveLdap::Base)
person_class.ldap_mapping mapping
person_with_uid_class = Class.new(ActiveLdap::Base)
person_with_uid_mapping =
mapping.merge(:recommended_classes => ["uidObject"])
person_with_uid_class.ldap_mapping person_with_uid_mapping
name = "sample"
name_with_uid = "sample-with-uid"
uid = "1000"
person = person_class.new(name)
person.sn = name
assert(person.save)
assert_equal([name, name], [person.cn, person.sn])
person_with_uid = person_with_uid_class.new(name_with_uid)
person_with_uid.sn = name_with_uid
assert(!person_with_uid.save)
person_with_uid.uid = uid
assert(person_with_uid.save)
assert_equal([name_with_uid, name_with_uid],
[person_with_uid.cn, person_with_uid.sn])
assert_equal(uid, person_with_uid.uid)
assert_equal([person.dn, person_with_uid.dn],
person_class.search.collect {|dn, attrs| dn})
person_class.required_classes += ["uidObject"]
assert_equal([person_with_uid.dn],
person_class.search.collect {|dn, attrs| dn})
assert_equal([person.dn, person_with_uid.dn],
person_with_uid_class.search.collect {|dn, attrs| dn})
end
def test_search_with_object_class
ou_class = Class.new(ActiveLdap::Base)
ou_class.ldap_mapping :dn_attribute => "ou",
:prefix => "",
:scope => :one,
:classes => ["organizationalUnit"]
name = "sample"
ou = ou_class.new(name)
assert(ou.save)
assert_equal(name, ou.ou)
assert_equal([ou.dn],
ou_class.search(:value => name).collect {|dn, attrs| dn})
ou_class.required_classes += ["organization"]
assert_equal([],
ou_class.search(:value => name).collect {|dn, attrs| dn})
end
def test_search_with_attributes_without_object_class
make_temporary_user do |user, password|
entries = @user_class.search(:filter => "#{user.dn_attribute}=#{user.id}",
:attributes => ["uidNumber"])
assert_equal([[user.dn, {"uidNumber" => [user.uid_number.to_s]}]],
entries)
end
end
def test_new_without_argument
user = @user_class.new
assert_equal(@user_class_classes, user.classes)
assert(user.respond_to?(:cn))
end
def test_new_with_invalid_argument
@user_class.new
assert_raises(ArgumentError) do
@user_class.new(100)
end
end
def test_loose_dn
make_temporary_user do |user,|
assert(user.class.exists?(user.dn.to_s))
assert(user.class.exists?(user.dn.to_s.gsub(/\b,/, " , ")))
assert(user.class.exists?(user.dn.to_s.gsub(/\b=/, " = ")))
end
end
def test_new_without_class
no_class_class = Class.new(ActiveLdap::Base)
no_class_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
:classes => []
assert_raises(ActiveLdap::UnknownAttribute) do
no_class_class.new("xxx")
end
end
def test_save_for_dNSDomain
domain_class = Class.new(ActiveLdap::Base)
domain_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
:classes => ['top', 'dcObject', 'dNSDomain']
name = "ftp"
a_record = "192.168.1.1"
domain = domain_class.new('ftp')
domain.a_record = a_record
assert(domain.save)
assert_equal(a_record, domain.a_record)
assert_equal(a_record, domain_class.find(name).a_record)
ensure
domain_class.delete(name) if domain_class.exists?(name)
end
def test_dn_by_index_getter
make_temporary_user do |user,|
assert_equal(user.dn, user["dn"])
end
end
def test_create_multiple
ensure_delete_user("temp-user1") do |uid1,|
ensure_delete_user("temp-user2") do |uid2,|
attributes = {
:uid => uid2,
:sn => uid2,
:cn => uid2,
:uid_number => "1000",
:gid_number => "1000",
:home_directory => "/home/#{uid2}",
}
user1, user2 = @user_class.create([{:uid => uid1}, attributes])
assert(!user1.errors.empty?)
assert(!@user_class.exists?(uid1))
assert_equal([], user2.errors.to_a)
assert(@user_class.exists?(uid2))
attributes.each do |key, value|
value = value.to_i if [:uid_number, :gid_number].include?(key)
assert_equal(value, user2[key])
end
end
end
end
def test_create
ensure_delete_user("temp-user") do |uid,|
user = @user_class.create(:uid => uid)
assert(!user.errors.empty?)
assert(!@user_class.exists?(uid))
attributes = {
:uid => uid,
:sn => uid,
:cn => uid,
:uid_number => "1000",
:gid_number => "1000",
:home_directory => "/home/#{uid}",
}
user = @user_class.create(attributes)
assert_equal([], user.errors.to_a)
assert(@user_class.exists?(uid))
attributes.each do |key, value|
value = value.to_i if [:uid_number, :gid_number].include?(key)
assert_equal(value, user[key])
end
end
end
class TestInstantiate < self
class Person < ActiveLdap::Base
ldap_mapping dn_attribute: "cn",
prefix: "ou=People",
scope: :one,
classes: ["top", "person"]
end
class OrganizationalPerson < Person
ldap_mapping dn_attribute: "cn",
prefix: "",
classes: ["top", "person", "organizationalPerson"]
end
class ResidentialPerson < Person
ldap_mapping dn_attribute: "cn",
prefix: "",
classes: ["top", "person", "residentialPerson"]
end
def test_sub_class
make_ou("People")
residential_person = ResidentialPerson.new(cn: "John Doe",
sn: "Doe",
street: "123 Main Street",
l: "Anytown")
residential_person.save!
organizational_person = OrganizationalPerson.new(cn: "Jane Smith",
sn: "Smith",
title: "General Manager")
organizational_person.save!
people = Person.all
assert_equal([ResidentialPerson, OrganizationalPerson],
people.collect(&:class))
end
end
def test_reload_of_not_exists_entry
make_temporary_user do |user,|
assert_nothing_raised do
user.reload
end
user.destroy
assert_raises(ActiveLdap::EntryNotFound) do
user.reload
end
end
end
def test_reload_and_new_entry
make_temporary_user do |user1,|
user2 = @user_class.new(user1.uid)
assert_equal(user1.attributes["uid"], user2.attributes["uid"])
assert_not_equal(user1.attributes["objectClass"],
@user_class.required_classes)
assert_equal(@user_class.required_classes,
user2.attributes["objectClass"])
assert_not_equal(user1.attributes["objectClass"],
user2.attributes["objectClass"])
assert(user2.exists?)
assert(user2.new_entry?)
user2.reload
assert(user2.exists?)
assert(!user2.new_entry?)
assert_equal(user1.attributes, user2.attributes)
end
end
def test_exists_for_instance
make_temporary_user do |user,|
assert(user.exists?)
assert(!user.new_entry?)
new_user = @user_class.new(user.uid)
assert(new_user.exists?)
assert(new_user.new_entry?)
user.destroy
assert(!user.exists?)
assert(user.new_entry?)
assert(!new_user.exists?)
assert(new_user.new_entry?)
end
end
def test_exists_without_required_object_class
make_temporary_user do |user,|
@user_class.required_classes -= ["posixAccount"]
user.remove_class("posixAccount")
assert(user.save)
assert(@user_class.exists?(user.dn))
@user_class.required_classes += ["posixAccount"]
assert(!@user_class.exists?(user.dn))
assert_raises(ActiveLdap::EntryNotFound) do
@user_class.find(user.dn)
end
end
end
def test_find_dns_without_required_object_class
make_temporary_user do |user1,|
make_temporary_user do |user2,|
make_temporary_user do |user3,|
@user_class.required_classes -= ["posixAccount"]
user1.remove_class("posixAccount")
assert(user1.save)
@user_class.required_classes += ["posixAccount"]
assert_raises(ActiveLdap::EntryNotFound) do
@user_class.find(user1.dn, user2.dn, user3.dn)
end
assert_equal([user2.dn, user3.dn],
@user_class.find(user2.dn, user3.dn).collect {|u| u.dn})
end
end
end
end
def test_reload
make_temporary_user do |user1,|
user2 = @user_class.find(user1.uid)
assert_equal(user1.attributes, user2.attributes)
user1.cn = "new #{user1.cn}"
assert_not_equal(user1.attributes, user2.attributes)
assert_equal(user1.attributes.reject {|k, v| k == "cn"},
user2.attributes.reject {|k, v| k == "cn"})
user2.reload
assert_not_equal(user1.attributes, user2.attributes)
assert_equal(user1.attributes.reject {|k, v| k == "cn"},
user2.attributes.reject {|k, v| k == "cn"})
assert(user1.save)
assert_not_equal(user1.attributes, user2.attributes)
assert_equal(user1.attributes.reject {|k, v| k == "cn"},
user2.attributes.reject {|k, v| k == "cn"})
user2.reload
assert_equal(user1.cn, user2.cn)
assert_equal(user1.attributes.reject {|k, v| k == "cn"},
user2.attributes.reject {|k, v| k == "cn"})
end
end
def test_inherit_base
sub_user_class = Class.new(@user_class)
sub_user_class.ldap_mapping :prefix => "ou=Sub"
assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
sub_user_class.send(:include, Module.new)
assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
sub_sub_user_class = Class.new(sub_user_class)
sub_sub_user_class.ldap_mapping :prefix => "ou=SubSub"
assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
sub_sub_user_class.send(:include, Module.new)
assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
end
def test_compare
make_temporary_user do |user1,|
make_temporary_user do |user2,|
make_temporary_user do |user3,|
make_temporary_user do |user4,|
actual = ([user1, user2, user3] & [user1, user4])
assert_equal([user1].collect {|user| user.id},
actual.collect {|user| user.id})
end
end
end
end
end
def test_ldap_mapping_symbol_dn_attribute
ou_class = Class.new(ActiveLdap::Base)
ou_class.ldap_mapping(:dn_attribute => :ou,
:prefix => "",
:classes => ["top", "organizationalUnit"])
assert_equal(["ou=Groups,#{current_configuration['base']}",
"ou=Users,#{current_configuration['base']}"],
ou_class.find(:all).collect(&:dn).collect(&:to_s).sort)
end
def test_ldap_mapping_validation
ou_class = Class.new(ActiveLdap::Base)
assert_raises(ArgumentError) do
ou_class.ldap_mapping :dnattr => "ou"
end
assert_nothing_raised do
ou_class.ldap_mapping :dn_attribute => "ou",
:prefix => "",
:classes => ["top", "organizationalUnit"]
end
end
class TestToXML < self
def test_root
ou = ou_class.new("Sample")
assert_equal(<<-EOX, ou.to_xml(:root => "ou"))
#{ou.dn}
organizationalUnit
top
Sample
EOX
end
def test_default
ou = ou_class.new("Sample")
assert_equal(<<-EOX, ou.to_xml)
#{ou.dn}
organizationalUnit
top
Sample
EOX
end
def test_complex
make_temporary_user do |user, password|
xml = normalize_attributes_order(user.to_xml(:root => "user"))
assert_equal(<<-EOX, xml)
#{user.dn}
#{user.cn}
#{user.gid_number}
#{user.home_directory}
#{base64(jpeg_photo)}
inetOrgPerson
organizationalPerson
person
posixAccount
shadowAccount
#{user.sn}
#{user.uid}
#{user.uid_number}
#{base64(certificate)}
#{user.user_password}
EOX
end
end
def test_except
ou = ou_class.new("Sample")
except = [:objectClass]
assert_equal(<<-EOX, ou.to_xml(:root => "sample", :except => except))
#{ou.dn}
Sample
EOX
end
def test_except_dn
ou = ou_class.new("Sample")
except = [:dn, :object_class]
assert_equal(<<-EOX, ou.to_xml(:root => "sample", :except => except))
Sample
EOX
end
def test_only
ou = ou_class.new("Sample")
only = [:objectClass]
assert_equal(<<-EOX, ou.to_xml(:root => "sample", :only => only))
organizationalUnit
top
EOX
end
def test_only_dn
ou = ou_class.new("Sample")
only = [:dn, :object_class]
assert_equal(<<-EOX, ou.to_xml(:root => "sample", :only => only))
#{ou.dn}
organizationalUnit
top
EOX
end
def test_escape
make_temporary_user do |user, password|
sn = user.sn
user.sn = "<#{sn}>"
except = [:jpeg_photo, :user_certificate]
assert_equal(<<-EOX, user.to_xml(:root => "user", :except => except))
#{user.dn}
#{user.cn}
#{user.gid_number}
#{user.home_directory}
inetOrgPerson
organizationalPerson
person
posixAccount
shadowAccount
<#{sn}>
#{user.uid}
#{user.uid_number}
#{user.user_password}
EOX
end
end
def test_type_ldif
make_temporary_user do |user, password|
sn = user.sn
user.sn = "<#{sn}>"
except = [:jpeg_photo, :user_certificate]
options = {:root => "user", :except => except, :type => :ldif}
assert_equal(<<-EOX, user.to_xml(options))
#{user.dn}
#{user.cn}
#{user.gid_number}
#{user.home_directory}
inetOrgPerson
organizationalPerson
person
posixAccount
shadowAccount
<#{sn}>
#{user.uid}
#{user.uid_number}
#{user.user_password}
EOX
end
end
def test_nil
ou = ou_class.new("Sample")
ou.description = [nil]
assert_equal(<<-EOX, ou.to_xml(:root => "sample"))
#{ou.dn}
organizationalUnit
top
Sample
EOX
end
def test_single_value
make_temporary_user do |user, password|
only = [:dn, :uidNumber]
assert_equal(<<-EOX, user.to_xml(:root => "user", :only => only))
#{user.dn}
#{user.uid_number}
EOX
end
end
def test_single_value_nil
make_temporary_user do |user, password|
only = [:dn, :uidNumber]
user.uid_number = nil
assert_equal(<<-EOX, user.to_xml(:root => "user", :only => only))
#{user.dn}
EOX
end
end
end
def test_save
make_temporary_user do |user, password|
user.sn = nil
assert(!user.save)
assert_raises(ActiveLdap::EntryInvalid) do
user.save!
end
user.sn = "Surname"
assert(user.save)
user.sn = "Surname2"
assert_nothing_raised {user.save!}
end
end
def test_have_attribute?
make_temporary_user do |user, password|
assert_true(user.have_attribute?(:cn))
assert_true(user.have_attribute?(:commonName))
assert_true(user.have_attribute?(:common_name))
assert_true(user.have_attribute?(:commonname))
assert_true(user.have_attribute?(:COMMONNAME))
assert_false(user.have_attribute?(:unknown_attribute))
end
end
def test_attribute_present?
make_temporary_user do |user, password|
assert(user.attribute_present?(:sn))
user.sn = nil
assert(!user.attribute_present?(:sn))
user.sn = "Surname"
assert(user.attribute_present?(:sn))
user.sn = [nil]
assert(!user.attribute_present?(:sn))
end
end
def test_attribute_present_with_unknown_attribute
make_temporary_user do |user, password|
assert(!user.attribute_present?(:unknown_attribute))
end
end
def test_update_all
make_temporary_user do |user, password|
make_temporary_user do |user2, password2|
user2_cn = user2.cn
new_cn = "New #{user.cn}"
@user_class.update_all({:cn => new_cn}, user.uid)
assert_equal(new_cn, @user_class.find(user.uid).cn)
assert_equal(user2_cn, @user_class.find(user2.uid).cn)
new_sn = "New SN"
@user_class.update_all({:sn => [new_sn]})
assert_equal(new_sn, @user_class.find(user.uid).sn)
assert_equal(new_sn, @user_class.find(user2.uid).sn)
new_sn2 = "New SN2"
@user_class.update_all({:sn => [new_sn2]}, user2.uid)
assert_equal(new_sn, @user_class.find(user.uid).sn)
assert_equal(new_sn2, @user_class.find(user2.uid).sn)
end
end
end
def test_update
make_temporary_user do |user, password|
new_cn = "New #{user.cn}"
new_user = @user_class.update(user.dn, {:cn => new_cn})
assert_equal(new_cn, new_user.cn)
make_temporary_user do |user2, password2|
new_sns = ["New SN1", "New SN2"]
new_cn2 = "New #{user2.cn}"
new_user, new_user2 = @user_class.update([user.dn, user2.dn],
[{:sn => new_sns[0]},
{:sn => new_sns[1],
:cn => new_cn2}])
assert_equal(new_sns, [new_user.sn, new_user2.sn])
assert_equal(new_cn2, new_user2.cn)
end
end
end
def test_to_key
uid = "bob"
new_user = @user_class.new
assert_equal(nil, new_user.to_key)
new_user.uid = uid
assert_equal([new_user.dn], new_user.to_key)
end
private
def detect_modify(object)
modify_called = false
singleton_class = class << object; self; end
singleton_class.send(:define_method, :modify_entry) do |*args|
dn, attributes, options = args
options ||= {}
modify_detector = Object.new
modify_detector.instance_variable_set("@called", false)
def modify_detector.modify(dn, entries, options)
@called = true
end
options[:connection] = modify_detector
result = super(dn, attributes, options)
modify_called = modify_detector.instance_variable_get("@called")
result
end
yield
modify_called
end
def assert_to_ldif(entry)
records = ActiveLdap::LDIF.parse(entry.to_ldif).records
parsed_entries = records.collect do |record|
entry.class.send(:instantiate, [record.dn, record.attributes])
end
assert_equal([entry], parsed_entries)
end
def base64(string)
[string].pack("m").gsub(/\n/u, "")
end
def normalize_attributes_order(xml)
xml.gsub(/<(\S+) (.+?)(\/?)>/) do |matched|
name = $1
attributes = $2
close_mark = $3
attributes = attributes.scan(/(\S+)="(.+?)"/)
normalized_attributes = attributes.sort_by do |key, value|
key
end.collect do |key, value|
"#{key}=\"#{value}\""
end.join(' ')
"<#{name} #{normalized_attributes}#{close_mark}>"
end
end
end