File: test_reflection.rb

package info (click to toggle)
ruby-activeldap 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 1,588 kB
  • sloc: ruby: 18,143; sh: 12; makefile: 5
file content (175 lines) | stat: -rw-r--r-- 6,170 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
require 'al-test-utils'

class TestReflection < Test::Unit::TestCase
  include AlTestUtils

  priority :must

  priority :normal
  def test_base_class
    assert_equal(ActiveLdap::Base, ActiveLdap::Base.base_class)
    assert_equal(@user_class, @user_class.base_class)
    sub_user_class = Class.new(@user_class)
    assert_equal(@user_class, sub_user_class.base_class)
  end

  def test_respond_to?
    make_temporary_user do |user, password|
      attributes = (user.must + user.may).collect(&:name) - ["objectClass"]
      _wrap_assertion do
        attributes.each do |name|
          assert_respond_to(user, name)
        end
        assert_not_respond_to(user, "objectClass")
      end

      user.replace_class(user.class.required_classes)
      new_attributes = collect_attributes(user.class.required_classes)
      new_attributes -= ["objectClass"]

      _wrap_assertion do
        assert_not_equal([], new_attributes)
        new_attributes.each do |name|
          assert_respond_to(user, name)
        end

        remained_attributes = (attributes - new_attributes)
        assert_not_equal([], remained_attributes)
        remained_attributes.each do |name|
          assert_not_respond_to(user, name)
        end
      end
    end
  end

  def test_methods
    make_temporary_user do |user, password|
      assert_equal(user.methods.uniq.size, user.methods.size)
      assert_equal(user.methods(false).uniq.size, user.methods(false).size)
    end

    make_temporary_user do |user, password|
      attributes = user.must.collect(&:name) + user.may.collect(&:name)
      attributes = (attributes - ["objectClass"]).map(&:to_sym)
      assert_equal([], attributes - user.methods)

      assert_methods_with_only_required_classes(user, attributes)
    end

    make_temporary_user do |user, password|
      user.remove_class("inetOrgPerson")
      attributes = user.must.collect(&:name) + user.may.collect(&:name)
      attributes = (attributes - ["objectClass"]).map(&:to_sym)
      assert_equal([], attributes - user.methods)

      assert_methods_with_only_required_classes(user, attributes)
    end

    make_temporary_user do |user, password|
      attributes = user.must.collect(&:name) + user.may.collect(&:name)
      attributes = attributes.map(&:downcase).map(&:to_sym)
      assert_not_equal([], attributes - user.methods)
      assert_not_equal([], attributes - user.methods(false))

      normalize_attributes_list = Proc.new do |*attributes_list|
        attributes_list.collect do |attrs|
          attrs.collect {|x| x.downcase}
        end
      end
      assert_methods_with_only_required_classes(user, attributes,
                                                &normalize_attributes_list)
    end

    make_temporary_user do |user, password|
      attributes = user.must.collect(&:name) + user.may.collect(&:name)
      attributes -= ["objectClass"]
      attributes = attributes.collect(&:underscore).map(&:to_sym)
      assert_equal([], attributes - user.methods)

      normalize_attributes_list = Proc.new do |*attributes_list|
        attributes_list.collect do |attrs|
          attrs.collect(&:underscore)
        end
      end
      assert_methods_with_only_required_classes(user, attributes,
                                                &normalize_attributes_list)
    end

    make_temporary_user do |user, password|
      user.remove_class("inetOrgPerson")
      attributes = user.must.collect(&:name) + user.may.collect(&:name)
      attributes -= ["objectClass"]
      attributes = attributes.collect(&:underscore).map(&:to_sym)
      assert_equal([], attributes - user.methods)

      normalize_attributes_list = Proc.new do |*attributes_list|
        attributes_list.collect do |attrs|
          attrs.collect(&:underscore)
        end
      end
      assert_methods_with_only_required_classes(user, attributes,
                                                &normalize_attributes_list)
    end
  end

  def test_attribute_names
    make_temporary_user do |user, password|
      attributes = collect_attributes(user.classes)
      assert_equal([], attributes.uniq - user.attribute_names)
      assert_equal([], user.attribute_names - attributes.uniq)
    end
  end

  private
  def assert_methods_with_only_required_classes(object, attributes)
    old_classes = (object.classes - object.class.required_classes).uniq
    old_attributes = collect_attributes(old_classes, false).uniq.sort
    required_attributes = collect_attributes(object.class.required_classes,
                                             false).uniq.sort
    if block_given?
      old_attributes, required_attributes =
        yield(old_attributes, required_attributes)
    end

    [old_attributes, required_attributes].map{|a| a.map!(&:to_sym)}

    object.replace_class(object.class.required_classes)

    assert_equal([],
                 old_attributes -
                   (attributes - object.methods - required_attributes) -
                    required_attributes)
  end

  def assert_respond_to(object, name)
    assert_true(object.respond_to?(name), name)
    assert_true(object.respond_to?("#{name}="), "#{name}=")
    assert_true(object.respond_to?("#{name}?"), "#{name}?")
    assert_true(object.respond_to?("#{name}_before_type_cast"),
                "#{name}_before_type_cast")
  end

  def assert_not_respond_to(object, name)
    assert_false(object.respond_to?(name), name)
    assert_false(object.respond_to?("#{name}="), "#{name}=")
    assert_false(object.respond_to?("#{name}?"), "#{name}?")
    assert_false(object.respond_to?("#{name}_before_type_cast"),
                 "#{name}_before_type_cast")
  end

  def collect_attributes(object_classes, with_aliases=true)
    attributes = []
    object_classes.each do |object_class|
      object_klass = ActiveLdap::Base.schema.object_class(object_class)
      if with_aliases
        (object_klass.must + object_klass.may).each do |attribute|
          attributes << attribute.name
          attributes.concat(attribute.aliases)
        end
      else
        attributes.concat((object_klass.must + object_klass.may).collect(&:name))
      end
    end
    attributes
  end
end