mongoid_money_field 3.2.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ # coding: utf-8
2
+
3
+ class Money
4
+ # Converts an object of this instance into a database friendly value.
5
+ def mongoize
6
+ {
7
+ :cents => cents,
8
+ :currency_iso => currency.iso_code
9
+ }
10
+ end
11
+
12
+ class << self
13
+
14
+ # Get the object as it was stored in the database, and instantiate
15
+ # this custom class from it.
16
+ def demongoize(object)
17
+ if object.is_a?(Hash)
18
+ object = object.symbolize_keys
19
+ object.has_key?(:cents) ? ::Money.new(object[:cents], object[:currency_iso]) : nil
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ # Takes any possible object and converts it to how it would be
26
+ # stored in the database.
27
+ def mongoize(object)
28
+ case
29
+ when object.is_a?(Money) then object.mongoize
30
+ when object.is_a?(Hash) then
31
+ object.symbolize_keys! if object.respond_to?(:symbolize_keys!)
32
+ ::Money.new(object[:cents], object[:currency_iso]).mongoize
33
+ when object.respond_to?(:to_money) then
34
+ object.to_money.mongoize
35
+ else object
36
+ end
37
+ end
38
+
39
+ # Converts the object that was supplied to a criteria and converts it
40
+ # into a database friendly form.
41
+ def evolve(object)
42
+ case object
43
+ when Money then object.mongoize
44
+ else object
45
+ end
46
+ end
47
+ end
48
+ end
@@ -8,7 +8,7 @@ class MoneyInput < SimpleForm::Inputs::Base
8
8
  input_html_options[:type] ||= "number"
9
9
  input_html_options[:step] ||= integer? ? 1 : "any"
10
10
  end
11
- @builder.text_field("#{attribute_name}_plain", input_html_options)
11
+ @builder.text_field(attribute_name, input_html_options)
12
12
  end
13
13
 
14
14
  private
@@ -0,0 +1,3 @@
1
+ module MongoidMoneyField
2
+ VERSION = "4.0.0"
3
+ end
@@ -1,88 +1,31 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mongoid_money_field/version'
5
5
 
6
- Gem::Specification.new do |s|
7
- s.name = "mongoid_money_field"
8
- s.version = "3.2.1"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mongoid_money_field"
8
+ spec.version = MongoidMoneyField::VERSION
9
+ spec.authors = ["Gleb Tv"]
10
+ spec.email = ["glebtv@gmail.com"]
11
+ spec.description = %q{Use RubyMoney with mongoid}
12
+ spec.summary = %q{Use RubyMoney with mongoid}
13
+ spec.homepage = "http://github.com/glebtv/mongoid_money_field"
14
+ spec.license = "MIT"
9
15
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["glebtv"]
12
- s.date = "2012-12-01"
13
- s.description = "Use RubyMoney with mongoid"
14
- s.email = "glebtv@gmail.com"
15
- s.extra_rdoc_files = [
16
- "README.rdoc"
17
- ]
18
- s.files = [
19
- ".document",
20
- ".rspec",
21
- ".rvmrc",
22
- ".travis.yml",
23
- "Gemfile",
24
- "Gemfile.lock",
25
- "MIT-LICENSE.txt",
26
- "README.rdoc",
27
- "Rakefile",
28
- "VERSION",
29
- "gemfiles/mongoid2.gemfile",
30
- "gemfiles/mongoid3.gemfile",
31
- "lib/mongoid_money_field.rb",
32
- "lib/mongoid_money_field/simple_form/money_input.rb",
33
- "mongoid_money_field.gemspec",
34
- "spec/money_spec.rb",
35
- "spec/spec_helper.rb",
36
- "spec/support/dummy_embedded.rb",
37
- "spec/support/dummy_money.rb",
38
- "spec/support/dummy_money_required.rb",
39
- "spec/support/dummy_money_with_default.rb",
40
- "spec/support/dummy_money_with_default_with_currency.rb",
41
- "spec/support/dummy_money_with_fixed_currency.rb",
42
- "spec/support/dummy_money_without_default.rb",
43
- "spec/support/dummy_not_a_number.rb",
44
- "spec/support/dummy_override_default_currency.rb",
45
- "spec/support/dummy_positive_number.rb",
46
- "spec/support/dummy_prices.rb",
47
- "spec/support/dummy_with_default_currency.rb"
48
- ]
49
- s.homepage = "http://github.com/glebtv/mongoid_money_field"
50
- s.licenses = ["MIT"]
51
- s.require_paths = ["lib"]
52
- s.rubygems_version = "1.8.24"
53
- s.summary = "Use RubyMoney with mongoid"
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
54
20
 
