mongo_mapper 0.5.8 → 0.6.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 (47) hide show
  1. data/Rakefile +4 -4
  2. data/VERSION +1 -1
  3. data/bin/mmconsole +10 -5
  4. data/lib/mongo_mapper.rb +28 -5
  5. data/lib/mongo_mapper/associations.rb +113 -12
  6. data/lib/mongo_mapper/associations/base.rb +24 -9
  7. data/lib/mongo_mapper/associations/belongs_to_polymorphic_proxy.rb +1 -1
  8. data/lib/mongo_mapper/associations/belongs_to_proxy.rb +1 -1
  9. data/lib/mongo_mapper/associations/many_documents_as_proxy.rb +2 -2
  10. data/lib/mongo_mapper/associations/many_documents_proxy.rb +7 -2
  11. data/lib/mongo_mapper/associations/many_embedded_proxy.rb +22 -36
  12. data/lib/mongo_mapper/associations/proxy.rb +11 -6
  13. data/lib/mongo_mapper/document.rb +37 -21
  14. data/lib/mongo_mapper/embedded_document.rb +32 -18
  15. data/lib/mongo_mapper/finder_options.rb +19 -12
  16. data/lib/mongo_mapper/rails_compatibility/document.rb +4 -0
  17. data/lib/mongo_mapper/rails_compatibility/embedded_document.rb +4 -0
  18. data/lib/mongo_mapper/support.rb +18 -46
  19. data/lib/mongo_mapper/types.rb +64 -0
  20. data/lib/mongo_mapper/validations.rb +13 -43
  21. data/mongo_mapper.gemspec +13 -10
  22. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +10 -10
  23. data/test/functional/associations/test_belongs_to_proxy.rb +29 -30
  24. data/test/functional/associations/test_many_documents_as_proxy.rb +13 -12
  25. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +34 -34
  26. data/test/functional/associations/test_many_embedded_proxy.rb +69 -74
  27. data/test/functional/associations/test_many_polymorphic_proxy.rb +10 -10
  28. data/test/functional/associations/test_many_proxy.rb +14 -15
  29. data/test/functional/test_associations.rb +4 -4
  30. data/test/functional/test_binary.rb +1 -1
  31. data/test/functional/test_dirty.rb +6 -6
  32. data/test/functional/test_document.rb +76 -69
  33. data/test/functional/test_embedded_document.rb +15 -14
  34. data/test/functional/test_pagination.rb +9 -1
  35. data/test/functional/test_string_id_compatibility.rb +72 -0
  36. data/test/functional/test_validations.rb +56 -7
  37. data/test/models.rb +7 -7
  38. data/test/test_helper.rb +2 -5
  39. data/test/unit/test_association_base.rb +6 -1
  40. data/test/unit/test_document.rb +22 -13
  41. data/test/unit/test_embedded_document.rb +47 -5
  42. data/test/unit/test_finder_options.rb +22 -3
  43. data/test/unit/test_mongo_mapper.rb +65 -0
  44. data/test/unit/test_rails_compatibility.rb +14 -0
  45. data/test/unit/test_support.rb +45 -0
  46. metadata +9 -6
  47. data/test/unit/test_mongomapper.rb +0 -28
