activeldap 4.0.5 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +3 -1
  3. data/doc/text/development.md +26 -0
  4. data/doc/text/{news.textile → news.md} +451 -241
  5. data/doc/text/{rails.textile → rails.md} +44 -33
  6. data/doc/text/{tutorial.textile → tutorial.md} +177 -185
  7. data/lib/active_ldap/adapter/base.rb +40 -17
  8. data/lib/active_ldap/adapter/jndi.rb +21 -9
  9. data/lib/active_ldap/adapter/jndi_connection.rb +83 -20
  10. data/lib/active_ldap/adapter/ldap.rb +50 -28
  11. data/lib/active_ldap/adapter/ldap_ext.rb +32 -13
  12. data/lib/active_ldap/adapter/net_ldap.rb +26 -24
  13. data/lib/active_ldap/associations.rb +5 -5
  14. data/lib/active_ldap/attribute_methods/before_type_cast.rb +1 -1
  15. data/lib/active_ldap/attribute_methods/dirty.rb +4 -7
  16. data/lib/active_ldap/attribute_methods/query.rb +1 -1
  17. data/lib/active_ldap/attribute_methods/read.rb +5 -1
  18. data/lib/active_ldap/attribute_methods/write.rb +1 -1
  19. data/lib/active_ldap/attribute_methods.rb +1 -2
  20. data/lib/active_ldap/base.rb +61 -14
  21. data/lib/active_ldap/callbacks.rb +7 -8
  22. data/lib/active_ldap/configuration.rb +27 -3
  23. data/lib/active_ldap/connection.rb +4 -22
  24. data/lib/active_ldap/distinguished_name.rb +1 -1
  25. data/lib/active_ldap/human_readable.rb +5 -4
  26. data/lib/active_ldap/operations.rb +24 -4
  27. data/lib/active_ldap/persistence.rb +3 -2
  28. data/lib/active_ldap/populate.rb +5 -3
  29. data/lib/active_ldap/railties/controller_runtime.rb +1 -2
  30. data/lib/active_ldap/schema/syntaxes.rb +8 -4
  31. data/lib/active_ldap/validations.rb +12 -4
  32. data/lib/active_ldap/version.rb +1 -1
  33. data/lib/active_ldap.rb +0 -7
  34. data/po/en/active-ldap.po +2 -2
  35. data/po/ja/active-ldap.po +3 -3
  36. data/test/add-phonetic-attribute-options-to-slapd.ldif +3 -3
  37. data/test/al-test-utils.rb +125 -38
  38. data/test/command.rb +13 -16
  39. data/test/enable-dynamic-groups.ldif +22 -0
  40. data/test/enable-start-tls.ldif +27 -0
  41. data/test/run-test.rb +0 -4
  42. data/test/test_base.rb +223 -22
  43. data/test/test_base_per_instance.rb +33 -1
  44. data/test/test_callback.rb +10 -8
  45. data/test/test_connection.rb +4 -0
  46. data/test/test_connection_per_class.rb +34 -0
  47. data/test/test_dn.rb +7 -0
  48. data/test/test_entry.rb +1 -0
  49. data/test/test_find.rb +14 -3
  50. data/test/test_supported_control.rb +1 -1
  51. data/test/test_syntax.rb +5 -0
  52. data/test/test_validation.rb +28 -15
  53. metadata +23 -24
  54. data/README.textile +0 -141
  55. data/doc/text/development.textile +0 -54
  56. data/lib/active_ldap/timeout.rb +0 -75
  57. data/lib/active_ldap/timeout_stub.rb +0 -17
data/test/test_base.rb CHANGED
@@ -5,7 +5,52 @@ require 'al-test-utils'
5
5
  class TestBase < Test::Unit::TestCase
6
6
  include AlTestUtils
7
7
 
