lookout-mongo_mapper 0.11.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.
Files changed (176) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +33 -0
  3. data/UPGRADES +26 -0
  4. data/bin/mmconsole +59 -0
  5. data/examples/attr_accessible.rb +22 -0
  6. data/examples/attr_protected.rb +22 -0
  7. data/examples/cache_key.rb +24 -0
  8. data/examples/custom_types.rb +24 -0
  9. data/examples/identity_map.rb +33 -0
  10. data/examples/identity_map/automatic.rb +2 -0
  11. data/examples/keys.rb +40 -0
  12. data/examples/modifiers/set.rb +25 -0
  13. data/examples/plugins.rb +38 -0
  14. data/examples/querying.rb +35 -0
  15. data/examples/safe.rb +43 -0
  16. data/examples/scopes.rb +52 -0
  17. data/examples/validating/embedded_docs.rb +29 -0
  18. data/lib/mongo_mapper.rb +94 -0
  19. data/lib/mongo_mapper/connection.rb +96 -0
  20. data/lib/mongo_mapper/document.rb +42 -0
  21. data/lib/mongo_mapper/embedded_document.rb +32 -0
  22. data/lib/mongo_mapper/exceptions.rb +30 -0
  23. data/lib/mongo_mapper/extensions/array.rb +19 -0
  24. data/lib/mongo_mapper/extensions/binary.rb +22 -0
  25. data/lib/mongo_mapper/extensions/boolean.rb +44 -0
  26. data/lib/mongo_mapper/extensions/date.rb +25 -0
  27. data/lib/mongo_mapper/extensions/float.rb +14 -0
  28. data/lib/mongo_mapper/extensions/hash.rb +14 -0
  29. data/lib/mongo_mapper/extensions/integer.rb +19 -0
  30. data/lib/mongo_mapper/extensions/kernel.rb +9 -0
  31. data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
  32. data/lib/mongo_mapper/extensions/object.rb +26 -0
  33. data/lib/mongo_mapper/extensions/object_id.rb +32 -0
  34. data/lib/mongo_mapper/extensions/set.rb +20 -0
  35. data/lib/mongo_mapper/extensions/string.rb +18 -0
  36. data/lib/mongo_mapper/extensions/time.rb +28 -0
  37. data/lib/mongo_mapper/locale/en.yml +5 -0
  38. data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
  39. data/lib/mongo_mapper/plugins.rb +22 -0
  40. data/lib/mongo_mapper/plugins/accessible.rb +52 -0
  41. data/lib/mongo_mapper/plugins/active_model.rb +18 -0
  42. data/lib/mongo_mapper/plugins/associations.rb +90 -0
  43. data/lib/mongo_mapper/plugins/associations/base.rb +92 -0
  44. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +54 -0
  45. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +34 -0
  46. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
  47. data/lib/mongo_mapper/plugins/associations/collection.rb +27 -0
  48. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +44 -0
  49. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +133 -0
  50. data/lib/mongo_mapper/plugins/associations/many_association.rb +63 -0
  51. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
  52. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +118 -0
  53. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
  54. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
  55. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
  56. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +22 -0
  57. data/lib/mongo_mapper/plugins/associations/one_association.rb +48 -0
  58. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
  59. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
  60. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +95 -0
  61. data/lib/mongo_mapper/plugins/associations/proxy.rb +134 -0
  62. data/lib/mongo_mapper/plugins/associations/single_association.rb +46 -0
  63. data/lib/mongo_mapper/plugins/caching.rb +21 -0
  64. data/lib/mongo_mapper/plugins/callbacks.rb +29 -0
  65. data/lib/mongo_mapper/plugins/clone.rb +22 -0
  66. data/lib/mongo_mapper/plugins/dirty.rb +60 -0
  67. data/lib/mongo_mapper/plugins/document.rb +41 -0
  68. data/lib/mongo_mapper/plugins/dynamic_querying.rb +45 -0
  69. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
  70. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +56 -0
  71. data/lib/mongo_mapper/plugins/embedded_document.rb +53 -0
  72. data/lib/mongo_mapper/plugins/equality.rb +23 -0
  73. data/lib/mongo_mapper/plugins/identity_map.rb +128 -0
  74. data/lib/mongo_mapper/plugins/indexes.rb +13 -0
  75. data/lib/mongo_mapper/plugins/inspect.rb +16 -0
  76. data/lib/mongo_mapper/plugins/keys.rb +313 -0
  77. data/lib/mongo_mapper/plugins/keys/key.rb +61 -0
  78. data/lib/mongo_mapper/plugins/logger.rb +18 -0
  79. data/lib/mongo_mapper/plugins/modifiers.rb +134 -0
  80. data/lib/mongo_mapper/plugins/pagination.rb +16 -0
  81. data/lib/mongo_mapper/plugins/persistence.rb +69 -0
  82. data/lib/mongo_mapper/plugins/protected.rb +45 -0
  83. data/lib/mongo_mapper/plugins/querying.rb +165 -0
  84. data/lib/mongo_mapper/plugins/querying/decorator.rb +36 -0
  85. data/lib/mongo_mapper/plugins/rails.rb +58 -0
  86. data/lib/mongo_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
  87. data/lib/mongo_mapper/plugins/safe.rb +28 -0
  88. data/lib/mongo_mapper/plugins/sci.rb +36 -0
  89. data/lib/mongo_mapper/plugins/scopes.rb +27 -0
  90. data/lib/mongo_mapper/plugins/serialization.rb +109 -0
  91. data/lib/mongo_mapper/plugins/timestamps.rb +22 -0
  92. data/lib/mongo_mapper/plugins/touch.rb +18 -0
  93. data/lib/mongo_mapper/plugins/userstamps.rb +18 -0
  94. data/lib/mongo_mapper/plugins/validations.rb +86 -0
  95. data/lib/mongo_mapper/railtie.rb +48 -0
  96. data/lib/mongo_mapper/railtie/database.rake +65 -0
  97. data/lib/mongo_mapper/translation.rb +10 -0
  98. data/lib/mongo_mapper/version.rb +4 -0
  99. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
  100. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
  101. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
  102. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +13 -0
  103. data/test/_NOTE_ON_TESTING +1 -0
  104. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +64 -0
  105. data/test/functional/associations/test_belongs_to_proxy.rb +238 -0
  106. data/test/functional/associations/test_in_array_proxy.rb +349 -0
  107. data/test/functional/associations/test_many_documents_as_proxy.rb +231 -0
  108. data/test/functional/associations/test_many_documents_proxy.rb +866 -0
  109. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +239 -0
  110. data/test/functional/associations/test_many_embedded_proxy.rb +289 -0
  111. data/test/functional/associations/test_many_polymorphic_proxy.rb +303 -0
  112. data/test/functional/associations/test_one_as_proxy.rb +491 -0
  113. data/test/functional/associations/test_one_embedded_polymorphic_proxy.rb +208 -0
  114. data/test/functional/associations/test_one_embedded_proxy.rb +100 -0
  115. data/test/functional/associations/test_one_proxy.rb +383 -0
  116. data/test/functional/test_accessible.rb +198 -0
  117. data/test/functional/test_associations.rb +46 -0
  118. data/test/functional/test_binary.rb +27 -0
  119. data/test/functional/test_caching.rb +77 -0
  120. data/test/functional/test_callbacks.rb +232 -0
  121. data/test/functional/test_dirty.rb +301 -0
  122. data/test/functional/test_document.rb +282 -0
  123. data/test/functional/test_dynamic_querying.rb +75 -0
  124. data/test/functional/test_embedded_document.rb +288 -0
  125. data/test/functional/test_equality.rb +20 -0
  126. data/test/functional/test_identity_map.rb +513 -0
  127. data/test/functional/test_indexes.rb +50 -0
  128. data/test/functional/test_logger.rb +20 -0
  129. data/test/functional/test_modifiers.rb +537 -0
  130. data/test/functional/test_pagination.rb +91 -0
  131. data/test/functional/test_protected.rb +201 -0
  132. data/test/functional/test_querying.rb +935 -0
  133. data/test/functional/test_safe.rb +76 -0
  134. data/test/functional/test_sci.rb +240 -0
  135. data/test/functional/test_scopes.rb +171 -0
  136. data/test/functional/test_timestamps.rb +62 -0
  137. data/test/functional/test_touch.rb +125 -0
  138. data/test/functional/test_userstamps.rb +44 -0
  139. data/test/functional/test_validations.rb +414 -0
  140. data/test/models.rb +261 -0
  141. data/test/support/railtie.rb +4 -0
  142. data/test/support/railtie/autoloaded.rb +2 -0
  143. data/test/support/railtie/not_autoloaded.rb +3 -0
  144. data/test/support/railtie/parent.rb +3 -0
  145. data/test/test_active_model_lint.rb +18 -0
  146. data/test/test_helper.rb +93 -0
  147. data/test/unit/associations/test_base.rb +146 -0
  148. data/test/unit/associations/test_belongs_to_association.rb +29 -0
  149. data/test/unit/associations/test_many_association.rb +63 -0
  150. data/test/unit/associations/test_one_association.rb +47 -0
  151. data/test/unit/associations/test_proxy.rb +100 -0
  152. data/test/unit/serializers/test_json_serializer.rb +216 -0
  153. data/test/unit/serializers/test_xml_serializer.rb +196 -0
  154. data/test/unit/test_clone.rb +69 -0
  155. data/test/unit/test_document.rb +249 -0
  156. data/test/unit/test_dynamic_finder.rb +125 -0
  157. data/test/unit/test_embedded_document.rb +682 -0
  158. data/test/unit/test_equality.rb +38 -0
  159. data/test/unit/test_exceptions.rb +12 -0
  160. data/test/unit/test_extensions.rb +380 -0
  161. data/test/unit/test_identity_map_middleware.rb +34 -0
  162. data/test/unit/test_inspect.rb +47 -0
  163. data/test/unit/test_key.rb +205 -0
  164. data/test/unit/test_keys.rb +65 -0
  165. data/test/unit/test_mongo_mapper.rb +143 -0
  166. data/test/unit/test_pagination.rb +11 -0
  167. data/test/unit/test_plugins.rb +89 -0
  168. data/test/unit/test_rails.rb +183 -0
  169. data/test/unit/test_rails_compatibility.rb +38 -0
  170. data/test/unit/test_rails_reflect_on_association.rb +118 -0
  171. data/test/unit/test_railtie.rb +66 -0
  172. data/test/unit/test_serialization.rb +166 -0
  173. data/test/unit/test_time_zones.rb +44 -0
  174. data/test/unit/test_translation.rb +27 -0
  175. data/test/unit/test_validations.rb +562 -0
  176. metadata +285 -0
