treequel 1.11.0 → 1.12.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +135 -12
- data/{History.rdoc → History.md} +46 -34
- data/Manifest.txt +6 -5
- data/{README.rdoc → README.md} +58 -44
- data/Rakefile +40 -18
- data/examples/ldap-rack-auth.rb +1 -1
- data/examples/ldap_state.rb +5 -5
- data/lib/treequel.rb +10 -9
- data/lib/treequel/behavior/control.rb +7 -8
- data/lib/treequel/branch.rb +29 -28
- data/lib/treequel/branchcollection.rb +8 -7
- data/lib/treequel/branchset.rb +22 -21
- data/lib/treequel/constants.rb +23 -24
- data/lib/treequel/control.rb +15 -15
- data/lib/treequel/controls/contentsync.rb +17 -16
- data/lib/treequel/controls/pagedresults.rb +13 -12
- data/lib/treequel/controls/sortedresults.rb +11 -10
- data/lib/treequel/directory.rb +35 -34
- data/lib/treequel/exceptions.rb +2 -1
- data/lib/treequel/filter.rb +10 -9
- data/lib/treequel/mixins.rb +4 -4
- data/lib/treequel/model.rb +23 -13
- data/lib/treequel/model/errors.rb +10 -9
- data/lib/treequel/model/objectclass.rb +9 -8
- data/lib/treequel/model/schemavalidations.rb +5 -4
- data/lib/treequel/monkeypatches.rb +5 -4
- data/lib/treequel/schema.rb +19 -18
- data/lib/treequel/schema/attributetype.rb +9 -8
- data/lib/treequel/schema/ldapsyntax.rb +2 -1
- data/lib/treequel/schema/matchingrule.rb +2 -1
- data/lib/treequel/schema/matchingruleuse.rb +2 -1
- data/lib/treequel/schema/objectclass.rb +23 -22
- data/lib/treequel/schema/table.rb +3 -2
- data/lib/treequel/sequel_integration.rb +2 -1
- data/lib/treequel/utils.rb +183 -0
- data/misc/ruby-ldap-controlsfix.patch +50 -0
- data/spec/{lib/constants.rb → spec_constants.rb} +7 -6
- data/spec/{lib/helpers.rb → spec_helpers.rb} +31 -53
- data/spec/treequel/branch_spec.rb +196 -223
- data/spec/treequel/branchcollection_spec.rb +73 -113
- data/spec/treequel/branchset_spec.rb +102 -161
- data/spec/treequel/control_spec.rb +5 -21
- data/spec/treequel/controls/contentsync_spec.rb +3 -17
- data/spec/treequel/controls/pagedresults_spec.rb +40 -62
- data/spec/treequel/controls/sortedresults_spec.rb +37 -59
- data/spec/treequel/directory_spec.rb +171 -190
- data/spec/treequel/filter_spec.rb +106 -131
- data/spec/treequel/mixins_spec.rb +47 -81
- data/spec/treequel/model/errors_spec.rb +11 -35
- data/spec/treequel/model/objectclass_spec.rb +99 -131
- data/spec/treequel/model/schemavalidations_spec.rb +36 -60
- data/spec/treequel/model_spec.rb +164 -167
- data/spec/treequel/monkeypatches_spec.rb +20 -41
- data/spec/treequel/schema/attributetype_spec.rb +84 -107
- data/spec/treequel/schema/ldapsyntax_spec.rb +10 -36
- data/spec/treequel/schema/matchingrule_spec.rb +23 -47
- data/spec/treequel/schema/matchingruleuse_spec.rb +18 -42
- data/spec/treequel/schema/objectclass_spec.rb +73 -94
- data/spec/treequel/schema/table_spec.rb +58 -86
- data/spec/treequel/schema_spec.rb +47 -59
- data/spec/treequel_spec.rb +131 -156
- metadata +68 -42
- metadata.gz.sig +0 -0
- data/spec/lib/matchers.rb +0 -55
|
@@ -1,33 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
#encoding: utf-8
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
require 'pathname'
|
|
5
|
-
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
|
6
|
-
|
|
7
|
-
libdir = basedir + "lib"
|
|
8
|
-
extdir = basedir + "ext"
|
|
9
|
-
|
|
10
|
-
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
|
11
|
-
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
|
12
|
-
$LOAD_PATH.unshift( extdir ) unless $LOAD_PATH.include?( extdir )
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
require 'rspec'
|
|
16
|
-
|
|
17
|
-
require 'spec/lib/constants'
|
|
18
|
-
require 'spec/lib/helpers'
|
|
4
|
+
require_relative '../spec_helpers'
|
|
19
5
|
|
|
20
6
|
require 'treequel'
|
|
21
7
|
require 'treequel/mixins'
|
|
22
8
|
|
|
23
9
|
|
|
24
|
-
include Treequel::TestConstants
|
|
25
|
-
include Treequel::Constants
|
|
26
|
-
|
|
27
|
-
#####################################################################
|
|
28
|
-
### C O N T E X T S
|
|
29
|
-
#####################################################################
|
|
30
|
-
|
|
31
10
|
describe Treequel, "mixin" do
|
|
32
11
|
|
|
33
12
|
describe Treequel::Loggable, "mixed into a class" do
|
|
@@ -49,7 +28,7 @@ describe Treequel, "mixin" do
|
|
|
49
28
|
|
|
50
29
|
it "is able to output to the log via its #log method" do
|
|
51
30
|
@obj.log_test_message( :debug, "debugging message" )
|
|
52
|
-
@log_output.last.
|
|
31
|
+
expect( @log_output.last ).to match( /debugging message/i )
|
|
53
32
|
end
|
|
54
33
|
end
|
|
55
34
|
|
|
@@ -65,15 +44,15 @@ describe Treequel, "mixin" do
|
|
|
65
44
|
|
|
66
45
|
result = Treequel::HashUtilities.stringify_keys( testhash )
|
|
67
46
|
|
|
68
|
-
result.
|
|
69
|
-
result.
|
|
70
|
-
result.
|
|
47
|
+
expect( result ).to be_an_instance_of( Hash )
|
|
48
|
+
expect( result ).to_not be_equal( testhash )
|
|
49
|
+
expect( result ).to eq(
|
|
71
50
|
'foo' => 1,
|
|
72
51
|
'bar' => {
|
|
73
52
|
'klang' => 'klong',
|
|
74
53
|
'barang' => { 'kerklang' => 'dumdumdum' },
|
|
75
54
|
}
|
|
76
|
-
|
|
55
|
+
)
|
|
77
56
|
end
|
|
78
57
|
|
|
79
58
|
|
|
@@ -88,15 +67,15 @@ describe Treequel, "mixin" do
|
|
|
88
67
|
|
|
89
68
|
result = Treequel::HashUtilities.symbolify_keys( testhash )
|
|
90
69
|
|
|
91
|
-
result.
|
|
92
|
-
result.
|
|
93
|
-
result.
|
|
70
|
+
expect( result ).to be_an_instance_of( Hash )
|
|
71
|
+
expect( result ).to_not be_equal( testhash )
|
|
72
|
+
expect( result ).to eq(
|
|
94
73
|
:foo => 1,
|
|
95
74
|
:bar => {
|
|
96
75
|
:klang => 'klong',
|
|
97
76
|
:barang => { :kerklang => 'dumdumdum' },
|
|
98
77
|
}
|
|
99
|
-
|
|
78
|
+
)
|
|
100
79
|
end
|
|
101
80
|
|
|
102
81
|
it "includes a function that can be used as the key-collision callback for " +
|
|
@@ -117,15 +96,15 @@ describe Treequel, "mixin" do
|
|
|
117
96
|
}
|
|
118
97
|
}
|
|
119
98
|
|
|
120
|
-
hash1.merge( hash2, &Treequel::HashUtilities.method(:merge_recursively) ).
|
|
99
|
+
expect( hash1.merge( hash2, &Treequel::HashUtilities.method(:merge_recursively) ) ).to eq(
|
|
121
100
|
:foo => 1,
|
|
122
101
|
:bar => [:one, :locke],
|
|
123
102
|
:baz => {
|
|
124
103
|
:glom => [:chunker, :plunker],
|
|
125
104
|
:trim => :liquor,
|
|
126
105
|
},
|
|
127
|
-
:klong => 88.8
|
|
128
|
-
|
|
106
|
+
:klong => 88.8
|
|
107
|
+
)
|
|
129
108
|
end
|
|
130
109
|
|
|
131
110
|
end
|
|
@@ -137,9 +116,9 @@ describe Treequel, "mixin" do
|
|
|
137
116
|
|
|
138
117
|
result = Treequel::ArrayUtilities.stringify_array( testarray )
|
|
139
118
|
|
|
140
|
-
result.
|
|
141
|
-
result.
|
|
142
|
-
result.
|
|
119
|
+
expect( result ).to be_an_instance_of( Array )
|
|
120
|
+
expect( result ).to_not be_equal( testarray )
|
|
121
|
+
expect( result ).to eq( ['a', 'b', 'c', ['d', 'e', ['f', 'g']]] )
|
|
143
122
|
end
|
|
144
123
|
|
|
145
124
|
|
|
@@ -148,19 +127,13 @@ describe Treequel, "mixin" do
|
|
|
148
127
|
|
|
149
128
|
result = Treequel::ArrayUtilities.symbolify_array( testarray )
|
|
150
129
|
|
|
151
|
-
result.
|
|
152
|
-
result.
|
|
153
|
-
result.
|
|
130
|
+
expect( result ).to be_an_instance_of( Array )
|
|
131
|
+
expect( result ).to_not be_equal( testarray )
|
|
132
|
+
expect( result ).to eq( [:a, :b, :c, [:d, :e, [:f, :g]]] )
|
|
154
133
|
end
|
|
155
134
|
end
|
|
156
135
|
|
|
157
136
|
describe Treequel::AttributeDeclarations do
|
|
158
|
-
before( :all ) do
|
|
159
|
-
setup_logging( :fatal )
|
|
160
|
-
end
|
|
161
|
-
after( :all ) do
|
|
162
|
-
reset_logging()
|
|
163
|
-
end
|
|
164
137
|
|
|
165
138
|
describe "predicate attribute declaration" do
|
|
166
139
|
before( :all ) do
|
|
@@ -176,31 +149,24 @@ describe Treequel, "mixin" do
|
|
|
176
149
|
end
|
|
177
150
|
|
|
178
151
|
it "creates a plain predicate method" do
|
|
179
|
-
@testclass.new( true ).
|
|
180
|
-
@testclass.new( false ).
|
|
181
|
-
@testclass.new( 1 ).
|
|
182
|
-
@testclass.new( :something_else ).
|
|
152
|
+
expect( @testclass.new( true ) ).to be_testable()
|
|
153
|
+
expect( @testclass.new( false ) ).to_not be_testable()
|
|
154
|
+
expect( @testclass.new( 1 ) ).to be_testable()
|
|
155
|
+
expect( @testclass.new( :something_else ) ).to be_testable()
|
|
183
156
|
end
|
|
184
157
|
|
|
185
158
|
it "creates a mutator" do
|
|
186
159
|
obj = @testclass.new( true )
|
|
187
160
|
obj.testable = false
|
|
188
|
-
obj.
|
|
161
|
+
expect( obj ).to_not be_testable()
|
|
189
162
|
obj.testable = true
|
|
190
|
-
obj.
|
|
163
|
+
expect( obj ).to be_testable()
|
|
191
164
|
end
|
|
192
165
|
end
|
|
193
166
|
end
|
|
194
167
|
|
|
195
168
|
describe Treequel::Delegation do
|
|
196
169
|
|
|
197
|
-
before( :all ) do
|
|
198
|
-
setup_logging( :fatal )
|
|
199
|
-
end
|
|
200
|
-
after( :all ) do
|
|
201
|
-
reset_logging()
|
|
202
|
-
end
|
|
203
|
-
|
|
204
170
|
describe "method delegation" do
|
|
205
171
|
before( :all ) do
|
|
206
172
|
@testclass = Class.new do
|
|
@@ -220,35 +186,35 @@ describe Treequel, "mixin" do
|
|
|
220
186
|
end
|
|
221
187
|
|
|
222
188
|
before( :each ) do
|
|
223
|
-
@subobj =
|
|
189
|
+
@subobj = double( "delegate" )
|
|
224
190
|
@obj = @testclass.new( @subobj )
|
|
225
191
|
end
|
|
226
192
|
|
|
227
193
|
|
|
228
194
|
it "can be used to set up delegation through a method" do
|
|
229
|
-
@subobj.
|
|
195
|
+
expect( @subobj ).to receive( :delegated_method )
|
|
230
196
|
@obj.delegated_method
|
|
231
197
|
end
|
|
232
198
|
|
|
233
199
|
it "passes any arguments through to the delegate object's method" do
|
|
234
|
-
@subobj.
|
|
200
|
+
expect( @subobj ).to receive( :delegated_method ).with( :arg1, :arg2 )
|
|
235
201
|
@obj.delegated_method( :arg1, :arg2 )
|
|
236
202
|
end
|
|
237
203
|
|
|
238
204
|
it "allows delegation to the delegate object's method with a block" do
|
|
239
|
-
@subobj.
|
|
205
|
+
expect( @subobj ).to receive( :delegated_method ).with( :arg1 ).
|
|
240
206
|
and_yield( :the_block_argument )
|
|
241
207
|
blockarg = nil
|
|
242
208
|
@obj.delegated_method( :arg1 ) {|arg| blockarg = arg }
|
|
243
|
-
blockarg.
|
|
209
|
+
expect( blockarg ).to eq( :the_block_argument )
|
|
244
210
|
end
|
|
245
211
|
|
|
246
212
|
it "reports errors from its caller's perspective", :ruby_18 do
|
|
247
213
|
begin
|
|
248
214
|
@obj.erroring_delegated_method
|
|
249
215
|
rescue NoMethodError => err
|
|
250
|
-
err.message.
|
|
251
|
-
err.backtrace.first.
|
|
216
|
+
expect( err.message ).to match( /nonexistant_method/ )
|
|
217
|
+
expect( err.backtrace.first ).to match( /#{__FILE__}/ )
|
|
252
218
|
rescue ::Exception => err
|
|
253
219
|
fail "Expected a NoMethodError, but got a %p (%s)" % [ err.class, err.message ]
|
|
254
220
|
else
|
|
@@ -274,35 +240,35 @@ describe Treequel, "mixin" do
|
|
|
274
240
|
end
|
|
275
241
|
|
|
276
242
|
before( :each ) do
|
|
277
|
-
@subobj =
|
|
243
|
+
@subobj = double( "delegate" )
|
|
278
244
|
@obj = @testclass.new( @subobj )
|
|
279
245
|
end
|
|
280
246
|
|
|
281
247
|
|
|
282
248
|
it "can be used to set up delegation through a method" do
|
|
283
|
-
@subobj.
|
|
249
|
+
expect( @subobj ).to receive( :delegated_method )
|
|
284
250
|
@obj.delegated_method
|
|
285
251
|
end
|
|
286
252
|
|
|
287
253
|
it "passes any arguments through to the delegate's method" do
|
|
288
|
-
@subobj.
|
|
254
|
+
expect( @subobj ).to receive( :delegated_method ).with( :arg1, :arg2 )
|
|
289
255
|
@obj.delegated_method( :arg1, :arg2 )
|
|
290
256
|
end
|
|
291
257
|
|
|
292
258
|
it "allows delegation to the delegate's method with a block" do
|
|
293
|
-
@subobj.
|
|
259
|
+
expect( @subobj ).to receive( :delegated_method ).with( :arg1 ).
|
|
294
260
|
and_yield( :the_block_argument )
|
|
295
261
|
blockarg = nil
|
|
296
262
|
@obj.delegated_method( :arg1 ) {|arg| blockarg = arg }
|
|
297
|
-
blockarg.
|
|
263
|
+
expect( blockarg ).to eq( :the_block_argument )
|
|
298
264
|
end
|
|
299
265
|
|
|
300
266
|
it "reports errors from its caller's perspective", :ruby_18 do
|
|
301
267
|
begin
|
|
302
268
|
@obj.erroring_delegated_method
|
|
303
269
|
rescue NoMethodError => err
|
|
304
|
-
err.message.
|
|
305
|
-
err.backtrace.first.
|
|
270
|
+
expect( err.message ).to match( /`erroring_delegated_method' for nil/ )
|
|
271
|
+
expect( err.backtrace.first ).to match( /#{__FILE__}/ )
|
|
306
272
|
rescue ::Exception => err
|
|
307
273
|
fail "Expected a NoMethodError, but got a %p (%s)" % [ err.class, err.message ]
|
|
308
274
|
else
|
|
@@ -318,19 +284,19 @@ describe Treequel, "mixin" do
|
|
|
318
284
|
|
|
319
285
|
describe "key normalization" do
|
|
320
286
|
it "downcases" do
|
|
321
|
-
Treequel::Normalization.normalize_key( :logonTime ).
|
|
287
|
+
expect( Treequel::Normalization.normalize_key( :logonTime ) ).to eq( :logontime )
|
|
322
288
|
end
|
|
323
289
|
|
|
324
290
|
it "symbolifies" do
|
|
325
|
-
Treequel::Normalization.normalize_key( 'cn' ).
|
|
291
|
+
expect( Treequel::Normalization.normalize_key( 'cn' ) ).to eq( :cn )
|
|
326
292
|
end
|
|
327
293
|
|
|
328
294
|
it "strips invalid characters" do
|
|
329
|
-
Treequel::Normalization.normalize_key( 'given name' ).
|
|
295
|
+
expect( Treequel::Normalization.normalize_key( 'given name' ) ).to eq( :givenname )
|
|
330
296
|
end
|
|
331
297
|
|
|
332
298
|
it "converts hyphens to underscores" do
|
|
333
|
-
Treequel::Normalization.normalize_key( 'apple-nickname' ).
|
|
299
|
+
expect( Treequel::Normalization.normalize_key( 'apple-nickname' ) ).to eq( :apple_nickname )
|
|
334
300
|
end
|
|
335
301
|
end
|
|
336
302
|
|
|
@@ -343,12 +309,12 @@ describe Treequel, "mixin" do
|
|
|
343
309
|
'apple-nickname' => 'a nickname',
|
|
344
310
|
}
|
|
345
311
|
|
|
346
|
-
Treequel::Normalization.normalize_hash( hash ).
|
|
312
|
+
expect( Treequel::Normalization.normalize_hash( hash ) ).to eq(
|
|
347
313
|
:logontime => 'a logon time',
|
|
348
314
|
:cn => 'a common name',
|
|
349
315
|
:givenname => 'a given name',
|
|
350
316
|
:apple_nickname => 'a nickname',
|
|
351
|
-
|
|
317
|
+
)
|
|
352
318
|
end
|
|
353
319
|
end
|
|
354
320
|
end
|
|
@@ -1,48 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
#encoding: utf-8
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
require 'pathname'
|
|
5
|
-
basedir = Pathname.new( __FILE__ ).dirname.parent.parent.parent
|
|
6
|
-
|
|
7
|
-
libdir = basedir + "lib"
|
|
8
|
-
|
|
9
|
-
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
|
10
|
-
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
require 'rspec'
|
|
14
|
-
|
|
15
|
-
require 'spec/lib/helpers'
|
|
4
|
+
require_relative '../../spec_helpers'
|
|
16
5
|
|
|
17
6
|
require 'treequel/model'
|
|
18
7
|
require 'treequel/model/errors'
|
|
19
8
|
require 'treequel/branchset'
|
|
20
9
|
|
|
21
10
|
|
|
22
|
-
|
|
23
|
-
#####################################################################
|
|
24
|
-
### C O N T E X T S
|
|
25
|
-
#####################################################################
|
|
26
|
-
|
|
27
11
|
describe Treequel::Model::Errors do
|
|
28
12
|
|
|
29
|
-
before( :all ) do
|
|
30
|
-
setup_logging( :fatal )
|
|
31
|
-
end
|
|
32
|
-
|
|
33
13
|
before( :each ) do
|
|
34
14
|
@errors = Treequel::Model::Errors.new
|
|
35
15
|
end
|
|
36
16
|
|
|
37
|
-
after( :all ) do
|
|
38
|
-
reset_logging()
|
|
39
|
-
end
|
|
40
|
-
|
|
41
17
|
|
|
42
18
|
it "allows the addition of errors" do
|
|
43
19
|
@errors.add( :cn, "Not a common name." )
|
|
44
|
-
@errors[:cn].
|
|
45
|
-
@errors[:cn].
|
|
20
|
+
expect( @errors[:cn].length ).to eq( 1 )
|
|
21
|
+
expect( @errors[:cn] ).to include( "Not a common name." )
|
|
46
22
|
end
|
|
47
23
|
|
|
48
24
|
it "knows how many errors there are" do
|
|
@@ -50,25 +26,25 @@ describe Treequel::Model::Errors do
|
|
|
50
26
|
@errors.add( :description, "must be this tall to ride" )
|
|
51
27
|
@errors.add( :description, "must have at least one value" )
|
|
52
28
|
|
|
53
|
-
@errors.count.
|
|
29
|
+
expect( @errors.count ).to eq( 3 )
|
|
54
30
|
end
|
|
55
31
|
|
|
56
32
|
it "is empty if there haven't been any errors registered" do
|
|
57
|
-
@errors.
|
|
33
|
+
expect( @errors ).to be_empty()
|
|
58
34
|
end
|
|
59
35
|
|
|
60
36
|
it "isn't empty if there have been errors registered" do
|
|
61
37
|
@errors.add( :uid, 'duplicate value' )
|
|
62
|
-
@errors.
|
|
38
|
+
expect( @errors ).to_not be_empty()
|
|
63
39
|
end
|
|
64
40
|
|
|
65
41
|
it "can build an array of error messages" do
|
|
66
42
|
@errors.add( :l, "is not a valid location" )
|
|
67
43
|
@errors.add( [:givenName, :sn, :displayName], "must be unique" )
|
|
68
44
|
|
|
69
|
-
@errors.full_messages.
|
|
70
|
-
@errors.full_messages.
|
|
71
|
-
@errors.full_messages.
|
|
45
|
+
expect( @errors.full_messages.length ).to eq( 2 )
|
|
46
|
+
expect( @errors.full_messages ).to include( "givenName and sn and displayName must be unique" )
|
|
47
|
+
expect( @errors.full_messages ).to include( "l is not a valid location" )
|
|
72
48
|
end
|
|
73
49
|
|
|
74
50
|
end
|
|
@@ -1,37 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
#encoding: utf-8
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
require 'pathname'
|
|
5
|
-
basedir = Pathname.new( __FILE__ ).dirname.parent.parent.parent
|
|
6
|
-
|
|
7
|
-
libdir = basedir + "lib"
|
|
8
|
-
|
|
9
|
-
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
|
10
|
-
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
require 'rspec'
|
|
14
|
-
|
|
15
|
-
require 'spec/lib/helpers'
|
|
4
|
+
require_relative '../../spec_helpers'
|
|
16
5
|
|
|
17
6
|
require 'treequel/model'
|
|
18
7
|
require 'treequel/model/objectclass'
|
|
19
8
|
require 'treequel/branchset'
|
|
20
9
|
|
|
21
10
|
|
|
22
|
-
|
|
23
|
-
#####################################################################
|
|
24
|
-
### C O N T E X T S
|
|
25
|
-
#####################################################################
|
|
26
|
-
|
|
27
11
|
describe Treequel::Model::ObjectClass do
|
|
28
12
|
|
|
29
|
-
before( :all ) do
|
|
30
|
-
setup_logging( :fatal )
|
|
31
|
-
end
|
|
32
|
-
|
|
33
13
|
before( :each ) do
|
|
34
|
-
@conn =
|
|
14
|
+
@conn = double( "ldap connection object" )
|
|
35
15
|
@directory = get_fixtured_directory( @conn )
|
|
36
16
|
Treequel::Model.directory = @directory
|
|
37
17
|
end
|
|
@@ -42,13 +22,9 @@ describe Treequel::Model::ObjectClass do
|
|
|
42
22
|
Treequel::Model.base_registry.clear
|
|
43
23
|
end
|
|
44
24
|
|
|
45
|
-
after( :all ) do
|
|
46
|
-
reset_logging()
|
|
47
|
-
end
|
|
48
|
-
|
|
49
25
|
|
|
50
26
|
it "outputs a warning when it is included instead of used to extend a Module" do
|
|
51
|
-
Treequel::Model::ObjectClass.
|
|
27
|
+
expect( Treequel::Model::ObjectClass ).to receive( :warn ).
|
|
52
28
|
with( /extending.*rather than appending/i )
|
|
53
29
|
mixin = Module.new do
|
|
54
30
|
include Treequel::Model::ObjectClass
|
|
@@ -64,7 +40,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
64
40
|
model_objectclasses :inetOrgPerson
|
|
65
41
|
end
|
|
66
42
|
|
|
67
|
-
mixin.model_objectclasses.
|
|
43
|
+
expect( mixin.model_objectclasses ).to eq( [:inetOrgPerson] )
|
|
68
44
|
end
|
|
69
45
|
|
|
70
46
|
it "can declare a required objectClass as a String" do
|
|
@@ -73,7 +49,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
73
49
|
model_objectclasses 'apple-computer-list'
|
|
74
50
|
end
|
|
75
51
|
|
|
76
|
-
mixin.model_objectclasses.
|
|
52
|
+
expect( mixin.model_objectclasses ).to eq( [:'apple-computer-list'] )
|
|
77
53
|
end
|
|
78
54
|
|
|
79
55
|
it "can declare multiple required objectClasses" do
|
|
@@ -82,18 +58,18 @@ describe Treequel::Model::ObjectClass do
|
|
|
82
58
|
model_objectclasses :inetOrgPerson, :acmeAccount
|
|
83
59
|
end
|
|
84
60
|
|
|
85
|
-
mixin.model_objectclasses.
|
|
61
|
+
expect( mixin.model_objectclasses ).to eq( [ :inetOrgPerson, :acmeAccount ] )
|
|
86
62
|
end
|
|
87
63
|
|
|
88
64
|
it "can declare a single base" do
|
|
89
65
|
mixin = Module.new do
|
|
90
66
|
extend Treequel::Model::ObjectClass,
|
|
91
|
-
Treequel::
|
|
67
|
+
Treequel::SpecConstants
|
|
92
68
|
model_objectclasses :device
|
|
93
69
|
model_bases TEST_PHONES_DN
|
|
94
70
|
end
|
|
95
71
|
|
|
96
|
-
mixin.model_bases.
|
|
72
|
+
expect( mixin.model_bases ).to eq( [TEST_PHONES_DN] )
|
|
97
73
|
end
|
|
98
74
|
|
|
99
75
|
it "can declare a base with spaces" do
|
|
@@ -103,19 +79,19 @@ describe Treequel::Model::ObjectClass do
|
|
|
103
79
|
model_bases 'ou=phones, dc=acme, dc=com'
|
|
104
80
|
end
|
|
105
81
|
|
|
106
|
-
mixin.model_bases.
|
|
82
|
+
expect( mixin.model_bases ).to eq( ['ou=phones,dc=acme,dc=com'] )
|
|
107
83
|
end
|
|
108
84
|
|
|
109
85
|
it "can declare multiple bases" do
|
|
110
86
|
mixin = Module.new do
|
|
111
87
|
extend Treequel::Model::ObjectClass,
|
|
112
|
-
Treequel::
|
|
88
|
+
Treequel::SpecConstants
|
|
113
89
|
model_objectclasses :ipHost
|
|
114
90
|
model_bases TEST_HOSTS_DN,
|
|
115
91
|
TEST_SUBHOSTS_DN
|
|
116
92
|
end
|
|
117
93
|
|
|
118
|
-
mixin.model_bases.
|
|
94
|
+
expect( mixin.model_bases ).to include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
|
|
119
95
|
end
|
|
120
96
|
|
|
121
97
|
it "raises an exception when creating a search for a mixin that hasn't declared " +
|
|
@@ -134,7 +110,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
134
110
|
extend Treequel::Model::ObjectClass
|
|
135
111
|
end
|
|
136
112
|
|
|
137
|
-
mixin.model_class.
|
|
113
|
+
expect( mixin.model_class ).to eq( Treequel::Model )
|
|
138
114
|
end
|
|
139
115
|
|
|
140
116
|
it "can declare a model class other than Treequel::Model" do
|
|
@@ -144,7 +120,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
144
120
|
model_class MyModel
|
|
145
121
|
end
|
|
146
122
|
|
|
147
|
-
mixin.model_class.
|
|
123
|
+
expect( mixin.model_class ).to eq( MyModel )
|
|
148
124
|
end
|
|
149
125
|
|
|
150
126
|
it "re-registers objectClasses that have already been declared when declaring a " +
|
|
@@ -157,8 +133,8 @@ describe Treequel::Model::ObjectClass do
|
|
|
157
133
|
model_class MyModel
|
|
158
134
|
end
|
|
159
135
|
|
|
160
|
-
Treequel::Model.objectclass_registry[:inetOrgPerson].
|
|
161
|
-
MyModel.objectclass_registry[:inetOrgPerson].
|
|
136
|
+
expect( Treequel::Model.objectclass_registry[:inetOrgPerson] ).to_not include( mixin )
|
|
137
|
+
expect( MyModel.objectclass_registry[:inetOrgPerson] ).to include( mixin )
|
|
162
138
|
end
|
|
163
139
|
|
|
164
140
|
it "re-registers bases that have already been declared when declaring a " +
|
|
@@ -171,8 +147,8 @@ describe Treequel::Model::ObjectClass do
|
|
|
171
147
|
model_class MyModel
|
|
172
148
|
end
|
|
173
149
|
|
|
174
|
-
Treequel::Model.base_registry['ou=people,dc=acme,dc=com'].
|
|
175
|
-
MyModel.base_registry['ou=people,dc=acme,dc=com'].
|
|
150
|
+
expect( Treequel::Model.base_registry['ou=people,dc=acme,dc=com'] ).to_not include( mixin )
|
|
151
|
+
expect( MyModel.base_registry['ou=people,dc=acme,dc=com'] ).to include( mixin )
|
|
176
152
|
end
|
|
177
153
|
|
|
178
154
|
it "re-registers bases that have already been declared when declaring a " +
|
|
@@ -185,13 +161,13 @@ describe Treequel::Model::ObjectClass do
|
|
|
185
161
|
model_class MyModel
|
|
186
162
|
end
|
|
187
163
|
|
|
188
|
-
Treequel::Model.base_registry['ou=people,dc=acme,dc=com'].
|
|
189
|
-
MyModel.base_registry['ou=people,dc=acme,dc=com'].
|
|
164
|
+
expect( Treequel::Model.base_registry['ou=people,dc=acme,dc=com'] ).to_not include( mixin )
|
|
165
|
+
expect( MyModel.base_registry['ou=people,dc=acme,dc=com'] ).to include( mixin )
|
|
190
166
|
end
|
|
191
167
|
|
|
192
168
|
it "uses the directory associated with its model_class instead of Treequel::Model's if " +
|
|
193
169
|
"its model_class is set when creating a search Branchset" do
|
|
194
|
-
conn =
|
|
170
|
+
conn = double( "ldap connection object" )
|
|
195
171
|
directory = get_fixtured_directory( conn )
|
|
196
172
|
|
|
197
173
|
class MyModel < Treequel::Model; end
|
|
@@ -205,8 +181,8 @@ describe Treequel::Model::ObjectClass do
|
|
|
205
181
|
|
|
206
182
|
result = mixin.search
|
|
207
183
|
|
|
208
|
-
result.
|
|
209
|
-
result.branch.directory.
|
|
184
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
185
|
+
expect( result.branch.directory ).to eq( directory )
|
|
210
186
|
end
|
|
211
187
|
|
|
212
188
|
it "delegates Branchset methods through the Branchset returned by its #search method" do
|
|
@@ -215,13 +191,13 @@ describe Treequel::Model::ObjectClass do
|
|
|
215
191
|
model_objectclasses :inetOrgPerson
|
|
216
192
|
end
|
|
217
193
|
|
|
218
|
-
mixin.filter( :mail ).
|
|
194
|
+
expect( mixin.filter( :mail ) ).to be_a( Treequel::Branchset )
|
|
219
195
|
end
|
|
220
196
|
|
|
221
197
|
it "delegates Branchset Enumerable methods through the Branchset returned by its " +
|
|
222
198
|
"#search method" do
|
|
223
|
-
@conn.
|
|
224
|
-
@conn.
|
|
199
|
+
expect( @conn ).to receive( :bound? ).and_return( true )
|
|
200
|
+
expect( @conn ).to receive( :search_ext2 ).
|
|
225
201
|
with( TEST_BASE_DN, LDAP::LDAP_SCOPE_SUBTREE, "(objectClass=inetOrgPerson)",
|
|
226
202
|
[], false, [], [], 0, 0, 1, "", nil ).
|
|
227
203
|
and_return([ TEST_PERSON_ENTRY ])
|
|
@@ -233,9 +209,9 @@ describe Treequel::Model::ObjectClass do
|
|
|
233
209
|
|
|
234
210
|
result = mixin.first
|
|
235
211
|
|
|
236
|
-
result.
|
|
237
|
-
result.
|
|
238
|
-
result.dn.
|
|
212
|
+
expect( result ).to be_a( Treequel::Model )
|
|
213
|
+
expect( result ).to be_a( mixin )
|
|
214
|
+
expect( result.dn ).to eq( TEST_PERSON_ENTRY['dn'].first )
|
|
239
215
|
end
|
|
240
216
|
|
|
241
217
|
end
|
|
@@ -249,9 +225,9 @@ describe Treequel::Model::ObjectClass do
|
|
|
249
225
|
end
|
|
250
226
|
|
|
251
227
|
result = mixin.create( TEST_PERSON_DN )
|
|
252
|
-
result.
|
|
253
|
-
result[:objectClass].
|
|
254
|
-
result[TEST_PERSON_DN_ATTR].
|
|
228
|
+
expect( result ).to be_a( Treequel::Model )
|
|
229
|
+
expect( result[:objectClass] ).to include( 'inetOrgPerson' )
|
|
230
|
+
expect( result[TEST_PERSON_DN_ATTR] ).to eq( [ TEST_PERSON_DN_VALUE ] )
|
|
255
231
|
end
|
|
256
232
|
|
|
257
233
|
it "can instantiate a new model object with its declared objectClasses in a directory " +
|
|
@@ -262,9 +238,9 @@ describe Treequel::Model::ObjectClass do
|
|
|
262
238
|
end
|
|
263
239
|
|
|
264
240
|
result = mixin.create( @directory, TEST_PERSON_DN )
|
|
265
|
-
result.
|
|
266
|
-
result[:objectClass].
|
|
267
|
-
result[TEST_PERSON_DN_ATTR].
|
|
241
|
+
expect( result ).to be_a( Treequel::Model )
|
|
242
|
+
expect( result[:objectClass] ).to include( 'inetOrgPerson' )
|
|
243
|
+
expect( result[TEST_PERSON_DN_ATTR] ).to eq( [ TEST_PERSON_DN_VALUE ] )
|
|
268
244
|
end
|
|
269
245
|
|
|
270
246
|
it "doesn't add the extracted DN attribute if it's already present in the entry" do
|
|
@@ -275,10 +251,10 @@ describe Treequel::Model::ObjectClass do
|
|
|
275
251
|
|
|
276
252
|
result = mixin.create( TEST_PERSON_DN,
|
|
277
253
|
TEST_PERSON_DN_ATTR => [TEST_PERSON_DN_VALUE] )
|
|
278
|
-
result.
|
|
279
|
-
result[:objectClass].
|
|
280
|
-
result[TEST_PERSON_DN_ATTR].
|
|
281
|
-
result[TEST_PERSON_DN_ATTR].
|
|
254
|
+
expect( result ).to be_a( Treequel::Model )
|
|
255
|
+
expect( result[:objectClass] ).to include( 'inetOrgPerson' )
|
|
256
|
+
expect( result[TEST_PERSON_DN_ATTR].length ).to eq( 1 )
|
|
257
|
+
expect( result[TEST_PERSON_DN_ATTR] ).to eq( [ TEST_PERSON_DN_VALUE ] )
|
|
282
258
|
end
|
|
283
259
|
|
|
284
260
|
it "merges objectClasses passed to the creation method" do
|
|
@@ -289,11 +265,11 @@ describe Treequel::Model::ObjectClass do
|
|
|
289
265
|
|
|
290
266
|
result = mixin.create( TEST_PERSON_DN,
|
|
291
267
|
:objectClass => [:person, :inetOrgPerson] )
|
|
292
|
-
result.
|
|
293
|
-
result[:objectClass].
|
|
294
|
-
result[:objectClass].
|
|
295
|
-
result[TEST_PERSON_DN_ATTR].
|
|
296
|
-
result[TEST_PERSON_DN_ATTR].
|
|
268
|
+
expect( result ).to be_a( Treequel::Model )
|
|
269
|
+
expect( result[:objectClass].length ).to eq( 2 )
|
|
270
|
+
expect( result[:objectClass] ).to include( 'inetOrgPerson', 'person' )
|
|
271
|
+
expect( result[TEST_PERSON_DN_ATTR].length ).to eq( 1 )
|
|
272
|
+
expect( result[TEST_PERSON_DN_ATTR] ).to include( TEST_PERSON_DN_VALUE )
|
|
297
273
|
end
|
|
298
274
|
|
|
299
275
|
it "handles the creation of objects with multi-value DNs" do
|
|
@@ -303,11 +279,11 @@ describe Treequel::Model::ObjectClass do
|
|
|
303
279
|
end
|
|
304
280
|
|
|
305
281
|
result = mixin.create( TEST_HOST_MULTIVALUE_DN )
|
|
306
|
-
result.
|
|
307
|
-
result[:objectClass].
|
|
308
|
-
result[:objectClass].
|
|
309
|
-
result[TEST_HOST_MULTIVALUE_DN_ATTR1].
|
|
310
|
-
result[TEST_HOST_MULTIVALUE_DN_ATTR2].
|
|
282
|
+
expect( result ).to be_a( Treequel::Model )
|
|
283
|
+
expect( result[:objectClass].length ).to eq( 3 )
|
|
284
|
+
expect( result[:objectClass] ).to include( 'ipHost', 'ieee802Device', 'device' )
|
|
285
|
+
expect( result[TEST_HOST_MULTIVALUE_DN_ATTR1] ).to include( TEST_HOST_MULTIVALUE_DN_VALUE1 )
|
|
286
|
+
expect( result[TEST_HOST_MULTIVALUE_DN_ATTR2] ).to include( TEST_HOST_MULTIVALUE_DN_VALUE2 )
|
|
311
287
|
end
|
|
312
288
|
|
|
313
289
|
end
|
|
@@ -315,7 +291,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
315
291
|
context "module that has one required objectClass declared" do
|
|
316
292
|
|
|
317
293
|
before( :each ) do
|
|
318
|
-
@conn =
|
|
294
|
+
@conn = double( "ldap connection object" )
|
|
319
295
|
@directory = get_fixtured_directory( @conn )
|
|
320
296
|
Treequel::Model.directory = @directory
|
|
321
297
|
|
|
@@ -331,35 +307,33 @@ describe Treequel::Model::ObjectClass do
|
|
|
331
307
|
|
|
332
308
|
|
|
333
309
|
it "is returned as one of the mixins for entries with only that objectClass" do
|
|
334
|
-
Treequel::Model.mixins_for_objectclasses(
|
|
335
|
-
should include( @mixin )
|
|
310
|
+
expect( Treequel::Model.mixins_for_objectclasses(:inetOrgPerson) ).to include( @mixin )
|
|
336
311
|
end
|
|
337
312
|
|
|
338
313
|
it "is not returned in the list of mixins to apply to an entry without that objectClass" do
|
|
339
|
-
Treequel::Model.mixins_for_objectclasses(
|
|
340
|
-
should_not include( @mixin )
|
|
314
|
+
expect( Treequel::Model.mixins_for_objectclasses(:device) ).to_not include( @mixin )
|
|
341
315
|
end
|
|
342
316
|
|
|
343
317
|
it "can create a Branchset that will search for applicable entries" do
|
|
344
318
|
result = @mixin.search
|
|
345
319
|
|
|
346
|
-
result.
|
|
347
|
-
result.base_dn.
|
|
348
|
-
result.filter.to_s.
|
|
349
|
-
result.branch.directory.
|
|
320
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
321
|
+
expect( result.base_dn ).to eq( TEST_BASE_DN )
|
|
322
|
+
expect( result.filter.to_s ).to eq( '(objectClass=inetOrgPerson)' )
|
|
323
|
+
expect( result.branch.directory ).to eq( @directory )
|
|
350
324
|
end
|
|
351
325
|
|
|
352
326
|
it "can create a Branchset that will search for applicable entries in a Directory other " +
|
|
353
327
|
"than the one set for Treequel::Model" do
|
|
354
|
-
conn =
|
|
328
|
+
conn = double( "second ldap connection object" )
|
|
355
329
|
directory = get_fixtured_directory( conn )
|
|
356
330
|
|
|
357
331
|
result = @mixin.search( directory )
|
|
358
332
|
|
|
359
|
-
result.
|
|
360
|
-
result.base_dn.
|
|
361
|
-
result.filter.to_s.
|
|
362
|
-
result.branch.directory.
|
|
333
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
334
|
+
expect( result.base_dn ).to eq( TEST_BASE_DN )
|
|
335
|
+
expect( result.filter.to_s ).to eq( '(objectClass=inetOrgPerson)' )
|
|
336
|
+
expect( result.branch.directory ).to eq( directory )
|
|
363
337
|
end
|
|
364
338
|
|
|
365
339
|
end
|
|
@@ -380,36 +354,34 @@ describe Treequel::Model::ObjectClass do
|
|
|
380
354
|
|
|
381
355
|
it "is returned as one of the mixins to apply to entries with all of its required " +
|
|
382
356
|
"objectClasses" do
|
|
383
|
-
Treequel::Model.mixins_for_objectclasses(
|
|
384
|
-
should include( @mixin )
|
|
357
|
+
expect( Treequel::Model.mixins_for_objectclasses(:device, :ipHost) ).to include( @mixin )
|
|
385
358
|
end
|
|
386
359
|
|
|
387
360
|
it "is not returned in the list of mixins to apply to an entry with only one of its " +
|
|
388
361
|
"objectClasses" do
|
|
389
|
-
Treequel::Model.mixins_for_objectclasses(
|
|
390
|
-
should_not include( @mixin )
|
|
362
|
+
expect( Treequel::Model.mixins_for_objectclasses(:device) ).to_not include( @mixin )
|
|
391
363
|
end
|
|
392
364
|
|
|
393
365
|
it "can create a Branchset that will search for applicable entries" do
|
|
394
366
|
result = @mixin.search
|
|
395
367
|
|
|
396
|
-
result.
|
|
397
|
-
result.base_dn.
|
|
398
|
-
result.filter.to_s.
|
|
399
|
-
result.branch.directory.
|
|
368
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
369
|
+
expect( result.base_dn ).to eq( TEST_BASE_DN )
|
|
370
|
+
expect( result.filter.to_s ).to eq( '(&(objectClass=device)(objectClass=ipHost))' )
|
|
371
|
+
expect( result.branch.directory ).to eq( @directory )
|
|
400
372
|
end
|
|
401
373
|
|
|
402
374
|
it "can create a Branchset that will search for applicable entries in a Directory other " +
|
|
403
375
|
"than the one set for Treequel::Model" do
|
|
404
|
-
conn =
|
|
376
|
+
conn = double( "second ldap connection object" )
|
|
405
377
|
directory = get_fixtured_directory( conn )
|
|
406
378
|
|
|
407
379
|
result = @mixin.search( directory )
|
|
408
380
|
|
|
409
|
-
result.
|
|
410
|
-
result.base_dn.
|
|
411
|
-
result.filter.to_s.
|
|
412
|
-
result.branch.directory.
|
|
381
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
382
|
+
expect( result.base_dn ).to eq( TEST_BASE_DN )
|
|
383
|
+
expect( result.filter.to_s ).to eq( '(&(objectClass=device)(objectClass=ipHost))' )
|
|
384
|
+
expect( result.branch.directory ).to eq( directory )
|
|
413
385
|
end
|
|
414
386
|
|
|
415
387
|
end
|
|
@@ -418,7 +390,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
418
390
|
before( :each ) do
|
|
419
391
|
@mixin = Module.new do
|
|
420
392
|
extend Treequel::Model::ObjectClass,
|
|
421
|
-
Treequel::
|
|
393
|
+
Treequel::SpecConstants
|
|
422
394
|
model_bases TEST_PEOPLE_DN
|
|
423
395
|
end
|
|
424
396
|
end
|
|
@@ -429,36 +401,34 @@ describe Treequel::Model::ObjectClass do
|
|
|
429
401
|
|
|
430
402
|
|
|
431
403
|
it "is returned as one of the mixins to apply to an entry that is a child of its base" do
|
|
432
|
-
Treequel::Model.mixins_for_dn(
|
|
433
|
-
should include( @mixin )
|
|
404
|
+
expect( Treequel::Model.mixins_for_dn(TEST_PERSON_DN) ).to include( @mixin )
|
|
434
405
|
end
|
|
435
406
|
|
|
436
407
|
it "is not returned as one of the mixins to apply to an entry that is not a child of " +
|
|
437
408
|
"its base" do
|
|
438
|
-
Treequel::Model.mixins_for_dn(
|
|
439
|
-
should_not include( @mixin )
|
|
409
|
+
expect( Treequel::Model.mixins_for_dn(TEST_ROOM_DN) ).to_not include( @mixin )
|
|
440
410
|
end
|
|
441
411
|
|
|
442
412
|
it "can create a Branchset that will search for applicable entries" do
|
|
443
413
|
result = @mixin.search
|
|
444
414
|
|
|
445
|
-
result.
|
|
446
|
-
result.base_dn.
|
|
447
|
-
result.filter.to_s.
|
|
448
|
-
result.branch.directory.
|
|
415
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
416
|
+
expect( result.base_dn ).to eq( TEST_PEOPLE_DN )
|
|
417
|
+
expect( result.filter.to_s ).to eq( '(objectClass=*)' )
|
|
418
|
+
expect( result.branch.directory ).to eq( @directory )
|
|
449
419
|
end
|
|
450
420
|
|
|
451
421
|
it "can create a Branchset that will search for applicable entries in a Directory other " +
|
|
452
422
|
"than the one set for Treequel::Model" do
|
|
453
|
-
conn =
|
|
423
|
+
conn = double( "second ldap connection object" )
|
|
454
424
|
directory = get_fixtured_directory( conn )
|
|
455
425
|
|
|
456
426
|
result = @mixin.search( directory )
|
|
457
427
|
|
|
458
|
-
result.
|
|
459
|
-
result.base_dn.
|
|
460
|
-
result.filter.to_s.
|
|
461
|
-
result.branch.directory.
|
|
428
|
+
expect( result ).to be_a( Treequel::Branchset )
|
|
429
|
+
expect( result.base_dn ).to eq( TEST_PEOPLE_DN )
|
|
430
|
+
expect( result.filter.to_s ).to eq( '(objectClass=*)' )
|
|
431
|
+
expect( result.branch.directory ).to eq( directory )
|
|
462
432
|
end
|
|
463
433
|
|
|
464
434
|
end
|
|
@@ -467,7 +437,7 @@ describe Treequel::Model::ObjectClass do
|
|
|
467
437
|
before( :each ) do
|
|
468
438
|
@mixin = Module.new do
|
|
469
439
|
extend Treequel::Model::ObjectClass,
|
|
470
|
-
Treequel::
|
|
440
|
+
Treequel::SpecConstants
|
|
471
441
|
model_bases TEST_HOSTS_DN,
|
|
472
442
|
TEST_SUBHOSTS_DN
|
|
473
443
|
end
|
|
@@ -480,41 +450,39 @@ describe Treequel::Model::ObjectClass do
|
|
|
480
450
|
|
|
481
451
|
it "is returned as one of the mixins to apply to an entry that is a child of one of " +
|
|
482
452
|
"its bases" do
|
|
483
|
-
Treequel::Model.mixins_for_dn(
|
|
484
|
-
should include( @mixin )
|
|
453
|
+
expect( Treequel::Model.mixins_for_dn(TEST_SUBHOST_DN) ).to include( @mixin )
|
|
485
454
|
end
|
|
486
455
|
|
|
487
456
|
it "is not returned as one of the mixins to apply to an entry that is not a child of " +
|
|
488
457
|
"its base" do
|
|
489
|
-
Treequel::Model.mixins_for_dn(
|
|
490
|
-
should_not include( @mixin )
|
|
458
|
+
expect( Treequel::Model.mixins_for_dn(TEST_PERSON_DN) ).to_not include( @mixin )
|
|
491
459
|
end
|
|
492
460
|
|
|
493
461
|
it "can create a BranchCollection that will search for applicable entries" do
|
|
494
462
|
result = @mixin.search
|
|
495
463
|
|
|
496
|
-
result.
|
|
497
|
-
result.base_dns.
|
|
498
|
-
result.base_dns.
|
|
464
|
+
expect( result ).to be_a( Treequel::BranchCollection )
|
|
465
|
+
expect( result.base_dns.length ).to eq( 2 )
|
|
466
|
+
expect( result.base_dns ).to include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
|
|
499
467
|
result.branchsets.each do |brset|
|
|
500
|
-
brset.filter_string.
|
|
501
|
-
brset.branch.directory.
|
|
468
|
+
expect( brset.filter_string ).to eq( '(objectClass=*)' )
|
|
469
|
+
expect( brset.branch.directory ).to eq( @directory )
|
|
502
470
|
end
|
|
503
471
|
end
|
|
504
472
|
|
|
505
473
|
it "can create a BranchCollection that will search for applicable entries in a Directory " +
|
|
506
474
|
" other than the one set for Treequel::Model" do
|
|
507
|
-
conn =
|
|
475
|
+
conn = double( "second ldap connection object" )
|
|
508
476
|
directory = get_fixtured_directory( conn )
|
|
509
477
|
|
|
510
478
|
result = @mixin.search( directory )
|
|
511
479
|
|
|
512
|
-
result.
|
|
513
|
-
result.base_dns.
|
|
514
|
-
result.base_dns.
|
|
480
|
+
expect( result ).to be_a( Treequel::BranchCollection )
|
|
481
|
+
expect( result.base_dns.length ).to eq( 2 )
|
|
482
|
+
expect( result.base_dns ).to include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
|
|
515
483
|
result.branchsets.each do |brset|
|
|
516
|
-
brset.filter_string.
|
|
517
|
-
brset.branch.directory.
|
|
484
|
+
expect( brset.filter_string ).to eq( '(objectClass=*)' )
|
|
485
|
+
expect( brset.branch.directory ).to eq( directory )
|
|
518
486
|
end
|
|
519
487
|
end
|
|
520
488
|
|