8
+ sub_test_case("follow_referrals") do
9
+ def test_default
10
+ make_temporary_user do |user1,|
11
+ make_temporary_user do |user2,|
12
+ member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
13
+ make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
14
+ assert_equal([user1.dn, user2.dn],
15
+ group_of_urls.attributes["member"])
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def test_connection_false
22
+ omit_unless_jruby
23
+ @group_of_urls_class.setup_connection(
24
+ current_configuration.merge(follow_referrals: false)
25
+ )
26
+ make_temporary_user do |user1,|
27
+ make_temporary_user do |user2,|
28
+ member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
29
+ make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
30
+ assert_nil(group_of_urls.attributes["member"])
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def test_connect_false
37
+ omit_unless_jruby
38
+ connection = @group_of_urls_class.connection
39
+ connection.disconnect!
40
+ connection.connect(follow_referrals: false)
41
+ make_temporary_user do |user1,|
42
+ make_temporary_user do |user2,|
43
+ member_url = ["ldap:///#{user1.base.to_s}??one?(objectClass=person)"]
44
+ make_temporary_group_of_urls(member_url: member_url) do |group_of_urls|
45
+ assert_nil(group_of_urls.attributes["member"])
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
8
52
  priority :must
53
+ priority :normal
9
54
  def test_search_colon_value
10
55
  make_temporary_group(:cn => "temp:group") do |group|
11
56
  assert_equal("temp:group", group.cn)
@@ -13,7 +58,6 @@ class TestBase < Test::Unit::TestCase
13
58
  end
14
59
  end
15
60
 
16
- priority :normal
17
61
  def test_lower_case_object_class
18
62
  fixture_file = fixture("lower_case_object_class_schema.rb")
19
63
  schema_entries = eval(File.read(fixture_file))
@@ -122,9 +166,9 @@ class TestBase < Test::Unit::TestCase
122
166
 
123
167
  def test_operational_attributes
124
168
  make_temporary_group do |group|
125
- dn, attributes = @group_class.search(:attributes => ["*"])[0]
169
+ _dn, attributes = @group_class.search(:attributes => ["*"])[0]
126
170
  normal_attributes = attributes.keys
127
- dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
171
+ _dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
128
172
  operational_attributes = attributes.keys - normal_attributes
129
173
  operational_attribute = operational_attributes[0]
130
174
 
@@ -150,13 +194,13 @@ class TestBase < Test::Unit::TestCase
150
194
  _ou_class.create("root2")
151
195
  assert_equal(["base",
152
196
  "root1", "child1", "child2", "domain", "child3",
153
- "root2"],
154
- _entry_class.find(:all).collect(&:id))
197
+ "root2"].sort,
198
+ _entry_class.find(:all).collect(&:id).sort)
155
199
  assert_raise(ActiveLdap::DeleteError) do
156
200
  root1.destroy_all
157
201
  end
158
- assert_equal(["base", "root1", "domain", "root2"],
159
- _entry_class.find(:all).collect(&:id))
202
+ assert_equal(["base", "root1", "domain", "root2"].sort,
203
+ _entry_class.find(:all).collect(&:id).sort)
160
204
  end
161
205
 
162
206
  def test_delete_mixed_tree_by_instance
@@ -173,13 +217,13 @@ class TestBase < Test::Unit::TestCase
173
217
  _ou_class.create("root2")
174
218
  assert_equal(["base",
175
219
  "root1", "child1", "child2", "domain", "child3",
176
- "root2"],
177
- _entry_class.find(:all).collect(&:id))
220
+ "root2"].sort,
221
+ _entry_class.find(:all).collect(&:id).sort)
178
222
  assert_raise(ActiveLdap::DeleteError) do
179
223
  root1.delete_all
180
224
  end
181
- assert_equal(["base", "root1", "domain", "root2"],
182
- _entry_class.find(:all).collect(&:id))
225
+ assert_equal(["base", "root1", "domain", "root2"].sort,
226
+ _entry_class.find(:all).collect(&:id).sort)
183
227
  end
184
228
 
185
229
  def test_delete_tree
