mark_mapper 0.0.1

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 (211) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.rdoc +39 -0
  4. data/examples/attr_accessible.rb +24 -0
  5. data/examples/attr_protected.rb +24 -0
  6. data/examples/cache_key.rb +26 -0
  7. data/examples/custom_types.rb +26 -0
  8. data/examples/identity_map.rb +30 -0
  9. data/examples/identity_map/automatic.rb +2 -0
  10. data/examples/keys.rb +42 -0
  11. data/examples/modifiers/set.rb +27 -0
  12. data/examples/plugins.rb +40 -0
  13. data/examples/querying.rb +39 -0
  14. data/examples/sample_app.rb +43 -0
  15. data/examples/scopes.rb +56 -0
  16. data/examples/validating/embedded_docs.rb +31 -0
  17. data/lib/mark_mapper.rb +125 -0
  18. data/lib/mark_mapper/config.rb +90 -0
  19. data/lib/mark_mapper/connection.rb +60 -0
  20. data/lib/mark_mapper/criteria_hash.rb +194 -0
  21. data/lib/mark_mapper/document.rb +46 -0
  22. data/lib/mark_mapper/embedded_document.rb +32 -0
  23. data/lib/mark_mapper/exceptions.rb +33 -0
  24. data/lib/mark_mapper/extensions/array.rb +27 -0
  25. data/lib/mark_mapper/extensions/boolean.rb +45 -0
  26. data/lib/mark_mapper/extensions/date.rb +29 -0
  27. data/lib/mark_mapper/extensions/duplicable.rb +86 -0
  28. data/lib/mark_mapper/extensions/float.rb +18 -0
  29. data/lib/mark_mapper/extensions/hash.rb +26 -0
  30. data/lib/mark_mapper/extensions/integer.rb +27 -0
  31. data/lib/mark_mapper/extensions/kernel.rb +11 -0
  32. data/lib/mark_mapper/extensions/nil_class.rb +18 -0
  33. data/lib/mark_mapper/extensions/object.rb +30 -0
  34. data/lib/mark_mapper/extensions/object_id.rb +18 -0
  35. data/lib/mark_mapper/extensions/set.rb +20 -0
  36. data/lib/mark_mapper/extensions/string.rb +31 -0
  37. data/lib/mark_mapper/extensions/symbol.rb +87 -0
  38. data/lib/mark_mapper/extensions/time.rb +29 -0
  39. data/lib/mark_mapper/locale/en.yml +5 -0
  40. data/lib/mark_mapper/middleware/identity_map.rb +41 -0
  41. data/lib/mark_mapper/normalizers/criteria_hash_key.rb +17 -0
  42. data/lib/mark_mapper/normalizers/criteria_hash_value.rb +66 -0
  43. data/lib/mark_mapper/normalizers/fields_value.rb +26 -0
  44. data/lib/mark_mapper/normalizers/hash_key.rb +19 -0
  45. data/lib/mark_mapper/normalizers/integer.rb +19 -0
  46. data/lib/mark_mapper/normalizers/options_hash_value.rb +83 -0
  47. data/lib/mark_mapper/normalizers/sort_value.rb +55 -0
  48. data/lib/mark_mapper/options_hash.rb +103 -0
  49. data/lib/mark_mapper/pagination.rb +6 -0
  50. data/lib/mark_mapper/pagination/collection.rb +32 -0
  51. data/lib/mark_mapper/pagination/paginator.rb +46 -0
  52. data/lib/mark_mapper/plugins.rb +22 -0
  53. data/lib/mark_mapper/plugins/accessible.rb +61 -0
  54. data/lib/mark_mapper/plugins/active_model.rb +18 -0
  55. data/lib/mark_mapper/plugins/associations.rb +96 -0
  56. data/lib/mark_mapper/plugins/associations/base.rb +98 -0
  57. data/lib/mark_mapper/plugins/associations/belongs_to_association.rb +63 -0
  58. data/lib/mark_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +35 -0
  59. data/lib/mark_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
  60. data/lib/mark_mapper/plugins/associations/collection.rb +29 -0
  61. data/lib/mark_mapper/plugins/associations/embedded_collection.rb +44 -0
  62. data/lib/mark_mapper/plugins/associations/in_array_proxy.rb +133 -0
  63. data/lib/mark_mapper/plugins/associations/many_association.rb +63 -0
  64. data/lib/mark_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
  65. data/lib/mark_mapper/plugins/associations/many_documents_proxy.rb +142 -0
  66. data/lib/mark_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
  67. data/lib/mark_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
  68. data/lib/mark_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
  69. data/lib/mark_mapper/plugins/associations/one_as_proxy.rb +22 -0
  70. data/lib/mark_mapper/plugins/associations/one_association.rb +48 -0
  71. data/lib/mark_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
  72. data/lib/mark_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
  73. data/lib/mark_mapper/plugins/associations/one_proxy.rb +95 -0
  74. data/lib/mark_mapper/plugins/associations/proxy.rb +138 -0
  75. data/lib/mark_mapper/plugins/associations/single_association.rb +46 -0
  76. data/lib/mark_mapper/plugins/caching.rb +21 -0
  77. data/lib/mark_mapper/plugins/callbacks.rb +42 -0
  78. data/lib/mark_mapper/plugins/clone.rb +24 -0
  79. data/lib/mark_mapper/plugins/counter_cache.rb +97 -0
  80. data/lib/mark_mapper/plugins/dirty.rb +61 -0
  81. data/lib/mark_mapper/plugins/document.rb +41 -0
  82. data/lib/mark_mapper/plugins/dumpable.rb +22 -0
  83. data/lib/mark_mapper/plugins/dynamic_querying.rb +45 -0
  84. data/lib/mark_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
  85. data/lib/mark_mapper/plugins/embedded_callbacks.rb +81 -0
  86. data/lib/mark_mapper/plugins/embedded_document.rb +53 -0
  87. data/lib/mark_mapper/plugins/equality.rb +23 -0
  88. data/lib/mark_mapper/plugins/identity_map.rb +144 -0
  89. data/lib/mark_mapper/plugins/indexable.rb +86 -0
  90. data/lib/mark_mapper/plugins/inspect.rb +16 -0
  91. data/lib/mark_mapper/plugins/keys.rb +470 -0
  92. data/lib/mark_mapper/plugins/keys/key.rb +134 -0
  93. data/lib/mark_mapper/plugins/keys/static.rb +45 -0
  94. data/lib/mark_mapper/plugins/logger.rb +18 -0
  95. data/lib/mark_mapper/plugins/modifiers.rb +140 -0
  96. data/lib/mark_mapper/plugins/pagination.rb +16 -0
  97. data/lib/mark_mapper/plugins/partial_updates.rb +77 -0
  98. data/lib/mark_mapper/plugins/persistence.rb +79 -0
  99. data/lib/mark_mapper/plugins/protected.rb +45 -0
  100. data/lib/mark_mapper/plugins/querying.rb +173 -0
  101. data/lib/mark_mapper/plugins/querying/decorated_markmapper_query.rb +75 -0
  102. data/lib/mark_mapper/plugins/rails.rb +79 -0
  103. data/lib/mark_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
  104. data/lib/mark_mapper/plugins/sci.rb +82 -0
  105. data/lib/mark_mapper/plugins/scopes.rb +28 -0
  106. data/lib/mark_mapper/plugins/serialization.rb +109 -0
  107. data/lib/mark_mapper/plugins/timestamps.rb +29 -0
  108. data/lib/mark_mapper/plugins/touch.rb +18 -0
  109. data/lib/mark_mapper/plugins/userstamps.rb +18 -0
  110. data/lib/mark_mapper/plugins/validations.rb +96 -0
  111. data/lib/mark_mapper/query.rb +278 -0
  112. data/lib/mark_mapper/railtie.rb +52 -0
  113. data/lib/mark_mapper/railtie/database.rake +65 -0
  114. data/lib/mark_mapper/translation.rb +10 -0
  115. data/lib/mark_mapper/version.rb +4 -0
  116. data/lib/rails/generators/mark_mapper/config/config_generator.rb +37 -0
  117. data/lib/rails/generators/mark_mapper/config/templates/marklogic.yml +19 -0
  118. data/lib/rails/generators/mark_mapper/model/model_generator.rb +40 -0
  119. data/lib/rails/generators/mark_mapper/model/templates/model.rb +17 -0
  120. data/spec/config/mark_mapper.yml +6 -0
  121. data/spec/examples_spec.rb +25 -0
  122. data/spec/functional/accessible_spec.rb +198 -0
  123. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +64 -0
  124. data/spec/functional/associations/belongs_to_proxy_spec.rb +255 -0
  125. data/spec/functional/associations/in_array_proxy_spec.rb +349 -0
  126. data/spec/functional/associations/many_documents_as_proxy_spec.rb +230 -0
  127. data/spec/functional/associations/many_documents_proxy_spec.rb +968 -0
  128. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +238 -0
  129. data/spec/functional/associations/many_embedded_proxy_spec.rb +288 -0
  130. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +302 -0
  131. data/spec/functional/associations/one_as_proxy_spec.rb +489 -0
  132. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +207 -0
  133. data/spec/functional/associations/one_embedded_proxy_spec.rb +100 -0
  134. data/spec/functional/associations/one_proxy_spec.rb +406 -0
  135. data/spec/functional/associations_spec.rb +48 -0
  136. data/spec/functional/caching_spec.rb +75 -0
  137. data/spec/functional/callbacks_spec.rb +330 -0
  138. data/spec/functional/counter_cache_spec.rb +235 -0
  139. data/spec/functional/dirty_spec.rb +316 -0
  140. data/spec/functional/document_spec.rb +310 -0
  141. data/spec/functional/dumpable_spec.rb +24 -0
  142. data/spec/functional/dynamic_querying_spec.rb +75 -0
  143. data/spec/functional/embedded_document_spec.rb +316 -0
  144. data/spec/functional/equality_spec.rb +20 -0
  145. data/spec/functional/extensions_spec.rb +16 -0
  146. data/spec/functional/identity_map_spec.rb +483 -0
  147. data/spec/functional/keys_spec.rb +339 -0
  148. data/spec/functional/logger_spec.rb +20 -0
  149. data/spec/functional/modifiers_spec.rb +446 -0
  150. data/spec/functional/options_hash_spec.rb +41 -0
  151. data/spec/functional/pagination_spec.rb +89 -0
  152. data/spec/functional/partial_updates_spec.rb +530 -0
  153. data/spec/functional/protected_spec.rb +199 -0
  154. data/spec/functional/querying_spec.rb +984 -0
  155. data/spec/functional/rails_spec.rb +55 -0
  156. data/spec/functional/sci_spec.rb +374 -0
  157. data/spec/functional/scopes_spec.rb +204 -0
  158. data/spec/functional/static_keys_spec.rb +153 -0
  159. data/spec/functional/timestamps_spec.rb +97 -0
  160. data/spec/functional/touch_spec.rb +125 -0
  161. data/spec/functional/userstamps_spec.rb +46 -0
  162. data/spec/functional/validations_spec.rb +416 -0
  163. data/spec/quality_spec.rb +51 -0
  164. data/spec/spec_helper.rb +150 -0
  165. data/spec/support/matchers.rb +15 -0
  166. data/spec/support/models.rb +256 -0
  167. data/spec/symbol_operator_spec.rb +70 -0
  168. data/spec/symbol_spec.rb +9 -0
  169. data/spec/unit/associations/base_spec.rb +146 -0
  170. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  171. data/spec/unit/associations/many_association_spec.rb +64 -0
  172. data/spec/unit/associations/one_association_spec.rb +48 -0
  173. data/spec/unit/associations/proxy_spec.rb +103 -0
  174. data/spec/unit/clone_spec.rb +79 -0
  175. data/spec/unit/config_generator_spec.rb +24 -0
  176. data/spec/unit/criteria_hash_spec.rb +218 -0
  177. data/spec/unit/document_spec.rb +251 -0
  178. data/spec/unit/dynamic_finder_spec.rb +125 -0
  179. data/spec/unit/embedded_document_spec.rb +676 -0
  180. data/spec/unit/equality_spec.rb +38 -0
  181. data/spec/unit/exceptions_spec.rb +12 -0
  182. data/spec/unit/extensions_spec.rb +368 -0
  183. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  184. data/spec/unit/inspect_spec.rb +47 -0
  185. data/spec/unit/key_spec.rb +276 -0
  186. data/spec/unit/keys_spec.rb +155 -0
  187. data/spec/unit/mark_mapper_spec.rb +37 -0
  188. data/spec/unit/model_generator_spec.rb +45 -0
  189. data/spec/unit/normalizers/criteria_hash_key_spec.rb +37 -0
  190. data/spec/unit/normalizers/criteria_hash_value_spec.rb +200 -0
  191. data/spec/unit/normalizers/fields_value_spec.rb +45 -0
  192. data/spec/unit/normalizers/hash_key_spec.rb +15 -0
  193. data/spec/unit/normalizers/integer_spec.rb +24 -0
  194. data/spec/unit/normalizers/options_hash_value_spec.rb +99 -0
  195. data/spec/unit/normalizers/sort_value_spec.rb +98 -0
  196. data/spec/unit/options_hash_spec.rb +64 -0
  197. data/spec/unit/pagination/collection_spec.rb +30 -0
  198. data/spec/unit/pagination/paginator_spec.rb +118 -0
  199. data/spec/unit/pagination_spec.rb +11 -0
  200. data/spec/unit/plugins_spec.rb +89 -0
  201. data/spec/unit/query_spec.rb +837 -0
  202. data/spec/unit/rails_compatibility_spec.rb +40 -0
  203. data/spec/unit/rails_reflect_on_association_spec.rb +118 -0
  204. data/spec/unit/rails_spec.rb +188 -0
  205. data/spec/unit/serialization_spec.rb +169 -0
  206. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  207. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  208. data/spec/unit/time_zones_spec.rb +44 -0
  209. data/spec/unit/translation_spec.rb +27 -0
  210. data/spec/unit/validations_spec.rb +588 -0
  211. metadata +307 -0
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe SymbolOperator do
4
+ context "SymbolOperator" do
5
+ before { @operator = SymbolOperator.new(:foo, 'eq') }
6
+ subject { @operator }
7
+
8
+ it "has field" do
9
+ subject.field.should == :foo
10
+ end
11
+
12
+ it "has operator" do
13
+ subject.operator.should == 'eq'
14
+ end
15
+
16
+ context "==" do
17
+ it "returns true if field and operator are equal" do
18
+ SymbolOperator.new(:foo, 'eq').should == SymbolOperator.new(:foo, 'eq')
19
+ end
20
+
21
+ it "returns false if fields are equal but operators are not" do
22
+ SymbolOperator.new(:foo, 'eq').should_not == SymbolOperator.new(:foo, 'all')
23
+ end
24
+
25
+ it "returns false if operators are equal but fields are not" do
26
+ SymbolOperator.new(:foo, 'eq').should_not == SymbolOperator.new(:bar, 'eq')
27
+ end
28
+
29
+ it "returns false if neither are equal" do
30
+ SymbolOperator.new(:foo, 'eq').should_not == SymbolOperator.new(:bar, 'all')
31
+ end
32
+
33
+ it "returns false if other isn't an symbol operator" do
34
+ SymbolOperator.new(:foo, 'eq').should_not == 'foo.in'
35
+ end
36
+ end
37
+
38
+ context "hash" do
39
+
40
+ it 'returns sum of operator and hash field' do
41
+ SymbolOperator.new(:foo, 'eq').hash.should == :foo.hash + 'eq'.hash
42
+ end
43
+
44
+ end
45
+
46
+ context 'eql?' do
47
+
48
+ it 'uses #== for equality comparison' do
49
+ expect(subject).to receive(:"==").with("dummy_value")
50
+ subject.eql?("dummy_value")
51
+ end
52
+
53
+ end
54
+
55
+ context "<=>" do
56
+ it "returns string comparison of operator for same field, different operator" do
57
+ (SymbolOperator.new(:foo, 'eq') <=> SymbolOperator.new(:foo, 'all')).should == 1
58
+ (SymbolOperator.new(:foo, 'all') <=> SymbolOperator.new(:foo, 'eq')).should == -1
59
+ end
60
+
61
+ it "returns 0 for same field same operator" do
62
+ (SymbolOperator.new(:foo, 'eq') <=> SymbolOperator.new(:foo, 'eq')).should == 0
63
+ end
64
+
65
+ it "returns 1 for different field" do
66
+ (SymbolOperator.new(:foo, 'eq') <=> SymbolOperator.new(:bar, 'eq')).should == 1
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Symbol do
4
+ SymbolOperators.each do |operator|
5
+ it "responds to #{operator}" do
6
+ :foo.send(operator).should be_instance_of(SymbolOperator)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ class FooMonster; end
4
+ module AssociationSpec
5
+ include MarkMapper::Plugins::Associations
6
+
7
+ describe MarkMapper::Plugins::Associations::Base do
8
+ it "should initialize with type and name" do
9
+ base = ManyAssociation.new(:foos)
10
+ base.name.should == :foos
11
+ end
12
+
13
+ it "should also allow options when initializing" do
14
+ base = ManyAssociation.new(:foos, :polymorphic => true)
15
+ base.options[:polymorphic].should be_truthy
16
+ end
17
+
18
+ context "klass" do
19
+ it "should default to class_name constantized" do
20
+ BelongsToAssociation.new(:foo_monster).klass.should == FooMonster
21
+ end
22
+
23
+ it "should be the specified class" do
24
+ anonnymous_class = Class.new
25
+ BelongsToAssociation.new(:foo_monster, :class => anonnymous_class).klass.should == anonnymous_class
26
+ end
27
+ end
28
+
29
+ context "polymorphic?" do
30
+ it "should be true if polymorphic" do
31
+ ManyAssociation.new(:foos, :polymorphic => true).polymorphic?.should be_truthy
32
+ end
33
+
34
+ it "should be false if not polymorphic" do
35
+ ManyAssociation.new(:bars).polymorphic?.should be_falsey
36
+ end
37
+ end
38
+
39
+ context "as?" do
40
+ it "should be true if one" do
41
+ OneAssociation.new(:foo, :as => :commentable).as?.should be_truthy
42
+ end
43
+
44
+ it "should be false if not one" do
45
+ ManyAssociation.new(:foo).as?.should be_falsey
46
+ end
47
+ end
48
+
49
+ context "in_array?" do
50
+ it "should be true if one" do
51
+ OneAssociation.new(:foo, :in => :list_ids).in_array?.should be_truthy
52
+ end
53
+
54
+ it "should be false if not one" do
55
+ ManyAssociation.new(:foo).in_array?.should be_falsey
56
+ end
57
+ end
58
+
59
+ context "query_options" do
60
+ it "should default to empty hash" do
61
+ base = ManyAssociation.new(:foos)
62
+ base.query_options.should == {}
63
+ end
64
+
65
+ it "should work with order" do
66
+ base = ManyAssociation.new(:foos, :order => 'position')
67
+ base.query_options.should == {:order => 'position'}
68
+ end
69
+
70
+ it "should correctly parse from options" do
71
+ base = ManyAssociation.new(:foos, :order => 'position', :somekey => 'somevalue')
72
+ base.query_options.should == {:order => 'position', :somekey => 'somevalue'}
73
+ end
74
+ end
75
+
76
+ context "type_key_name" do
77
+ it "should be association name _ type for belongs_to" do
78
+ BelongsToAssociation.new(:foo).type_key_name.should == 'foo_type'
79
+ end
80
+ end
81
+
82
+ context "foreign_key" do
83
+ it "should default to assocation name _id for belongs to" do
84
+ base = BelongsToAssociation.new(:foo)
85
+ base.foreign_key.should == 'foo_id'
86
+ end
87
+
88
+ it "should be overridable with :foreign_key option" do
89
+ base = BelongsToAssociation.new(:foo, :foreign_key => 'foobar_id')
90
+ base.foreign_key.should == 'foobar_id'
91
+ end
92
+ end
93
+
94
+ it "should have ivar that is association name" do
95
+ BelongsToAssociation.new(:foo).ivar.should == '@_foo'
96
+ end
97
+
98
+ context "embeddable?" do
99
+ it "should be true if class is embeddable" do
100
+ base = ManyAssociation.new(:medias)
101
+ base.embeddable?.should be_truthy
102
+ end
103
+
104
+ it "should be false if class is not embeddable" do
105
+ base = ManyAssociation.new(:statuses)
106
+ base.embeddable?.should be_falsey
107
+
108
+ base = BelongsToAssociation.new(:project)
109
+ base.embeddable?.should be_falsey
110
+ end
111
+ end
112
+
113
+ context "proxy_class" do
114
+ it "should be BelongsToProxy for belongs_to" do
115
+ base = BelongsToAssociation.new(:project)
116
+ base.proxy_class.should == BelongsToProxy
117
+ end
118
+
119
+ it "should be BelongsToPolymorphicProxy for polymorphic belongs_to" do
120
+ base = BelongsToAssociation.new(:target, :polymorphic => true)
121
+ base.proxy_class.should == BelongsToPolymorphicProxy
122
+ end
123
+
124
+ it "should be OneProxy for one" do
125
+ base = OneAssociation.new(:status, :polymorphic => true)
126
+ base.proxy_class.should == OneProxy
127
+ end
128
+
129
+ it "should be OneEmbeddedProxy for one embedded" do
130
+ base = OneAssociation.new(:media)
131
+ base.proxy_class.should == OneEmbeddedProxy
132
+ end
133
+ end
134
+
135
+ context "touch?" do
136
+ it "should be true if touch" do
137
+ BelongsToAssociation.new(:car, :touch => true).touch?.should be_truthy
138
+ end
139
+
140
+ it "should be false if not touch" do
141
+ BelongsToAssociation.new(:car).touch?.should be_falsey
142
+ end
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ module BelongsToAssociation
4
+ include MarkMapper::Plugins::Associations
5
+ describe "BelongsToAssociation" do
6
+
7
+ context "class_name" do
8
+ it "should camelize the name" do
9
+ BelongsToAssociation.new(:user).class_name.should == 'User'
10
+ end
11
+
12
+ it "should be changeable using class_name option" do
13
+ association = BelongsToAssociation.new(:user, :class_name => 'Person')
14
+ association.class_name.should == 'Person'
15
+ end
16
+ end
17
+
18
+ context "embeddable?" do
19
+ it "should be false even if class is embeddable" do
20
+ base = BelongsToAssociation.new(:address)
21
+ base.embeddable?.should be_falsey
22
+ end
23
+
24
+ it "should be false if class is not embeddable" do
25
+ base = BelongsToAssociation.new(:project)
26
+ base.embeddable?.should be_falsey
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module ManyAssociationSpec
5
+ include MarkMapper::Plugins::Associations
6
+ describe "ManyAssociation" do
7
+
8
+ context "class_name" do
9
+ it "should camelize the name" do
10
+ ManyAssociation.new(:smart_people).class_name.should == 'SmartPerson'
11
+ end
12
+
13
+ it "should be changeable using class_name option" do
14
+ base = ManyAssociation.new(:smart_people, :class_name => 'IntelligentPerson')
15
+ base.class_name.should == 'IntelligentPerson'
16
+ end
17
+ end
18
+
19
+ context "type_key_name" do
20
+ it "should be _type" do
21
+ ManyAssociation.new(:foos).type_key_name.should == '_type'
22
+ end
23
+ end
24
+
25
+ context "embeddable?" do
26
+ it "should be true if class is embeddable" do
27
+ base = ManyAssociation.new(:medias)
28
+ base.embeddable?.should be_truthy
29
+ end
30
+
31
+ it "should be false if class is not embeddable" do
32
+ base = ManyAssociation.new(:statuses)
33
+ base.embeddable?.should be_falsey
34
+ end
35
+ end
36
+
37
+ context "proxy_class" do
38
+ it "should be ManyDocumentsProxy for many" do
39
+ base = ManyAssociation.new(:statuses)
40
+ base.proxy_class.should == ManyDocumentsProxy
41
+ end
42
+
43
+ it "should be ManyPolymorphicProxy for polymorphic many" do
44
+ base = ManyAssociation.new(:messages, :polymorphic => true)
45
+ base.proxy_class.should == ManyPolymorphicProxy
46
+ end
47
+
48
+ it "should be ManyEmbeddedProxy for many embedded" do
49
+ base = ManyAssociation.new(:medias)
50
+ base.proxy_class.should == ManyEmbeddedProxy
51
+ end
52
+
53
+ it "should be ManyEmbeddedPolymorphicProxy for polymorphic many embedded" do
54
+ base = ManyAssociation.new(:medias, :polymorphic => true)
55
+ base.proxy_class.should == ManyEmbeddedPolymorphicProxy
56
+ end
57
+
58
+ it "should be InArrayProxy for many with :in option" do
59
+ base = ManyAssociation.new(:messages, :in => :message_ids)
60
+ base.proxy_class.should == InArrayProxy
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module OneAssociationSpec
5
+ include MarkMapper::Plugins::Associations
6
+ describe "OneAssociation" do
7
+
8
+ context "type_key_name" do
9
+ it "should be _type" do
10
+ OneAssociation.new(:foo).type_key_name.should == '_type'
11
+ end
12
+ end
13
+
14
+ context "embeddable?" do
15
+ it "should be true if class is embeddable" do
16
+ base = OneAssociation.new(:media)
17
+ base.embeddable?.should be_truthy
18
+ end
19
+
20
+ it "should be false if class is not embeddable" do
21
+ base = OneAssociation.new(:project)
22
+ base.embeddable?.should be_falsey
23
+ end
24
+ end
25
+
26
+ context "proxy_class" do
27
+ it "should be OneProxy for one" do
28
+ base = OneAssociation.new(:status)
29
+ base.proxy_class.should == OneProxy
30
+ end
31
+
32
+ it "should be OneAsProxy for one with :as option" do
33
+ base = OneAssociation.new(:message, :as => :messagable)
34
+ base.proxy_class.should == OneAsProxy
35
+ end
36
+
37
+ it "should be OneEmbeddedProxy for one embedded" do
38
+ base = OneAssociation.new(:media)
39
+ base.proxy_class.should == OneEmbeddedProxy
40
+ end
41
+
42
+ it "should be OneEmbeddedPolymorphicProxy for polymorphic one embedded" do
43
+ base = OneAssociation.new(:media, :polymorphic => true)
44
+ base.proxy_class.should == OneEmbeddedPolymorphicProxy
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeNilProxy < MarkMapper::Plugins::Associations::Proxy
4
+ def find_target; nil end
5
+ end
6
+
7
+ class FakeBlankProxy < MarkMapper::Plugins::Associations::Proxy
8
+ def find_target; '' end
9
+ end
10
+
11
+ class FakeNumberProxy < MarkMapper::Plugins::Associations::Proxy
12
+ def find_target; 17 end
13
+ end
14
+
15
+ class FakeProxy < MarkMapper::Plugins::Associations::Proxy
16
+ def find_target; [1, 2] end
17
+ end
18
+
19
+ describe "Proxy" do
20
+ before do
21
+ @owner = double('owner', :new? => false)
22
+ @association = double('association', :options => {:extend => []})
23
+
24
+ @proxy = FakeProxy.new(@owner, @association)
25
+ @nil_proxy = FakeNilProxy.new(@owner, @association)
26
+ @blank_proxy = FakeBlankProxy.new(@owner, @association)
27
+ end
28
+
29
+ it "should set target to nil when reset is called" do
30
+ @proxy.reset
31
+ @proxy.target.should be_nil
32
+ end
33
+
34
+ it "should be able to inspect the proxy" do
35
+ @proxy.inspect.should == '[1, 2]'
36
+ end
37
+
38
+ context "nil?" do
39
+ it "should be true if nil" do
40
+ @nil_proxy.nil?.should be_truthy
41
+ end
42
+
43
+ it "should be false if not nil" do
44
+ @proxy.nil?.should be_falsey
45
+ end
46
+ end
47
+
48
+ context "blank?" do
49
+ it "should be true if blank" do
50
+ @blank_proxy.blank?.should be_truthy
51
+ @nil_proxy.blank?.should be_truthy
52
+ end
53
+
54
+ it "should be false if not blank" do
55
+ @proxy.blank?.should be_falsey
56
+ end
57
+ end
58
+
59
+ context "present?" do
60
+ it "should be true if present" do
61
+ @proxy.present?.should be_truthy
62
+ end
63
+
64
+ it "should be false if not present" do
65
+ @blank_proxy.present?.should be_falsey
66
+ @nil_proxy.present?.should be_falsey
67
+ end
68
+ end
69
+
70
+ it "should delegate respond_to? to target" do
71
+ @proxy.respond_to?(:each).should be_truthy
72
+ @proxy.respond_to?(:size).should be_truthy
73
+ @proxy.respond_to?(:gsub).should be_falsey
74
+ end
75
+
76
+ it "should alias proxy owner to owner" do
77
+ @proxy.proxy_owner.should == @owner
78
+ end
79
+
80
+ it "should alias proxy target to target" do
81
+ @proxy.proxy_target.should == @target
82
+ end
83
+
84
+ context "send" do
85
+ it "should work if proxy responds to method" do
86
+ @proxy.send(:reset)
87
+ @proxy.target.should be_nil
88
+ end
89
+
90
+ it "should work if the target responds to the method" do
91
+ @proxy.send(:size).should == 2
92
+ end
93
+
94
+ it "should not work if neither the proxy or target respond to method" do
95
+ lambda { @proxy.send(:gsub) }.should raise_error
96
+ end
97
+
98
+ it "should work if a proc is passed" do
99
+ p = Proc.new {|x| x+1}
100
+ @proxy.send(:collect, &p).should == [2,3]
101
+ end
102
+ end
103
+ end