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.
Files changed (67) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/ChangeLog +135 -12
  5. data/{History.rdoc → History.md} +46 -34
  6. data/Manifest.txt +6 -5
  7. data/{README.rdoc → README.md} +58 -44
  8. data/Rakefile +40 -18
  9. data/examples/ldap-rack-auth.rb +1 -1
  10. data/examples/ldap_state.rb +5 -5
  11. data/lib/treequel.rb +10 -9
  12. data/lib/treequel/behavior/control.rb +7 -8
  13. data/lib/treequel/branch.rb +29 -28
  14. data/lib/treequel/branchcollection.rb +8 -7
  15. data/lib/treequel/branchset.rb +22 -21
  16. data/lib/treequel/constants.rb +23 -24
  17. data/lib/treequel/control.rb +15 -15
  18. data/lib/treequel/controls/contentsync.rb +17 -16
  19. data/lib/treequel/controls/pagedresults.rb +13 -12
  20. data/lib/treequel/controls/sortedresults.rb +11 -10
  21. data/lib/treequel/directory.rb +35 -34
  22. data/lib/treequel/exceptions.rb +2 -1
  23. data/lib/treequel/filter.rb +10 -9
  24. data/lib/treequel/mixins.rb +4 -4
  25. data/lib/treequel/model.rb +23 -13
  26. data/lib/treequel/model/errors.rb +10 -9
  27. data/lib/treequel/model/objectclass.rb +9 -8
  28. data/lib/treequel/model/schemavalidations.rb +5 -4
  29. data/lib/treequel/monkeypatches.rb +5 -4
  30. data/lib/treequel/schema.rb +19 -18
  31. data/lib/treequel/schema/attributetype.rb +9 -8
  32. data/lib/treequel/schema/ldapsyntax.rb +2 -1
  33. data/lib/treequel/schema/matchingrule.rb +2 -1
  34. data/lib/treequel/schema/matchingruleuse.rb +2 -1
  35. data/lib/treequel/schema/objectclass.rb +23 -22
  36. data/lib/treequel/schema/table.rb +3 -2
  37. data/lib/treequel/sequel_integration.rb +2 -1
  38. data/lib/treequel/utils.rb +183 -0
  39. data/misc/ruby-ldap-controlsfix.patch +50 -0
  40. data/spec/{lib/constants.rb → spec_constants.rb} +7 -6
  41. data/spec/{lib/helpers.rb → spec_helpers.rb} +31 -53
  42. data/spec/treequel/branch_spec.rb +196 -223
  43. data/spec/treequel/branchcollection_spec.rb +73 -113
  44. data/spec/treequel/branchset_spec.rb +102 -161
  45. data/spec/treequel/control_spec.rb +5 -21
  46. data/spec/treequel/controls/contentsync_spec.rb +3 -17
  47. data/spec/treequel/controls/pagedresults_spec.rb +40 -62
  48. data/spec/treequel/controls/sortedresults_spec.rb +37 -59
  49. data/spec/treequel/directory_spec.rb +171 -190
  50. data/spec/treequel/filter_spec.rb +106 -131
  51. data/spec/treequel/mixins_spec.rb +47 -81
  52. data/spec/treequel/model/errors_spec.rb +11 -35
  53. data/spec/treequel/model/objectclass_spec.rb +99 -131
  54. data/spec/treequel/model/schemavalidations_spec.rb +36 -60
  55. data/spec/treequel/model_spec.rb +164 -167
  56. data/spec/treequel/monkeypatches_spec.rb +20 -41
  57. data/spec/treequel/schema/attributetype_spec.rb +84 -107
  58. data/spec/treequel/schema/ldapsyntax_spec.rb +10 -36
  59. data/spec/treequel/schema/matchingrule_spec.rb +23 -47
  60. data/spec/treequel/schema/matchingruleuse_spec.rb +18 -42
  61. data/spec/treequel/schema/objectclass_spec.rb +73 -94
  62. data/spec/treequel/schema/table_spec.rb +58 -86
  63. data/spec/treequel/schema_spec.rb +47 -59
  64. data/spec/treequel_spec.rb +131 -156
  65. metadata +68 -42
  66. metadata.gz.sig +0 -0
  67. data/spec/lib/matchers.rb +0 -55