55
- if s.respond_to? :specification_version then
56
- s.specification_version = 3
21
+ spec.add_runtime_dependency "mongoid", ">= 3.0.0"
22
+ spec.add_runtime_dependency "money", ">= 0"
57
23
 
58
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
- s.add_runtime_dependency(%q<mongoid>, [">= 2.4.0"])
60
- s.add_runtime_dependency(%q<money>, [">= 0"])
61
- s.add_development_dependency(%q<rspec>, ["~> 2.12.0"])
62
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
63
- s.add_development_dependency(%q<bundler>, [">= 1.1.0"])
64
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
65
- s.add_development_dependency(%q<simplecov>, [">= 0.4.0"])
66
- s.add_development_dependency(%q<database_cleaner>, ["~> 0.9.0"])
67
- else
68
- s.add_dependency(%q<mongoid>, [">= 2.4.0"])
69
- s.add_dependency(%q<money>, [">= 0"])
70
- s.add_dependency(%q<rspec>, ["~> 2.12.0"])
71
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
72
- s.add_dependency(%q<bundler>, [">= 1.1.0"])
73
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
74
- s.add_dependency(%q<simplecov>, [">= 0.4.0"])
75
- s.add_dependency(%q<database_cleaner>, ["~> 0.9.0"])
76
- end
77
- else
78
- s.add_dependency(%q<mongoid>, [">= 2.4.0"])
79
- s.add_dependency(%q<money>, [">= 0"])
80
- s.add_dependency(%q<rspec>, ["~> 2.12.0"])
81
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
82
- s.add_dependency(%q<bundler>, [">= 1.1.0"])
83
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
84
- s.add_dependency(%q<simplecov>, [">= 0.4.0"])
85
- s.add_dependency(%q<database_cleaner>, ["~> 0.9.0"])
86
- end
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "bundler", "~> 1.3.4"
26
+ spec.add_development_dependency "rspec", "~> 2.13.0"
27
+ spec.add_development_dependency "rdoc", "~> 4.0.1"
28
+ spec.add_development_dependency "simplecov", "~> 0.7.1"
29
+ spec.add_development_dependency "database_cleaner", "~> 0.9.1"
30
+ spec.add_development_dependency "mongoid-rspec", "~> 1.7.0"
87
31
  end