@@ -189,8 +233,8 @@ class TestBase < Test::Unit::TestCase
189
233
  _ou_class.create(:ou => "child1", :parent => root1)
190
234
  _ou_class.create(:ou => "child2", :parent => root1)
191
235
  _ou_class.create("root2")
192
- assert_equal(["base", "root1", "child1", "child2", "root2"],
193
- _ou_class.find(:all).collect(&:ou))
236
+ assert_equal(["base", "root1", "child1", "child2", "root2"].sort,
237
+ _ou_class.find(:all).collect(&:ou).sort)
194
238
  _ou_class.delete_all(:base => root1.dn)
195
239
  assert_equal(["base", "root2"],
196
240
  _ou_class.find(:all).collect(&:ou))
@@ -217,11 +261,11 @@ class TestBase < Test::Unit::TestCase
217
261
  :classes => ["top"]
218
262
  entry_class.dn_attribute = nil
219
263
  assert_equal(["base", "root1", "child1", "domain1", "grandchild1",
220
- "child2", "domain2", "root2"],
221
- entry_class.find(:all).collect(&:id))
264
+ "child2", "domain2", "root2"].sort,
265
+ entry_class.find(:all).collect(&:id).sort)
222
266
  entry_class.delete_all(nil, :base => child2.dn)
223
- assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"],
224
- entry_class.find(:all).collect(&:id))
267
+ assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"].sort,
268
+ entry_class.find(:all).collect(&:id).sort)
225
269
  end
226
270
 
227
271
  def test_first
@@ -252,6 +296,94 @@ class TestBase < Test::Unit::TestCase
252
296
  end
253
297
  end
254
298
 
299
+ def test_set_single_valued_attribute_uses_replace
300
+ make_temporary_user(:simple => true) do |user,|
301
+ assert_not_nil(user.homeDirectory)
302
+ assert_not_equal("/home/foo", user.homeDirectory)
303
+
304
+ user.homeDirectory = "/home/foo"
305
+ assert_equal({
306
+ :modified => true,
307
+ :entries => [
308
+ [
309
+ :replace,
310
+ "homeDirectory",
311
+ {"homeDirectory" => ["/home/foo"]},
312
+ ]
313
+ ]
314
+ },
315
+ detect_modify(user) {user.save})
316
+ assert_equal("/home/foo", user.homeDirectory)
317
+ end
318
+ end
319
+
320
+ def test_set_attribute_uses_add_for_completely_new_value
321
+ make_temporary_user(:simple => true) do |user,|
322
+ assert_nil(user.description)
323
+
324
+ user.description = "x"
325
+ assert_equal({
326
+ :modified => true,
327
+ :entries => [
328
+ [:add, "description", {"description" => ["x"]}],
329
+ ],
330
+ },
331
+ detect_modify(user) {user.save})
332
+ assert_equal("x", user.description)
333
+ end
334
+ end
335
+
336
+ def test_set_attribute_uses_add_for_added_value
337
+ make_temporary_user(:simple => true) do |user,|
338
+ user.description = ["a", "b"]
339
+ assert(user.save)
340
+
341
+ user.description = ["a", "b", "c"]
342
+ assert_equal({
343
+ :modified => true,
344
+ :entries => [
345
+ [:add, "description", {"description" => ["c"]}],
346
+ ],
347
+ },
348
+ capture = detect_modify(user) {user.save})
349
+ assert_equal(["a", "b", "c"], user.description)
350
+ end
351
+ end
352
+
353
+ def test_set_attribute_uses_delete_for_deleted_value
354
+ make_temporary_user(:simple => true) do |user,|
355
+ user.description = ["a", "b", "c"]
356
+ assert(user.save)
357
+
358
+ user.description = ["a", "c"]
359
+ assert_equal({
360
+ :modified => true,
361
+ :entries => [
362
+ [:delete, "description", {"description" => ["b"]}],
363
+ ],
364
+ },
365
+ detect_modify(user) {user.save})
366
+ assert_equal(["a", "c"], user.description)
367
+ end
368
+ end
369
+
370
+ def test_set_attribute_uses_delete_for_unset_value
371
+ make_temporary_user(:simple => true) do |user,|
372
+ user.description = "x"
373
+ assert(user.save)
374
+
375
+ user.description = nil
376
+ assert_equal({
377
+ :modified => true,
378
+ :entries => [
379
+ [:delete, "description", {"description" => ["x"]}],
380
+ ],
381
+ },
382
+ detect_modify(user) {user.save})
383
+ assert_nil(user.description)
384
+ end
385
+ end
386
+
255
387
  def test_set_attributes_with_a_blank_value_in_values