@@ -0,0 +1,64 @@
1
+ module MongoMapper
2
+ module Types
3
+ class Binary
4
+ def self.to_mongo(value)
5
+ if value.is_a?(ByteBuffer)
6
+ value
7
+ else
8
+ value.nil? ? nil : ByteBuffer.new(value)
9
+ end
10
+ end
11
+
12
+ def self.from_mongo(value)
13
+ value
14
+ end
15
+ end
16
+
17
+ class Boolean
18
+ def self.to_mongo(value)
19
+ if value.is_a?(Boolean)
20
+ value
21
+ else
22
+ ['true', 't', '1'].include?(value.to_s.downcase)
23
+ end
24
+ end
25
+
26
+ def self.from_mongo(value)
27
+ !!value
28
+ end
29
+ end
30
+
31
+ class ObjectId
32
+ def self.to_mongo(value)
33
+ if value.nil?
34
+ nil
35
+ elsif value.is_a?(Mongo::ObjectID)
36
+ value
37
+ else
38
+ Mongo::ObjectID.from_string(value.to_s)
39
+ end
40
+ end
41
+
42
+ def self.from_mongo(value)
43
+ value
44
+ end
45
+ end
46
+
47
+ # This allows using just Boolean when defining
48
+ # keys instead of MongoMapper::Types::Boolean
49
+ module Lookup
50
+ def const_missing(name)
51
+ if MongoMapper::Types.const_defined?(name)
52
+ MongoMapper::Types.const_get(name)
53
+ else
54
+ super
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ # This was required to get in front of ActiveSupports Class#const_missing
62
+ Class.instance_eval do
63
+ include MongoMapper::Types::Lookup
64
+ end
@@ -4,67 +4,37 @@ module MongoMapper
4
4
  def validates_uniqueness_of(*args)
5
5
  add_validations(args, MongoMapper::Validations::ValidatesUniquenessOf)
6
6
  end
7
-
8
- def validates_exclusion_of(*args)
9
- add_validations(args, MongoMapper::Validations::ValidatesExclusionOf)
10
- end
11
-
12
- def validates_inclusion_of(*args)
13
- add_validations(args, MongoMapper::Validations::ValidatesInclusionOf)
14
- end
15
7
  end
16
8
 
17
9
  class ValidatesUniquenessOf < Validatable::ValidationBase
18
- option :scope
19
-
10
+ option :scope, :case_sensitive
11
+ default :case_sensitive => true
12
+
20
13
  def valid?(instance)
21
14
  value = instance[attribute]
22
15
  return true if allow_blank && value.blank?
23
- doc = instance.class.first({self.attribute => value}.merge(scope_conditions(instance)))
24
- doc.nil? || instance.id == doc.id
16
+ base_conditions = case_sensitive ? {self.attribute => value} : {}
17
+ doc = instance.class.first(base_conditions.merge(scope_conditions(instance)).merge(where_conditions(instance)))
18
+ doc.nil? || instance._id == doc._id
25
19
  end
26
20
 
27
21
  def message(instance)
28
22
  super || "has already been taken"
29
23
  end
30
-
24
+
31
25
  def scope_conditions(instance)
32
26
  return {} unless scope
33
27
  Array(scope).inject({}) do |conditions, key|
34
28
  conditions.merge(key => instance[key])
35
29
  end
36
30
  end
37
- end
38
-
39
- class ValidatesExclusionOf < Validatable::ValidationBase
40
- required_option :within
41
-
42
- def valid?(instance)
43
- value = instance[attribute]
44
- return true if allow_nil && value.nil?
45
- return true if allow_blank && value.blank?
46
-
47
- !within.include?(instance[attribute])
48
- end
49
-
50
- def message(instance)
51
- super || "is reserved"
52
- end
53
- end
54
31
 
55
- class ValidatesInclusionOf < Validatable::ValidationBase
56
- required_option :within
57
-
58
- def valid?(instance)
59
- value = instance[attribute]
60
- return true if allow_nil && value.nil?
61
- return true if allow_blank && value.blank?
62
-
63
- within.include?(value)
64
- end
65
-
66
- def message(instance)
67
- super || "is not in the list"
32
+ def where_conditions(instance)
33
+ conditions = {}
34
+ unless case_sensitive
35
+ conditions.merge!({'$where' => "this.#{attribute}.toLowerCase() == '#{instance[attribute].downcase}'"})
36
+ end
37
+ conditions
68
38
  end
69
39
  end
70
40
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongo_mapper}
8
- s.version = "0.5.8"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Nunemaker"]
12
- s.date = %q{2009-10-29}
12
+ s.date = %q{2009-11-14}
13
13
  s.default_executable = %q{mmconsole}
14
14
  s.email = %q{nunemaker@gmail.com}
15
15
  s.executables = ["mmconsole"]
