ad-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +6 -0
- data/Gemfile +12 -0
- data/README.markdown +36 -0
- data/Rakefile +19 -0
- data/ad-framework.gemspec +25 -0
- data/doc/open_ldap_server.markdown +17 -0
- data/extras/adtest.schema +304 -0
- data/extras/slapd.conf +10 -0
- data/lib/ad-framework.rb +53 -0
- data/lib/ad-framework/attribute.rb +35 -0
- data/lib/ad-framework/attribute_type.rb +133 -0
- data/lib/ad-framework/auxiliary_class.rb +24 -0
- data/lib/ad-framework/config.rb +72 -0
- data/lib/ad-framework/config/attribute_definition.rb +18 -0
- data/lib/ad-framework/config/mapping.rb +26 -0
- data/lib/ad-framework/exceptions.rb +17 -0
- data/lib/ad-framework/fields.rb +44 -0
- data/lib/ad-framework/patterns/callbacks.rb +47 -0
- data/lib/ad-framework/patterns/has_schema.rb +127 -0
- data/lib/ad-framework/patterns/persistence.rb +67 -0
- data/lib/ad-framework/patterns/searchable.rb +117 -0
- data/lib/ad-framework/patterns/validations.rb +50 -0
- data/lib/ad-framework/schema.rb +118 -0
- data/lib/ad-framework/structural_class.rb +61 -0
- data/lib/ad-framework/utilities/entry_builder.rb +77 -0
- data/lib/ad-framework/utilities/transaction.rb +32 -0
- data/lib/ad-framework/utilities/validator.rb +26 -0
- data/lib/ad-framework/version.rb +5 -0
- data/test/helper.rb +71 -0
- data/test/integration/defined_array_test.rb +49 -0
- data/test/integration/defined_integer_test.rb +48 -0
- data/test/integration/defined_string_test.rb +48 -0
- data/test/integration/defined_top_test.rb +101 -0
- data/test/integration/defined_user_test.rb +140 -0
- data/test/irb.rb +2 -0
- data/test/support/factory.rb +67 -0
- data/test/support/ldap.yml +6 -0
- data/test/support/schema/attribute_types.rb +67 -0
- data/test/support/schema/attributes.rb +10 -0
- data/test/support/schema/auxiliary_classes.rb +12 -0
- data/test/support/schema/structural_classes.rb +46 -0
- data/test/support/seed.rb +28 -0
- data/test/support/state.rb +29 -0
- data/test/unit/ad-framework/attribute_test.rb +84 -0
- data/test/unit/ad-framework/attribute_type/class_methods_test.rb +146 -0
- data/test/unit/ad-framework/attribute_type_test.rb +114 -0
- data/test/unit/ad-framework/auxiliary_class_test.rb +39 -0
- data/test/unit/ad-framework/config/attribute_definition_test.rb +26 -0
- data/test/unit/ad-framework/config/mapping_test.rb +41 -0
- data/test/unit/ad-framework/config_test.rb +121 -0
- data/test/unit/ad-framework/fields_test.rb +44 -0
- data/test/unit/ad-framework/patterns/callbacks_test.rb +90 -0
- data/test/unit/ad-framework/patterns/has_schema/class_methods_test.rb +214 -0
- data/test/unit/ad-framework/patterns/has_schema_test.rb +96 -0
- data/test/unit/ad-framework/patterns/persistence_test.rb +126 -0
- data/test/unit/ad-framework/patterns/searchable_test.rb +201 -0
- data/test/unit/ad-framework/patterns/validations_test.rb +113 -0
- data/test/unit/ad-framework/schema_test.rb +268 -0
- data/test/unit/ad-framework/structural_class_test.rb +64 -0
- data/test/unit/ad-framework/utilities/entry_builder_test.rb +107 -0
- data/test/unit/ad-framework/utilities/transaction_test.rb +50 -0
- data/test/unit/ad-framework/utilities/validator_test.rb +46 -0
- data/test/unit/ad-framework_test.rb +116 -0
- metadata +225 -0
@@ -0,0 +1,214 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
module AD::Framework::Patterns::HasSchema
|
4
|
+
|
5
|
+
class ClassMethodsTest < Assert::Context
|
6
|
+
desc "AD::Framework::Patterns::HasSchema class"
|
7
|
+
setup do
|
8
|
+
@module = AD::Framework::Patterns::HasSchema
|
9
|
+
@structural_class = Factory.structural_class do
|
10
|
+
attributes :name, :display_name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
subject{ @structural_class }
|
14
|
+
|
15
|
+
should "return an instance of AD::Framework::Schema with #schema" do
|
16
|
+
assert_instance_of AD::Framework::Schema, subject.schema
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class SetLdapNameTest < ClassMethodsTest
|
21
|
+
desc "setting ldap name"
|
22
|
+
setup do
|
23
|
+
@new_value = "awesomeness"
|
24
|
+
@structural_class.ldap_name(@new_value)
|
25
|
+
end
|
26
|
+
|
27
|
+
should "set the schema's ldap name" do
|
28
|
+
assert_match @new_value, subject.schema.ldap_name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class SetTreebaseTest < ClassMethodsTest
|
33
|
+
desc "setting treebase"
|
34
|
+
setup do
|
35
|
+
@new_value = "CN=container"
|
36
|
+
@structural_class.treebase(@new_value)
|
37
|
+
end
|
38
|
+
|
39
|
+
should "set the schema's treebase with a call to #treebase" do
|
40
|
+
assert_match @new_value, subject.schema.treebase
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class SetRdnTest < ClassMethodsTest
|
45
|
+
desc "setting rdn"
|
46
|
+
setup do
|
47
|
+
@new_value = "name"
|
48
|
+
@structural_class.rdn(@new_value)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "set the schema's rdn with a call to #rdn" do
|
52
|
+
assert_equal @new_value, subject.schema.rdn
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class SetAttributesTest < ClassMethodsTest
|
57
|
+
desc "setting attributes"
|
58
|
+
setup do
|
59
|
+
@values = [ :name, :display_name ]
|
60
|
+
@structural_class.schema.expects(:add_attributes).with(@values)
|
61
|
+
end
|
62
|
+
|
63
|
+
should "add attributes to the schema" do
|
64
|
+
values = @values
|
65
|
+
assert_nothing_raised{ subject.attributes(*values) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class SetReadAttributesTest < ClassMethodsTest
|
70
|
+
desc "setting read attributes"
|
71
|
+
setup do
|
72
|
+
@values = [ :name, :display_name ]
|
73
|
+
@structural_class.schema.expects(:add_read_attributes).with(@values)
|
74
|
+
end
|
75
|
+
|
76
|
+
should "add read attributes to the schema" do
|
77
|
+
values = @values
|
78
|
+
assert_nothing_raised{ subject.read_attributes(*values) }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class SetWriteAttributesTest < ClassMethodsTest
|
83
|
+
desc "setting write attributes"
|
84
|
+
setup do
|
85
|
+
@values = [ :name, :display_name ]
|
86
|
+
@structural_class.schema.expects(:add_write_attributes).with(@values)
|
87
|
+
end
|
88
|
+
|
89
|
+
should "add write attributes to the schema" do
|
90
|
+
values = @values
|
91
|
+
assert_nothing_raised{ subject.write_attributes(*values) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class SetMustSetTest < ClassMethodsTest
|
96
|
+
desc "setting mandatory attributes"
|
97
|
+
setup do
|
98
|
+
@values = [ :name ]
|
99
|
+
@structural_class.schema.expects(:add_mandatory).with(@values)
|
100
|
+
end
|
101
|
+
|
102
|
+
should "add mandatory attributes to the schema" do
|
103
|
+
values = @values
|
104
|
+
assert_nothing_raised{ subject.must_set(*values) }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class BeforeCreateTest < ClassMethodsTest
|
109
|
+
desc "adding a before_create callback"
|
110
|
+
setup do
|
111
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
112
|
+
@structural_class.schema.expects(:add_callback).with(:before, :create, @values)
|
113
|
+
end
|
114
|
+
|
115
|
+
should "add callbacks to the schema" do
|
116
|
+
values = @values
|
117
|
+
assert_nothing_raised{ subject.before_create(*values) }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class BeforeUpdateTest < ClassMethodsTest
|
122
|
+
desc "adding a before_update callback"
|
123
|
+
setup do
|
124
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
125
|
+
@structural_class.schema.expects(:add_callback).with(:before, :update, @values)
|
126
|
+
end
|
127
|
+
|
128
|
+
should "add callbacks to the schema" do
|
129
|
+
values = @values
|
130
|
+
assert_nothing_raised{ subject.before_update(*values) }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class BeforeSaveTest < ClassMethodsTest
|
135
|
+
desc "adding a before_save callback"
|
136
|
+
setup do
|
137
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
138
|
+
@structural_class.schema.expects(:add_callback).with(:before, :create, @values)
|
139
|
+
@structural_class.schema.expects(:add_callback).with(:before, :update, @values)
|
140
|
+
end
|
141
|
+
|
142
|
+
should "add callbacks for create and update to the schema" do
|
143
|
+
values = @values
|
144
|
+
assert_nothing_raised{ subject.before_save(*values) }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class BeforeDestroyTest < ClassMethodsTest
|
149
|
+
desc "adding a before_destroy callback"
|
150
|
+
setup do
|
151
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
152
|
+
@structural_class.schema.expects(:add_callback).with(:before, :destroy, @values)
|
153
|
+
end
|
154
|
+
|
155
|
+
should "add callbacks to the schema" do
|
156
|
+
values = @values
|
157
|
+
assert_nothing_raised{ subject.before_destroy(*values) }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
class AfterCreateTest < ClassMethodsTest
|
162
|
+
desc "adding a after_create callback"
|
163
|
+
setup do
|
164
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
165
|
+
@structural_class.schema.expects(:add_callback).with(:after, :create, @values)
|
166
|
+
end
|
167
|
+
|
168
|
+
should "add callbacks to the schema" do
|
169
|
+
values = @values
|
170
|
+
assert_nothing_raised{ subject.after_create(*values) }
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class AfterUpdateTest < ClassMethodsTest
|
175
|
+
desc "adding a after_update callback"
|
176
|
+
setup do
|
177
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
178
|
+
@structural_class.schema.expects(:add_callback).with(:after, :update, @values)
|
179
|
+
end
|
180
|
+
|
181
|
+
should "add callbacks to the schema" do
|
182
|
+
values = @values
|
183
|
+
assert_nothing_raised{ subject.after_update(*values) }
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
class AfterSaveTest < ClassMethodsTest
|
188
|
+
desc "adding a after_save callback"
|
189
|
+
setup do
|
190
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
191
|
+
@structural_class.schema.expects(:add_callback).with(:after, :create, @values)
|
192
|
+
@structural_class.schema.expects(:add_callback).with(:after, :update, @values)
|
193
|
+
end
|
194
|
+
|
195
|
+
should "add callbacks for create and update to the schema" do
|
196
|
+
values = @values
|
197
|
+
assert_nothing_raised{ subject.after_save(*values) }
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
class AfterDestroyTest < ClassMethodsTest
|
202
|
+
desc "adding a after_destroy callback"
|
203
|
+
setup do
|
204
|
+
@values = [ :do_something_amazing, :another_amazing_thing ]
|
205
|
+
@structural_class.schema.expects(:add_callback).with(:after, :destroy, @values)
|
206
|
+
end
|
207
|
+
|
208
|
+
should "add callbacks to the schema" do
|
209
|
+
values = @values
|
210
|
+
assert_nothing_raised{ subject.after_destroy(*values) }
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
module AD::Framework::Patterns::HasSchema
|
4
|
+
|
5
|
+
class BaseTest < Assert::Context
|
6
|
+
desc "AD::Framework::Patterns::HasSchema"
|
7
|
+
setup do
|
8
|
+
@structural_class = Factory.structural_class do
|
9
|
+
treebase "CN=Something, DC=example, DC=com"
|
10
|
+
attributes :name, :display_name
|
11
|
+
end
|
12
|
+
@instance = @structural_class.new({ :name => "someone", :display_name => "Someone" })
|
13
|
+
end
|
14
|
+
subject{ @instance }
|
15
|
+
|
16
|
+
should have_instance_methods :schema, :dn, :attributes, :attributes=
|
17
|
+
should have_class_methods :schema, :ldap_name, :treebase, :rdn, :attributes
|
18
|
+
should have_class_methods :read_attributes, :write_attributes, :must_set
|
19
|
+
should have_class_methods :before_create, :before_update, :before_save, :before_destroy
|
20
|
+
should have_class_methods :after_create, :after_update, :after_save, :after_destroy
|
21
|
+
|
22
|
+
should "return it's class's schema wtih a call to #schema" do
|
23
|
+
assert_equal subject.class.schema.klass, subject.schema.klass
|
24
|
+
end
|
25
|
+
should "return a hash of the attributes and their values with a call to #attributes" do
|
26
|
+
expected = subject.schema.attributes.inject({}) do |h, a|
|
27
|
+
h.merge({ a.to_sym => subject.send(a) })
|
28
|
+
end
|
29
|
+
assert_equal expected, subject.attributes
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class DnTest < BaseTest
|
34
|
+
desc "dn method"
|
35
|
+
setup do
|
36
|
+
@distinguished_name = "CN=distinguishedname, #{subject.schema.treebase}"
|
37
|
+
@dn = "CN=dn, #{subject.schema.treebase}"
|
38
|
+
@built_dn = "CN=#{subject.send(subject.schema.rdn)}, #{subject.schema.treebase}"
|
39
|
+
@instance.fields[:distinguishedname] = @distinguished_name
|
40
|
+
@instance.fields[:dn] = @dn
|
41
|
+
end
|
42
|
+
subject{ @instance }
|
43
|
+
|
44
|
+
should "return the distinguished name field" do
|
45
|
+
assert_equal @distinguished_name, subject.dn
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class DnWithoutDistinguishedNameTest < DnTest
|
50
|
+
desc "without the distinguishedname field"
|
51
|
+
setup do
|
52
|
+
@instance.fields[:distinguishedname] = nil
|
53
|
+
end
|
54
|
+
|
55
|
+
should "return the dn field" do
|
56
|
+
assert_equal @dn, subject.dn
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class DnWithNoFieldsTest < DnWithoutDistinguishedNameTest
|
61
|
+
desc "and without the dn field"
|
62
|
+
setup do
|
63
|
+
@instance.fields[:dn] = nil
|
64
|
+
end
|
65
|
+
|
66
|
+
should "return a concatenation of the rdn field and the treebase" do
|
67
|
+
assert_equal @built_dn, subject.dn
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class SetObjectAttributesTest < BaseTest
|
72
|
+
desc "setting attributes"
|
73
|
+
setup do
|
74
|
+
@new_attributes = { :name => "amazing", :display_name => "Amazing" }
|
75
|
+
@instance.attributes = @new_attributes
|
76
|
+
end
|
77
|
+
|
78
|
+
should "set multiple attributes" do
|
79
|
+
assert_equal @new_attributes[:name], subject.name
|
80
|
+
assert_equal @new_attributes[:display_name], subject.display_name
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class SetAttributesWithInvalidTest < BaseTest
|
85
|
+
desc "setting attributes with ignored key/values"
|
86
|
+
setup do
|
87
|
+
@new_attributes = { :something => "something" }
|
88
|
+
end
|
89
|
+
|
90
|
+
should "be ignored" do
|
91
|
+
new_attributes = @new_attributes
|
92
|
+
assert_nothing_raised{ subject.attributes = new_attributes }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
module AD::Framework::Patterns::Persistence
|
4
|
+
|
5
|
+
class BaseTest < Assert::Context
|
6
|
+
desc "the persistence pattern"
|
7
|
+
setup do
|
8
|
+
@structural_class = Factory.structural_class do
|
9
|
+
ldap_name "persistenceTestObject"
|
10
|
+
attributes :name, :system_flags
|
11
|
+
end
|
12
|
+
@instance = @structural_class.new({ :name => "test", :system_flags => 1 })
|
13
|
+
@mock_connection = mock()
|
14
|
+
@instance.stubs(:connection).returns(@mock_connection)
|
15
|
+
end
|
16
|
+
subject{ @instance }
|
17
|
+
|
18
|
+
should have_instance_methods :new_entry?, :save, :create, :update, :destroy
|
19
|
+
should have_class_methods :create
|
20
|
+
|
21
|
+
should "return true with #new_entry?" do
|
22
|
+
assert_equal true, subject.new_entry?
|
23
|
+
end
|
24
|
+
should "call #create with #save" do
|
25
|
+
subject.expects(:create)
|
26
|
+
assert_nothing_raised{ subject.save }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class WithDistinguishedNameFieldTest < BaseTest
|
31
|
+
desc "with a distinguishedname field set"
|
32
|
+
setup do
|
33
|
+
@instance.fields[:distinguishedname] = "distinguishedname"
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return false with #new_entry?" do
|
37
|
+
assert_equal false, subject.new_entry?
|
38
|
+
end
|
39
|
+
should "call #create with #save" do
|
40
|
+
subject.expects(:update)
|
41
|
+
assert_nothing_raised{ subject.save }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class WithDnFieldTest < BaseTest
|
46
|
+
desc "with a dn field set"
|
47
|
+
setup do
|
48
|
+
@instance.fields[:dn] = "dn"
|
49
|
+
end
|
50
|
+
|
51
|
+
should "return false with #new_entry?" do
|
52
|
+
assert_equal false, subject.new_entry?
|
53
|
+
end
|
54
|
+
should "call #create with #save" do
|
55
|
+
subject.expects(:update)
|
56
|
+
assert_nothing_raised{ subject.save }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class CreateObjectTest < BaseTest
|
61
|
+
desc "create method"
|
62
|
+
setup do
|
63
|
+
@set_dn = @instance.dn
|
64
|
+
fields = @instance.fields.dup
|
65
|
+
fields[:objectclass] = @instance.schema.object_classes.collect(&:ldap_name).compact
|
66
|
+
fields[:distinguishedname] = @set_dn
|
67
|
+
@set_attributes = fields.to_hash
|
68
|
+
@mock_connection.expects(:add).with({ :dn => @set_dn, :attributes => @set_attributes })
|
69
|
+
@instance.expects(:reload)
|
70
|
+
end
|
71
|
+
|
72
|
+
should "call add on it's connection with the fields, including dn and objectclass" do
|
73
|
+
assert_nothing_raised{ @instance.create }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class UpdateObjectTest < BaseTest
|
78
|
+
desc "update method"
|
79
|
+
setup do
|
80
|
+
@instance.fields[:dn] = @instance.dn
|
81
|
+
@instance.attributes = { :name => "new name", :system_flags => 12 }
|
82
|
+
@mock_connection.expects(:open).yields(@mock_connection)
|
83
|
+
@instance.fields.changes.each do |name, value|
|
84
|
+
@mock_connection.expects(:replace_attribute).with(@instance.dn, name, value)
|
85
|
+
end
|
86
|
+
@instance.expects(:reload)
|
87
|
+
end
|
88
|
+
|
89
|
+
should "call replace attribute for every changed field" do
|
90
|
+
assert_nothing_raised{ subject.update }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class DestroyObjectTest < BaseTest
|
95
|
+
desc "destroy method"
|
96
|
+
setup do
|
97
|
+
@instance.fields[:dn] = @instance.dn
|
98
|
+
@mock_connection.expects(:delete).with(@instance.dn)
|
99
|
+
end
|
100
|
+
|
101
|
+
should "call delete on the connection" do
|
102
|
+
assert_nothing_raised{ subject.destroy }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class CreateClassMethodTest < Assert::Context
|
107
|
+
desc "create on the class"
|
108
|
+
setup do
|
109
|
+
@structural_class = Factory.structural_class do
|
110
|
+
ldap_name "persistenceClassTestObject"
|
111
|
+
attributes :name, :system_flags
|
112
|
+
end
|
113
|
+
@attributes = { :name => "from class", :system_flags => 5 }
|
114
|
+
mock_entry = mock()
|
115
|
+
@structural_class.expects(:new).returns(mock_entry).with(@attributes)
|
116
|
+
mock_entry.expects(:create)
|
117
|
+
end
|
118
|
+
subject{ @structural_class }
|
119
|
+
|
120
|
+
should "call create on a new entry build with attributes passed to it" do
|
121
|
+
attributes = @attributes
|
122
|
+
assert_nothing_raised{ subject.create(attributes) }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
module AD::Framework::Patterns::Searchable
|
4
|
+
|
5
|
+
class BaseTest < Assert::Context
|
6
|
+
desc "AD::Framework::Searchable"
|
7
|
+
setup do
|
8
|
+
@structural_class = Factory.structural_class do
|
9
|
+
ldap_name "searchableTestObject"
|
10
|
+
treebase "OU=Random"
|
11
|
+
end
|
12
|
+
AD::Framework.register_structural_class(@structural_class)
|
13
|
+
@fields = { "objectclass" => [ @structural_class.schema.ldap_name ] }
|
14
|
+
instance_fields = @fields.dup.merge({ "dn" => "CN=something, DC=example, DC=com" })
|
15
|
+
@instance = @structural_class.new({ :fields => instance_fields })
|
16
|
+
end
|
17
|
+
subject{ @instance }
|
18
|
+
|
19
|
+
should have_instance_methods :reload
|
20
|
+
should have_class_methods :find, :first, :all
|
21
|
+
|
22
|
+
teardown do
|
23
|
+
AD::Framework.defined_object_classes.delete(@structural_class.ldap_name.to_sym)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ReloadTest < BaseTest
|
28
|
+
desc "reload method"
|
29
|
+
setup do
|
30
|
+
@search_args = {
|
31
|
+
:objectclass__eq => @instance.class.ldap_name, :base => @instance.treebase, :size => 1
|
32
|
+
}
|
33
|
+
@distinguishedname = "distinguishedname test"
|
34
|
+
@dn = "dn test"
|
35
|
+
@instance.fields[:distinguishedname] = @distinguishedname
|
36
|
+
@instance.fields[:dn] = @dn
|
37
|
+
@mock_connection = mock()
|
38
|
+
@instance.expects(:connection).returns(@mock_connection)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class WithDistinguishedNameTest < ReloadTest
|
43
|
+
desc "with distinguishedname field set"
|
44
|
+
setup do
|
45
|
+
@search_args[:dn__eq] = @instance.fields[:distinguishedname]
|
46
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields ])
|
47
|
+
end
|
48
|
+
|
49
|
+
should "call search on it's connection with the distinguishedname field" do
|
50
|
+
assert_nothing_raised{ subject.reload }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class WithDnTest < ReloadTest
|
55
|
+
desc "without distinguishedname and with dn field set"
|
56
|
+
setup do
|
57
|
+
@instance.fields[:distinguishedname] = nil
|
58
|
+
@search_args[:dn__eq] = @instance.fields[:dn]
|
59
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields ])
|
60
|
+
end
|
61
|
+
|
62
|
+
should "call search on it's connection with the dn field" do
|
63
|
+
assert_nothing_raised{ subject.reload }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class WithInvalidDnTest < ReloadTest
|
68
|
+
desc "with an invalid dn"
|
69
|
+
setup do
|
70
|
+
@instance.fields[:distinguishedname] = @instance.fields[:dn] = nil
|
71
|
+
@search_args[:dn__eq] = nil
|
72
|
+
@mock_connection.expects(:search).with(@search_args).returns([])
|
73
|
+
end
|
74
|
+
should "raise a not found exception if the search returns no entries" do
|
75
|
+
assert_raises(AD::Framework::EntryNotFound){ subject.reload }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class FirstMethodTest < BaseTest
|
80
|
+
desc "first method"
|
81
|
+
setup do
|
82
|
+
@structural_class = Factory.structural_class do
|
83
|
+
ldap_name "firstSearchableTestObject"
|
84
|
+
end
|
85
|
+
@first_args = { :name => "someone" }
|
86
|
+
@search_args = {
|
87
|
+
:name => @first_args[:name], :objectclass__eq => @structural_class.ldap_name,
|
88
|
+
:base => @structural_class.treebase, :size => 1
|
89
|
+
}
|
90
|
+
@mock_connection = mock()
|
91
|
+
@structural_class.expects(:connection).returns(@mock_connection)
|
92
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields ])
|
93
|
+
end
|
94
|
+
subject{ @structural_class }
|
95
|
+
|
96
|
+
should "search with the args passed and return a single entry" do
|
97
|
+
found = nil
|
98
|
+
assert_nothing_raised{ found = subject.first(@first_args) }
|
99
|
+
assert found
|
100
|
+
assert_equal @fields, found.fields
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class AllMethodTest < BaseTest
|
105
|
+
desc "all method"
|
106
|
+
setup do
|
107
|
+
@structural_class = Factory.structural_class do
|
108
|
+
ldap_name "allSearchableTestObject"
|
109
|
+
end
|
110
|
+
@all_args = { :where => { :name => "*some*" } }
|
111
|
+
@search_args = {
|
112
|
+
:name => @all_args[:where][:name], :objectclass__eq => @structural_class.ldap_name,
|
113
|
+
:base => @structural_class.treebase
|
114
|
+
}
|
115
|
+
@mock_connection = mock()
|
116
|
+
@structural_class.expects(:connection).returns(@mock_connection)
|
117
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields.dup, @fields.dup ])
|
118
|
+
end
|
119
|
+
subject{ @structural_class }
|
120
|
+
|
121
|
+
should "search with the args passed and return multiple entries" do
|
122
|
+
all = nil
|
123
|
+
assert_nothing_raised{ all = subject.all(@all_args) }
|
124
|
+
assert_instance_of Array, all
|
125
|
+
all.each{|found| assert_equal(@fields, found.fields) }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class FindMethodWithDnTest < BaseTest
|
130
|
+
desc "find method with a dn"
|
131
|
+
setup do
|
132
|
+
@structural_class = Factory.structural_class do
|
133
|
+
ldap_name "findWithDNSearchableTestObject"
|
134
|
+
end
|
135
|
+
@dn = "CN=someone, #{@structural_class.treebase}"
|
136
|
+
@search_args = {
|
137
|
+
:dn__eq => @dn, :objectclass__eq => @structural_class.ldap_name,
|
138
|
+
:base => @structural_class.treebase, :size => 1
|
139
|
+
}
|
140
|
+
@mock_connection = mock()
|
141
|
+
@structural_class.expects(:connection).returns(@mock_connection)
|
142
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields ])
|
143
|
+
end
|
144
|
+
subject{ @structural_class }
|
145
|
+
|
146
|
+
should "return an entry with a matching dn" do
|
147
|
+
found = nil
|
148
|
+
assert_nothing_raised{ found = subject.find(@dn) }
|
149
|
+
assert found
|
150
|
+
assert_equal(@fields, found.fields)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class FindMethodWithRdnTest < BaseTest
|
155
|
+
desc "find method with a rdn"
|
156
|
+
setup do
|
157
|
+
@structural_class = Factory.structural_class do
|
158
|
+
ldap_name "findWithRDNSearchableTestObject"
|
159
|
+
end
|
160
|
+
@rdn = "someone"
|
161
|
+
@search_args = {
|
162
|
+
:dn__eq => "CN=#{@rdn}, #{@structural_class.treebase}", :base => @structural_class.treebase,
|
163
|
+
:objectclass__eq => @structural_class.ldap_name, :size => 1
|
164
|
+
}
|
165
|
+
@mock_connection = mock()
|
166
|
+
@structural_class.expects(:connection).returns(@mock_connection)
|
167
|
+
@mock_connection.expects(:search).with(@search_args).returns([ @fields ])
|
168
|
+
end
|
169
|
+
subject{ @structural_class }
|
170
|
+
|
171
|
+
should "return an entry with a matching rdn" do
|
172
|
+
found = nil
|
173
|
+
assert_nothing_raised{ found = subject.find(@rdn) }
|
174
|
+
assert found
|
175
|
+
assert_equal(@fields, found.fields)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
class FindMethodWithNotResultTest < BaseTest
|
180
|
+
desc "find method that returns no result"
|
181
|
+
setup do
|
182
|
+
@structural_class = Factory.structural_class do
|
183
|
+
ldap_name "findWithDNSearchableTestObject"
|
184
|
+
end
|
185
|
+
@dn = "CN=someone, #{@structural_class.treebase}"
|
186
|
+
@search_args = {
|
187
|
+
:dn__eq => @dn, :objectclass__eq => @structural_class.ldap_name,
|
188
|
+
:base => @structural_class.treebase, :size => 1
|
189
|
+
}
|
190
|
+
@mock_connection = mock()
|
191
|
+
@structural_class.expects(:connection).returns(@mock_connection)
|
192
|
+
@mock_connection.expects(:search).with(@search_args).returns([])
|
193
|
+
end
|
194
|
+
subject{ @structural_class }
|
195
|
+
|
196
|
+
should "raise an error when no entry is found" do
|
197
|
+
assert_raises(AD::Framework::EntryNotFound){ subject.find(@dn) }
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|