@@ -1,33 +1,12 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ #encoding: utf-8
2
3
 
3
- BEGIN {
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.should =~ /debugging message/i
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.should be_an_instance_of( Hash )
69
- result.should_not be_equal( testhash )
70
- result.should == {
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.should be_an_instance_of( Hash )
92
- result.should_not be_equal( testhash )
93
- result.should == {
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) ).should == {
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.should be_an_instance_of( Array )
141
- result.should_not be_equal( testarray )
142
- result.should == ['a', 'b', 'c', ['d', 'e', ['f', 'g']]]
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.should be_an_instance_of( Array )
152
- result.should_not be_equal( testarray )
153
- result.should == [:a, :b, :c, [:d, :e, [:f, :g]]]
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 ).should be_testable()
180
- @testclass.new( false ).should_not be_testable()
181
- @testclass.new( 1 ).should be_testable()
182
- @testclass.new( :something_else ).should be_testable()
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.should_not be_testable()
161
+ expect( obj ).to_not be_testable()
189
162
  obj.testable = true
190
- obj.should be_testable()
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 = mock( "delegate" )
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.should_receive( :delegated_method )
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.should_receive( :delegated_method ).with( :arg1, :arg2 )
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.should_receive( :delegated_method ).with( :arg1 ).
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.should == :the_block_argument
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.should =~ /nonexistant_method/
251
- err.backtrace.first.should =~ /#{__FILE__}/
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 = mock( "delegate" )
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.should_receive( :delegated_method )
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.should_receive( :delegated_method ).with( :arg1, :arg2 )
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.should_receive( :delegated_method ).with( :arg1 ).
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.should == :the_block_argument
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.should =~ /`erroring_delegated_method' for nil/
305
- err.backtrace.first.should =~ /#{__FILE__}/
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 ).should == :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' ).should == :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' ).should == :givenname
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' ).should == :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 ).should == {
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
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ #encoding: utf-8
2
3
 
3
- BEGIN {
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].should have( 1 ).member
45
- @errors[:cn].should include( "Not a common name." )
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.should == 3
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.should be_empty()
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.should_not be_empty()
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.should have( 2 ).members
70
- @errors.full_messages.should include( "givenName and sn and displayName must be unique" )
71
- @errors.full_messages.should include( "l is not a valid location" )
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
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
+ #encoding: utf-8
2
3
 
3
- BEGIN {
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 = mock( "ldap connection object" )
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.should_receive( :warn ).
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.should == [:inetOrgPerson]
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.should == [:'apple-computer-list']
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.should == [ :inetOrgPerson, :acmeAccount ]
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::TestConstants
67
+ Treequel::SpecConstants
92
68
  model_objectclasses :device
93
69
  model_bases TEST_PHONES_DN
94
70
  end
95
71
 
96
- mixin.model_bases.should == [TEST_PHONES_DN]
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.should == ['ou=phones,dc=acme,dc=com']
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::TestConstants
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.should include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
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.should == Treequel::Model
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.should == MyModel
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].should_not include( mixin )
161
- MyModel.objectclass_registry[:inetOrgPerson].should include( mixin )
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'].should_not include( mixin )
175
- MyModel.base_registry['ou=people,dc=acme,dc=com'].should include( mixin )
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'].should_not include( mixin )
189
- MyModel.base_registry['ou=people,dc=acme,dc=com'].should include( mixin )
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 = mock( "ldap connection object" )
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.should be_a( Treequel::Branchset )
209
- result.branch.directory.should == 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 ).should be_a( Treequel::Branchset )
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.stub( :bound? ).and_return( true )
224
- @conn.should_receive( :search_ext2 ).
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.should be_a( Treequel::Model )
237
- result.should be_a( mixin )
238
- result.dn.should == TEST_PERSON_ENTRY['dn'].first
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.should be_a( Treequel::Model )
253
- result[:objectClass].should include( 'inetOrgPerson' )
254
- result[TEST_PERSON_DN_ATTR].should == [ TEST_PERSON_DN_VALUE ]
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.should be_a( Treequel::Model )
266
- result[:objectClass].should include( 'inetOrgPerson' )
267
- result[TEST_PERSON_DN_ATTR].should == [ TEST_PERSON_DN_VALUE ]
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.should be_a( Treequel::Model )
279
- result[:objectClass].should include( 'inetOrgPerson' )
280
- result[TEST_PERSON_DN_ATTR].should have( 1 ).member
281
- result[TEST_PERSON_DN_ATTR].should == [ TEST_PERSON_DN_VALUE ]
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.should be_a( Treequel::Model )
293
- result[:objectClass].should have( 2 ).members
294
- result[:objectClass].should include( 'inetOrgPerson', 'person' )
295
- result[TEST_PERSON_DN_ATTR].should have( 1 ).member
296
- result[TEST_PERSON_DN_ATTR].should include( TEST_PERSON_DN_VALUE )
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.should be_a( Treequel::Model )
307
- result[:objectClass].should have( 3 ).members
308
- result[:objectClass].should include( 'ipHost', 'ieee802Device', 'device' )
309
- result[TEST_HOST_MULTIVALUE_DN_ATTR1].should include( TEST_HOST_MULTIVALUE_DN_VALUE1 )
310
- result[TEST_HOST_MULTIVALUE_DN_ATTR2].should include( TEST_HOST_MULTIVALUE_DN_VALUE2 )
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 = mock( "ldap connection object" )
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( :inetOrgPerson ).
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( :device ).
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.should be_a( Treequel::Branchset )
347
- result.base_dn.should == TEST_BASE_DN
348
- result.filter.to_s.should == '(objectClass=inetOrgPerson)'
349
- result.branch.directory.should == @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 = mock( "second ldap connection object" )
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.should be_a( Treequel::Branchset )
360
- result.base_dn.should == TEST_BASE_DN
361
- result.filter.to_s.should == '(objectClass=inetOrgPerson)'
362
- result.branch.directory.should == 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( :device, :ipHost ).
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( :device ).
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.should be_a( Treequel::Branchset )
397
- result.base_dn.should == TEST_BASE_DN
398
- result.filter.to_s.should == '(&(objectClass=device)(objectClass=ipHost))'
399
- result.branch.directory.should == @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 = mock( "second ldap connection object" )
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.should be_a( Treequel::Branchset )
410
- result.base_dn.should == TEST_BASE_DN
411
- result.filter.to_s.should == '(&(objectClass=device)(objectClass=ipHost))'
412
- result.branch.directory.should == 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::TestConstants
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( TEST_PERSON_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( TEST_ROOM_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.should be_a( Treequel::Branchset )
446
- result.base_dn.should == TEST_PEOPLE_DN
447
- result.filter.to_s.should == '(objectClass=*)'
448
- result.branch.directory.should == @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 = mock( "second ldap connection object" )
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.should be_a( Treequel::Branchset )
459
- result.base_dn.should == TEST_PEOPLE_DN
460
- result.filter.to_s.should == '(objectClass=*)'
461
- result.branch.directory.should == 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::TestConstants
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( TEST_SUBHOST_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( TEST_PERSON_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.should be_a( Treequel::BranchCollection )
497
- result.base_dns.should have( 2 ).members
498
- result.base_dns.should include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
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.should == '(objectClass=*)'
501
- brset.branch.directory.should == @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 = mock( "second ldap connection object" )
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.should be_a( Treequel::BranchCollection )
513
- result.base_dns.should have( 2 ).members
514
- result.base_dns.should include( TEST_HOSTS_DN, TEST_SUBHOSTS_DN )
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.should == '(objectClass=*)'
517
- brset.branch.directory.should == 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