@@ -50,6 +50,7 @@ Gem::Specification.new do |s|
50
50
  "lib/mongo_mapper/serialization.rb",
51
51
  "lib/mongo_mapper/serializers/json_serializer.rb",
52
52
  "lib/mongo_mapper/support.rb",
53
+ "lib/mongo_mapper/types.rb",
53
54
  "lib/mongo_mapper/validations.rb",
54
55
  "mongo_mapper.gemspec",
55
56
  "specs.watchr",
@@ -70,6 +71,7 @@ Gem::Specification.new do |s|
70
71
  "test/functional/test_logger.rb",
71
72
  "test/functional/test_pagination.rb",
72
73
  "test/functional/test_rails_compatibility.rb",
74
+ "test/functional/test_string_id_compatibility.rb",
73
75
  "test/functional/test_validations.rb",
74
76
  "test/models.rb",
75
77
  "test/support/custom_matchers.rb",
@@ -82,7 +84,7 @@ Gem::Specification.new do |s|
82
84
  "test/unit/test_embedded_document.rb",
83
85
  "test/unit/test_finder_options.rb",
84
86
  "test/unit/test_key.rb",
85
- "test/unit/test_mongomapper.rb",
87
+ "test/unit/test_mongo_mapper.rb",
86
88
  "test/unit/test_observing.rb",
87
89
  "test/unit/test_pagination.rb",
88
90
  "test/unit/test_rails_compatibility.rb",
@@ -113,6 +115,7 @@ Gem::Specification.new do |s|
113
115
  "test/functional/test_logger.rb",
114
116
  "test/functional/test_pagination.rb",
115
117
  "test/functional/test_rails_compatibility.rb",
118
+ "test/functional/test_string_id_compatibility.rb",
116
119
  "test/functional/test_validations.rb",
117
120
  "test/models.rb",
118
121
  "test/support/custom_matchers.rb",
@@ -125,7 +128,7 @@ Gem::Specification.new do |s|
125
128
  "test/unit/test_embedded_document.rb",
126
129
  "test/unit/test_finder_options.rb",
127
130
  "test/unit/test_key.rb",
128
- "test/unit/test_mongomapper.rb",
131
+ "test/unit/test_mongo_mapper.rb",
129
132
  "test/unit/test_observing.rb",
130
133
  "test/unit/test_pagination.rb",
131
134
  "test/unit/test_rails_compatibility.rb",
@@ -142,28 +145,28 @@ Gem::Specification.new do |s|
142
145
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
143
146
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3"])
144
147
  s.add_runtime_dependency(%q<mongo>, ["= 0.16"])
145
- s.add_runtime_dependency(%q<jnunemaker-validatable>, ["= 1.8.0"])
148
+ s.add_runtime_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
146
149
  s.add_development_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
147
150
  s.add_development_dependency(%q<shoulda>, ["= 2.10.2"])
148
151
  s.add_development_dependency(%q<timecop>, ["= 0.3.1"])
149
- s.add_development_dependency(%q<mocha>, ["= 0.9.4"])
152
+ s.add_development_dependency(%q<mocha>, ["= 0.9.8"])
150
153
  else
151
154
  s.add_dependency(%q<activesupport>, [">= 2.3"])
152
155
  s.add_dependency(%q<mongo>, ["= 0.16"])
153
- s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.0"])
156
+ s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
154
157
  s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
155
158
  s.add_dependency(%q<shoulda>, ["= 2.10.2"])
156
159
  s.add_dependency(%q<timecop>, ["= 0.3.1"])
157
- s.add_dependency(%q<mocha>, ["= 0.9.4"])
160
+ s.add_dependency(%q<mocha>, ["= 0.9.8"])
158
161
  end
159
162
  else
160
163
  s.add_dependency(%q<activesupport>, [">= 2.3"])
161
164
  s.add_dependency(%q<mongo>, ["= 0.16"])
162
- s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.0"])
165
+ s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
163
166
  s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