88
-
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe DummyMoney do
6
+ it { should allow_mass_assignment_of(:description) }
7
+ it { should allow_mass_assignment_of(:price) }
8
+ end
@@ -0,0 +1,123 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Money3Compat do
6
+ it { should allow_mass_assignment_of(:description) }
7
+ it { should allow_mass_assignment_of(:price) }
8
+
9
+ it 'correctly reads old fields data' do
10
+ Money3.create!(price_currency: 'GBP', price_cents: '12000')
11
+ Money3Compat.first.price.cents.should eq 12000
12
+ Money3Compat.first.price.currency.iso_code.should eq 'GBP'
13
+ end
14
+
15
+ it 'correctly works after save' do
16
+ Money3.create!(price_currency: 'GBP', price_cents: '12000')
17
+ Money3Compat.first.save.should be_true
18
+
19
+ Money3Compat.first.price.cents.should eq 12000
20
+ Money3Compat.first.price.currency.iso_code.should eq 'GBP'
21
+ end
22
+
23
+ it 'correctly migrates data' do
24
+ Money3.create!(price_currency: 'GBP', price_cents: '12000')
25
+
26
+ Money3.first.read_attribute(:price_currency).should_not be_nil
27
+ Money3.first.read_attribute(:price_cents).should_not be_nil
28
+
29
+ Money3.first.read_attribute(:price_currency).should eq 'GBP'
30
+ Money3.first.read_attribute(:price_cents).should eq 12000
31
+
32
+ Money3Compat.migrate_from_money_field_3!(:price)
33
+
34
+ Money3Compat.first.price.cents.should eq 12000
35
+ Money3Compat.first.price.currency.iso_code.should eq 'GBP'
36
+
37
+ Money3.first.read_attribute(:price_currency).should be_nil
38
+ Money3.first.read_attribute(:price_cents).should be_nil
39
+
40
+ Money3Compat.first.read_attribute(:price_currency).should be_nil
41
+ Money3Compat.first.read_attribute(:price_cents).should be_nil
42
+
43
+ f = Money3Compat.first
44
+ f.price = '32.00 GBP'
45
+ f.save.should be_true
46
+
47
+ Money3Compat.first.price.cents.should eq 3200
48
+ Money3Compat.first.price.currency.iso_code.should eq 'GBP'
49
+ end
50
+
51
+ describe 'with fixed currency' do
52
+ it 'correctly reads old' do
53
+ Money3.create!(price_with_fix_cents: '12000')
54
+ Money3Compat.first.price_with_fix.cents.should eq 12000
55
+ Money3Compat.first.price_with_fix.currency.iso_code.should eq 'GBP'
56
+ end
57
+
58
+ it 'correctly works after save' do
59
+ Money3.create!(price_with_fix_cents: '12000')
60
+ Money3Compat.first.save.should be_true
61
+ Money3Compat.first.price_with_fix.cents.should eq 12000
62
+ Money3Compat.first.price_with_fix.currency.iso_code.should eq 'GBP'
63
+ end
64
+
65
+ it 'correctly migrates data' do
66
+ Money3.create!(price_with_fix_cents: '12000')
67
+ Money3Compat.migrate_from_money_field_3!(:price_with_fix)
68
+
69
+ Money3Compat.first.read_attribute(:price_with_fix_currency).should be_nil
70
+ Money3Compat.first.read_attribute(:price_with_fix_cents).should be_nil
71
+
72
+ Money3Compat.first.price_with_fix.cents.should eq 12000
73
+ Money3Compat.first.price_with_fix.currency.iso_code.should eq 'GBP'
74
+ end
75
+ end
76
+
77
+ describe 'with no default' do
78
+ it 'correctly reads old' do
79
+ Money3.create!(price_no_default_currency: 'GBP', price_no_default_cents: '12000')
80
+ Money3Compat.first.price_no_default.cents.should eq 12000
81
+ Money3Compat.first.price_no_default.currency.iso_code.should eq 'GBP'
82
+ end
83
+
84
+ it 'correctly works after save' do
85
+ Money3.create!(price_no_default_currency: 'GBP', price_no_default_cents: '12000')
86
+ Money3Compat.first.save.should be_true
87
+ Money3Compat.first.price_no_default.cents.should eq 12000
88
+ Money3Compat.first.price_no_default.currency.iso_code.should eq 'GBP'
89
+ end
90
+
91
+ it 'correctly migrates data' do
92
+ Money3.create!(price_no_default_currency: 'GBP', price_no_default_cents: '12000')
93
+ Money3Compat.migrate_from_money_field_3!(:price_no_default)
94
+
95
+ Money3Compat.first.read_attribute(:price_no_default_currency).should be_nil
96
+ Money3Compat.first.read_attribute(:price_no_default_cents).should be_nil
97
+
98
+ Money3Compat.first.price_no_default.cents.should eq 12000
99
+ Money3Compat.first.price_no_default.currency.iso_code.should eq 'GBP'
100
+ end
101
+
102
+ it 'correctly migrates data with no currency' do
103
+ Money3.create!(price_no_default_cents: '12000')
104
+ Money3Compat.migrate_from_money_field_3!(:price_no_default)
105
+
106
+ Money3Compat.first.read_attribute(:price_no_default_currency).should be_nil
107
+ Money3Compat.first.read_attribute(:price_no_default_cents).should be_nil
108
+
109
+ Money3Compat.first.price_no_default.cents.should eq 12000
110
+ Money3Compat.first.price_no_default.currency.iso_code.should eq 'RUB'
111
+ end
112
+
113
+ it 'correctly migrates data with no cents' do
114
+ Money3.create!()
115
+ Money3Compat.migrate_from_money_field_3!(:price_no_default)
116
+
117
+ Money3Compat.first.read_attribute(:price_no_default_currency).should be_nil
118
+ Money3Compat.first.read_attribute(:price_no_default_cents).should be_nil
119
+
120
+ Money3Compat.first.price_no_default.should be_nil
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,342 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Mongoid::MoneyField do
6
+
7
+ describe 'when money field is required' do
8
+ it 'should be valid to save when field is filled in' do
9
+ dummy = DummyMoneyRequired.new
10
+ dummy.price = '$10'
11
+ dummy.should be_valid
12
+ dummy.save.should eq true
13
+ end
14
+
15
+ it 'should be not valid to save when field is not filled in' do
16
+ dummy = DummyMoneyRequired.new
17
+ dummy.should_not be_valid
18
+ dummy.errors.count.should eq 1
19
+ dummy.errors.messages[:price][0].should eq "can't be blank"
20
+ dummy.save.should eq false
21
+ end
22
+
23
+ it 'should be valid to save when field is filled in but currency is not' do
24
+ dummy = DummyMoneyRequired.new
25
+ dummy.price_cents = 123
26
+ dummy.should be_valid
27
+ dummy.save.should eq true
28
+ dummy.price_currency.should eq Money.default_currency.iso_code
29
+ end
30
+ end
31
+
32
+ describe 'when value is filled from code' do
33
+ it 'should raise the error when value consists non digits' do
34
+ dummy = DummyNotANumber.new
35
+ dummy.price = 'incorrect1'
36
+ dummy.should_not be_valid
37
+ dummy.errors.count.should eq 1
38
+ dummy.errors.messages[:price][0].should eq "is not a number"
39
+ dummy.save.should eq false
40
+ end
41
+
42
+ it 'should raise the error when value consists more then one decimal separator' do
43
+ dummy = DummyNotANumber.new
44
+ dummy.price = '121,212,22'
45
+ dummy.should_not be_valid
46
+ dummy.errors.count.should eq 1
47
+ dummy.errors.messages[:price][0].should eq "is not a number"
48
+ dummy.save.should eq false
49
+ end
50
+
51
+ it 'should raise the error when value is not present' do
52
+ dummy = DummyNotANumber.new
53
+ dummy.should_not be_valid
54
+ dummy.errors.count.should eq 1
55
+ dummy.errors.messages[:price][0].should eq "is not a number"
56
+ dummy.save.should eq false
57
+ end
58
+
59
+ it 'should raise the error when value is not present' do
60
+ dummy = DummyNotANumber.new( price: '' )
61
+ dummy.should_not be_valid
62
+ dummy.errors.count.should eq 1
63
+ dummy.errors.messages[:price][0].should eq "is not a number"
64
+ dummy.save.should eq false
65
+ end
66
+ end
67
+
68
+ describe 'when value is filled from SimpleForm' do
69
+ it 'should raise the error when value consists non digits' do
70
+ dummy = DummyNotANumber.new
71
+ dummy.price_plain = 'incorrect1'
72
+ dummy.should_not be_valid
73
+ dummy.errors.count.should eq 1
74
+ dummy.errors.messages[:price][0].should eq "is not a number"
75
+ dummy.save.should eq false
76
+ end
77
+
78
+ it 'should raise the error when value consists more then one decimal separator' do
79
+ dummy = DummyNotANumber.new
80
+ dummy.price_plain = '121,212,22'
81
+ dummy.should_not be_valid
82
+ dummy.errors.count.should eq 1
83
+ dummy.errors.messages[:price][0].should eq "is not a number"
84
+ dummy.save.should eq false
85
+ end
86
+ end
87
+
88
+ describe 'when value should be a positive number' do
89
+ it 'should raise the error when value lesser than 1' do
90
+ dummy = DummyPositiveNumber.new( price: '-10' )
91
+ dummy.should_not be_valid
92
+ dummy.errors.count.should eq 1
93
+ dummy.errors.messages[:price][0].should eq "must be greater than 1"
94
+ dummy.save.should eq false
95
+ dummy.price_cents.should eq -1000
96
+ end
97
+
98
+ it 'should raise the error when value lesser than 1' do
99
+ dummy = DummyPositiveNumber.new( price: '0' )
100
+ dummy.should_not be_valid
101
+ dummy.errors.count.should eq 1
102
+ dummy.errors.messages[:price][0].should eq "must be greater than 1"
103
+ dummy.save.should eq false
104
+ end
105
+
106
+ it 'should be ok when value is greater than 1' do
107
+ dummy = DummyPositiveNumber.new( price: '10' )
108
+ dummy.should be_valid
109
+ dummy.save.should eq true
110
+ end
111
+
112
+ it 'should be ok when value is not present' do
113
+ dummy = DummyPositiveNumber.new( price: '' )
114
+ dummy.should be_valid
115
+ dummy.save.should eq true
116
+ end
117
+ end
118
+
119
+ describe 'when both default currency and fixed currency is specified' do
120
+ it 'should use fixed currency instead of default' do
121
+ DummyOverrideDefaultCurrency.create!(price: '1.23')
122
+ DummyOverrideDefaultCurrency.first.price.currency.iso_code.should eq 'GBP'
123
+ end
124
+ end
125
+
126
+ describe 'when default currency is specified' do
127
+ it 'should use it instead of Money.default_currency' do
128
+ DummyWithDefaultCurrency.create!(price: '1.23')
129
+ DummyWithDefaultCurrency.first.price.currency.iso_code.should eq 'EUR'
130
+ Money.default_currency.iso_code.should eq 'RUB'
131
+ end
132
+ end
133
+
134
+ describe 'when persisting a document with a Money datatype' do
135
+ it 'should be persisted normally when set as dollars' do
136
+ dummy = DummyMoney.new
137
+ dummy.price = '$10'
138
+ dummy.save.should eq true
139
+ end
140
+
141
+ it 'should be persisted normally when set as cents' do
142
+ dummy = DummyMoney.new
143
+ dummy.price = '$9.99'
144
+ dummy.save.should eq true
145
+ end
146
+
147
+ it 'should be persisted normally when set as Money' do
148
+ dummy = DummyMoney.new
149
+ dummy.price = Money.parse(1.23)
150
+ dummy.save.should eq true
151
+ end
152
+
153
+ it 'should be possible to set value to nil' do
154
+ dummy = DummyMoney.new
155
+ dummy.price = Money.parse(1.23)
156
+ dummy.save.should eq true
157
+
158
+ dummy = DummyMoney.first
159
+ dummy.price.should eq Money.parse(1.23)
160
+ dummy.price = nil
161
+ dummy.save.should eq true
162
+ dummy = DummyMoney.first
163
+ dummy.price.should be_nil
164
+ end
165
+ end
166
+
167
+ describe 'when accessing a document from the datastore with a Money datatype' do
168
+ before(:each) do
169
+ DummyMoney.create(:description => "Test", :price => '9.99')
170
+ end
171
+
172
+ it 'should have a Money value that matches the money value that was initially persisted' do
173
+ dummy = DummyMoney.first
174
+ dummy.price.should eq Money.parse('9.99')
175
+ end
176
+ end
177
+
178
+ describe 'when accessing a document from the datastore with a Money datatype set as money' do
179
+ before(:each) do
180
+ dm = DummyMoney.create(:description => "Test")
181
+ dm.price = Money.parse('1.23')
182
+ dm.save!
183
+ end
184
+
185
+ it 'should have a Money value that matches the money value that was initially persisted' do
186
+ dummy = DummyMoney.first
187
+ dummy.price.cents.should eq 123
188
+ end
189
+ end
190
+
191
+ describe 'when accessing a document from the datastore with a Money datatype set as money with mass asignment' do
192
+ before(:each) do
193
+ DummyMoney.create(:description => "Test", :price => Money.parse('1.23'))
194
+ end
195
+
196
+ it 'should have a Money value that matches the money value that was initially persisted' do
197
+ dummy = DummyMoney.first
198
+ dummy.price.cents.should eq 123
199
+ end
200
+ end
201
+
202
+ describe 'when accessing a document from the datastore with a Money datatype and empty value' do
203
+ it 'should be nil' do
204
+ dummy = DummyMoneyWithoutDefault.new
205
+ dummy.save.should eq true
206
+ DummyMoneyWithoutDefault.first.price.should be_nil
207
+ end
208
+
209
+ it 'should be 0 when used with default' do
210
+ dummy = DummyMoney.new
211
+ dummy.save.should eq true
212
+ DummyMoney.first.price.cents.should eq 0
213
+ end
214
+
215
+ it 'should set money to default currency if money is given without it' do
216
+ dummy = DummyMoneyWithDefault.new
217
+ dummy.save.should eq true
218
+ dummy = DummyMoneyWithDefault.first
219
+ dummy.price.currency.iso_code.should eq Money.default_currency.iso_code
220
+ dummy.price.cents.should eq 100
221
+ end
222
+
223
+ it 'should set money to default currency if money is given without it on a document with multiple money fields' do
224
+ dummy = DummyPrices.new
225
+ dummy.save.should eq true
226
+ dummy = DummyPrices.first
227
+ dummy.price.currency.iso_code.should eq Money.default_currency.iso_code
228
+ dummy.price.cents.should eq 100
229
+
230
+ dummy.price2.should be_nil
231
+
232
+ dummy.price1.cents.should eq 0
233
+ end
234
+
235
+
236
+ it 'should set money to correct currency if money is given with it' do
237
+ dummy = DummyMoneyWithDefaultWithCurrency.new
238
+ dummy.save.should eq true
239
+ dummy = DummyMoneyWithDefaultWithCurrency.first
240
+ dummy.price.currency.iso_code.should eq 'GBP'
241
+ dummy.price.cents.should eq 100
242
+ end
243
+ end
244
+
245
+ describe 'when accessing a document from the datastore with a Money datatype and fixed currency' do
246
+ it 'should have correct currency when value is set to 5$' do
247
+ DummyMoneyWithFixedCurrency.create!(price: '5$')
248
+ dummy = DummyMoneyWithFixedCurrency.first
249
+ dummy.price.currency.iso_code.should eq 'GBP'
250
+ dummy.price.cents.should eq 500
251
+ dummy.price.should eq Money.parse('5 GBP')
252
+ end
253
+
254
+ it 'should have correct currency when value is set to 100 RUB' do
255
+ DummyMoneyWithFixedCurrency.create!(price: '100 RUB')
256
+ dummy = DummyMoneyWithFixedCurrency.first
257
+ dummy.price.currency.iso_code.should eq 'GBP'
258
+ dummy.price.cents.should eq 100_00
259
+ dummy.price.should eq Money.parse('100 GBP')
260
+ end
261
+ end
262
+
263
+ describe 'when setting to a string value with currency' do
264
+ it 'should handle RUB' do
265
+ DummyMoney.create(description: "Test", price: '1.23 RUB')
266
+ dummy = DummyMoney.first
267
+ dummy.price.currency.iso_code.should eq 'RUB'
268
+ dummy.price.cents.should eq 123
269
+ dummy.price.should eq Money.parse('1.23 RUB')
270
+ end
271
+
272
+ it 'should handle $' do
273
+ DummyMoney.create(description: "Test", price: '1.23 USD')
274
+ dummy = DummyMoney.first
275
+ dummy.price.currency.iso_code.should eq 'USD'
276
+ dummy.price.cents.should eq 123
277
+ dummy.price.should eq Money.parse('1.23 USD')
278
+ end
279
+ end
280
+
281
+ describe 'when accessing a document from the datastore with a Money datatype and blank value' do
282
+ before(:each) do
283
+ DummyMoney.create(description: "Test", price: '')
284
+ end
285
+
286
+ it 'should be nil' do
287
+ dummy = DummyMoney.first
288
+ dummy.price.should be_nil
289
+ end
290
+
291
+ it 'should be updated correctly' do
292
+ dummy = DummyMoney.first
293
+ dummy.price.should be_nil
294
+ dummy.price = '1.23 USD'
295
+ dummy.save.should eq true
296
+ dummy = DummyMoney.first
297
+ dummy.price.currency.iso_code.should eq 'USD'
298
+ dummy.price.cents.should eq 123
299
+ end
300
+ end
301
+
302
+ describe 'when accessing a document from the datastore with embedded documents with money fields' do
303
+ before(:each) do
304
+ o = DummyOrder.new(first_name: 'test')
305
+
306
+ o.dummy_line_items << DummyLineItem.new({name: 'item 1', price: Money.new(1299)})
307
+ li = DummyLineItem.new({name: 'item 2', price: Money.new(1499)})
308
+ o.dummy_line_items.push li
309
+
310
+ o.save
311
+ end
312
+
313
+ it 'should have correct value for first item' do
314
+ o = DummyOrder.first
315
+ o.dummy_line_items.first.price.should eq Money.parse('12.99')
316
+ end
317
+
318
+ it 'should have correct value for first item' do
319
+ o = DummyOrder.first
320
+ o.dummy_line_items.last.price.should eq Money.parse('14.99')
321
+ end
322
+ end
323
+
324
+ describe 'when accessing a document from the datastore with multiple Money datatypes' do
325
+ before(:each) do
326
+ DummyPrices.create(description: "Test", price3: '1', price1: '1.23', price2: '2.33')
327
+ end
328
+
329
+ it 'should have correct Money value for field 1' do
330
+ dummy = DummyPrices.first
331
+ dummy.price1.should eq Money.parse('1.23')
332
+ end
333
+ it 'should have correct Money value for field 2' do
334
+ dummy = DummyPrices.first
335
+ dummy.price2.should eq Money.parse('2.33')
336
+ end
337
+ it 'should have correct Money value for field 3' do
338
+ dummy = DummyPrices.first
339
+ dummy.price3.should eq Money.parse('1')
340
+ end
341
+ end
342
+ end