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.
- data/.document +0 -0
- data/.gitignore +18 -0
- data/.rspec +0 -0
- data/.travis.yml +8 -11
- data/Gemfile +3 -12
- data/Gemfile.lock +43 -38
- data/{MIT-LICENSE.txt → LICENSE.txt} +3 -1
- data/README.rdoc +15 -2
- data/Rakefile +4 -39
- data/gemfiles/{mongoid3.gemfile → money4-mongoid3.gemfile} +1 -1
- data/gemfiles/money4-mongoid31.gemfile +12 -0
- data/gemfiles/{mongoid2.gemfile → money50-mongoid3.gemfile} +10 -10
- data/gemfiles/money50-mongoid31.gemfile +12 -0
- data/gemfiles/money51-mongoid3.gemfile +11 -0
- data/gemfiles/money51-mongoid31.gemfile +12 -0
- data/lib/mongoid_money_field.rb +118 -76
- data/lib/mongoid_money_field/field.rb +48 -0
- data/lib/mongoid_money_field/simple_form/money_input.rb +1 -1
- data/lib/mongoid_money_field/version.rb +3 -0
- data/mongoid_money_field.gemspec +26 -83
- data/spec/model_spec.rb +8 -0
- data/spec/money3_compat_spec.rb +123 -0
- data/spec/money3_spec.rb +342 -0
- data/spec/money_spec.rb +60 -46
- data/spec/ruby_money_spec.rb +62 -0
- data/spec/spec_helper.rb +15 -16
- data/spec/support/dummy_not_a_number.rb +0 -0
- data/spec/support/dummy_positive_number.rb +0 -0
- data/spec/support/money3.rb +30 -0
- data/spec/support/mongoid.yml +8 -0
- data/spec/support/priceable.rb +5 -0
- metadata +90 -37
- data/VERSION +0 -1
data/spec/money_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Mongoid::MoneyField do
|
|
6
6
|
|
7
7
|
describe 'when money field is required' do
|
8
8
|
it 'should be valid to save when field is filled in' do
|
9
|
-
dummy
|
9
|
+
dummy = DummyMoneyRequired.new
|
10
10
|
dummy.price = '$10'
|
11
11
|
dummy.should be_valid
|
12
12
|
dummy.save.should eq true
|
@@ -19,19 +19,11 @@ describe Mongoid::MoneyField do
|
|
19
19
|
dummy.errors.messages[:price][0].should eq "can't be blank"
|
20
20
|
dummy.save.should eq false
|
21
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
22
|
end
|
31
23
|
|
32
24
|
describe 'when value is filled from code' do
|
33
25
|
it 'should raise the error when value consists non digits' do
|
34
|
-
dummy
|
26
|
+
dummy = DummyNotANumber.new
|
35
27
|
dummy.price = 'incorrect1'
|
36
28
|
dummy.should_not be_valid
|
37
29
|
dummy.errors.count.should eq 1
|
@@ -40,7 +32,7 @@ describe Mongoid::MoneyField do
|
|
40
32
|
end
|
41
33
|
|
42
34
|
it 'should raise the error when value consists more then one decimal separator' do
|
43
|
-
dummy
|
35
|
+
dummy = DummyNotANumber.new
|
44
36
|
dummy.price = '121,212,22'
|
45
37
|
dummy.should_not be_valid
|
46
38
|
dummy.errors.count.should eq 1
|
@@ -57,7 +49,7 @@ describe Mongoid::MoneyField do
|
|
57
49
|
end
|
58
50
|
|
59
51
|
it 'should raise the error when value is not present' do
|
60
|
-
dummy = DummyNotANumber.new(
|
52
|
+
dummy = DummyNotANumber.new(price: '')
|
61
53
|
dummy.should_not be_valid
|
62
54
|
dummy.errors.count.should eq 1
|
63
55
|
dummy.errors.messages[:price][0].should eq "is not a number"
|
@@ -67,8 +59,8 @@ describe Mongoid::MoneyField do
|
|
67
59
|
|
68
60
|
describe 'when value is filled from SimpleForm' do
|
69
61
|
it 'should raise the error when value consists non digits' do
|
70
|
-
dummy
|
71
|
-
dummy.
|
62
|
+
dummy = DummyNotANumber.new
|
63
|
+
dummy.price = 'incorrect1'
|
72
64
|
dummy.should_not be_valid
|
73
65
|
dummy.errors.count.should eq 1
|
74
66
|
dummy.errors.messages[:price][0].should eq "is not a number"
|
@@ -76,8 +68,8 @@ describe Mongoid::MoneyField do
|
|
76
68
|
end
|
77
69
|
|
78
70
|
it 'should raise the error when value consists more then one decimal separator' do
|
79
|
-
dummy
|
80
|
-
dummy.
|
71
|
+
dummy = DummyNotANumber.new
|
72
|
+
dummy.price = '121,212,22'
|
81
73
|
dummy.should_not be_valid
|
82
74
|
dummy.errors.count.should eq 1
|
83
75
|
dummy.errors.messages[:price][0].should eq "is not a number"
|
@@ -87,7 +79,7 @@ describe Mongoid::MoneyField do
|
|
87
79
|
|
88
80
|
describe 'when value should be a positive number' do
|
89
81
|
it 'should raise the error when value lesser than 1' do
|
90
|
-
dummy = DummyPositiveNumber.new(
|
82
|
+
dummy = DummyPositiveNumber.new(price: '-10')
|
91
83
|
dummy.should_not be_valid
|
92
84
|
dummy.errors.count.should eq 1
|
93
85
|
dummy.errors.messages[:price][0].should eq "must be greater than 1"
|
@@ -96,7 +88,15 @@ describe Mongoid::MoneyField do
|
|
96
88
|
end
|
97
89
|
|
98
90
|
it 'should raise the error when value lesser than 1' do
|
99
|
-
dummy = DummyPositiveNumber.new(
|
91
|
+
dummy = DummyPositiveNumber.new(price: '-1000')
|
92
|
+
dummy.should_not be_valid
|
93
|
+
dummy.errors.count.should eq 1
|
94
|
+
dummy.errors.messages[:price][0].should eq "must be greater than 1"
|
95
|
+
dummy.save.should eq false
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should raise the error when value lesser than 1' do
|
99
|
+
dummy = DummyPositiveNumber.new(price: '0')
|
100
100
|
dummy.should_not be_valid
|
101
101
|
dummy.errors.count.should eq 1
|
102
102
|
dummy.errors.messages[:price][0].should eq "must be greater than 1"
|
@@ -104,13 +104,19 @@ describe Mongoid::MoneyField do
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'should be ok when value is greater than 1' do
|
107
|
-
dummy = DummyPositiveNumber.new(
|
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 greater than 1' do
|
113
|
+
dummy = DummyPositiveNumber.new(price: '1000')
|
108
114
|
dummy.should be_valid
|
109
115
|
dummy.save.should eq true
|
110
116
|
end
|
111
117
|
|
112
118
|
it 'should be ok when value is not present' do
|
113
|
-
dummy = DummyPositiveNumber.new(
|
119
|
+
dummy = DummyPositiveNumber.new(price: '')
|
114
120
|
dummy.should be_valid
|
115
121
|
dummy.save.should eq true
|
116
122
|
end
|
@@ -133,25 +139,25 @@ describe Mongoid::MoneyField do
|
|
133
139
|
|
134
140
|
describe 'when persisting a document with a Money datatype' do
|
135
141
|
it 'should be persisted normally when set as dollars' do
|
136
|
-
dummy
|
142
|
+
dummy = DummyMoney.new
|
137
143
|
dummy.price = '$10'
|
138
144
|
dummy.save.should eq true
|
139
145
|
end
|
140
|
-
|
146
|
+
|
141
147
|
it 'should be persisted normally when set as cents' do
|
142
|
-
dummy
|
148
|
+
dummy = DummyMoney.new
|
143
149
|
dummy.price = '$9.99'
|
144
150
|
dummy.save.should eq true
|
145
151
|
end
|
146
|
-
|
152
|
+
|
147
153
|
it 'should be persisted normally when set as Money' do
|
148
|
-
dummy
|
154
|
+
dummy = DummyMoney.new
|
149
155
|
dummy.price = Money.parse(1.23)
|
150
156
|
dummy.save.should eq true
|
151
157
|
end
|
152
158
|
|
153
159
|
it 'should be possible to set value to nil' do
|
154
|
-
dummy
|
160
|
+
dummy = DummyMoney.new
|
155
161
|
dummy.price = Money.parse(1.23)
|
156
162
|
dummy.save.should eq true
|
157
163
|
|
@@ -163,50 +169,50 @@ describe Mongoid::MoneyField do
|
|
163
169
|
dummy.price.should be_nil
|
164
170
|
end
|
165
171
|
end
|
166
|
-
|
172
|
+
|
167
173
|
describe 'when accessing a document from the datastore with a Money datatype' do
|
168
174
|
before(:each) do
|
169
175
|
DummyMoney.create(:description => "Test", :price => '9.99')
|
170
176
|
end
|
171
|
-
|
177
|
+
|
172
178
|
it 'should have a Money value that matches the money value that was initially persisted' do
|
173
179
|
dummy = DummyMoney.first
|
174
180
|
dummy.price.should eq Money.parse('9.99')
|
175
181
|
end
|
176
182
|
end
|
177
|
-
|
183
|
+
|
178
184
|
describe 'when accessing a document from the datastore with a Money datatype set as money' do
|
179
185
|
before(:each) do
|
180
|
-
dm
|
186
|
+
dm = DummyMoney.create(:description => "Test")
|
181
187
|
dm.price = Money.parse('1.23')
|
182
188
|
dm.save!
|
183
189
|
end
|
184
|
-
|
190
|
+
|
185
191
|
it 'should have a Money value that matches the money value that was initially persisted' do
|
186
192
|
dummy = DummyMoney.first
|
187
193
|
dummy.price.cents.should eq 123
|
188
194
|
end
|
189
195
|
end
|
190
|
-
|
196
|
+
|
191
197
|
describe 'when accessing a document from the datastore with a Money datatype set as money with mass asignment' do
|
192
198
|
before(:each) do
|
193
199
|
DummyMoney.create(:description => "Test", :price => Money.parse('1.23'))
|
194
200
|
end
|
195
|
-
|
201
|
+
|
196
202
|
it 'should have a Money value that matches the money value that was initially persisted' do
|
197
203
|
dummy = DummyMoney.first
|
198
204
|
dummy.price.cents.should eq 123
|
199
205
|
end
|
200
206
|
end
|
201
|
-
|
207
|
+
|
202
208
|
describe 'when accessing a document from the datastore with a Money datatype and empty value' do
|
203
209
|
it 'should be nil' do
|
204
210
|
dummy = DummyMoneyWithoutDefault.new
|
205
211
|
dummy.save.should eq true
|
206
212
|
DummyMoneyWithoutDefault.first.price.should be_nil
|
207
213
|
end
|
208
|
-
|
209
|
-
|
214
|
+
|
215
|
+
it 'should be 0 when used with default' do
|
210
216
|
dummy = DummyMoney.new
|
211
217
|
dummy.save.should eq true
|
212
218
|
DummyMoney.first.price.cents.should eq 0
|
@@ -226,7 +232,7 @@ describe Mongoid::MoneyField do
|
|
226
232
|
dummy = DummyPrices.first
|
227
233
|
dummy.price.currency.iso_code.should eq Money.default_currency.iso_code
|
228
234
|
dummy.price.cents.should eq 100
|
229
|
-
|
235
|
+
|
230
236
|
dummy.price2.should be_nil
|
231
237
|
|
232
238
|
dummy.price1.cents.should eq 0
|
@@ -277,17 +283,25 @@ describe Mongoid::MoneyField do
|
|
277
283
|
dummy.price.should eq Money.parse('1.23 USD')
|
278
284
|
end
|
279
285
|
end
|
280
|
-
|
286
|
+
|
281
287
|
describe 'when accessing a document from the datastore with a Money datatype and blank value' do
|
282
288
|
before(:each) do
|
283
289
|
DummyMoney.create(description: "Test", price: '')
|
284
290
|
end
|
285
|
-
|
291
|
+
|
286
292
|
it 'should be nil' do
|
287
293
|
dummy = DummyMoney.first
|
288
294
|
dummy.price.should be_nil
|
289
295
|
end
|
290
296
|
|
297
|
+
it 'stays nil' do
|
298
|
+
dummy = DummyMoney.first
|
299
|
+
dummy.price = ''
|
300
|
+
dummy.price.should be_nil
|
301
|
+
dummy.save.should be_true
|
302
|
+
DummyMoney.first.price.should be_nil
|
303
|
+
end
|
304
|
+
|
291
305
|
it 'should be updated correctly' do
|
292
306
|
dummy = DummyMoney.first
|
293
307
|
dummy.price.should be_nil
|
@@ -298,7 +312,7 @@ describe Mongoid::MoneyField do
|
|
298
312
|
dummy.price.cents.should eq 123
|
299
313
|
end
|
300
314
|
end
|
301
|
-
|
315
|
+
|
302
316
|
describe 'when accessing a document from the datastore with embedded documents with money fields' do
|
303
317
|
before(:each) do
|
304
318
|
o = DummyOrder.new(first_name: 'test')
|
@@ -306,26 +320,26 @@ describe Mongoid::MoneyField do
|
|
306
320
|
o.dummy_line_items << DummyLineItem.new({name: 'item 1', price: Money.new(1299)})
|
307
321
|
li = DummyLineItem.new({name: 'item 2', price: Money.new(1499)})
|
308
322
|
o.dummy_line_items.push li
|
309
|
-
|
323
|
+
|
310
324
|
o.save
|
311
325
|
end
|
312
|
-
|
326
|
+
|
313
327
|
it 'should have correct value for first item' do
|
314
328
|
o = DummyOrder.first
|
315
329
|
o.dummy_line_items.first.price.should eq Money.parse('12.99')
|
316
330
|
end
|
317
|
-
|
331
|
+
|
318
332
|
it 'should have correct value for first item' do
|
319
333
|
o = DummyOrder.first
|
320
334
|
o.dummy_line_items.last.price.should eq Money.parse('14.99')
|
321
|
-
end
|
335
|
+
end
|
322
336
|
end
|
323
|
-
|
337
|
+
|
324
338
|
describe 'when accessing a document from the datastore with multiple Money datatypes' do
|
325
339
|
before(:each) do
|
326
340
|
DummyPrices.create(description: "Test", price3: '1', price1: '1.23', price2: '2.33')
|
327
341
|
end
|
328
|
-
|
342
|
+
|
329
343
|
it 'should have correct Money value for field 1' do
|
330
344
|
dummy = DummyPrices.first
|
331
345
|
dummy.price1.should eq Money.parse('1.23')
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# from https://github.com/RubyMoney/money-rails/blob/master/spec/mongoid/three_spec.rb
|
6
|
+
|
7
|
+
describe Money do
|
8
|
+
let!(:priceable) { Priceable.create(:price => Money.new(100, 'EUR')) }
|
9
|
+
let!(:priceable_from_num) { Priceable.create(:price => 1) }
|
10
|
+
let!(:priceable_from_string) { Priceable.create(:price => '1 EUR' )}
|
11
|
+
let!(:priceable_from_hash) { Priceable.create(:price => {:cents=>100, :currency_iso=>"EUR"} )}
|
12
|
+
let!(:priceable_from_hash_with_indifferent_access) {
|
13
|
+
Priceable.create(:price => {:cents=>100, :currency_iso=>"EUR"}.with_indifferent_access)
|
14
|
+
}
|
15
|
+
|
16
|
+
context "mongoize" do
|
17
|
+
it "mongoizes correctly a Money object to a hash of cents and currency" do
|
18
|
+
priceable.price.cents.should == 100
|
19
|
+
priceable.price.currency.should == Money::Currency.find('EUR')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "mongoizes correctly a Numeric object to a hash of cents and currency" do
|
23
|
+
priceable_from_num.price.cents.should == 100
|
24
|
+
priceable_from_num.price.currency.should == Money.default_currency
|
25
|
+
end
|
26
|
+
|
27
|
+
it "mongoizes correctly a String object to a hash of cents and currency" do
|
28
|
+
priceable_from_string.price.cents.should == 100
|
29
|
+
priceable_from_string.price.currency.should == Money::Currency.find('EUR')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "mongoizes correctly a hash of cents and currency" do
|
33
|
+
priceable_from_hash.price.cents.should == 100
|
34
|
+
priceable_from_hash.price.currency.should == Money::Currency.find('EUR')
|
35
|
+
end
|
36
|
+
|
37
|
+
it "mongoizes correctly a HashWithIndifferentAccess of cents and currency" do
|
38
|
+
priceable_from_hash_with_indifferent_access.price.cents.should == 100
|
39
|
+
priceable_from_hash_with_indifferent_access.price.currency.should == Money::Currency.find('EUR')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "demongoize" do
|
44
|
+
subject { Priceable.first.price }
|
45
|
+
it { should be_an_instance_of(Money) }
|
46
|
+
it { should == Money.new(100, 'EUR') }
|
47
|
+
it "returns nil if a nil value was stored" do
|
48
|
+
nil_priceable = Priceable.create(:price => nil)
|
49
|
+
nil_priceable.price.should be_nil
|
50
|
+
end
|
51
|
+
it 'returns nil if an unknown value was stored' do
|
52
|
+
zero_priceable = Priceable.create(:price => [])
|
53
|
+
zero_priceable.price.should be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "evolve" do
|
58
|
+
it "transforms correctly a Money object to a Mongo friendly value" do
|
59
|
+
Priceable.where(:price => Money.new(100, 'EUR')).first.should == priceable
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
-
require 'rspec'
|
6
|
-
require 'simplecov'
|
7
|
-
require 'mongoid'
|
8
4
|
|
9
|
-
require '
|
5
|
+
require 'rubygems'
|
10
6
|
|
7
|
+
require 'simplecov'
|
11
8
|
SimpleCov.start
|
12
9
|
|
10
|
+
require 'bundler/setup'
|
11
|
+
require 'mongoid'
|
12
|
+
require 'database_cleaner'
|
13
|
+
require 'mongoid-rspec'
|
14
|
+
|
13
15
|
require 'mongoid_money_field'
|
14
16
|
|
15
17
|
Money.default_currency = Money::Currency.new("RUB")
|
@@ -18,32 +20,29 @@ Money.default_currency = Money::Currency.new("RUB")
|
|
18
20
|
# in ./support/ and its subdirectories.
|
19
21
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
20
22
|
|
23
|
+
ENV["MONGOID_ENV"] = "test"
|
24
|
+
Mongoid.load!("spec/support/mongoid.yml")
|
25
|
+
|
21
26
|
def mongoid3?
|
22
27
|
defined?(Mongoid::VERSION) && Gem::Version.new(Mongoid::VERSION) >= Gem::Version.new('3.0.0.rc')
|
23
28
|
end
|
24
29
|
|
25
30
|
Mongoid.configure do |config|
|
26
31
|
if mongoid3?
|
27
|
-
|
32
|
+
ENV["MONGOID_ENV"] = "test"
|
33
|
+
Mongoid.load!("spec/support/mongoid.yml")
|
28
34
|
else
|
29
35
|
config.master = Mongo::Connection.new.db('mongoid_money_field_test')
|
30
36
|
end
|
31
37
|
end
|
32
38
|
|
33
|
-
DatabaseCleaner.orm = "mongoid"
|
34
|
-
|
35
39
|
RSpec.configure do |config|
|
36
|
-
config.before
|
40
|
+
config.before :suite do
|
37
41
|
DatabaseCleaner.strategy = :truncation
|
38
42
|
end
|
39
|
-
|
40
|
-
config.before(:each) do
|
41
|
-
DatabaseCleaner.start
|
42
|
-
end
|
43
|
-
|
44
|
-
config.after(:each) do
|
43
|
+
config.after :each do
|
45
44
|
DatabaseCleaner.clean
|
46
45
|
end
|
47
|
-
|
46
|
+
config.include Mongoid::Matchers
|
48
47
|
config.mock_with :rspec
|
49
48
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Money3
|
2
|
+
include Mongoid::Document
|
3
|
+
store_in collection: 'compat3'
|
4
|
+
|
5
|
+
include Mongoid::MoneyField
|
6
|
+
|
7
|
+
field :description
|
8
|
+
|
9
|
+
field :price_currency, type: String
|
10
|
+
field :price_cents, type: Integer
|
11
|
+
|
12
|
+
field :price_no_default_currency, type: String
|
13
|
+
field :price_no_default_cents, type: Integer
|
14
|
+
|
15
|
+
field :price_with_fix_currency, type: String
|
16
|
+
field :price_with_fix_cents, type: Integer
|
17
|
+
end
|
18
|
+
|
19
|
+
class Money3Compat
|
20
|
+
include Mongoid::Document
|
21
|
+
store_in collection: 'compat3'
|
22
|
+
|
23
|
+
include Mongoid::MoneyField
|
24
|
+
|
25
|
+
field :description
|
26
|
+
|
27
|
+
money_field :price, default: 0
|
28
|
+
money_field :price_no_default
|
29
|
+
money_field :price_with_fix, fixed_currency: 'GBP'
|
30
|
+
end
|