256
388
  make_temporary_user(:simple => true) do |user,|
257
389
  user.attributes = {"description" => ["a", "b", ""]}
@@ -295,6 +427,19 @@ class TestBase < Test::Unit::TestCase
295
427
  end
296
428
  end
297
429
 
430
+ def test_set_dn_with_unnormalized_dn_attribute_with_forward_slash
431
+ make_temporary_user do |user,|
432
+ new_dn = "uid=temp/user1,#{user.class.base}"
433
+ assert_not_equal(user.dn.to_s, new_dn)
434
+
435
+ user.uid = 'temp/user1'
436
+ assert_equal(user.dn.to_s, new_dn)
437
+
438
+ assert_true(user.save!)
439
+ assert_true(user.class.find(user.uid).update_attributes!(gidNumber: 100069))
440
+ end
441
+ end
442
+
298
443
  def test_destroy_with_empty_base_and_prefix_of_class
299
444
  make_temporary_user do |user,|
300
445
  base = user.class.base
@@ -354,14 +499,25 @@ class TestBase < Test::Unit::TestCase
354
499
 
355
500
  def test_save_with_changes
356
501
  make_temporary_user do |user, password|
502
+ cn = user.cn
357
503
  user.cn += "!!!"
358
- assert_true(detect_modify(user) {user.save})
504
+ assert_equal({
505
+ :modified => true,
506
+ :entries => [
507
+ [:replace, "cn", {"cn" => ["#{cn}!!!"]}],
508
+ ],
509
+ },
510
+ detect_modify(user) {user.save})
359
511
  end
360
512
  end
361
513
 
362
514
  def test_save_without_changes
363
515
  make_temporary_user do |user, password|
364
- assert_false(detect_modify(user) {user.save})
516
+ assert_equal({
517
+ :modified => false,
518
+ :entries => [],
519
+ },
520
+ detect_modify(user) {user.save})
365
521
  end
366
522
  end
367
523
 
@@ -663,6 +819,43 @@ class TestBase < Test::Unit::TestCase
663
819
  end
664
820
  end
665
821
 
822
+ class TestInstantiate < self
823
+ class Person < ActiveLdap::Base
824
+ ldap_mapping dn_attribute: "cn",
825
+ prefix: "ou=People",
826
+ scope: :one,
827
+ classes: ["top", "person"]
828
+ end
829
+
830
+ class OrganizationalPerson < Person
831
+ ldap_mapping dn_attribute: "cn",
832
+ prefix: "",
833
+ classes: ["top", "person", "organizationalPerson"]
834
+ end
835
+
836
+ class ResidentialPerson < Person
837
+ ldap_mapping dn_attribute: "cn",
838
+ prefix: "",
839
+ classes: ["top", "person", "residentialPerson"]
840
+ end
841
+
842
+ def test_sub_class
843
+ make_ou("People")
844
+ residential_person = ResidentialPerson.new(cn: "John Doe",
845
+ sn: "Doe",
846
+ street: "123 Main Street",
847
+ l: "Anytown")
848
+ residential_person.save!
849
+ organizational_person = OrganizationalPerson.new(cn: "Jane Smith",
850
+ sn: "Smith",
851
+ title: "General Manager")
852
+ organizational_person.save!
853
+ people = Person.all
854
+ assert_equal([ResidentialPerson, OrganizationalPerson],
855
+ people.collect(&:class))
856
+ end
857
+ end
858
+
666
859
  def test_reload_of_not_exists_entry
