deferred_associations 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,6 +16,7 @@ module ActiveRecord
16
16
  define_obj_setter collection_name
17
17
  define_obj_getter collection_name
18
18
  define_id_setter collection_name
19
+ define_id_getter collection_name
19
20
 
20
21
  define_update_method collection_name
21
22
  define_reload_method collection_name
@@ -63,13 +64,21 @@ module ActiveRecord
63
64
  collection_singular_ids = "#{collection_name.singularize}_ids"
64
65
  define_method "#{collection_singular_ids}_with_deferred_save=" do |ids|
65
66
  ids = Array.wrap(ids).reject { |id| id.blank? }
66
- new_values = self.send("#{collection_name}").klass.find(ids)
67
+ new_values = self.send("#{collection_name}_without_deferred_save").klass.find(ids)
67
68
  self.send("#{collection_name}=", new_values)
68
69
  end
69
70
  alias_method_chain :"#{collection_singular_ids}=", 'deferred_save'
70
71
  end
71
72
  end
72
73
 
74
+ def define_id_getter collection_name
75
+ collection_singular_ids = "#{collection_name.singularize}_ids"
76
+ define_method "#{collection_singular_ids}_with_deferred_save" do
77
+ self.send(collection_name).map { |e| e[:id] }
78
+ end
79
+ alias_method_chain :"#{collection_singular_ids}", 'deferred_save'
80
+ end
81
+
73
82
  def define_update_method collection_name
74
83
 
75
84
  define_method "hmwds_update_#{collection_name}" do
