treequel 1.0.1 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +176 -14
- data/LICENSE +1 -1
- data/Rakefile +61 -45
- data/Rakefile.local +20 -0
- data/bin/treequel +502 -269
- data/examples/ldap-rack-auth.rb +2 -0
- data/lib/treequel.rb +221 -18
- data/lib/treequel/branch.rb +410 -201
- data/lib/treequel/branchcollection.rb +25 -13
- data/lib/treequel/branchset.rb +42 -40
- data/lib/treequel/constants.rb +233 -3
- data/lib/treequel/control.rb +95 -0
- data/lib/treequel/controls/contentsync.rb +138 -0
- data/lib/treequel/controls/pagedresults.rb +162 -0
- data/lib/treequel/controls/sortedresults.rb +216 -0
- data/lib/treequel/directory.rb +212 -65
- data/lib/treequel/exceptions.rb +11 -12
- data/lib/treequel/filter.rb +1 -12
- data/lib/treequel/mixins.rb +83 -47
- data/lib/treequel/monkeypatches.rb +29 -0
- data/lib/treequel/schema.rb +23 -19
- data/lib/treequel/schema/attributetype.rb +33 -3
- data/lib/treequel/schema/ldapsyntax.rb +0 -11
- data/lib/treequel/schema/matchingrule.rb +0 -11
- data/lib/treequel/schema/matchingruleuse.rb +0 -11
- data/lib/treequel/schema/objectclass.rb +36 -10
- data/lib/treequel/schema/table.rb +159 -0
- data/lib/treequel/sequel_integration.rb +7 -7
- data/lib/treequel/utils.rb +4 -66
- data/rake/documentation.rb +89 -0
- data/rake/helpers.rb +375 -307
- data/rake/hg.rb +16 -2
- data/rake/manual.rb +11 -6
- data/rake/packaging.rb +20 -35
- data/rake/publishing.rb +22 -62
- data/spec/lib/constants.rb +20 -0
- data/spec/lib/control_behavior.rb +44 -0
- data/spec/lib/matchers.rb +51 -0
- data/spec/treequel/branch_spec.rb +88 -29
- data/spec/treequel/branchcollection_spec.rb +24 -1
- data/spec/treequel/branchset_spec.rb +123 -51
- data/spec/treequel/control_spec.rb +48 -0
- data/spec/treequel/controls/contentsync_spec.rb +38 -0
- data/spec/treequel/controls/pagedresults_spec.rb +138 -0
- data/spec/treequel/controls/sortedresults_spec.rb +171 -0
- data/spec/treequel/directory_spec.rb +186 -16
- data/spec/treequel/mixins_spec.rb +42 -3
- data/spec/treequel/schema/attributetype_spec.rb +22 -20
- data/spec/treequel/schema/objectclass_spec.rb +67 -46
- data/spec/treequel/schema/table_spec.rb +134 -0
- data/spec/treequel_spec.rb +277 -15
- metadata +89 -108
- data/bin/treequel.orig +0 -963
- data/examples/ldap-monitor.rb +0 -143
- data/examples/ldap-monitor/public/css/master.css +0 -328
- data/examples/ldap-monitor/public/images/card_small.png +0 -0
- data/examples/ldap-monitor/public/images/chain_small.png +0 -0
- data/examples/ldap-monitor/public/images/globe_small.png +0 -0
- data/examples/ldap-monitor/public/images/globe_small_green.png +0 -0
- data/examples/ldap-monitor/public/images/plug.png +0 -0
- data/examples/ldap-monitor/public/images/shadows/large-30-down.png +0 -0
- data/examples/ldap-monitor/public/images/tick.png +0 -0
- data/examples/ldap-monitor/public/images/tick_circle.png +0 -0
- data/examples/ldap-monitor/public/images/treequel-favicon.png +0 -0
- data/examples/ldap-monitor/views/backends.erb +0 -41
- data/examples/ldap-monitor/views/connections.erb +0 -74
- data/examples/ldap-monitor/views/databases.erb +0 -39
- data/examples/ldap-monitor/views/dump_subsystem.erb +0 -14
- data/examples/ldap-monitor/views/index.erb +0 -14
- data/examples/ldap-monitor/views/layout.erb +0 -35
- data/examples/ldap-monitor/views/listeners.erb +0 -30
- data/rake/rdoc.rb +0 -30
- data/rake/win32.rb +0 -190
@@ -34,7 +34,7 @@ describe Treequel::BranchCollection do
|
|
34
34
|
include Treequel::SpecHelpers
|
35
35
|
|
36
36
|
before( :all ) do
|
37
|
-
setup_logging( :
|
37
|
+
setup_logging( :fatal )
|
38
38
|
end
|
39
39
|
|
40
40
|
after( :all ) do
|
@@ -105,6 +105,20 @@ describe Treequel::BranchCollection do
|
|
105
105
|
@collection = Treequel::BranchCollection.new( @branchset1, @branchset2 )
|
106
106
|
end
|
107
107
|
|
108
|
+
it "knows that it is empty if all of its branchsets are empty" do
|
109
|
+
@branchset1.should_receive( :empty? ).and_return( true )
|
110
|
+
@branchset2.should_receive( :empty? ).and_return( true )
|
111
|
+
|
112
|
+
@collection.should be_empty()
|
113
|
+
end
|
114
|
+
|
115
|
+
it "knows that it is not empty if one of its branchsets has matching entries" do
|
116
|
+
@branchset1.should_receive( :empty? ).and_return( true )
|
117
|
+
@branchset2.should_receive( :empty? ).and_return( false )
|
118
|
+
|
119
|
+
@collection.should_not be_empty()
|
120
|
+
end
|
121
|
+
|
108
122
|
it "fetches all of the results from each of its branchsets if asked for all results" do
|
109
123
|
@branchset1.should_receive( :each ).and_yield( :bs1_stuff )
|
110
124
|
@branchset2.should_receive( :each ).and_yield( :bs2_stuff )
|
@@ -186,6 +200,15 @@ describe Treequel::BranchCollection do
|
|
186
200
|
filtered_collection.should include( filtered_branchset1, filtered_branchset2 )
|
187
201
|
end
|
188
202
|
|
203
|
+
it "raises a reasonable exception if one of its delegates returns a non-branchset" do
|
204
|
+
filter = Treequel::Filter.new
|
205
|
+
@branchset1.stub!( :filter ).and_return( filter )
|
206
|
+
|
207
|
+
expect {
|
208
|
+
@collection.filter
|
209
|
+
}.to raise_exception( ArgumentError, /0 for 1/ )
|
210
|
+
end
|
211
|
+
|
189
212
|
# it "can create a clone of itself with ordered branchsets" do
|
190
213
|
# ordered_branchset1 = stub( "branchset 3", :dn => 'cn=example3,dc=acme,dc=com', :each => 1 )
|
191
214
|
# ordered_branchset2 = stub( "branchset 4", :dn => 'cn=example4,dc=acme,dc=com', :each => 1 )
|
@@ -9,20 +9,13 @@ BEGIN {
|
|
9
9
|
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
10
10
|
}
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
require 'spec/lib/helpers'
|
16
|
-
|
17
|
-
require 'treequel/branchset'
|
18
|
-
rescue LoadError
|
19
|
-
unless Object.const_defined?( :Gem )
|
20
|
-
require 'rubygems'
|
21
|
-
retry
|
22
|
-
end
|
23
|
-
raise
|
24
|
-
end
|
12
|
+
require 'spec'
|
13
|
+
require 'spec/lib/constants'
|
14
|
+
require 'spec/lib/helpers'
|
25
15
|
|
16
|
+
require 'treequel/branchset'
|
17
|
+
require 'treequel/branchcollection'
|
18
|
+
require 'treequel/control'
|
26
19
|
|
27
20
|
include Treequel::TestConstants
|
28
21
|
include Treequel::Constants
|
@@ -34,14 +27,17 @@ include Treequel::Constants
|
|
34
27
|
describe Treequel::Branchset do
|
35
28
|
include Treequel::SpecHelpers
|
36
29
|
|
30
|
+
# Make the specs read more clearly
|
37
31
|
class << self
|
38
32
|
alias_method :they, :it
|
39
33
|
end
|
40
34
|
|
41
35
|
DEFAULT_PARAMS = {
|
42
|
-
:limit
|
43
|
-
:selectattrs
|
44
|
-
:timeout
|
36
|
+
:limit => 0,
|
37
|
+
:selectattrs => [],
|
38
|
+
:timeout => 0,
|
39
|
+
:client_controls => [],
|
40
|
+
:server_controls => [],
|
45
41
|
}
|
46
42
|
|
47
43
|
before( :all ) do
|
@@ -53,8 +49,9 @@ describe Treequel::Branchset do
|
|
53
49
|
end
|
54
50
|
|
55
51
|
before( :each ) do
|
56
|
-
@directory = mock( "treequel directory ")
|
52
|
+
@directory = mock( "treequel directory ", :registered_controls => [] )
|
57
53
|
@branch = mock( "treequel branch", :dn => 'thedn' )
|
54
|
+
@branch.stub!( :directory ).and_return( @directory )
|
58
55
|
@params = DEFAULT_PARAMS.dup
|
59
56
|
end
|
60
57
|
|
@@ -67,15 +64,35 @@ describe Treequel::Branchset do
|
|
67
64
|
they "are Enumerable" do
|
68
65
|
resultbranch = mock( "Result Branch" )
|
69
66
|
|
70
|
-
@branch.should_receive( :
|
71
|
-
|
72
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
67
|
+
@branch.should_receive( :search ).
|
68
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
73
69
|
and_yield( resultbranch )
|
74
70
|
resultbranch.should_receive( :dn ).and_return( :its_dn )
|
75
71
|
|
76
72
|
@branchset.all? {|b| b.dn }
|
77
73
|
end
|
78
74
|
|
75
|
+
#
|
76
|
+
# #empty?
|
77
|
+
#
|
78
|
+
they "know that they are empty if they don't match at least one entry" do
|
79
|
+
params = @params.merge( :limit => 1 )
|
80
|
+
@branch.should_receive( :search ).
|
81
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, params ).
|
82
|
+
and_return( [] )
|
83
|
+
|
84
|
+
@branchset.should be_empty()
|
85
|
+
end
|
86
|
+
|
87
|
+
they "know that they are empty if they match at least one entry" do
|
88
|
+
params = @params.merge( :limit => 1 )
|
89
|
+
@branch.should_receive( :search ).
|
90
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, params ).
|
91
|
+
and_return( [:a_branch] )
|
92
|
+
|
93
|
+
@branchset.should_not be_empty()
|
94
|
+
end
|
95
|
+
|
79
96
|
#
|
80
97
|
# #map
|
81
98
|
#
|
@@ -83,9 +100,8 @@ describe Treequel::Branchset do
|
|
83
100
|
resultbranch = mock( "Result Branch" )
|
84
101
|
resultbranch2 = mock( "Result Branch 2" )
|
85
102
|
|
86
|
-
@branch.should_receive( :
|
87
|
-
|
88
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
103
|
+
@branch.should_receive( :search ).
|
104
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
89
105
|
and_yield( resultbranch ).and_yield( resultbranch2 )
|
90
106
|
resultbranch.should_receive( :[] ).with( :cn ).and_return([ :first_cn ])
|
91
107
|
resultbranch2.should_receive( :[] ).with( :cn ).and_return([ :second_cn ])
|
@@ -101,9 +117,8 @@ describe Treequel::Branchset do
|
|
101
117
|
resultbranch = mock( "Result Branch" )
|
102
118
|
resultbranch2 = mock( "Result Branch 2" )
|
103
119
|
|
104
|
-
@branch.should_receive( :
|
105
|
-
|
106
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
120
|
+
@branch.should_receive( :search ).
|
121
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
107
122
|
and_yield( resultbranch ).and_yield( resultbranch2 )
|
108
123
|
|
109
124
|
resultbranch.should_receive( :[] ).with( :email ).
|
@@ -124,9 +139,8 @@ describe Treequel::Branchset do
|
|
124
139
|
resultbranch = mock( "Result Branch" )
|
125
140
|
resultbranch2 = mock( "Result Branch 2" )
|
126
141
|
|
127
|
-
@branch.should_receive( :
|
128
|
-
|
129
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
142
|
+
@branch.should_receive( :search ).
|
143
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
130
144
|
and_yield( resultbranch ).and_yield( resultbranch2 )
|
131
145
|
|
132
146
|
resultbranch.should_receive( :[] ).with( :email ).
|
@@ -143,6 +157,33 @@ describe Treequel::Branchset do
|
|
143
157
|
:second_email => :second_cn,
|
144
158
|
}
|
145
159
|
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# #+
|
163
|
+
#
|
164
|
+
they "can be combined into a BranchCollection by adding them together" do
|
165
|
+
other_branch = mock( "second treequel branch", :dn => 'theotherdn' )
|
166
|
+
other_branch.stub!( :directory ).and_return( @directory )
|
167
|
+
other_branchset = Treequel::Branchset.new( other_branch )
|
168
|
+
|
169
|
+
result = @branchset + other_branchset
|
170
|
+
result.should be_a( Treequel::BranchCollection )
|
171
|
+
result.branchsets.should have( 2 ).members
|
172
|
+
result.branchsets.should include( @branchset, other_branchset )
|
173
|
+
end
|
174
|
+
|
175
|
+
they "can be combined with a Branch into a BranchCollection by adding it" do
|
176
|
+
other_branch = mock( "second treequel branch", :dn => 'theotherdn' )
|
177
|
+
other_branch.stub!( :directory ).and_return( @directory )
|
178
|
+
|
179
|
+
result = @branchset + other_branch
|
180
|
+
result.should be_a( Treequel::BranchCollection )
|
181
|
+
result.branchsets.should have( 2 ).members
|
182
|
+
result.branchsets.should include( @branchset )
|
183
|
+
result.branchsets.select {|bs| bs != @branchset }.
|
184
|
+
first.branch.should == other_branch
|
185
|
+
end
|
186
|
+
|
146
187
|
end
|
147
188
|
|
148
189
|
describe "instance with no filter, options, or scope set" do
|
@@ -170,9 +211,8 @@ describe Treequel::Branchset do
|
|
170
211
|
|
171
212
|
|
172
213
|
it "performs a search using the default filter and scope when all records are requested" do
|
173
|
-
@branch.should_receive( :
|
174
|
-
|
175
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
214
|
+
@branch.should_receive( :search ).
|
215
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, @params ).
|
176
216
|
and_yield( :matching_branches )
|
177
217
|
|
178
218
|
@branchset.all.should == [ :matching_branches ]
|
@@ -180,10 +220,9 @@ describe Treequel::Branchset do
|
|
180
220
|
|
181
221
|
it "performs a search using the default filter, scope, and a limit of 1 when the first " +
|
182
222
|
"record is requested" do
|
183
|
-
@
|
184
|
-
@
|
185
|
-
with(
|
186
|
-
@params.merge(:limit => 1) ).
|
223
|
+
params = @params.merge( :limit => 1 )
|
224
|
+
@branch.should_receive( :search ).
|
225
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter, params ).
|
187
226
|
and_return( [:first_matching_branch, :other_branches] )
|
188
227
|
|
189
228
|
@branchset.first.should == :first_matching_branch
|
@@ -222,9 +261,8 @@ describe Treequel::Branchset do
|
|
222
261
|
|
223
262
|
it "uses its scope setting as the scope to use when searching" do
|
224
263
|
@branchset.options[:scope] = :onelevel
|
225
|
-
@branch.should_receive( :
|
226
|
-
|
227
|
-
with( @branch, :onelevel, @branchset.filter, @params ).
|
264
|
+
@branch.should_receive( :search ).
|
265
|
+
with( :onelevel, @branchset.filter, @params ).
|
228
266
|
and_yield( :matching_branches )
|
229
267
|
|
230
268
|
@branchset.all.should == [:matching_branches]
|
@@ -251,9 +289,8 @@ describe Treequel::Branchset do
|
|
251
289
|
|
252
290
|
it "uses its selection as the list of attributes to fetch when searching" do
|
253
291
|
@branchset.options[:select] = [ :l, :cn, :uid ]
|
254
|
-
@branch.should_receive( :
|
255
|
-
|
256
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
292
|
+
@branch.should_receive( :search ).
|
293
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
257
294
|
@params.merge(:selectattrs => ['l', 'cn', 'uid']) ).
|
258
295
|
and_yield( :matching_branches )
|
259
296
|
|
@@ -277,9 +314,8 @@ describe Treequel::Branchset do
|
|
277
314
|
|
278
315
|
it "uses its timeout as the timeout values when searching" do
|
279
316
|
@branchset.options[:timeout] = 5.375
|
280
|
-
@branch.should_receive( :
|
281
|
-
|
282
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
317
|
+
@branch.should_receive( :search ).
|
318
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
283
319
|
@params.merge(:timeout => 5.375) ).
|
284
320
|
and_yield( :matching_branches )
|
285
321
|
|
@@ -337,9 +373,8 @@ describe Treequel::Branchset do
|
|
337
373
|
|
338
374
|
it "uses its limit as the limit when searching" do
|
339
375
|
@branchset.options[:limit] = 8
|
340
|
-
@branch.should_receive( :
|
341
|
-
|
342
|
-
with( @branch, Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
376
|
+
@branch.should_receive( :search ).
|
377
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, @branchset.filter,
|
343
378
|
@params.merge(:limit => 8) ).
|
344
379
|
and_yield( :matching_branches )
|
345
380
|
|
@@ -371,9 +406,8 @@ describe Treequel::Branchset do
|
|
371
406
|
end
|
372
407
|
|
373
408
|
it "performs a search using the default filter and scope when all records are requested" do
|
374
|
-
@branch.should_receive( :
|
375
|
-
|
376
|
-
with( @branch, :onelevel, @branchset.filter, @params ).
|
409
|
+
@branch.should_receive( :search ).
|
410
|
+
with( :onelevel, @branchset.filter, @params ).
|
377
411
|
and_yield( :matching_branches )
|
378
412
|
|
379
413
|
@branchset.all.should == [:matching_branches]
|
@@ -381,6 +415,44 @@ describe Treequel::Branchset do
|
|
381
415
|
|
382
416
|
end
|
383
417
|
|
418
|
+
describe "created for a directory with registered controls" do
|
419
|
+
|
420
|
+
before( :all ) do
|
421
|
+
@control = Module.new {
|
422
|
+
include Treequel::Control
|
423
|
+
OID = '3.1.4.1.5.926'
|
424
|
+
|
425
|
+
def yep; end
|
426
|
+
def get_client_controls; [:client_control]; end
|
427
|
+
def get_server_controls; [:server_control]; end
|
428
|
+
}
|
429
|
+
end
|
430
|
+
|
431
|
+
before( :each ) do
|
432
|
+
@directory.stub!( :registered_controls ).and_return([ @control ])
|
433
|
+
end
|
434
|
+
|
435
|
+
it "extends instances of itself with any controls registered with its Branch's Directory" do
|
436
|
+
set = Treequel::Branchset.new( @branch )
|
437
|
+
set.should respond_to( :yep )
|
438
|
+
end
|
439
|
+
|
440
|
+
it "appends client controls to search arguments" do
|
441
|
+
resultbranch = mock( "Result Branch" )
|
442
|
+
set = Treequel::Branchset.new( @branch )
|
443
|
+
|
444
|
+
@params[:server_controls] = [:server_control]
|
445
|
+
@params[:client_controls] = [:client_control]
|
446
|
+
|
447
|
+
@branch.should_receive( :search ).
|
448
|
+
with( Treequel::Branchset::DEFAULT_SCOPE, set.filter, @params ).
|
449
|
+
and_yield( resultbranch )
|
450
|
+
|
451
|
+
set.all.should == [ resultbranch ]
|
452
|
+
end
|
453
|
+
|
454
|
+
end
|
455
|
+
|
384
456
|
end
|
385
457
|
|
386
458
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
BEGIN {
|
4
|
+
require 'pathname'
|
5
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
6
|
+
|
7
|
+
libdir = basedir + "lib"
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
10
|
+
}
|
11
|
+
|
12
|
+
require 'spec'
|
13
|
+
require 'spec/lib/constants'
|
14
|
+
require 'spec/lib/helpers'
|
15
|
+
|
16
|
+
require 'treequel'
|
17
|
+
require 'treequel/control'
|
18
|
+
|
19
|
+
include Treequel::TestConstants
|
20
|
+
include Treequel::Constants
|
21
|
+
|
22
|
+
#####################################################################
|
23
|
+
### C O N T E X T S
|
24
|
+
#####################################################################
|
25
|
+
module TestControl
|
26
|
+
OID = 'an OID'
|
27
|
+
include Treequel::Control
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Treequel::Control do
|
31
|
+
include Treequel::SpecHelpers
|
32
|
+
|
33
|
+
before( :each ) do
|
34
|
+
@testclass = Class.new
|
35
|
+
@obj = @testclass.new
|
36
|
+
@obj.extend( TestControl )
|
37
|
+
end
|
38
|
+
|
39
|
+
it "provides a empty client control list by default" do
|
40
|
+
@obj.get_client_controls.should == []
|
41
|
+
end
|
42
|
+
|
43
|
+
it "provides a empty server control list by default" do
|
44
|
+
@obj.get_server_controls.should == []
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# vim: set nosta noet ts=4 sw=4:
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
BEGIN {
|
4
|
+
require 'pathname'
|
5
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
6
|
+
|
7
|
+
libdir = basedir + "lib"
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
10
|
+
}
|
11
|
+
|
12
|
+
require 'spec'
|
13
|
+
require 'spec/lib/constants'
|
14
|
+
require 'spec/lib/helpers'
|
15
|
+
require 'spec/lib/control_behavior'
|
16
|
+
|
17
|
+
require 'treequel'
|
18
|
+
require 'treequel/controls/contentsync'
|
19
|
+
|
20
|
+
include Treequel::TestConstants
|
21
|
+
include Treequel::Constants
|
22
|
+
|
23
|
+
#####################################################################
|
24
|
+
### C O N T E X T S
|
25
|
+
#####################################################################
|
26
|
+
describe Treequel::ContentSyncControl do
|
27
|
+
include Treequel::SpecHelpers
|
28
|
+
|
29
|
+
before( :each ) do
|
30
|
+
# Used by the shared behavior
|
31
|
+
@control = Treequel::ContentSyncControl
|
32
|
+
end
|
33
|
+
|
34
|
+
it_should_behave_like "A Treequel::Control"
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
# vim: set nosta noet ts=4 sw=4:
|
@@ -0,0 +1,138 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
BEGIN {
|
4
|
+
require 'pathname'
|
5
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
6
|
+
|
7
|
+
libdir = basedir + "lib"
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
10
|
+
}
|
11
|
+
|
12
|
+
require 'spec'
|
13
|
+
require 'spec/lib/constants'
|
14
|
+
require 'spec/lib/helpers'
|
15
|
+
require 'spec/lib/control_behavior'
|
16
|
+
|
17
|
+
require 'treequel'
|
18
|
+
require 'treequel/controls/pagedresults'
|
19
|
+
|
20
|
+
include Treequel::TestConstants
|
21
|
+
include Treequel::Constants
|
22
|
+
|
23
|
+
#####################################################################
|
24
|
+
### C O N T E X T S
|
25
|
+
#####################################################################
|
26
|
+
describe Treequel::PagedResultsControl do
|
27
|
+
include Treequel::SpecHelpers
|
28
|
+
|
29
|
+
before( :all ) do
|
30
|
+
setup_logging( :fatal )
|
31
|
+
end
|
32
|
+
|
33
|
+
before( :each ) do
|
34
|
+
# Used by the shared behavior
|
35
|
+
@control = Treequel::PagedResultsControl
|
36
|
+
@branch = mock( "Branch", :dn => 'cn=example,dc=acme,dc=com' )
|
37
|
+
@directory = mock( "Directory" )
|
38
|
+
|
39
|
+
@branch.stub!( :directory ).and_return( @directory )
|
40
|
+
@directory.stub!( :registered_controls ).and_return([ Treequel::PagedResultsControl ])
|
41
|
+
@branchset = Treequel::Branchset.new( @branch )
|
42
|
+
end
|
43
|
+
|
44
|
+
after( :all ) do
|
45
|
+
reset_logging()
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
it_should_behave_like "A Treequel::Control"
|
50
|
+
|
51
|
+
|
52
|
+
it "adds a paged_results_setsize attribute to extended branchsets" do
|
53
|
+
@branchset.should respond_to( :paged_results_setsize )
|
54
|
+
end
|
55
|
+
|
56
|
+
it "adds a paged_results_cookie attribute to extended branchsets" do
|
57
|
+
@branchset.should respond_to( :paged_results_cookie )
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can add paging of a specific size to a Branchset via the #with_paged_results mutator" do
|
61
|
+
@branchset.with_paged_results( 17 ).paged_results_setsize.should == 17
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can create an unpaged Branchset from a paged one by passing nil to #with_paged_results" do
|
65
|
+
paged_branchset = @branchset.with_paged_results( 25 )
|
66
|
+
paged_branchset.with_paged_results( nil ).paged_results_setsize.should == nil
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can create an unpaged Branchset from a paged one by passing 0 to #with_paged_results" do
|
70
|
+
paged_branchset = @branchset.with_paged_results( 25 )
|
71
|
+
paged_branchset.with_paged_results( 0 ).paged_results_setsize.should == nil
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can create an unpaged Branchset from a paged one via the #without_paging mutator" do
|
75
|
+
paged_branchset = @branchset.with_paged_results( 25 )
|
76
|
+
paged_branchset.without_paging.paged_results_setsize.should == nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it "can remove any existing paging from a Branchset via the #without_paging! imperative method" do
|
80
|
+
paged_branchset = @branchset.with_paged_results( 25 )
|
81
|
+
paged_branchset.without_paging!
|
82
|
+
paged_branchset.paged_results_setsize.should == nil
|
83
|
+
end
|
84
|
+
|
85
|
+
it "injects the correct server-control structure into the search when iterating" do
|
86
|
+
oid = Treequel::PagedResultsControl::OID
|
87
|
+
expected_asn1_string = "0\005\002\001\031\004\000"
|
88
|
+
expected_control = LDAP::Control.new( oid, expected_asn1_string, true )
|
89
|
+
|
90
|
+
resultbranch = mock( "Paged result branch" )
|
91
|
+
resultcontrol = mock( "Paged result control" )
|
92
|
+
|
93
|
+
@branch.should_receive( :search ).with( :subtree,
|
94
|
+
instance_of(Treequel::Filter),
|
95
|
+
{
|
96
|
+
:limit => 0,
|
97
|
+
:selectattrs => [],
|
98
|
+
:timeout => 0,
|
99
|
+
:server_controls => [ expected_control ],
|
100
|
+
:client_controls => []
|
101
|
+
}
|
102
|
+
).and_yield( resultbranch )
|
103
|
+
|
104
|
+
resultbranch.should_receive( :controls ).and_return([ resultcontrol ])
|
105
|
+
resultcontrol.should_receive( :oid ).
|
106
|
+
and_return( Treequel::PagedResultsControl::OID )
|
107
|
+
resultcontrol.should_receive( :decode ).and_return([ 25, "cookievalue" ])
|
108
|
+
|
109
|
+
@branchset.with_paged_results( 25 ).each do |*args|
|
110
|
+
args.should == [ resultbranch ]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it "doesn't add a paging control if no set size has been set" do
|
115
|
+
resultbranch = mock( "Result branch" )
|
116
|
+
|
117
|
+
@branch.should_receive( :search ).with( :subtree,
|
118
|
+
instance_of(Treequel::Filter),
|
119
|
+
{
|
120
|
+
:limit => 0,
|
121
|
+
:selectattrs => [],
|
122
|
+
:timeout => 0,
|
123
|
+
:server_controls => [],
|
124
|
+
:client_controls => []
|
125
|
+
}
|
126
|
+
).and_yield( resultbranch )
|
127
|
+
|
128
|
+
resultbranch.should_receive( :controls ).and_return( [] )
|
129
|
+
|
130
|
+
@branchset.without_paging.each do |*args|
|
131
|
+
args.should == [ resultbranch ]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
# vim: set nosta noet ts=4 sw=4:
|