164
167
  s.add_dependency(%q<shoulda>, ["= 2.10.2"])
165
168
  s.add_dependency(%q<timecop>, ["= 0.3.1"])
166
- s.add_dependency(%q<mocha>, ["= 0.9.4"])
169
+ s.add_dependency(%q<mocha>, ["= 0.9.8"])
167
170
  end
168
171
  end
169
172
 
@@ -19,11 +19,11 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
19
19
  status.target = project
20
20
  status.save.should be_true
21
21
 
22
- from_db = Status.find(status.id)
23
- from_db.target.nil?.should be_false
24
- from_db.target_id.should == project.id
25
- from_db.target_type.should == "Project"
26
- from_db.target.name.should == "mongomapper"
22
+ status = status.reload
23
+ status.target.nil?.should be_false
24
+ status.target_id.should == project._id
25
+ status.target_type.should == "Project"
26
+ status.target.name.should == "mongomapper"
27
27
  end
28
28
 
29
29
  should "unset the association" do
@@ -32,11 +32,11 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
32
32
  status.target = project
33
33
  status.save.should be_true
34
34
 
35
- from_db = Status.find(status.id)
36
- from_db.target = nil
37
- from_db.target_type.nil?.should be_true
38
- from_db.target_id.nil?.should be_true
39
- from_db.target.nil?.should be_true
35
+ status = status.reload
36
+ status.target = nil
37
+ status.target_type.nil?.should be_true
38
+ status.target_id.nil?.should be_true
39
+ status.target.nil?.should be_true
40
40
  end
41
41
 
42
42
  context "association id set but document not found" do
@@ -2,48 +2,47 @@ require 'test_helper'
2
2
  require 'models'
3
3
 
4
4
  class BelongsToProxyTest < Test::Unit::TestCase
5
- def setup
6
- Status.collection.remove
7
- Project.collection.remove
5
+ def setup
6
+ @post_class = Class.new do
7
+ include MongoMapper::Document
8
+ end
9
+
10
+ @comment_class = Class.new do
11
+ include MongoMapper::Document
12
+ key :post_id, String
13
+ end
14
+ @comment_class.belongs_to :post, :class => @post_class
15
+
16
+ @post_class.collection.remove
17
+ @comment_class.collection.remove
8
18
  end
9
19
 
10
20
  should "default to nil" do
11
- status = Status.new
12
- status.project.nil?.should == true
13
- status.project.inspect.should == 'nil'
21
+ @comment_class.new.post.nil?.should be_true
14
22
  end
15
23
 
16
24
  should "be able to replace the association" do
17
- status = Status.new(:name => 'Foo!')
18
- project = Project.new(:name => "mongomapper")
19
- status.project = project
20
- status.save.should be_true
25
+ post = @post_class.new(:name => 'mongomapper')
26
+ comment = @comment_class.new(:name => 'Foo!', :post => post)
27
+ comment.save.should be_true
21
28
 
22
- from_db = Status.find(status.id)
23
- from_db.project.nil?.should be_false
24
- from_db.project.name.should == "mongomapper"
29
+ comment = comment.reload
30
+ comment.post.should == post
31
+ comment.post.nil?.should be_false
25
32
  end
26
33
 
27
34
  should "unset the association" do
28
- status = Status.new(:name => 'Foo!')
29
- project = Project.new(:name => "mongomapper")
30
- status.project = project
31
- status.save.should be_true
35
+ post = @post_class.new(:name => 'mongomapper')
36
+ comment = @comment_class.new(:name => 'Foo!', :post => post)
37
+ comment.save.should be_true
32
38
 
33
- from_db = Status.find(status.id)
34
- from_db.project = nil
35
- from_db.project.nil?.should be_true
36
- from_db.project.inspect.should == 'nil'
39
+ comment = comment.reload
40
+ comment.post = nil
41
+ comment.post.nil?.should be_true
37
42
  end
38
43
 
