mongo_mapper 0.5.8 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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