active_repository 0.0.1 → 0.0.3
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 +1 -0
- data/.travis.yml +10 -0
- data/README.md +23 -3
- data/Rakefile +10 -0
- data/active_repository.gemspec +7 -3
- data/lib/active_repository/associations.rb +2 -7
- data/lib/active_repository/base.rb +40 -150
- data/lib/active_repository/finders.rb +101 -0
- data/lib/active_repository/sql_query_executor.rb +26 -14
- data/lib/active_repository/version.rb +1 -1
- data/lib/active_repository/write_support.rb +31 -14
- data/lib/active_repository/writers.rb +67 -0
- data/spec/active_repository/associations_spec.rb +348 -0
- data/spec/active_repository/base_spec.rb +68 -2
- data/spec/active_repository/sql_query_executor_spec.rb +0 -1
- data/spec/support/shared_examples.rb +78 -19
- data/support/mongoid.yml +6 -0
- metadata +30 -8
@@ -0,0 +1,348 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'active_repository'
|
3
|
+
require 'active_record'
|
4
|
+
require 'mongoid'
|
5
|
+
|
6
|
+
describe ActiveRepository::Base, "associations" do
|
7
|
+
|
8
|
+
before do
|
9
|
+
class Country < ActiveRecord::Base
|
10
|
+
extend ActiveRepository::Associations::ActiveRecordExtensions
|
11
|
+
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
12
|
+
connection.create_table(:countries, :force => true) {}
|
13
|
+
end
|
14
|
+
|
15
|
+
class School < ActiveRecord::Base
|
16
|
+
extend ActiveRepository::Associations::ActiveRecordExtensions
|
17
|
+
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
18
|
+
connection.create_table(:schools, :force => true) do |t|
|
19
|
+
t.integer :city_id
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class City < ActiveRepository::Base
|
24
|
+
City.set_model_class(self)
|
25
|
+
City.set_save_in_memory(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
class Author < ActiveRepository::Base
|
29
|
+
Author.set_model_class(self)
|
30
|
+
Author.set_save_in_memory(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
class Book < ActiveRecord::Base
|
34
|
+
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
35
|
+
connection.create_table(:books, :force => true) do |t|
|
36
|
+
t.integer :author_id
|
37
|
+
t.boolean :published
|
38
|
+
end
|
39
|
+
|
40
|
+
if Object.const_defined?(:ActiveModel)
|
41
|
+
scope :published, {:conditions => {:published => true}}
|
42
|
+
else
|
43
|
+
named_scope :published, {:conditions => {:published => true}}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
after do
|
49
|
+
Object.send :remove_const, :City
|
50
|
+
Object.send :remove_const, :Author
|
51
|
+
Object.send :remove_const, :Country
|
52
|
+
Object.send :remove_const, :School
|
53
|
+
Object.send :remove_const, :Book
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#has_many" do
|
57
|
+
|
58
|
+
context "with ActiveRecord children" do
|
59
|
+
before do
|
60
|
+
@included_book_1 = Book.create! :author_id => 1, :published => true
|
61
|
+
@included_book_2 = Book.create! :author_id => 1, :published => false
|
62
|
+
@excluded_book = Book.create! :author_id => 2, :published => true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "find the correct records" do
|
66
|
+
Author.has_many :books
|
67
|
+
author = Author.create :id => 1
|
68
|
+
author.books.should == [@included_book_1, @included_book_2]
|
69
|
+
end
|
70
|
+
|
71
|
+
it "return a scope so that we can apply further scopes" do
|
72
|
+
Author.has_many :books
|
73
|
+
author = Author.create :id => 1
|
74
|
+
author.books.published.should == [@included_book_1]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "with ActiveHash children" do
|
79
|
+
before do
|
80
|
+
Author.field :city_id
|
81
|
+
@included_author_1 = Author.create :city_id => 1
|
82
|
+
@included_author_2 = Author.create :city_id => 1
|
83
|
+
@excluded_author = Author.create :city_id => 2
|
84
|
+
end
|
85
|
+
|
86
|
+
it "find the correct records" do
|
87
|
+
City.has_many :authors
|
88
|
+
city = City.create :id => 1
|
89
|
+
city.authors.should == [@included_author_1, @included_author_2]
|
90
|
+
end
|
91
|
+
|
92
|
+
it "uses the correct class name when passed" do
|
93
|
+
City.has_many :writers, :class_name => "Author"
|
94
|
+
city = City.create :id => 1
|
95
|
+
city.writers.should == [@included_author_1, @included_author_2]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
describe ActiveRepository::Associations::ActiveRecordExtensions do
|
102
|
+
|
103
|
+
describe "#belongs_to_active_repository" do
|
104
|
+
context "setting by id" do
|
105
|
+
it "finds the correct records" do
|
106
|
+
School.belongs_to_active_repository :city
|
107
|
+
city = City.create
|
108
|
+
school = School.create :city_id => city.id
|
109
|
+
school.city.should == city
|
110
|
+
end
|
111
|
+
|
112
|
+
it "returns nil when the record does not exist" do
|
113
|
+
School.belongs_to_active_repository :city
|
114
|
+
school = School.create! :city_id => nil
|
115
|
+
school.city.should be_nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "setting by association" do
|
120
|
+
it "finds the correct records" do
|
121
|
+
School.belongs_to_active_repository :city
|
122
|
+
city = City.create
|
123
|
+
school = School.create :city => city
|
124
|
+
school.city.should == city
|
125
|
+
end
|
126
|
+
|
127
|
+
it "returns nil when the record does not exist" do
|
128
|
+
School.belongs_to_active_repository :city
|
129
|
+
school = School.create! :city => nil
|
130
|
+
school.city.should be_nil
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
it "finds active record metadata for this association" do
|
135
|
+
School.belongs_to_active_repository :city
|
136
|
+
association = School.reflect_on_association(:city)
|
137
|
+
association.should_not be_nil
|
138
|
+
association.klass.name.should == City.name
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "#belongs_to" do
|
144
|
+
|
145
|
+
context "with an ActiveRecord parent" do
|
146
|
+
it "find the correct records" do
|
147
|
+
City.belongs_to :country
|
148
|
+
country = Country.create
|
149
|
+
city = City.create :country_id => country.id
|
150
|
+
city.country.should == country
|
151
|
+
end
|
152
|
+
|
153
|
+
it "returns nil when the record does not exist" do
|
154
|
+
City.belongs_to :country
|
155
|
+
city = City.create :country_id => 123
|
156
|
+
city.country.should be_nil
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "with an ActiveHash parent" do
|
161
|
+
it "find the correct records" do
|
162
|
+
Author.belongs_to :city
|
163
|
+
city = City.create
|
164
|
+
author = Author.create :city_id => city.id
|
165
|
+
author.city.should == city
|
166
|
+
end
|
167
|
+
|
168
|
+
it "returns nil when the record does not exist" do
|
169
|
+
Author.belongs_to :city
|
170
|
+
author = Author.create :city_id => 123
|
171
|
+
author.city.should be_nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "#parent=" do
|
176
|
+
before do
|
177
|
+
Author.belongs_to :city
|
178
|
+
@city = City.create :id => 1
|
179
|
+
end
|
180
|
+
|
181
|
+
it "sets the underlying id of the parent" do
|
182
|
+
author = Author.new
|
183
|
+
author.city = @city
|
184
|
+
author.city_id.should == @city.id
|
185
|
+
end
|
186
|
+
|
187
|
+
it "works from hash assignment" do
|
188
|
+
author = Author.new :city => @city
|
189
|
+
author.city_id.should == @city.id
|
190
|
+
author.city.should == @city
|
191
|
+
end
|
192
|
+
|
193
|
+
it "works with nil" do
|
194
|
+
author = Author.new :city => @city
|
195
|
+
author.city_id.should == @city.id
|
196
|
+
author.city.should == @city
|
197
|
+
|
198
|
+
author.city = nil
|
199
|
+
author.city_id.should be_nil
|
200
|
+
author.city.should be_nil
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "with a different foreign key" do
|
205
|
+
before do
|
206
|
+
Author.belongs_to :residence, :class_name => "City", :foreign_key => "city_id"
|
207
|
+
@city = City.create :id => 1
|
208
|
+
end
|
209
|
+
|
210
|
+
it "works" do
|
211
|
+
author = Author.new
|
212
|
+
author.residence = @city
|
213
|
+
author.city_id.should == @city.id
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "#has_one" do
|
219
|
+
context "with ActiveRecord children" do
|
220
|
+
before do
|
221
|
+
Author.has_one :book
|
222
|
+
end
|
223
|
+
|
224
|
+
it "find the correct records" do
|
225
|
+
book = Book.create! :author_id => 1, :published => true
|
226
|
+
author = Author.create :id => 1
|
227
|
+
author.book.should == book
|
228
|
+
end
|
229
|
+
|
230
|
+
it "returns nil when there is no record" do
|
231
|
+
author = Author.create :id => 1
|
232
|
+
author.book.should be_nil
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "with ActiveHash children" do
|
237
|
+
before do
|
238
|
+
City.has_one :author
|
239
|
+
Author.field :city_id
|
240
|
+
end
|
241
|
+
|
242
|
+
it "find the correct records" do
|
243
|
+
city = City.create :id => 1
|
244
|
+
author = Author.create :city_id => 1
|
245
|
+
city.author.should == author
|
246
|
+
end
|
247
|
+
|
248
|
+
it "returns nil when there are no records" do
|
249
|
+
city = City.create :id => 1
|
250
|
+
city.author.should be_nil
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "#marked_for_destruction?" do
|
256
|
+
it "should return false" do
|
257
|
+
City.new.marked_for_destruction?.should == false
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
describe "Multiple ORM" do
|
262
|
+
before do
|
263
|
+
Object.send :remove_const, :City
|
264
|
+
# Object.send :remove_const, :Author
|
265
|
+
Object.send :remove_const, :Country
|
266
|
+
# Object.send :remove_const, :School
|
267
|
+
# Object.send :remove_const, :Book
|
268
|
+
|
269
|
+
class Country < ActiveRepository::Base
|
270
|
+
Country.set_model_class(Country)
|
271
|
+
Country.set_save_in_memory(true)
|
272
|
+
has_many :states
|
273
|
+
end
|
274
|
+
|
275
|
+
class StateModel < ActiveRecord::Base
|
276
|
+
self.table_name = 'states'
|
277
|
+
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
278
|
+
connection.create_table(:states) do |t|
|
279
|
+
t.integer :country_id
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
class State < ActiveRepository::Base
|
284
|
+
State.set_model_class(StateModel)
|
285
|
+
State.set_save_in_memory(false)
|
286
|
+
belongs_to :country
|
287
|
+
has_many :cities
|
288
|
+
|
289
|
+
fields :country_id, :city_id
|
290
|
+
end
|
291
|
+
|
292
|
+
Mongoid.load!("support/mongoid.yml", :development)
|
293
|
+
|
294
|
+
class CityModel
|
295
|
+
include Mongoid::Document
|
296
|
+
store_in collection: "countries"
|
297
|
+
field :state_id
|
298
|
+
end
|
299
|
+
|
300
|
+
class City < ActiveRepository::Base
|
301
|
+
City.set_model_class(CityModel)
|
302
|
+
City.set_save_in_memory(false)
|
303
|
+
belongs_to :state
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
after do
|
308
|
+
Object.send :remove_const, :CityModel
|
309
|
+
Object.send :remove_const, :State
|
310
|
+
Object.send :remove_const, :StateModel
|
311
|
+
end
|
312
|
+
|
313
|
+
context ActiveRepository do
|
314
|
+
it "relates with ActiveRecord models" do
|
315
|
+
country = Country.create
|
316
|
+
state = State.create(:country_id => country.id)
|
317
|
+
|
318
|
+
country.states.should == [state]
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
context ActiveRecord do
|
323
|
+
it "relates with ActiveRepository objects" do
|
324
|
+
country = Country.create
|
325
|
+
state = State.create(:country_id => country.id)
|
326
|
+
|
327
|
+
state.country.should == country
|
328
|
+
end
|
329
|
+
|
330
|
+
it "relates with Mongoid models" do
|
331
|
+
state = State.create
|
332
|
+
city = City.create(:state_id => state.id)
|
333
|
+
|
334
|
+
state.cities.should == [city]
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
context Mongoid do
|
339
|
+
it "relates with ActiveRecord models" do
|
340
|
+
state = State.create
|
341
|
+
city = City.create(:state_id => state.id)
|
342
|
+
|
343
|
+
city.state.should == state
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
end
|
@@ -2,8 +2,8 @@ require 'spec_helper'
|
|
2
2
|
require 'support/shared_examples'
|
3
3
|
|
4
4
|
require 'active_repository'
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require 'active_record'
|
6
|
+
require 'mongoid'
|
7
7
|
|
8
8
|
describe ActiveRepository, "Base" do
|
9
9
|
|
@@ -120,4 +120,70 @@ describe ActiveRepository, "Base" do
|
|
120
120
|
it_behaves_like '.transaction'
|
121
121
|
it_behaves_like '.delete_all'
|
122
122
|
end
|
123
|
+
|
124
|
+
context "mongoid" do
|
125
|
+
before do
|
126
|
+
Country.fields :name, :monarch, :language
|
127
|
+
|
128
|
+
Mongoid.load!("support/mongoid.yml", :development)
|
129
|
+
|
130
|
+
class CountryModel
|
131
|
+
include Mongoid::Document
|
132
|
+
|
133
|
+
store_in collection: "countries"
|
134
|
+
|
135
|
+
field :name
|
136
|
+
field :monarch
|
137
|
+
field :language
|
138
|
+
field :_id, type: Integer, default: -> { CountryModel.last ? CountryModel.last.id + 1 : 1 }
|
139
|
+
field :updated_at
|
140
|
+
field :created_at
|
141
|
+
end
|
142
|
+
|
143
|
+
Country.set_model_class(CountryModel)
|
144
|
+
Country.set_save_in_memory(false)
|
145
|
+
|
146
|
+
Country.delete_all
|
147
|
+
|
148
|
+
Country.create(:id => 1, :name => "US", :language => 'English')
|
149
|
+
Country.create(:id => 2, :name => "Canada", :language => 'English', :monarch => "The Crown of England")
|
150
|
+
Country.create(:id => 3, :name => "Mexico", :language => 'Spanish')
|
151
|
+
Country.create(:id => 4, :name => "UK", :language => 'English', :monarch => "The Crown of England")
|
152
|
+
Country.create(:id => 5, :name => "Brazil")
|
153
|
+
end
|
154
|
+
|
155
|
+
after do
|
156
|
+
Object.send :remove_const, :CountryModel
|
157
|
+
end
|
158
|
+
|
159
|
+
it_behaves_like '.update_attributes'
|
160
|
+
it_behaves_like '.all'
|
161
|
+
it_behaves_like '.where'
|
162
|
+
it_behaves_like '.exists?'
|
163
|
+
it_behaves_like '.count'
|
164
|
+
it_behaves_like '.first'
|
165
|
+
it_behaves_like '.last'
|
166
|
+
it_behaves_like '.find'
|
167
|
+
it_behaves_like '.find_by_id'
|
168
|
+
it_behaves_like 'custom finders'
|
169
|
+
it_behaves_like '#method_missing'
|
170
|
+
it_behaves_like '#attributes'
|
171
|
+
it_behaves_like 'reader_methods'
|
172
|
+
it_behaves_like 'interrogator methods'
|
173
|
+
it_behaves_like '#id'
|
174
|
+
it_behaves_like '#quoted_id'
|
175
|
+
it_behaves_like '#to_param'
|
176
|
+
it_behaves_like '#persisted?'
|
177
|
+
it_behaves_like '#eql?'
|
178
|
+
it_behaves_like '#=='
|
179
|
+
it_behaves_like '#hash'
|
180
|
+
it_behaves_like '#readonly?'
|
181
|
+
it_behaves_like '#cache_key'
|
182
|
+
it_behaves_like '#save'
|
183
|
+
it_behaves_like '.create'
|
184
|
+
it_behaves_like '#valid?'
|
185
|
+
it_behaves_like '#new_record?'
|
186
|
+
it_behaves_like '.transaction'
|
187
|
+
it_behaves_like '.delete_all'
|
188
|
+
end
|
123
189
|
end
|
@@ -30,10 +30,9 @@ shared_examples ".all" do
|
|
30
30
|
|
31
31
|
it "populates the data correctly" do
|
32
32
|
records = Country.all
|
33
|
-
records.
|
34
|
-
records.
|
35
|
-
records.
|
36
|
-
records.last.name.should == "Brazil"
|
33
|
+
records.should include(Country.first)
|
34
|
+
records.should include(Country.last)
|
35
|
+
records.size.should == 5
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
@@ -72,12 +71,13 @@ end
|
|
72
71
|
|
73
72
|
shared_examples ".exists?" do
|
74
73
|
it "checks if a record exists" do
|
75
|
-
id = Country.last.id
|
74
|
+
id = Country.last.id
|
76
75
|
|
77
76
|
Country.delete_all
|
78
77
|
Country.exists?(id).should be_false
|
79
78
|
|
80
|
-
country = Country.create(:
|
79
|
+
country = Country.create(:name => "France")
|
80
|
+
id = country.id
|
81
81
|
|
82
82
|
Country.exists?(id).should be_true
|
83
83
|
end
|
@@ -120,7 +120,11 @@ shared_examples ".find" do
|
|
120
120
|
|
121
121
|
context "with :all" do
|
122
122
|
it "returns all records" do
|
123
|
-
Country.find(:all)
|
123
|
+
records = Country.find(:all)
|
124
|
+
|
125
|
+
records.should include(Country.first)
|
126
|
+
records.should include(Country.last)
|
127
|
+
records.size.should == 5
|
124
128
|
end
|
125
129
|
end
|
126
130
|
|
@@ -446,9 +450,13 @@ shared_examples "#cache_key" do
|
|
446
450
|
end
|
447
451
|
|
448
452
|
it 'should use the record\'s updated_at if present' do
|
449
|
-
country = Country.create(:
|
453
|
+
country = Country.create(:name => "foo")
|
450
454
|
|
451
|
-
|
455
|
+
id = Country.last.id
|
456
|
+
|
457
|
+
date_string = country.updated_at.nil? ? "" : "-#{country.updated_at.to_s(:number)}"
|
458
|
+
|
459
|
+
Country.first.cache_key.should == "countries/#{id}#{date_string}"
|
452
460
|
end
|
453
461
|
|
454
462
|
it 'should use "new" instead of the id for a new record' do
|
@@ -467,7 +475,16 @@ shared_examples "#save" do
|
|
467
475
|
country = Country.new :id => 1, :name => "foo", :monarch => nil, :language => nil
|
468
476
|
country.persist.should be_true
|
469
477
|
country.reload
|
470
|
-
|
478
|
+
|
479
|
+
countries_attributes = Country.all.map(&:attributes)
|
480
|
+
countries_attributes.delete(:created_at)
|
481
|
+
countries_attributes.delete(:updated_at)
|
482
|
+
|
483
|
+
expected_attributes = [country].map(&:attributes)
|
484
|
+
expected_attributes.delete(:created_at)
|
485
|
+
expected_attributes.delete(:updated_at)
|
486
|
+
|
487
|
+
countries_attributes.should == expected_attributes
|
471
488
|
end
|
472
489
|
end
|
473
490
|
|
@@ -479,16 +496,31 @@ shared_examples ".create" do
|
|
479
496
|
|
480
497
|
it "works with no args" do
|
481
498
|
Country.all.should be_empty
|
482
|
-
country = Country.create
|
483
|
-
|
499
|
+
country = Country.create
|
500
|
+
|
501
|
+
country.id.should == Country.last.id
|
484
502
|
end
|
485
503
|
|
486
504
|
it "adds the new object to the data collection" do
|
487
505
|
Country.all.should be_empty
|
488
|
-
country = Country.create :
|
489
|
-
country.id.should ==
|
506
|
+
country = Country.create :name => "foo"
|
507
|
+
country.id.should == Country.last.id
|
490
508
|
country.name.should == "foo"
|
491
|
-
|
509
|
+
|
510
|
+
countries_attributes = Country.all.map(&:attributes)
|
511
|
+
expected_attributes = [country].map(&:attributes)
|
512
|
+
|
513
|
+
countries_attributes.each do |a|
|
514
|
+
a.delete(:created_at)
|
515
|
+
a.delete(:updated_at)
|
516
|
+
end
|
517
|
+
|
518
|
+
expected_attributes.each do |a|
|
519
|
+
a.delete(:created_at)
|
520
|
+
a.delete(:updated_at)
|
521
|
+
end
|
522
|
+
|
523
|
+
countries_attributes.should == expected_attributes
|
492
524
|
end
|
493
525
|
|
494
526
|
it "adds an auto-incrementing id if the id is nil" do
|
@@ -509,11 +541,24 @@ shared_examples ".create" do
|
|
509
541
|
|
510
542
|
it "adds the new object to the data collection" do
|
511
543
|
Country.all.should be_empty
|
512
|
-
country = Country.create :
|
513
|
-
country.id.should ==
|
544
|
+
country = Country.create :name => "foo"
|
545
|
+
country.id.should == Country.last.id
|
514
546
|
country.name.should == "foo"
|
515
547
|
|
516
|
-
Country.all.
|
548
|
+
countries_attributes = Country.all.map(&:attributes)
|
549
|
+
expected_attributes = [country].map(&:attributes)
|
550
|
+
|
551
|
+
countries_attributes.each do |a|
|
552
|
+
a.delete(:created_at)
|
553
|
+
a.delete(:updated_at)
|
554
|
+
end
|
555
|
+
|
556
|
+
expected_attributes.each do |a|
|
557
|
+
a.delete(:created_at)
|
558
|
+
a.delete(:updated_at)
|
559
|
+
end
|
560
|
+
|
561
|
+
countries_attributes.should == expected_attributes
|
517
562
|
end
|
518
563
|
|
519
564
|
it "updates count" do
|
@@ -575,7 +620,21 @@ shared_examples ".delete_all" do
|
|
575
620
|
it "clears out all record" do
|
576
621
|
country1 = Country.create
|
577
622
|
country2 = Country.create
|
578
|
-
|
623
|
+
|
624
|
+
countries_attributes = Country.all.map(&:attributes)
|
625
|
+
expected_attributes = [country1, country2].map(&:attributes)
|
626
|
+
|
627
|
+
countries_attributes.each do |a|
|
628
|
+
a.delete(:created_at)
|
629
|
+
a.delete(:updated_at)
|
630
|
+
end
|
631
|
+
|
632
|
+
expected_attributes.each do |a|
|
633
|
+
a.delete(:created_at)
|
634
|
+
a.delete(:updated_at)
|
635
|
+
end
|
636
|
+
|
637
|
+
countries_attributes.should == expected_attributes
|
579
638
|
Country.delete_all
|
580
639
|
Country.all.should be_empty
|
581
640
|
end
|