39
- context "association id set but document not found" do
40
- setup do
41
- @status = Status.new(:name => 'Foo', :project_id => '1234')
42
- end
43
-
44
- should "return nil instead of raising error" do
45
- @status.project.nil?.should be_true
46
- @status.project.inspect.should == 'nil'
47
- end
44
+ should "return nil if id set but document not found" do
45
+ id = Mongo::ObjectID.new
46
+ @comment_class.new(:name => 'Foo', :post_id => id).post.nil?.should be_true
48
47
  end
49
48
  end
@@ -35,19 +35,20 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
35
35
  PostComment.new(:body => 'baz')
36
36
  ]
37
37
  }.should change { PostComment.count }.by(3)
38
-
39
- from_db = Post.find(post.id)
40
- from_db.comments.size.should == 3
41
- from_db.comments[0].body.should == 'foo'
42
- from_db.comments[1].body.should == 'bar'
43
- from_db.comments[2].body.should == 'baz'
38
+
39
+ post = post.reload
40
+ post.comments.size.should == 3
41
+ bodies = post.comments.collect(&:body)
42
+ bodies.should include('foo')
43
+ bodies.should include('bar')
44
+ bodies.should include('baz')
44
45
  end
45
46
 
46
47
  context "build" do
47
48
  should "assign foreign key" do
48
49
  post = Post.new
49
50
  comment = post.comments.build
50
- comment.commentable_id.should == post.id
51
+ comment.commentable_id.should == post._id
51
52
  end
52
53
 
53
54
  should "assign _type" do
@@ -67,7 +68,7 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
67
68
  should "assign foreign key" do
68
69
  post = Post.new
69
70
  comment = post.comments.create
70
- comment.commentable_id.should == post.id
71
+ comment.commentable_id.should == post._id
71
72
  end
72
73
 
73
74
  should "assign _type" do
@@ -166,25 +167,25 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
166
167
 
167
168
  context "with one id" do
168
169
  should "work for id in association" do
169
- @post.comments.find(@comment2.id).should == @comment2
170
+ @post.comments.find(@comment2._id).should == @comment2
170
171
  end
171
172
 
172
173
  should "not work for id not in association" do
173
174
  lambda {
174
- @post.comments.find(@comment5.id)
175
+ @post.comments.find!(@comment5._id)
175
176
  }.should raise_error(MongoMapper::DocumentNotFound)
176
177
  end
177
178
  end
178
179
 
179
180
  context "with multiple ids" do
180
181
  should "work for ids in association" do
181
- posts = @post.comments.find(@comment1.id, @comment2.id)
182
+ posts = @post.comments.find!(@comment1._id, @comment2._id)
182
183
  posts.should == [@comment1, @comment2]
183
184
  end
184
185
 
185
186
  should "not work for ids not in association" do
186
187
  lambda {
187
- @post.comments.find(@comment1.id, @comment2.id, @comment4.id)
188
+ @post.comments.find!(@comment1._id, @comment2._id, @comment4._id)
188
189
  }.should raise_error(MongoMapper::DocumentNotFound)
189
190
  end
190
191
  end
@@ -24,9 +24,9 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
24
24
  catalog.medias = [Video.new("file" => "video.mpg", "length" => 3600)]
25
25
  catalog.save.should be_true
26
26
 
27
- from_db = Catalog.find(catalog.id)
28
- from_db.medias.size.should == 1
29
- from_db.medias[0].file.should == "video.mpg"
27
+ catalog = catalog.reload
28
+ catalog.medias.size.should == 1
29
+ catalog.medias[0].file.should == "video.mpg"
30
30
  end
31
31
 
32
32
  should "store different associations" do
@@ -38,15 +38,15 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
38
38
  ]
39
39
  catalog.save.should be_true
40
40
 