data/spec/db/database.yml CHANGED
@@ -1,21 +1,21 @@
1
- sqlite3:
2
- adapter: sqlite3
3
- database: test.sqlite3.db
4
-
5
- sqlite3mem:
6
- adapter: sqlite3
7
- database: ":memory:"
8
-
9
- postgresql:
10
- adapter: postgresql
11
- username: postgres
12
- password: postgres
13
- database: has_and_belongs_to_many_with_deferred_save_test
14
- min_messages: ERROR
15
-
16
- mysql:
17
- adapter: mysql
18
- host: localhost
19
- username: root
20
- password:
21
- database: has_and_belongs_to_many_with_deferred_save_test
1
+ sqlite3:
2
+ adapter: sqlite3
3
+ database: test.sqlite3.db
4
+
5
+ sqlite3mem:
6
+ adapter: sqlite3
7
+ database: ":memory:"
8
+
9
+ postgresql:
10
+ adapter: postgresql
11
+ username: postgres
12
+ password: postgres
13
+ database: has_and_belongs_to_many_with_deferred_save_test
14
+ min_messages: ERROR
15
+
16
+ mysql:
17
+ adapter: mysql
18
+ host: localhost
19
+ username: root
20
+ password:
21
+ database: has_and_belongs_to_many_with_deferred_save_test
data/spec/db/schema.rb CHANGED
@@ -1,40 +1,40 @@
1
- # This file is autogenerated. Instead of editing this file, please use the
2
- # migrations feature of ActiveRecord to incrementally modify your database, and
3
- # then regenerate this schema definition.
4
-
5
- ActiveRecord::Schema.define(:version => 1) do
6
-
7
- create_table "people", :force => true do |t|
8
- t.column "name", :string
9
- end
10
-
11
- create_table "people_rooms", :id => false, :force => true do |t|
12
- t.column "person_id", :integer
13
- t.column "room_id", :integer
14
- end
15
-
16
- create_table "rooms", :force => true do |t|
17
- t.column "name", :string
18
- t.column "maximum_occupancy", :integer
19
- end
20
-
21
- create_table "doors_rooms", :id => false, :force => true do |t|
22
- t.column "door_id", :integer
23
- t.column "room_id", :integer
24
- end
25
-
26
- create_table "doors", :force => true do |t|
27
- t.column "name", :string
28
- end
29
-
30
- create_table "tables", :force => true do |t|
31
- t.column "name", :string
32
- t.column "room_id", :integer
33
- end
34
-
35
- create_table "chairs", :force => true do |t|
36
- t.column "name", :string
37
- t.column "table_id", :integer
38
- end
39
-
40
- end
1
+ # This file is autogenerated. Instead of editing this file, please use the
2
+ # migrations feature of ActiveRecord to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+
5
+ ActiveRecord::Schema.define(:version => 1) do
6
+
7
+ create_table "people", :force => true do |t|
8
+ t.column "name", :string
9
+ end
10
+
11
+ create_table "people_rooms", :id => false, :force => true do |t|
12
+ t.column "person_id", :integer
13
+ t.column "room_id", :integer
14
+ end
15
+
16
+ create_table "rooms", :force => true do |t|
17
+ t.column "name", :string
18
+ t.column "maximum_occupancy", :integer
19
+ end
20
+
21
+ create_table "doors_rooms", :id => false, :force => true do |t|
22
+ t.column "door_id", :integer
23
+ t.column "room_id", :integer
24
+ end
25
+
26
+ create_table "doors", :force => true do |t|
27
+ t.column "name", :string
28
+ end
29
+
30
+ create_table "tables", :force => true do |t|
31
+ t.column "name", :string
32
+ t.column "room_id", :integer
33
+ end
34
+
35
+ create_table "chairs", :force => true do |t|
36
+ t.column "name", :string
37
+ t.column "table_id", :integer
38
+ end
39
+
40
+ end
@@ -1,234 +1,236 @@
1
- require "spec_helper"
2
- require 'has_and_belongs_to_many_with_deferred_save'
3
-
4
- describe "has_and_belongs_to_many_with_deferred_save" do
5
- describe "room maximum_occupancy" do
6
- before :all do
7
- @people = []
8
- @people << Person.create(:name => 'Filbert')
9
- @people << Person.create(:name => 'Miguel')
10
- @people << Person.create(:name => 'Rainer')
11
- @room = Room.new(:maximum_occupancy => 2)
12
- end
13
- after :all do
14
- Person.delete_all
15
- Room.delete_all
16
- end
17
-
18
- it "passes initial checks" do
19
- Room .count.should == 0
20
- Person.count.should == 3
21
-
22
- @room.people.should == []
23
- @room.people_without_deferred_save.should == []
24
- @room.people_without_deferred_save.object_id.should_not ==
25
- @room.unsaved_people.object_id
26
- end
27
-
28
- it "after adding people to room, it should not have saved anything to the database" do
29
- @room.people << @people[0]
30
- @room.people << @people[1]
31
-
32
- # Still not saved to the association table!
33
- Room.count_by_sql("select count(*) from people_rooms").should == 0
34
- @room.people_without_deferred_save.size. should == 0
35
- end
36
-
37
- it "but room.people.size should still report the current size of 2" do
38
- @room.people.size.should == 2 # 2 because this looks at unsaved_people and not at the database
39
- end
40
-
41
- it "after saving the model, the association should be saved in the join table" do
42
- @room.save # Only here is it actually saved to the association table!
43
- @room.errors.full_messages.should == []
44
- Room.count_by_sql("select count(*) from people_rooms").should == 2
45
- @room.people.size. should == 2
46
- @room.people_without_deferred_save.size. should == 2
47
- end
48
-
49
- it "when we try to add a 3rd person, it should add a validation error to the errors object like any other validation error" do
50
- lambda { @room.people << @people[2] }.should_not raise_error
51
- @room.people.size. should == 3
52
-
53
- Room.count_by_sql("select count(*) from people_rooms").should == 2
54
- @room.valid?
55
- @room.get_error(:people).should == "This room has reached its maximum occupancy"
56
- @room.people.size. should == 3 # Just like with normal attributes that fail validation... the attribute still contains the invalid data but we refuse to save until it is changed to something that is *valid*.
57
- end
58
-
59
- it "when we try to save, it should fail, because room.people is still invalid" do
60
- @room.save.should == false
61
- Room.count_by_sql("select count(*) from people_rooms").should == 2 # It's still not there, because it didn't pass the validation.
62
- @room.get_error(:people).should == "This room has reached its maximum occupancy"
63
- @room.people.size. should == 3
64
- @people.map {|p| p.reload; p.rooms.size}.should == [1, 1, 0]
65
- end
66
-
67
- it "when we reload, it should go back to only having 2 people in the room" do
68
- @room.reload
69
- @room.people.size. should == 2
70
- @room.people_without_deferred_save.size. should == 2
71
- @people.map {|p| p.reload; p.rooms.size}. should == [1, 1, 0]
72
- end
73
-
74
- it "if they try to go around our accessors and use the original accessors, then (and only then) will the exception be raised in before_adding_person..." do
75
- lambda do
76
- @room.people_without_deferred_save << @people[2]
77
- end.should raise_error(RuntimeError)
78
- end
79
-
80
- it "lets you bypass the validation on Room if we add the association from the other side (person.rooms <<)?" do
81
- @people[2].rooms << @room
82
- @people[2].rooms.size.should == 1
83
-
84
- # Adding it from one direction does not add it to the other object's association (@room.people), so the validation passes.
85
- @room.reload.people.size.should == 2
86
- @people[2].valid?
87
- @people[2].errors.full_messages.should == []
88
- @people[2].save.should == true
89
-
90
- # It is only after reloading that @room.people has this 3rd object, causing it to be invalid, and by then it's too late to do anything about it.
91
- @room.reload.people.size.should == 3
92
- @room.valid?.should == false
93
- end
94
-
95
- it "only if you add the validation to both sides, can you ensure that the size of the association does not exceed some limit" do
96
- @room.reload.people.size.should == 3
97
- @room.people.delete(@people[2])
98
- @room.save.should == true
99
- @room.reload.people.size.should == 2
100
- @people[2].reload.rooms.size.should == 0
101
-
102
- obj = @people[2]
103
- obj.do_extra_validation = true
104
-
105
- @people[2].rooms << @room
106
- @people[2].rooms.size.should == 1
107
-
108
- @room.reload.people.size.should == 2
109
- @people[2].valid?.should be_false
110
- @people[2].get_error(:rooms).should == "This room has reached its maximum occupancy"
111
- @room.reload.people.size.should == 2
112
- end
113
-
114
- it "still lets you do find" do
115
- @room.people2. find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
116
- @room.people_without_deferred_save.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
117
- @room.people2.first(:conditions => {:name => 'Filbert'}).should == @people[0]
118
- @room.people_without_deferred_save.first(:conditions => {:name => 'Filbert'}).should == @people[0]
119
- @room.people_without_deferred_save.find_by_name('Filbert').should == @people[0]
120
-
121
- @room.people.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
122
- @room.people.first(:conditions => {:name => 'Filbert'}). should == @people[0]
123
- @room.people.last(:conditions => {:name => 'Filbert'}). should == @people[0]
124
- @room.people.first. should == @people[0]
125
- @room.people.last. should == @people[1] # @people[2] was removed before
126
- @room.people.find_by_name('Filbert'). should == @people[0]
127
- end
128
-
129
- it "should be dumpable with Marshal" do
130
- lambda { Marshal.dump(@room.people) }.should_not raise_exception
131
- lambda { Marshal.dump(Room.new.people) }.should_not raise_exception
132
- end
133
-
134
- it "should detect difference in association" do
135
- @room = Room.find(@room.id)
136
- @room.bs_diff_before_module.should be_nil
137
- @room.bs_diff_after_module.should be_nil
138
- @room.bs_diff_method.should be_nil
139
-
140
- @room.people.size.should == 2
141
- @room.people = [@room.people[0]]
142
- @room.save.should be_true
143
-
144
- @room.bs_diff_before_module.should be_true
145
- @room.bs_diff_after_module.should be_true
146
- if ar3?
147
- @room.bs_diff_method.should be_nil # Rails 3.2: nil (before_save filter is not supported)
148
- else
149
- @room.bs_diff_method.should be_true
150
- end
151
- end
152
-
153
- it "should act like original habtm when using ID array with array manipulation" do
154
- @room = Room.find(@room.id)
155
- @room.people = [@people[0]]
156
- @room.save
157
- @room = Room.find(@room.id) # we don't want to let id and object setters interfere with each other
158
- @room.people2_ids << @people[1].id
159
- @room.people2_ids.should == [@people[0].id] # ID array manipulation is ignored
160
-
161
- @room.person_ids.size.should == 1
162
- @room.person_ids << @people[1].id
163
- @room.person_ids.should == [@people[0].id]
164
- Room.find(@room.id).person_ids.should == [@people[0].id]
165
- @room.save.should be_true
166
- Room.find(@room.id).person_ids.should == [@people[0].id] # ID array manipulation is ignored, too
167
- end
168
-
169
- it "should work with id setters" do
170
- @room = Room.find(@room.id)
171
- @room.people = [@people[0], @people[1]]
172
- @room.save
173
- @room = Room.find(@room.id)
174
- @room.person_ids.should == [@people[0].id, @people[1].id]
175
- @room.person_ids = [@people[1].id]
176
- @room.person_ids.should == [@people[1].id]
177
- Room.find(@room.id).person_ids.should == [@people[0].id,@people[1].id]
178
- @room.save.should be_true
179
- Room.find(@room.id).person_ids.should == [@people[1].id]
180
- end
181
-
182
- it "should work with multiple id setters and object setters" do
183
- @room = Room.find(@room.id)
184
- @room.people = [@people[0]]
185
- @room.person_ids = [@people[0].id, @people[1].id]
186
- @room.people = [@people[1]]
187
- @room.person_ids = [@people[0].id, @people[1].id]
188
- @room.people = [@people[1]]
189
- @room.save
190
- @room = Room.find(@room.id)
191
- @room.people.should == [@people[1]]
192
- end
193
-
194
- it "should give klass in AR 3" do
195
- if ar3?
196
- @room.people.klass.should == Person
197
- end
198
- end
199
-
200
- it "should give aliased_table_name in AR 2.3" do
201
- unless ar3?
202
- @room.people.aliased_table_name.should == "people"
203
- end
204
- end
205
- end
206
-
207
- describe "doors" do
208
- before :all do
209
- @rooms = []
210
- @rooms << Room.create(:name => 'Kitchen', :maximum_occupancy => 1)
211
- @rooms << Room.create(:name => 'Dining room', :maximum_occupancy => 10)
212
- @door = Door.new(:name => 'Kitchen-Dining-room door')
213
- end
214
-
215
- it "passes initial checks" do
216
- Room.count.should == 2
217
- Door.count.should == 0
218
-
219
- @door.rooms.should == []
220
- @door.rooms_without_deferred_save.should == []
221
- end
222
-
223
- it "the association has an include? method" do
224
- @door.rooms << @rooms[0]
225
- @door.rooms.include?(@rooms[0]).should be_true
226
- @door.rooms.include?(@rooms[1]).should be_false
227
- end
228
- end
229
-
230
- def ar3?
231
- ActiveRecord::VERSION::STRING >= "3"
232
- end
233
-
234
- end
1
+ require "spec_helper"
2
+ require 'has_and_belongs_to_many_with_deferred_save'
3
+
4
+ describe "has_and_belongs_to_many_with_deferred_save" do
5
+ describe "room maximum_occupancy" do
6
+ before :all do
7
+ @people = []
8
+ @people << Person.create(:name => 'Filbert')
9
+ @people << Person.create(:name => 'Miguel')
10
+ @people << Person.create(:name => 'Rainer')
11
+ @room = Room.new(:maximum_occupancy => 2)
12
+ end
13
+ after :all do
14
+ Person.delete_all
15
+ Room.delete_all
16
+ end
17
+
18
+ it "passes initial checks" do
19
+ Room .count.should == 0
20
+ Person.count.should == 3
21
+
22
+ @room.people.should == []
23
+ @room.people_without_deferred_save.should == []
24
+ @room.people_without_deferred_save.object_id.should_not ==
25
+ @room.unsaved_people.object_id
26
+ end
27
+
28
+ it "after adding people to room, it should not have saved anything to the database" do
29
+ @room.people << @people[0]
30
+ @room.people << @people[1]
31
+
32
+ # Still not saved to the association table!
33
+ Room.count_by_sql("select count(*) from people_rooms").should == 0
34
+ @room.people_without_deferred_save.size. should == 0
35
+ end
36
+
37
+ it "but room.people.size should still report the current size of 2" do
38
+ @room.people.size.should == 2 # 2 because this looks at unsaved_people and not at the database
39
+ end
40
+
41
+ it "after saving the model, the association should be saved in the join table" do
42
+ @room.save # Only here is it actually saved to the association table!
43
+ @room.errors.full_messages.should == []
44
+ Room.count_by_sql("select count(*) from people_rooms").should == 2
45
+ @room.people.size. should == 2
46
+ @room.people_without_deferred_save.size. should == 2
47
+ end
48
+
49
+ it "when we try to add a 3rd person, it should add a validation error to the errors object like any other validation error" do
50
+ lambda { @room.people << @people[2] }.should_not raise_error
51
+ @room.people.size. should == 3
52
+
53
+ Room.count_by_sql("select count(*) from people_rooms").should == 2
54
+ @room.valid?
55
+ @room.get_error(:people).should == "This room has reached its maximum occupancy"
56
+ @room.people.size. should == 3 # Just like with normal attributes that fail validation... the attribute still contains the invalid data but we refuse to save until it is changed to something that is *valid*.
57
+ end
58
+
59
+ it "when we try to save, it should fail, because room.people is still invalid" do
60
+ @room.save.should == false
61
+ Room.count_by_sql("select count(*) from people_rooms").should == 2 # It's still not there, because it didn't pass the validation.
62
+ @room.get_error(:people).should == "This room has reached its maximum occupancy"
63
+ @room.people.size. should == 3
64
+ @people.map {|p| p.reload; p.rooms.size}.should == [1, 1, 0]
65
+ end
66
+
67
+ it "when we reload, it should go back to only having 2 people in the room" do
68
+ @room.reload
69
+ @room.people.size. should == 2
70
+ @room.people_without_deferred_save.size. should == 2
71
+ @people.map {|p| p.reload; p.rooms.size}. should == [1, 1, 0]
72
+ end
73
+
74
+ it "if they try to go around our accessors and use the original accessors, then (and only then) will the exception be raised in before_adding_person..." do
75
+ lambda do
76
+ @room.people_without_deferred_save << @people[2]
77
+ end.should raise_error(RuntimeError)
78
+ end
79
+
80
+ it "lets you bypass the validation on Room if we add the association from the other side (person.rooms <<)?" do
81
+ @people[2].rooms << @room
82
+ @people[2].rooms.size.should == 1
83
+
84
+ # Adding it from one direction does not add it to the other object's association (@room.people), so the validation passes.
85
+ @room.reload.people.size.should == 2
86
+ @people[2].valid?
87
+ @people[2].errors.full_messages.should == []
88
+ @people[2].save.should == true
89
+
90
+ # It is only after reloading that @room.people has this 3rd object, causing it to be invalid, and by then it's too late to do anything about it.
91
+ @room.reload.people.size.should == 3
92
+ @room.valid?.should == false
93
+ end
94
+
95
+ it "only if you add the validation to both sides, can you ensure that the size of the association does not exceed some limit" do
96
+ @room.reload.people.size.should == 3
97
+ @room.people.delete(@people[2])
98
+ @room.save.should == true
99
+ @room.reload.people.size.should == 2
100
+ @people[2].reload.rooms.size.should == 0
101
+
102
+ obj = @people[2]
103
+ obj.do_extra_validation = true
104
+
105
+ @people[2].rooms << @room
106
+ @people[2].rooms.size.should == 1
107
+
108
+ @room.reload.people.size.should == 2
109
+ @people[2].valid?.should be_false
110
+ @people[2].get_error(:rooms).should == "This room has reached its maximum occupancy"
111
+ @room.reload.people.size.should == 2
112
+ end
113
+
114
+ it "still lets you do find" do
115
+ if ar4?
116
+ @room.people2.where(:name => 'Filbert').first.should == @people[0]
117
+ @room.people_without_deferred_save.where(:name => 'Filbert').first.should == @people[0]
118
+ @room.people.where(:name => 'Filbert').first.should == @people[0]
119
+ else
120
+ @room.people2. find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
121
+ @room.people_without_deferred_save.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
122
+ @room.people2.first(:conditions => {:name => 'Filbert'}).should == @people[0]
123
+ @room.people_without_deferred_save.first(:conditions => {:name => 'Filbert'}).should == @people[0]
124
+
125
+ @room.people.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
126
+ @room.people.first(:conditions => {:name => 'Filbert'}). should == @people[0]
127
+ @room.people.last(:conditions => {:name => 'Filbert'}). should == @people[0]
128
+ end
129
+
130
+ @room.people.first. should == @people[0]
131
+ @room.people.last. should == @people[1] # @people[2] was removed before
132
+ @room.people.find_by_name('Filbert'). should == @people[0]
133
+ @room.people_without_deferred_save.find_by_name('Filbert').should == @people[0]
134
+ end
135
+
136
+ it "should be dumpable with Marshal" do
137
+ lambda { Marshal.dump(@room.people) }.should_not raise_exception
138
+ lambda { Marshal.dump(Room.new.people) }.should_not raise_exception
139
+ end
140
+
141
+ it "should detect difference in association" do
142
+ @room = Room.find(@room.id)
143
+ @room.bs_diff_before_module.should be_nil
144
+ @room.bs_diff_after_module.should be_nil
145
+ @room.bs_diff_method.should be_nil
146
+
147
+ @room.people.size.should == 2
148
+ @room.people = [@room.people[0]]
149
+ @room.save.should be_true
150
+
151
+ @room.bs_diff_before_module.should be_true
152
+ @room.bs_diff_after_module.should be_true
153
+ if ar2?
154
+ @room.bs_diff_method.should be_true
155
+ else
156
+ @room.bs_diff_method.should be_nil # Rails 3.2: nil (before_save filter is not supported)
157
+ end
158
+ end
159
+
160
+ it "should act like original habtm when using ID array with array manipulation" do
161
+ @room = Room.find(@room.id)
162
+ @room.people = [@people[0]]
163
+ @room.save
164
+ @room = Room.find(@room.id) # we don't want to let id and object setters interfere with each other
165
+ @room.people2_ids << @people[1].id
166
+ @room.people2_ids.should == [@people[0].id] # ID array manipulation is ignored
167
+
168
+ @room.person_ids.size.should == 1
169
+ @room.person_ids << @people[1].id
170
+ @room.person_ids.should == [@people[0].id]
171
+ Room.find(@room.id).person_ids.should == [@people[0].id]
172
+ @room.save.should be_true
173
+ Room.find(@room.id).person_ids.should == [@people[0].id] # ID array manipulation is ignored, too
174
+ end
175
+
176
+ it "should work with id setters" do
177
+ @room = Room.find(@room.id)
178
+ @room.people = [@people[0], @people[1]]
179
+ @room.save
180
+ @room = Room.find(@room.id)
181
+ @room.person_ids.should == [@people[0].id, @people[1].id]
182
+ @room.person_ids = [@people[1].id]
183
+ @room.person_ids.should == [@people[1].id]
184
+ Room.find(@room.id).person_ids.should == [@people[0].id,@people[1].id]
185
+ @room.save.should be_true
186
+ Room.find(@room.id).person_ids.should == [@people[1].id]
187
+ end
188
+
189
+ it "should work with multiple id setters and object setters" do
190
+ @room = Room.find(@room.id)
191
+ @room.people = [@people[0]]
192
+ @room.person_ids = [@people[0].id, @people[1].id]
193
+ @room.people = [@people[1]]
194
+ @room.person_ids = [@people[0].id, @people[1].id]
195
+ @room.people = [@people[1]]
196
+ @room.save
197
+ @room = Room.find(@room.id)
198
+ @room.people.should == [@people[1]]
199
+ end
200
+
201
+ it "should give klass in AR 3/4" do
202
+ unless ar2?
203
+ @room.people.klass.should == Person
204
+ end
205
+ end
206
+
207
+ it "should give aliased_table_name in AR 2.3" do
208
+ if ar2?
209
+ @room.people.aliased_table_name.should == "people"
210
+ end
211
+ end
212
+ end
213
+
214
+ describe "doors" do
215
+ before :all do
216
+ @rooms = []
217
+ @rooms << Room.create(:name => 'Kitchen', :maximum_occupancy => 1)
218
+ @rooms << Room.create(:name => 'Dining room', :maximum_occupancy => 10)
219
+ @door = Door.new(:name => 'Kitchen-Dining-room door')
220
+ end
221
+
222
+ it "passes initial checks" do
223
+ Room.count.should == 2
224
+ Door.count.should == 0
225
+
226
+ @door.rooms.should == []
227
+ @door.rooms_without_deferred_save.should == []
228
+ end
229
+
230
+ it "the association has an include? method" do
231
+ @door.rooms << @rooms[0]
232
+ @door.rooms.include?(@rooms[0]).should be_true
233
+ @door.rooms.include?(@rooms[1]).should be_false
234
+ end
235
+ end
236
+ end