data/test/models.rb ADDED
@@ -0,0 +1,261 @@
1
+ # custom type
2
+ class WindowSize
3
+ attr_reader :width, :height
4
+
5
+ def self.to_mongo(value)
6
+ value.to_a
7
+ end
8
+
9
+ def self.from_mongo(value)
10
+ value.is_a?(self) ? value : WindowSize.new(value)
11
+ end
12
+
13
+ def initialize(*args)
14
+ @width, @height = args.flatten
15
+ end
16
+
17
+ def to_a
18
+ [width, height]
19
+ end
20
+
21
+ def ==(other)
22
+ other.is_a?(self.class) && other.width == width && other.height == height
23
+ end
24
+ end
25
+
26
+ module AccountsExtensions
27
+ def inactive
28
+ all(:last_logged_in => nil)
29
+ end
30
+ end
31
+
32
+ class Post
33
+ include MongoMapper::Document
34
+
35
+ key :title, String
36
+ key :body, String
37
+
38
+ many :comments, :as => :commentable, :class_name => 'PostComment'
39
+
40
+ timestamps!
41
+ end
42
+
43
+ class PostComment
44
+ include MongoMapper::Document
45
+
46
+ key :username, String, :default => 'Anonymous'
47
+ key :body, String
48
+
49
+ key :commentable_id, ObjectId
50
+ key :commentable_type, String
51
+ belongs_to :commentable, :polymorphic => true
52
+
53
+ timestamps!
54
+ end
55
+
56
+ class Address
57
+ include MongoMapper::EmbeddedDocument
58
+
59
+ key :address, String
60
+ key :city, String
61
+ key :state, String
62
+ key :zip, Integer
63
+ end
64
+
65
+ class Message
66
+ include MongoMapper::Document
67
+
68
+ key :body, String
69
+ key :position, Integer
70
+ key :room_id, ObjectId
71
+
72
+ belongs_to :room
73
+ end
74
+
75
+ class Enter < Message; end
76
+ class Exit < Message; end
77
+ class Chat < Message; end
78
+
79
+ class Room
80
+ include MongoMapper::Document
81
+
82
+ key :name, String
83
+ many :messages, :polymorphic => true, :order => 'position' do
84
+ def older
85
+ all(:position => {'$gt' => 5})
86
+ end
87
+ end
88
+ many :latest_messages, :class_name => 'Message', :order => 'position desc', :limit => 2
89
+
90
+ many :accounts, :polymorphic => true, :extend => AccountsExtensions
91
+ end
92
+
93
+ class Account
94
+ include MongoMapper::Document
95
+
96
+ key :room_id, ObjectId
97
+ key :last_logged_in, Time
98
+
99
+ belongs_to :room
100
+ end
101
+ class AccountUser < Account; end
102
+ class Bot < Account; end
103
+
104
+ class Answer
105
+ include MongoMapper::Document
106
+
107
+ key :body, String
108
+ end
109
+
110
+ module CollaboratorsExtensions
111
+ def top
112
+ first
113
+ end
114
+ end
115
+
116
+ class Project
117
+ include MongoMapper::Document
118
+
119
+ key :name, String
120
+
121
+ many :collaborators, :extend => CollaboratorsExtensions
122
+ many :statuses, :order => 'position' do
123
+ def open
124
+ all(:name => %w(New Assigned))
125
+ end
126
+ end
127
+
128
+ many :addresses do
129
+ def find_all_by_state(state)
130
+ # can't use select here for some reason
131
+ find_all { |a| a.state == state }
132
+ end
133
+ end
134
+ end
135
+
136
+ class Collaborator
137
+ include MongoMapper::Document
138
+ key :project_id, ObjectId
139
+ key :name, String
140
+ belongs_to :project
141
+ end
142
+
143
+ class Status
144
+ include MongoMapper::Document
145
+
146
+ scope :complete, where(:name => 'Complete')
147
+
148
+ def self.by_position(position)
149
+ where(:position => position)
150
+ end
151
+
152
+ key :project_id, ObjectId
153
+ key :target_id, ObjectId
154
+ key :target_type, String
155
+ key :name, String, :required => true
156
+ key :position, Integer
157
+
158
+ belongs_to :project
159
+ belongs_to :target, :polymorphic => true
160
+ end
161
+
162
+ class Media
163
+ include MongoMapper::EmbeddedDocument
164
+
165
+ key :file, String
166
+ key :visible, Boolean
167
+ end
168
+
169
+ class Video < Media
170
+ key :length, Integer
171
+ end
172
+
173
+ class Image < Media
174
+ key :width, Integer
175
+ key :height, Integer
176
+ end
177
+
178
+ class Music < Media
179
+ key :bitrate, String
180
+ end
181
+
182
+ class Catalog
183
+ include MongoMapper::Document
184
+
185
+ many :medias, :polymorphic => true do
186
+ def visible
187
+ # for some reason we can't use select here
188
+ find_all { |m| m.visible? }
189
+ end
190
+ end
191
+ end
192
+
193
+ module TrModels
194
+ class Transport
195
+ include MongoMapper::EmbeddedDocument
196
+
197
+ key :license_plate, String
198
+ key :purchased_on, Date
199
+ end
200
+
201
+ class Car < TrModels::Transport
202
+ include MongoMapper::EmbeddedDocument
203
+
204
+ key :model, String
205
+ key :year, Integer
206
+ end
207
+
208
+ class Bus < TrModels::Transport
209
+ include MongoMapper::EmbeddedDocument
210
+
211
+ key :max_passengers, Integer
212
+ end
213
+
214
+ class Ambulance < TrModels::Transport
215
+ include MongoMapper::EmbeddedDocument
216
+
217
+ key :icu, Boolean
218
+ end
219
+
220
+ class Fleet
221
+ include MongoMapper::Document
222
+
223
+ module TransportsExtension
224
+ def to_be_replaced
225
+ # for some reason we can't use select
226
+ find_all { |t| t.purchased_on < 2.years.ago.to_date }
227
+ end
228
+ end
229
+
230
+ many :transports, :polymorphic => true, :class_name => "TrModels::Transport", :extend => TransportsExtension
231
+ key :name, String
232
+ end
233
+ end
234
+
235
+ module News
236
+ class Paper
237
+ include MongoMapper::Document
238
+ end
239
+
240
+ class Article
241
+ include MongoMapper::Document
242
+ end
243
+ end
244
+
245
+ class AltUser
246
+ include MongoMapper::Document
247
+ end
248
+
249
+ class Human
250
+ include MongoMapper::EmbeddedDocument
251
+
252
+ key :name, String
253
+ embedded_in :post
254
+ end
255
+
256
+ class Robot
257
+ include MongoMapper::EmbeddedDocument
258
+
259
+ key :serial_number, String
260
+ embedded_in :post
261
+ end
@@ -0,0 +1,4 @@
1
+ module Railtie
2
+ # We could get AS::Dependencies to autocreate this module
3
+ # but let's keep it simple
4
+ end
@@ -0,0 +1,2 @@
1
+ class Railtie::Autoloaded < Railtie::Parent
2
+ end
@@ -0,0 +1,3 @@
1
+ class Railtie::NotAutoloaded < Railtie::Parent
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Railtie::Parent
2
+ extend ActiveSupport::DescendantsTracker
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+ # For testing against edge rails also.
3
+ # $:.unshift '/Users/jnunemaker/dev/ruby/rails/activemodel/lib'
4
+ require 'active_model'
5
+ require 'models'
6
+
7
+ class ActiveModelLintTest < ActiveModel::TestCase
8
+ include ::ActiveModel::Lint::Tests
9
+
10
+ def setup
11
+ @model = Post.new
12
+ end
13
+
14
+ def test_naming
15
+ Post.model_name.plural.should == 'posts'
16
+ Post.new.respond_to?(:model_name).should be_false
17
+ end
18
+ end
@@ -0,0 +1,93 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $:.unshift File.expand_path('../../lib', __FILE__)
5
+ require 'mongo_mapper'
6
+ require 'fileutils'
7
+ require 'ostruct'
8
+
9
+ Bundler.require(:default, :test)
10
+
11
+ class Test::Unit::TestCase
12
+ def Doc(name='Class', &block)
13
+ klass = Class.new
14
+ klass.class_eval do
15
+ include MongoMapper::Document
16
+
17
+ if name
18
+ class_eval "def self.name; '#{name}' end"
19
+ class_eval "def self.to_s; '#{name}' end"
20
+ else
21
+ set_collection_name :test
22
+ end
23
+ end
24
+
25
+ klass.class_eval(&block) if block_given?
26
+ klass.collection.remove
27
+ klass
28
+ end
29
+
30
+ def EDoc(name='Class', &block)
31
+ klass = Class.new do
32
+ include MongoMapper::EmbeddedDocument
33
+
34
+ if name
35
+ class_eval "def self.name; '#{name}' end"
36
+ class_eval "def self.to_s; '#{name}' end"
37
+ end
38
+ end
39
+
40
+ klass.class_eval(&block) if block_given?
41
+ klass
42
+ end
43
+
44
+ def drop_indexes(klass)
45
+ if klass.database.collection_names.include?(klass.collection.name)
46
+ klass.collection.drop_indexes
47
+ end
48
+ end
49
+
50
+ custom_matcher :be_true do |receiver, matcher, args|
51
+ matcher.positive_failure_message = "Expected #{receiver} to be true but it wasn't"
52
+ matcher.negative_failure_message = "Expected #{receiver} not to be true but it was"
53
+ receiver.eql?(true)
54
+ end
55
+
56
+ custom_matcher :be_false do |receiver, matcher, args|
57
+ matcher.positive_failure_message = "Expected #{receiver} to be false but it wasn't"
58
+ matcher.negative_failure_message = "Expected #{receiver} not to be false but it was"
59
+ receiver.eql?(false)
60
+ end
61
+
62
+ custom_matcher :have_error_on do |receiver, matcher, args|
63
+ receiver.valid?
64
+ attribute = args[0]
65
+ expected_message = args[1]
66
+
67
+ if expected_message.nil?
68
+ matcher.positive_failure_message = "#{receiver} had no errors on #{attribute}"
69
+ matcher.negative_failure_message = "#{receiver} had errors on #{attribute} #{receiver.errors.inspect}"
70
+ !receiver.errors[attribute].blank?
71
+ else
72
+ actual = receiver.errors[attribute]
73
+ matcher.positive_failure_message = %Q(Expected error on #{attribute} to be "#{expected_message}" but was "#{actual}")
74
+ matcher.negative_failure_message = %Q(Expected error on #{attribute} not to be "#{expected_message}" but was "#{actual}")
75
+ actual.include? expected_message
76
+ end
77
+ end
78
+
79
+ custom_matcher :have_index do |receiver, matcher, args|
80
+ index_name = args[0]
81
+ matcher.positive_failure_message = "#{receiver} does not have index named #{index_name}, but should"
82
+ matcher.negative_failure_message = "#{receiver} does have index named #{index_name}, but should not"
83
+ !receiver.collection.index_information.detect { |index| index[0] == index_name }.nil?
84
+ end
85
+ end
86
+
87
+ log_dir = File.expand_path('../../log', __FILE__)
88
+ FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
89
+ logger = Logger.new(log_dir + '/test.log')
90
+
91
+ MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
92
+ MongoMapper.database = "test"
93
+ MongoMapper.database.collections.each { |c| c.drop_indexes }
@@ -0,0 +1,146 @@
1
+ require 'test_helper'
2
+ require 'models'
3
+
4
+ class FooMonster; end
5
+
6
+ class AssociationBaseTest < Test::Unit::TestCase
7
+ include MongoMapper::Plugins::Associations
8
+
9
+ should "initialize with type and name" do
10
+ base = ManyAssociation.new(:foos)
11
+ base.name.should == :foos
12
+ end
13
+
14
+ should "also allow options when initializing" do
15
+ base = ManyAssociation.new(:foos, :polymorphic => true)
16
+ base.options[:polymorphic].should be_true
17
+ end
18
+
19
+ context "klass" do
20
+ should "default to class_name constantized" do
21
+ BelongsToAssociation.new(:foo_monster).klass.should == FooMonster
22
+ end
23
+
24
+ should "be the specified class" do
25
+ anonnymous_class = Class.new
26
+ BelongsToAssociation.new(:foo_monster, :class => anonnymous_class).klass.should == anonnymous_class
27
+ end
28
+ end
29
+
30
+ context "polymorphic?" do
31
+ should "be true if polymorphic" do
32
+ ManyAssociation.new(:foos, :polymorphic => true).polymorphic?.should be_true
33
+ end
34
+
35
+ should "be false if not polymorphic" do
36
+ ManyAssociation.new(:bars).polymorphic?.should be_false
37
+ end
38
+ end
39
+
40
+ context "as?" do
41
+ should "be true if one" do
42
+ OneAssociation.new(:foo, :as => :commentable).as?.should be_true
43
+ end
44
+
45
+ should "be false if not one" do
46
+ ManyAssociation.new(:foo).as?.should be_false
47
+ end
48
+ end
49
+
50
+ context "in_array?" do
51
+ should "be true if one" do
52
+ OneAssociation.new(:foo, :in => :list_ids).in_array?.should be_true
53
+ end
54
+
55
+ should "be false if not one" do
56
+ ManyAssociation.new(:foo).in_array?.should be_false
57
+ end
58
+ end
59
+
60
+ context "query_options" do
61
+ should "default to empty hash" do
62
+ base = ManyAssociation.new(:foos)
63
+ base.query_options.should == {}
64
+ end
65
+
66
+ should "work with order" do
67
+ base = ManyAssociation.new(:foos, :order => 'position')
68
+ base.query_options.should == {:order => 'position'}
69
+ end
70
+
71
+ should "correctly parse from options" do
72
+ base = ManyAssociation.new(:foos, :order => 'position', :somekey => 'somevalue')
73
+ base.query_options.should == {:order => 'position', :somekey => 'somevalue'}
74
+ end
75
+ end
76
+
77
+ context "type_key_name" do
78
+ should "be association name _ type for belongs_to" do
79
+ BelongsToAssociation.new(:foo).type_key_name.should == 'foo_type'
80
+ end
81
+ end
82
+
83
+ context "foreign_key" do
84
+ should "default to assocation name _id for belongs to" do
85
+ base = BelongsToAssociation.new(:foo)
86
+ base.foreign_key.should == 'foo_id'
87
+ end
88
+
89
+ should "be overridable with :foreign_key option" do
90
+ base = BelongsToAssociation.new(:foo, :foreign_key => 'foobar_id')
91
+ base.foreign_key.should == 'foobar_id'
92
+ end
93
+ end
94
+
95
+ should "have ivar that is association name" do
96
+ BelongsToAssociation.new(:foo).ivar.should == '@_foo'
97
+ end
98
+
99
+ context "embeddable?" do
100
+ should "be true if class is embeddable" do
101
+ base = ManyAssociation.new(:medias)
102
+ base.embeddable?.should be_true
103
+ end
104
+
105
+ should "be false if class is not embeddable" do
106
+ base = ManyAssociation.new(:statuses)
107
+ base.embeddable?.should be_false
108
+
109
+ base = BelongsToAssociation.new(:project)
110
+ base.embeddable?.should be_false
111
+ end
112
+ end
113
+
114
+ context "proxy_class" do
115
+ should "be BelongsToProxy for belongs_to" do
116
+ base = BelongsToAssociation.new(:project)
117
+ base.proxy_class.should == BelongsToProxy
118
+ end
119
+
120
+ should "be BelongsToPolymorphicProxy for polymorphic belongs_to" do
121
+ base = BelongsToAssociation.new(:target, :polymorphic => true)
122
+ base.proxy_class.should == BelongsToPolymorphicProxy
123
+ end
124
+
125
+ should "be OneProxy for one" do
126
+ base = OneAssociation.new(:status, :polymorphic => true)
127
+ base.proxy_class.should == OneProxy
128
+ end
129
+
130
+ should "be OneEmbeddedProxy for one embedded" do
131
+ base = OneAssociation.new(:media)
132
+ base.proxy_class.should == OneEmbeddedProxy
133
+ end
134
+ end
135
+
136
+ context "touch?" do
137
+ should "be true if touch" do
138
+ BelongsToAssociation.new(:car, :touch => true).touch?.should be_true
139
+ end
140
+
141
+ should "be false if not touch" do
142
+ BelongsToAssociation.new(:car).touch?.should be_false
143
+ end
144
+ end
145
+
146
+ end