41
- from_db = Catalog.find(catalog.id)
42
- from_db.medias.size.should == 3
43
- from_db.medias[0].file.should == "video.mpg"
44
- from_db.medias[0].length.should == 3600
45
- from_db.medias[1].file.should == "music.mp3"
46
- from_db.medias[1].bitrate.should == "128kbps"
47
- from_db.medias[2].file.should == "image.png"
48
- from_db.medias[2].width.should == 800
49
- from_db.medias[2].height.should == 600
41
+ catalog = catalog.reload
42
+ catalog.medias.size.should == 3
43
+ catalog.medias[0].file.should == "video.mpg"
44
+ catalog.medias[0].length.should == 3600
45
+ catalog.medias[1].file.should == "music.mp3"
46
+ catalog.medias[1].bitrate.should == "128kbps"
47
+ catalog.medias[2].file.should == "image.png"
48
+ catalog.medias[2].width.should == 800
49
+ catalog.medias[2].height.should == 600
50
50
  end
51
51
 
52
52
  context "With modularized models" do
@@ -75,16 +75,16 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
75
75
  fleet.transports[2].year.should == 2008
76
76
  fleet.save.should be_true
77
77
 
78
- from_db = TrModels::Fleet.find(fleet.id)
79
- from_db.transports.size.should == 3
80
- from_db.transports[0].license_plate.should == "GGG123"
81
- from_db.transports[0].icu.should be_true
82
- from_db.transports[1].license_plate.should == "ABC123"
83
- from_db.transports[1].model.should == "VW Golf"
84
- from_db.transports[1].year.should == 2001
85
- from_db.transports[2].license_plate.should == "DEF123"
86
- from_db.transports[2].model.should == "Honda Accord"
87
- from_db.transports[2].year.should == 2008
78
+ fleet = fleet.reload
79
+ fleet.transports.size.should == 3
80
+ fleet.transports[0].license_plate.should == "GGG123"
81
+ fleet.transports[0].icu.should be_true
82
+ fleet.transports[1].license_plate.should == "ABC123"
83
+ fleet.transports[1].model.should == "VW Golf"
84
+ fleet.transports[1].year.should == 2001
85
+ fleet.transports[2].license_plate.should == "DEF123"
86
+ fleet.transports[2].model.should == "Honda Accord"
87
+ fleet.transports[2].year.should == 2008
88
88
  end
89
89
 
90
90
  should "default reader to empty array" do
@@ -104,9 +104,9 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
104
104
  fleet.transports = [TrModels::Car.new("license_plate" => "DCU2013", "model" => "Honda Civic")]
105
105
  fleet.save.should be_true
106
106
 
107
- from_db = TrModels::Fleet.find(fleet.id)
108
- from_db.transports.size.should == 1
109
- from_db.transports[0].license_plate.should == "DCU2013"
107
+ fleet = fleet.reload
108
+ fleet.transports.size.should == 1
109
+ fleet.transports[0].license_plate.should == "DCU2013"
110
110
  end
111
111
 
112
112
  should "store different associations" do
@@ -118,15 +118,15 @@ class ManyEmbeddedPolymorphicProxyTest < Test::Unit::TestCase
118
118
  ]
119
119
  fleet.save.should be_true
120
120
 
121
- from_db = TrModels::Fleet.find(fleet.id)
122
- from_db.transports.size.should == 3
123
- from_db.transports[0].license_plate.should == "ABC1223"
124
- from_db.transports[0].model.should == "Honda Civic"
125
- from_db.transports[0].year.should == 2003
126
- from_db.transports[1].license_plate.should == "XYZ9090"
127
- from_db.transports[1].max_passengers.should == 51
128
- from_db.transports[2].license_plate.should == "HDD3030"
129
- from_db.transports[2].icu.should == true
121
+ fleet = fleet.reload
122
+ fleet.transports.size.should == 3
123
+ fleet.transports[0].license_plate.should == "ABC1223"
124
+ fleet.transports[0].model.should == "Honda Civic"
125
+ fleet.transports[0].year.should == 2003
126
+ fleet.transports[1].license_plate.should == "XYZ9090"
127
+ fleet.transports[1].max_passengers.should == 51
128
+ fleet.transports[2].license_plate.should == "HDD3030"
129
+ fleet.transports[2].icu.should == true
130
130
  end
131
131
  end
132
132