667
860
  make_temporary_user do |user,|
668
861
  assert_nothing_raised do
@@ -809,7 +1002,8 @@ class TestBase < Test::Unit::TestCase
809
1002
  ou_class.ldap_mapping(:dn_attribute => :ou,
810
1003
  :prefix => "",
811
1004
  :classes => ["top", "organizationalUnit"])
812
- assert_equal(["ou=Groups,#{current_configuration['base']}",
1005
+ assert_equal(["ou=GroupOfURLsSet,#{current_configuration['base']}",
1006
+ "ou=Groups,#{current_configuration['base']}",
813
1007
  "ou=Users,#{current_configuration['base']}"],
814
1008
  ou_class.find(:all).collect(&:dn).collect(&:to_s).sort)
815
1009
  end
@@ -1151,23 +1345,30 @@ EOX
1151
1345
 
1152
1346
  private
1153
1347
  def detect_modify(object)
1154
- modify_called = false
1348
+ modify_called = nil
1349
+ entries = nil
1155
1350
  singleton_class = class << object; self; end
1156
1351
  singleton_class.send(:define_method, :modify_entry) do |*args|
1157
1352
  dn, attributes, options = args
1158
1353
  options ||= {}
1159
1354
  modify_detector = Object.new
1160
1355
  modify_detector.instance_variable_set("@called", false)
1356
+ modify_detector.instance_variable_set("@entries", [])
1161
1357
  def modify_detector.modify(dn, entries, options)
1162
1358
  @called = true
1359
+ @entries = entries
1163
1360
  end
1164
1361
  options[:connection] = modify_detector
1165
1362
  result = super(dn, attributes, options)
1166
1363
  modify_called = modify_detector.instance_variable_get("@called")
1364
+ entries = modify_detector.instance_variable_get("@entries")
1167
1365
  result
1168
1366
  end
1169
1367
  yield
1170
- modify_called
1368
+ {
1369
+ :modified => modify_called,
1370
+ :entries => entries,
1371
+ }
1171
1372
  end
1172
1373
 
1173
1374
  def assert_to_ldif(entry)
@@ -9,13 +9,45 @@ class TestBasePerInstance < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  priority :must
12
+ def test_dn_with_sub_base_first
13
+ sub_user = @user_class.new(dn: "uid=user1,ou=Sub,#{@user_class.base}",
14
+ uid: "user1")
15
+ # Order is important. #base should be called before #dn.
16
+ base = sub_user.base.to_s
17
+ dn = sub_user.dn.to_s
18
+ assert_equal([
19
+ "ou=Sub,#{@user_class.base}",
20
+ "uid=user1,ou=Sub,#{@user_class.base}",
21
+ ],
22
+ [
23
+ base,
24
+ dn,
25
+ ])
26
+ end
27
+
28
+ def test_dn_with_sub_base_last
29
+ sub_user = @user_class.new(uid: "user1",
30
+ dn: "uid=user1,ou=Sub,#{@user_class.base}")
31
+ # Order is important. #base should be called before #dn.
32
+ base = sub_user.base.to_s
33
+ dn = sub_user.dn.to_s
34
+ assert_equal([
35
+ "ou=Sub,#{@user_class.base}",
36
+ "uid=user1,ou=Sub,#{@user_class.base}",
37
+ ],
38
+ [
39
+ base,
40
+ dn,
41
+ ])
42
+ end
43
+
44
+ priority :normal
12
45
  def test_set_base
13
46
  guest = @user_class.new("guest")
14
47
  guest.base = "ou=Sub"
15
48
  assert_equal("uid=guest,ou=Sub,#{@user_class.base}", guest.dn)
16
49
  end
17
50
 
18
- priority :normal
19
51
  def test_dn_is_base
20
52
  entry_class = Class.new(ActiveLdap::Base)
21
53
  entry_class.ldap_mapping :prefix => "",
@@ -6,10 +6,10 @@ class TestCallback < Test::Unit::TestCase
6
6
  priority :must
7
7
  def test_new
8
8
  initialized_entries = []
9
- @group_class.instance_variable_set("@initialized_entries",
10
- initialized_entries)
11
9
  @group_class.module_eval do
12
- after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
10
+ after_initialize do
11
+ initialized_entries << self
12
+ end
13
13
  end
14
14
  assert_equal([], initialized_entries)
15
15
  new_group = @group_class.new(:cn => "new-cn")
@@ -22,12 +22,14 @@ class TestCallback < Test::Unit::TestCase
22
22
  make_temporary_group do |group|
23
23
  found_entries = []
24
24
  initialized_entries = []
25
- @group_class.instance_variable_set("@found_entries", found_entries)
26
- @group_class.instance_variable_set("@initialized_entries",
27
- initialized_entries)
28
25
  @group_class.module_eval do
29
- after_find "self.class.instance_variable_get('@found_entries') << self"
30
- after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
26
+ prepend ActiveLdap::Callbacks::CallbackedInstantiatable
27
+ after_find do
28
+ found_entries << self
29
+ end
30
+ after_initialize do
31
+ initialized_entries << self
32
+ end
31
33
  end
32
34
 
33
35
  assert_equal([], found_entries)
@@ -3,6 +3,7 @@ require 'al-test-utils'
3
3
  class TestConnection < Test::Unit::TestCase
4
4
  include AlTestUtils::Config
5
5
  include AlTestUtils::MockLogger
6
+ include AlTestUtils::Omittable
6
7
 
7
8
  def setup
8
9
  super
@@ -23,6 +24,9 @@ class TestConnection < Test::Unit::TestCase
23
24
  end
24
25
 
25
26
  def test_retry_limit_0_with_nonexistent_host_with_timeout
27
+ omit_if_ldap("this test will take a long time...")
28
+ omit_if_jruby("JNI adapter returns connection error immediately. " +
29
+ "So timeout isn't invoked.")
26
30
  config = current_configuration.merge("host" => "192.168.29.29",
27
31
  "retry_limit" => 0,
28
32
  "timeout" => 1)
@@ -57,6 +57,40 @@ class TestConnectionPerClass < Test::Unit::TestCase
57
57
  assert_equal([sub2_base], sub2_class.find(:all).collect(&:dn))
58
58
  end
59
59
 
60
+ def test_multi_same_setup_connections
61
+ make_ou("Sub")
62
+ sub_class1 = ou_class("ou=Sub")
63
+ sub_class2 = ou_class("ou=Sub")
64
+
65
+ configuration = current_configuration.symbolize_keys
66
+ configuration[:scope] = :base
67
+ current_base = configuration[:base]
68
+ sub_configuration = configuration.dup
69
+ sub_base = "ou=Sub,#{current_base}"
70
+ sub_configuration[:base] = sub_base
71
+
72
+ sub_class1.setup_connection(sub_configuration)
73
+ sub_class2.setup_connection(sub_configuration)
74
+
75
+ sub_configuration1 = sub_class1.configuration
76
+ sub_configuration2 = sub_class2.configuration
77
+
78
+ assert_not_nil(sub_configuration1)
79
+ assert_not_nil(sub_configuration2)
80
+
81
+ sub_class1.setup_connection(sub_configuration.dup)
82
+ sub_class1.prefix = nil
83
+
84
+ assert_equal([
85
+ sub_configuration1,
86
+ sub_configuration2,
87
+ ],
88
+ [
89
+ sub_class1.configuration,
90
+ sub_class2.configuration,
91
+ ])
92
+ end
93
+
60
94
  def test_bind
61
95
  non_anon_class = ou_class("ou=NonAnonymous")
62
96
  anon_class = ou_class("ou=Anonymous")
data/test/test_dn.rb CHANGED
@@ -72,6 +72,13 @@ class TestDN < Test::Unit::TestCase
72
72
  "dc = \" l o c a l \" , dc = \"+n,\\\"e\\\";t\"")
73
73
  end
74
74
 
75
+ def test_parse_dn_with_spaces_in_attribute_value
76
+ assert_dn([["o", "xxx "], ["dc", "local"]], "o=xxx\\ ,dc=local")
77
+ assert_dn([["o", " xxx"], ["dc", "local"]], "o=\\ xxx,dc=local")
78
+ assert_dn([["o", "xxx yyy"], ["dc", "local"]], "o=xxx\\ yyy,dc=local")
79
+ assert_dn([["o", " xxx "], ["dc", "local"]], "o=\\ xxx\\ ,dc=local")
80
+ end
81
+
75
82
  def test_parse_dn_in_rfc2253
76
83
  assert_dn([
77
84
  {"cn" => "Steve Kille"},
data/test/test_entry.rb CHANGED
@@ -11,6 +11,7 @@ class TestEntry < Test::Unit::TestCase
11
11
  all_entries = [ActiveLdap::Base.base]
12
12
  all_entries += [user.dn, user.base]
13
13
  all_entries += [group.dn, group.base]
14
+ all_entries += [@group_of_urls_class.base]
14
15
  assert_equal(all_entries.sort,
15
16
  ActiveLdap::Entry.all.collect(&:dn).sort)
16
17
  end
data/test/test_find.rb CHANGED
@@ -3,7 +3,18 @@ require 'al-test-utils'
3
3
  class TestFind < Test::Unit::TestCase
4
4
  include AlTestUtils
5
5
 
6
- priority :must
6
+ def test_find_paged
7
+ page_size = 126
8
+ n_users = page_size + 1
9
+ uids = n_users.times.collect do
10
+ user, _password = make_temporary_user
11
+ user.uid
12
+ end
13
+ users = @user_class.find(:all, page_size: page_size)
14
+ assert_equal(uids.sort,
15
+ users.collect(&:uid).sort)
16
+ end
17
+
7
18
  def test_find_with_dn
8
19
  make_temporary_user do |user,|
9
20
  assert_equal(user.dn, @user_class.find(user.dn).dn)
@@ -11,7 +22,6 @@ class TestFind < Test::Unit::TestCase
11
22
  end
12
23
  end
13
24
 
14
- priority :normal
15
25
  def test_find_with_special_value_prefix
16
26
  # \2C == ','
17
27
  make_ou("a\\2Cb,ou=Users")
@@ -63,7 +73,8 @@ class TestFind < Test::Unit::TestCase
63
73
 
64
74
  def test_find_operational_attributes
65
75
  make_temporary_user do |user, password|
66
- found_user = @user_class.find(user.uid, :attributes => ["*", "+"])
76
+ found_user = @user_class.find(user.uid,
77
+ :include_operational_attributes => true)
67
78
  assert_equal(Time.now.utc.iso8601,
68
79
  found_user.modify_timestamp.utc.iso8601)
69
80
  end
@@ -17,7 +17,7 @@ class TestSupportedControl < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  def test_false
20
- assert_true(paged_results?(ActiveLdap::LdapControls::PAGED_RESULTS))
20
+ assert_false(paged_results?(ActiveLdap::LdapControls::ASSERTION))
21
21
  end
22
22
  end
23
23
  end
data/test/test_syntax.rb CHANGED
@@ -117,6 +117,11 @@ class TestSyntax < Test::Unit::TestCase
117
117
  "19941216103212.345+0900")
118
118
  end
119
119
 
120
+ def test_timezone_difference_with_minutes
121
+ assert_type_cast(Time.parse("2019-02-13 15:54:23 +0530"),
122
+ "20190213155423+0530")
123
+ end
124
+
120
125
  def test_year_month_day_hour_minute
121
126
  assert_type_cast(Time.parse("2008/01/07 03:46:00"),
122
127
  "200801070346")