money-rails 1.13.0 → 1.13.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +3 -2
- data/lib/money-rails/active_model/validator.rb +8 -5
- data/lib/money-rails/helpers/action_view_extension.rb +8 -0
- data/lib/money-rails/mongoid/money.rb +28 -19
- data/lib/money-rails/version.rb +1 -1
- data/spec/active_record/monetizable_spec.rb +54 -21
- data/spec/configuration_spec.rb +3 -3
- data/spec/helpers/action_view_extension_spec.rb +21 -0
- data/spec/mongoid/{four_spec.rb → mongoid_spec.rb} +8 -1
- metadata +4 -8
- data/spec/mongoid/five_spec.rb +0 -117
- data/spec/mongoid/three_spec.rb +0 -122
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4aaf2a0c37bb46472539f30ec9c60f868ffd3ec
|
4
|
+
data.tar.gz: cdc46c11f65bf4d28afe78dee2de672e66246c2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e79213ea0c3c9aab5563ae75984e6639045ae87fc6c9a63728482a93f8de6988a1f349a06dc36c71dcd5559dea9a718ba3ac579fd790a429991aca9b49bd4007
|
7
|
+
data.tar.gz: 92021999f49f2e24efa5cfba40ed18b0d9714dc2c2bb0c8df171aeec295b4cb31a5f94668de55a4a504fac88707aff31155e239c562ccda420177d552628a886
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.13.1
|
4
|
+
|
5
|
+
Add a guard clause for "blank form" input (Mongoid)
|
6
|
+
Do not add extra errors in case attribute is not a number
|
7
|
+
Use Money.locale_backend instead of Money.use_i18n
|
8
|
+
Add money_only_cents helper method
|
9
|
+
|
3
10
|
## 1.13.0
|
4
11
|
|
5
12
|
- Bump money version to ~> 6.13.0
|
data/README.md
CHANGED
@@ -326,7 +326,7 @@ end
|
|
326
326
|
```
|
327
327
|
|
328
328
|
In this case ```product.bonus``` will return a Money object with GBP as its
|
329
|
-
currency, whereas ```product.discount.
|
329
|
+
currency, whereas ```product.discount.currency.to_s # => EUR ```
|
330
330
|
|
331
331
|
As mentioned earlier you can use an object that responds to the method ```call``` and accepts the model instance as a parameter. That means you can use a ```Proc``` or ```lambda``` (we would recommend ```lambda``` over ```Proc``` because of their [different control flow characteristics](https://stackoverflow.com/questions/1740046/whats-the-difference-between-a-proc-and-a-lambda-in-ruby)) or even define a separate ```class``` with an instance or class method (maybe even a ```module```) to return the currency code:
|
332
332
|
|
@@ -502,6 +502,7 @@ _For examples below, `@money_object == <Money fractional:650 currency:USD>`_
|
|
502
502
|
| `humanized_money_with_symbol @money_object` | $6.50 |
|
503
503
|
| `money_without_cents @money_object` | 6 |
|
504
504
|
| `money_without_cents_and_with_symbol @money_object` | $6 |
|
505
|
+
| `money_only_cents @money_object` | 50 |
|
505
506
|
|
506
507
|
#### `no_cents_if_whole`
|
507
508
|
|
@@ -552,7 +553,7 @@ For examples on using the test_helpers look at
|
|
552
553
|
## Supported ORMs/ODMs
|
553
554
|
|
554
555
|
* ActiveRecord (>= 3.x)
|
555
|
-
* Mongoid (2.x
|
556
|
+
* Mongoid (>= 2.x)
|
556
557
|
|
557
558
|
## Supported Ruby interpreters
|
558
559
|
|
@@ -44,8 +44,7 @@ module MoneyRails
|
|
44
44
|
private
|
45
45
|
|
46
46
|
def record_does_not_have_error?
|
47
|
-
|
48
|
-
!@record.errors.added?(@attr, :not_a_number)
|
47
|
+
!@record.errors.added?(@attr, :not_a_number, value: @raw_value)
|
49
48
|
end
|
50
49
|
|
51
50
|
def reset_memoized_variables!
|
@@ -62,16 +61,20 @@ module MoneyRails
|
|
62
61
|
|
63
62
|
def decimal_mark
|
64
63
|
character = currency.decimal_mark || '.'
|
65
|
-
@_decimal_mark ||=
|
64
|
+
@_decimal_mark ||= use_backend_locale? ? I18n.t('number.currency.format.separator', default: character) : character
|
66
65
|
end
|
67
66
|
|
68
67
|
def thousands_separator
|
69
68
|
character = currency.thousands_separator || ','
|
70
|
-
@_thousands_separator ||=
|
69
|
+
@_thousands_separator ||= use_backend_locale? ? I18n.t('number.currency.format.delimiter', default: character) : character
|
71
70
|
end
|
72
71
|
|
73
72
|
def symbol
|
74
|
-
@_symbol ||=
|
73
|
+
@_symbol ||= use_backend_locale? ? I18n.t('number.currency.format.unit', default: currency.symbol) : currency.symbol
|
74
|
+
end
|
75
|
+
|
76
|
+
def use_backend_locale?
|
77
|
+
Money.locale_backend.present? || Money.use_i18n
|
75
78
|
end
|
76
79
|
|
77
80
|
def abs_raw_value
|
@@ -48,5 +48,13 @@ module MoneyRails
|
|
48
48
|
def money_without_cents_and_with_symbol(value)
|
49
49
|
money_without_cents(value, symbol: true)
|
50
50
|
end
|
51
|
+
|
52
|
+
def money_only_cents(value)
|
53
|
+
return '00' unless value.respond_to?(:to_money)
|
54
|
+
|
55
|
+
value = value.to_money
|
56
|
+
|
57
|
+
format "%0#{value.currency.exponent}d", (value % value.currency.subunit_to_unit).cents
|
58
|
+
end
|
51
59
|
end
|
52
60
|
end
|
@@ -28,25 +28,12 @@ class Money
|
|
28
28
|
# Takes any possible object and converts it to how it would be
|
29
29
|
# stored in the database.
|
30
30
|
def mongoize(object)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
object.symbolize_keys!
|
38
|
-
end
|
39
|
-
::Money.new(object[:cents], object[:currency_iso]).mongoize
|
40
|
-
when object.nil? then nil
|
41
|
-
when object.respond_to?(:to_money) then
|
42
|
-
begin
|
43
|
-
object.to_money.mongoize
|
44
|
-
rescue Money::Currency::UnknownCurrency, Monetize::ParseError => e
|
45
|
-
raise MoneyRails::Error, e.message if MoneyRails.raise_error_on_money_parsing
|
46
|
-
nil
|
47
|
-
end
|
48
|
-
else object
|
49
|
-
end
|
31
|
+
return object.mongoize if object.is_a?(Money)
|
32
|
+
return mongoize_hash(object) if object.is_a?(Hash)
|
33
|
+
return nil if object.nil?
|
34
|
+
return mongoize_castable(object) if object.respond_to?(:to_money)
|
35
|
+
|
36
|
+
object
|
50
37
|
end
|
51
38
|
|
52
39
|
# Converts the object that was supplied to a criteria and converts it
|
@@ -57,5 +44,27 @@ class Money
|
|
57
44
|
else object
|
58
45
|
end
|
59
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def mongoize_hash(hash)
|
51
|
+
if hash.respond_to?(:deep_symbolize_keys!)
|
52
|
+
hash.deep_symbolize_keys!
|
53
|
+
elsif hash.respond_to?(:symbolize_keys!)
|
54
|
+
hash.symbolize_keys!
|
55
|
+
end
|
56
|
+
|
57
|
+
# Guard for a blank form
|
58
|
+
return nil if hash[:cents] == '' && hash[:currency_iso] == ''
|
59
|
+
|
60
|
+
::Money.new(hash[:cents], hash[:currency_iso]).mongoize
|
61
|
+
end
|
62
|
+
|
63
|
+
def mongoize_castable(object)
|
64
|
+
object.to_money.mongoize
|
65
|
+
rescue Money::Currency::UnknownCurrency, Monetize::ParseError => e
|
66
|
+
return nil unless MoneyRails.raise_error_on_money_parsing
|
67
|
+
raise MoneyRails::Error, e.message
|
68
|
+
end
|
60
69
|
end
|
61
70
|
end
|
data/lib/money-rails/version.rb
CHANGED
@@ -494,31 +494,31 @@ if defined? ActiveRecord
|
|
494
494
|
product.price = Money.new(2500, :USD)
|
495
495
|
expect(product.save).to be_truthy
|
496
496
|
expect(product.price.cents).to eq(2500)
|
497
|
-
expect(product.price.
|
497
|
+
expect(product.price.currency.to_s).to eq("USD")
|
498
498
|
end
|
499
499
|
|
500
500
|
it "correctly assigns Fixnum objects to the attribute" do
|
501
501
|
product.price = 25
|
502
502
|
expect(product.save).to be_truthy
|
503
503
|
expect(product.price.cents).to eq(2500)
|
504
|
-
expect(product.price.
|
504
|
+
expect(product.price.currency.to_s).to eq("USD")
|
505
505
|
|
506
506
|
service.discount = 2
|
507
507
|
expect(service.save).to be_truthy
|
508
508
|
expect(service.discount.cents).to eq(200)
|
509
|
-
expect(service.discount.
|
509
|
+
expect(service.discount.currency.to_s).to eq("EUR")
|
510
510
|
end
|
511
511
|
|
512
512
|
it "correctly assigns String objects to the attribute" do
|
513
513
|
product.price = "25"
|
514
514
|
expect(product.save).to be_truthy
|
515
515
|
expect(product.price.cents).to eq(2500)
|
516
|
-
expect(product.price.
|
516
|
+
expect(product.price.currency.to_s).to eq("USD")
|
517
517
|
|
518
518
|
service.discount = "2"
|
519
519
|
expect(service.save).to be_truthy
|
520
520
|
expect(service.discount.cents).to eq(200)
|
521
|
-
expect(service.discount.
|
521
|
+
expect(service.discount.currency.to_s).to eq("EUR")
|
522
522
|
end
|
523
523
|
|
524
524
|
it "correctly assigns objects to a accessor attribute" do
|
@@ -532,57 +532,57 @@ if defined? ActiveRecord
|
|
532
532
|
product.bonus = 25
|
533
533
|
expect(product.save).to be_truthy
|
534
534
|
expect(product.bonus.cents).to eq(2500)
|
535
|
-
expect(product.bonus.
|
535
|
+
expect(product.bonus.currency.to_s).to eq("GBP")
|
536
536
|
|
537
537
|
service.charge = 2
|
538
538
|
expect(service.save).to be_truthy
|
539
539
|
expect(service.charge.cents).to eq(200)
|
540
|
-
expect(service.charge.
|
540
|
+
expect(service.charge.currency.to_s).to eq("USD")
|
541
541
|
end
|
542
542
|
|
543
543
|
it "overrides default, model currency with the value of :with_currency in string assignments" do
|
544
544
|
product.bonus = "25"
|
545
545
|
expect(product.save).to be_truthy
|
546
546
|
expect(product.bonus.cents).to eq(2500)
|
547
|
-
expect(product.bonus.
|
547
|
+
expect(product.bonus.currency.to_s).to eq("GBP")
|
548
548
|
|
549
549
|
service.charge = "2"
|
550
550
|
expect(service.save).to be_truthy
|
551
551
|
expect(service.charge.cents).to eq(200)
|
552
|
-
expect(service.charge.
|
552
|
+
expect(service.charge.currency.to_s).to eq("USD")
|
553
553
|
|
554
554
|
product.lambda_price = "32"
|
555
555
|
expect(product.save).to be_truthy
|
556
556
|
expect(product.lambda_price.cents).to eq(3200)
|
557
|
-
expect(product.lambda_price.
|
557
|
+
expect(product.lambda_price.currency.to_s).to eq("CAD")
|
558
558
|
end
|
559
559
|
|
560
560
|
it "overrides default currency with model currency, in fixnum assignments" do
|
561
561
|
product.discount_value = 5
|
562
562
|
expect(product.save).to be_truthy
|
563
563
|
expect(product.discount_value.cents).to eq(500)
|
564
|
-
expect(product.discount_value.
|
564
|
+
expect(product.discount_value.currency.to_s).to eq("USD")
|
565
565
|
end
|
566
566
|
|
567
567
|
it "overrides default currency with model currency, in string assignments" do
|
568
568
|
product.discount_value = "5"
|
569
569
|
expect(product.save).to be_truthy
|
570
570
|
expect(product.discount_value.cents).to eq(500)
|
571
|
-
expect(product.discount_value.
|
571
|
+
expect(product.discount_value.currency.to_s).to eq("USD")
|
572
572
|
end
|
573
573
|
|
574
574
|
it "falls back to default currency, in fixnum assignments" do
|
575
575
|
service.discount = 5
|
576
576
|
expect(service.save).to be_truthy
|
577
577
|
expect(service.discount.cents).to eq(500)
|
578
|
-
expect(service.discount.
|
578
|
+
expect(service.discount.currency.to_s).to eq("EUR")
|
579
579
|
end
|
580
580
|
|
581
581
|
it "falls back to default currency, in string assignments" do
|
582
582
|
service.discount = "5"
|
583
583
|
expect(service.save).to be_truthy
|
584
584
|
expect(service.discount.cents).to eq(500)
|
585
|
-
expect(service.discount.
|
585
|
+
expect(service.discount.currency.to_s).to eq("EUR")
|
586
586
|
end
|
587
587
|
|
588
588
|
it "sets field to nil, in nil assignments if allow_nil is set" do
|
@@ -616,13 +616,13 @@ if defined? ActiveRecord
|
|
616
616
|
context "for column with model currency:" do
|
617
617
|
it "has default currency if not specified" do
|
618
618
|
product = Product.create(sale_price_amount: 1234)
|
619
|
-
product.sale_price.
|
619
|
+
product.sale_price.currency.to_s == 'USD'
|
620
620
|
end
|
621
621
|
|
622
622
|
it "is overridden by instance currency column" do
|
623
623
|
product = Product.create(sale_price_amount: 1234,
|
624
624
|
sale_price_currency_code: 'CAD')
|
625
|
-
expect(product.sale_price.
|
625
|
+
expect(product.sale_price.currency.to_s).to eq('CAD')
|
626
626
|
end
|
627
627
|
|
628
628
|
it 'can change currency of custom column' do
|
@@ -634,14 +634,14 @@ if defined? ActiveRecord
|
|
634
634
|
sale_price_currency_code: 'USD'
|
635
635
|
)
|
636
636
|
|
637
|
-
expect(product.sale_price.
|
637
|
+
expect(product.sale_price.currency.to_s).to eq('USD')
|
638
638
|
|
639
639
|
product.sale_price = Money.new 456, 'CAD'
|
640
640
|
product.save
|
641
641
|
product.reload
|
642
642
|
|
643
|
-
expect(product.sale_price.
|
644
|
-
expect(product.discount_value.
|
643
|
+
expect(product.sale_price.currency.to_s).to eq('CAD')
|
644
|
+
expect(product.discount_value.currency.to_s).to eq('USD')
|
645
645
|
end
|
646
646
|
end
|
647
647
|
|
@@ -705,12 +705,12 @@ if defined? ActiveRecord
|
|
705
705
|
transaction.amount = Money.new(2500, :eur)
|
706
706
|
expect(transaction.save).to be_truthy
|
707
707
|
expect(transaction.amount.cents).to eq(Money.new(2500, :eur).cents)
|
708
|
-
expect(transaction.amount.
|
708
|
+
expect(transaction.amount.currency.to_s).to eq("EUR")
|
709
709
|
end
|
710
710
|
|
711
711
|
it "uses default currency if a non Money object is assigned to the attribute" do
|
712
712
|
transaction.amount = 234
|
713
|
-
expect(transaction.amount.
|
713
|
+
expect(transaction.amount.currency.to_s).to eq("USD")
|
714
714
|
end
|
715
715
|
|
716
716
|
it "constructs the money object from the mapped method value" do
|
@@ -767,9 +767,42 @@ if defined? ActiveRecord
|
|
767
767
|
end
|
768
768
|
end
|
769
769
|
|
770
|
+
context "when locale_backend is true" do
|
771
|
+
around(:each) do |example|
|
772
|
+
begin
|
773
|
+
Money.locale_backend = :i18n
|
774
|
+
Money.use_i18n = false
|
775
|
+
example.run
|
776
|
+
ensure
|
777
|
+
Money.locale_backend = nil
|
778
|
+
Money.use_i18n = true
|
779
|
+
end
|
780
|
+
end
|
781
|
+
it "validates with the locale's decimal mark" do
|
782
|
+
transaction.amount = "123,45"
|
783
|
+
expect(transaction.valid?).to be_truthy
|
784
|
+
end
|
785
|
+
|
786
|
+
it "does not validate with the currency's decimal mark" do
|
787
|
+
transaction.amount = "123.45"
|
788
|
+
expect(transaction.valid?).to be_falsey
|
789
|
+
end
|
790
|
+
|
791
|
+
it "validates with the locale's currency symbol" do
|
792
|
+
transaction.amount = "€123"
|
793
|
+
expect(transaction.valid?).to be_truthy
|
794
|
+
end
|
795
|
+
|
796
|
+
it "does not validate with the transaction's currency symbol" do
|
797
|
+
transaction.amount = "$123.45"
|
798
|
+
expect(transaction.valid?).to be_falsey
|
799
|
+
end
|
800
|
+
end
|
801
|
+
|
770
802
|
context "when use_i18n is false" do
|
771
803
|
around(:each) do |example|
|
772
804
|
begin
|
805
|
+
Money.locale_backend = nil
|
773
806
|
Money.use_i18n = false
|
774
807
|
example.run
|
775
808
|
ensure
|
data/spec/configuration_spec.rb
CHANGED
@@ -18,8 +18,8 @@ describe "configuration" do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "sets no_cents_if_whole value for formatted output globally" do
|
21
|
-
#
|
22
|
-
Money.
|
21
|
+
# Enable formatting to depend only on currency (to avoid default symbols for :en)
|
22
|
+
Money.locale_backend = :currency
|
23
23
|
|
24
24
|
value = Money.new(12345600, "EUR")
|
25
25
|
mark = Money::Currency.find(:eur).decimal_mark
|
@@ -35,7 +35,7 @@ describe "configuration" do
|
|
35
35
|
|
36
36
|
# Reset global settings
|
37
37
|
MoneyRails.no_cents_if_whole = nil
|
38
|
-
Money.
|
38
|
+
Money.locale_backend = :i18n
|
39
39
|
end
|
40
40
|
|
41
41
|
it "sets symbol for formatted output globally" do
|
@@ -74,6 +74,27 @@ describe 'MoneyRails::ActionViewExtension', type: :helper do
|
|
74
74
|
it { is_expected.not_to include "00" }
|
75
75
|
end
|
76
76
|
|
77
|
+
describe '#money_only_cents' do
|
78
|
+
let(:monetizable_object){ Money.new(125_00) }
|
79
|
+
subject { helper.money_only_cents monetizable_object }
|
80
|
+
it { is_expected.to eq "00" }
|
81
|
+
|
82
|
+
context 'with a non-money object' do
|
83
|
+
let(:monetizable_object){ 125 }
|
84
|
+
it { is_expected.to eq "00" }
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with less than 10 cents' do
|
88
|
+
let(:monetizable_object){ Money.new(8) }
|
89
|
+
it { is_expected.to eq "08" }
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with a non monetizable object' do
|
93
|
+
let(:monetizable_object){ false }
|
94
|
+
it { is_expected.to eq "00" }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
77
98
|
context 'respects MoneyRails::Configuration settings' do
|
78
99
|
context 'with no_cents_if_whole: false' do
|
79
100
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
if defined?(Mongoid) && ::Mongoid::VERSION
|
3
|
+
if defined?(Mongoid) && ::Mongoid::VERSION.split('.').first.to_i > 2
|
4
4
|
|
5
5
|
describe Money do
|
6
6
|
let!(:priceable) { Priceable.create(price: Money.new(100, 'EUR')) }
|
@@ -8,6 +8,9 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^4(.*)/
|
|
8
8
|
let(:priceable_from_num) { Priceable.create(price: 1) }
|
9
9
|
let(:priceable_from_string) { Priceable.create(price: '1 EUR' )}
|
10
10
|
let(:priceable_from_hash) { Priceable.create(price: {cents: 100, currency_iso: "EUR"} )}
|
11
|
+
let(:priceable_from_blank_strings_hash) {
|
12
|
+
Priceable.create(price: {cents: '', currency_iso: ''})
|
13
|
+
}
|
11
14
|
let(:priceable_from_hash_with_indifferent_access) {
|
12
15
|
Priceable.create(price: {cents: 100, currency_iso: "EUR"}.with_indifferent_access)
|
13
16
|
}
|
@@ -69,6 +72,10 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^4(.*)/
|
|
69
72
|
expect(priceable_from_hash.price.currency).to eq(Money::Currency.find('EUR'))
|
70
73
|
end
|
71
74
|
|
75
|
+
it "mongoizes a hash of blank strings for cents and currency to nil" do
|
76
|
+
expect(priceable_from_blank_strings_hash.price).to eq(nil)
|
77
|
+
end
|
78
|
+
|
72
79
|
it "correctly mongoizes a HashWithIndifferentAccess of cents and currency" do
|
73
80
|
expect(priceable_from_hash_with_indifferent_access.price.cents).to eq(100)
|
74
81
|
expect(priceable_from_hash_with_indifferent_access.price.currency).to eq(Money::Currency.find('EUR'))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: money-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.13.
|
4
|
+
version: 1.13.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Loupasakis
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-01-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: money
|
@@ -221,9 +221,7 @@ files:
|
|
221
221
|
- spec/dummy/script/rails
|
222
222
|
- spec/helpers/action_view_extension_spec.rb
|
223
223
|
- spec/helpers/form_helper_spec.rb
|
224
|
-
- spec/mongoid/
|
225
|
-
- spec/mongoid/four_spec.rb
|
226
|
-
- spec/mongoid/three_spec.rb
|
224
|
+
- spec/mongoid/mongoid_spec.rb
|
227
225
|
- spec/mongoid/two_spec.rb
|
228
226
|
- spec/spec_helper.rb
|
229
227
|
- spec/support/database_cleaner.rb
|
@@ -315,9 +313,7 @@ test_files:
|
|
315
313
|
- spec/dummy/script/rails
|
316
314
|
- spec/helpers/action_view_extension_spec.rb
|
317
315
|
- spec/helpers/form_helper_spec.rb
|
318
|
-
- spec/mongoid/
|
319
|
-
- spec/mongoid/four_spec.rb
|
320
|
-
- spec/mongoid/three_spec.rb
|
316
|
+
- spec/mongoid/mongoid_spec.rb
|
321
317
|
- spec/mongoid/two_spec.rb
|
322
318
|
- spec/spec_helper.rb
|
323
319
|
- spec/support/database_cleaner.rb
|
data/spec/mongoid/five_spec.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
if defined?(Mongoid) && ::Mongoid::VERSION =~ /^5(.*)/
|
4
|
-
|
5
|
-
describe Money do
|
6
|
-
let!(:priceable) { Priceable.create(price: Money.new(100, 'EUR')) }
|
7
|
-
let!(:priceable_from_num) { Priceable.create(price: 1) }
|
8
|
-
let!(:priceable_from_string) { Priceable.create(price: '1 EUR' )}
|
9
|
-
let!(:priceable_from_hash) { Priceable.create(price: {cents: 100, currency_iso: "EUR"} )}
|
10
|
-
let!(:priceable_from_hash_with_indifferent_access) {
|
11
|
-
Priceable.create(price: {cents: 100, currency_iso: "EUR"}.with_indifferent_access)
|
12
|
-
}
|
13
|
-
let(:priceable_from_string_with_hyphen) { Priceable.create(price: '1-2 EUR' )}
|
14
|
-
let(:priceable_from_string_with_unknown_currency) { Priceable.create(price: '1 TLDR') }
|
15
|
-
let(:priceable_with_infinite_precision) { Priceable.create(price: Money.new(BigDecimal.new('100.1'), 'EUR')) }
|
16
|
-
let(:priceable_with_hash_field) {
|
17
|
-
Priceable.create(price_hash: {
|
18
|
-
key1: Money.new(100, "EUR"),
|
19
|
-
key2: Money.new(200, "USD")
|
20
|
-
})
|
21
|
-
}
|
22
|
-
|
23
|
-
context "mongoize" do
|
24
|
-
it "correctly mongoizes a Money object to a hash of cents and currency" do
|
25
|
-
expect(priceable.price.cents).to eq(100)
|
26
|
-
expect(priceable.price.currency).to eq(Money::Currency.find('EUR'))
|
27
|
-
end
|
28
|
-
|
29
|
-
it "correctly mongoizes a Numeric object to a hash of cents and currency" do
|
30
|
-
expect(priceable_from_num.price.cents).to eq(100)
|
31
|
-
expect(priceable_from_num.price.currency).to eq(Money.default_currency)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "correctly mongoizes a String object to a hash of cents and currency" do
|
35
|
-
expect(priceable_from_string.price.cents).to eq(100)
|
36
|
-
expect(priceable_from_string.price.currency).to eq(Money::Currency.find('EUR'))
|
37
|
-
end
|
38
|
-
|
39
|
-
context "when MoneyRails.raise_error_on_money_parsing is true" do
|
40
|
-
before { MoneyRails.raise_error_on_money_parsing = true }
|
41
|
-
after { MoneyRails.raise_error_on_money_parsing = false }
|
42
|
-
|
43
|
-
it "raises exception if the mongoized value is a String with a hyphen" do
|
44
|
-
expect { priceable_from_string_with_hyphen }.to raise_error MoneyRails::Error
|
45
|
-
end
|
46
|
-
|
47
|
-
it "raises exception if the mongoized value is a String with an unknown currency" do
|
48
|
-
expect { priceable_from_string_with_unknown_currency }.to raise_error MoneyRails::Error
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "when MoneyRails.raise_error_on_money_parsing is false" do
|
53
|
-
it "does not correctly mongoize a String with a hyphen in its middle" do
|
54
|
-
expect(priceable_from_string_with_hyphen.price).to eq(nil)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "does not correctly mongoize a String with an unknown currency" do
|
58
|
-
expect(priceable_from_string_with_unknown_currency.price).to eq(nil)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "correctly mongoizes a hash of cents and currency" do
|
63
|
-
expect(priceable_from_hash.price.cents).to eq(100)
|
64
|
-
expect(priceable_from_hash.price.currency).to eq(Money::Currency.find('EUR'))
|
65
|
-
end
|
66
|
-
|
67
|
-
it "correctly mongoizes a HashWithIndifferentAccess of cents and currency" do
|
68
|
-
expect(priceable_from_hash_with_indifferent_access.price.cents).to eq(100)
|
69
|
-
expect(priceable_from_hash_with_indifferent_access.price.currency).to eq(Money::Currency.find('EUR'))
|
70
|
-
end
|
71
|
-
|
72
|
-
context "infinite_precision = true" do
|
73
|
-
before do
|
74
|
-
Money.infinite_precision = true
|
75
|
-
end
|
76
|
-
|
77
|
-
after do
|
78
|
-
Money.infinite_precision = false
|
79
|
-
end
|
80
|
-
|
81
|
-
it "correctly mongoizes a Money object to a hash of cents and currency" do
|
82
|
-
expect(priceable_with_infinite_precision.price.cents).to eq(BigDecimal.new('100.1'))
|
83
|
-
expect(priceable_with_infinite_precision.price.currency).to eq(Money::Currency.find('EUR'))
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it "correctly serializes a Hash field containing Money objects" do
|
89
|
-
expect(priceable_with_hash_field.price_hash[:key1][:cents]).to eq(100)
|
90
|
-
expect(priceable_with_hash_field.price_hash[:key2][:cents]).to eq(200)
|
91
|
-
expect(priceable_with_hash_field.price_hash[:key1][:currency_iso]).to eq('EUR')
|
92
|
-
expect(priceable_with_hash_field.price_hash[:key2][:currency_iso]).to eq('USD')
|
93
|
-
end
|
94
|
-
|
95
|
-
context "demongoize" do
|
96
|
-
subject { Priceable.first.price }
|
97
|
-
it { is_expected.to be_an_instance_of(Money) }
|
98
|
-
it { is_expected.to eq(Money.new(100, 'EUR')) }
|
99
|
-
|
100
|
-
it "returns 0 cents in default_currency if a nil value was stored" do
|
101
|
-
nil_priceable = Priceable.create(price: nil)
|
102
|
-
expect(nil_priceable.price.cents).to eq(0)
|
103
|
-
expect(nil_priceable.price.currency).to eq(Money.default_currency)
|
104
|
-
end
|
105
|
-
it 'returns nil if an unknown value was stored' do
|
106
|
-
zero_priceable = Priceable.create(price: [])
|
107
|
-
expect(zero_priceable.price).to be_nil
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context "evolve" do
|
112
|
-
it "correctly transforms a Money object into a Mongo friendly value" do
|
113
|
-
expect(Priceable.where(price: Money.new(100, 'EUR')).first).to eq(priceable)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
data/spec/mongoid/three_spec.rb
DELETED
@@ -1,122 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
if defined?(Mongoid) && ::Mongoid::VERSION =~ /^3(.*)/
|
4
|
-
|
5
|
-
describe Money do
|
6
|
-
let!(:priceable) { Priceable.create(price: Money.new(100, 'EUR')) }
|
7
|
-
let(:priceable_from_nil) { Priceable.create(price: nil) }
|
8
|
-
let(:priceable_from_num) { Priceable.create(price: 1) }
|
9
|
-
let(:priceable_from_string) { Priceable.create(price: '1 EUR' )}
|
10
|
-
let(:priceable_from_hash) { Priceable.create(price: {cents: 100, currency_iso: "EUR"} )}
|
11
|
-
let(:priceable_from_hash_with_indifferent_access) {
|
12
|
-
Priceable.create(price: {cents: 100, currency_iso: "EUR"}.with_indifferent_access)
|
13
|
-
}
|
14
|
-
let(:priceable_from_string_with_hyphen) { Priceable.create(price: '1-2 EUR' )}
|
15
|
-
let(:priceable_from_string_with_unknown_currency) { Priceable.create(price: '1 TLDR') }
|
16
|
-
let(:priceable_with_infinite_precision) { Priceable.create(price: Money.new(BigDecimal.new('100.1'), 'EUR')) }
|
17
|
-
let(:priceable_with_hash_field) {
|
18
|
-
Priceable.create(price_hash: {
|
19
|
-
key1: Money.new(100, "EUR"),
|
20
|
-
key2: Money.new(200, "USD")
|
21
|
-
})
|
22
|
-
}
|
23
|
-
|
24
|
-
context "mongoize" do
|
25
|
-
it "mongoizes correctly nil to nil" do
|
26
|
-
expect(priceable_from_nil.price).to be_nil
|
27
|
-
end
|
28
|
-
|
29
|
-
it "mongoizes correctly a Money object to a hash of cents and currency" do
|
30
|
-
expect(priceable.price.cents).to eq(100)
|
31
|
-
expect(priceable.price.currency).to eq(Money::Currency.find('EUR'))
|
32
|
-
end
|
33
|
-
|
34
|
-
it "mongoizes correctly a Numeric object to a hash of cents and currency" do
|
35
|
-
expect(priceable_from_num.price.cents).to eq(100)
|
36
|
-
expect(priceable_from_num.price.currency).to eq(Money.default_currency)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "mongoizes correctly a String object to a hash of cents and currency" do
|
40
|
-
expect(priceable_from_string.price.cents).to eq(100)
|
41
|
-
expect(priceable_from_string.price.currency).to eq(Money::Currency.find('EUR'))
|
42
|
-
end
|
43
|
-
|
44
|
-
context "when MoneyRails.raise_error_on_money_parsing is true" do
|
45
|
-
before { MoneyRails.raise_error_on_money_parsing = true }
|
46
|
-
after { MoneyRails.raise_error_on_money_parsing = false }
|
47
|
-
|
48
|
-
it "raises exception if the mongoized value is a String with a hyphen" do
|
49
|
-
expect { priceable_from_string_with_hyphen }.to raise_error MoneyRails::Error
|
50
|
-
end
|
51
|
-
|
52
|
-
it "raises exception if the mongoized value is a String with an unknown currency" do
|
53
|
-
expect { priceable_from_string_with_unknown_currency }.to raise_error MoneyRails::Error
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "when MoneyRails.raise_error_on_money_parsing is false" do
|
58
|
-
it "does not mongoizes correctly a String with hyphen in its middle" do
|
59
|
-
expect(priceable_from_string_with_hyphen.price).to eq(nil)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "does not mongoize correctly a String with an unknown currency" do
|
63
|
-
expect(priceable_from_string_with_unknown_currency.price).to eq(nil)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
it "mongoizes correctly a hash of cents and currency" do
|
68
|
-
expect(priceable_from_hash.price.cents).to eq(100)
|
69
|
-
expect(priceable_from_hash.price.currency).to eq(Money::Currency.find('EUR'))
|
70
|
-
end
|
71
|
-
|
72
|
-
it "mongoizes correctly a HashWithIndifferentAccess of cents and currency" do
|
73
|
-
expect(priceable_from_hash_with_indifferent_access.price.cents).to eq(100)
|
74
|
-
expect(priceable_from_hash_with_indifferent_access.price.currency).to eq(Money::Currency.find('EUR'))
|
75
|
-
end
|
76
|
-
|
77
|
-
context "infinite_precision = true" do
|
78
|
-
before do
|
79
|
-
Money.infinite_precision = true
|
80
|
-
end
|
81
|
-
|
82
|
-
after do
|
83
|
-
Money.infinite_precision = false
|
84
|
-
end
|
85
|
-
|
86
|
-
it "mongoizes correctly a Money object to a hash of cents and currency" do
|
87
|
-
expect(priceable_with_infinite_precision.price.cents).to eq(BigDecimal.new('100.1'))
|
88
|
-
expect(priceable_with_infinite_precision.price.currency).to eq(Money::Currency.find('EUR'))
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it "serializes correctly a Hash field containing Money objects" do
|
94
|
-
expect(priceable_with_hash_field.price_hash[:key1][:cents]).to eq(100)
|
95
|
-
expect(priceable_with_hash_field.price_hash[:key2][:cents]).to eq(200)
|
96
|
-
expect(priceable_with_hash_field.price_hash[:key1][:currency_iso]).to eq('EUR')
|
97
|
-
expect(priceable_with_hash_field.price_hash[:key2][:currency_iso]).to eq('USD')
|
98
|
-
end
|
99
|
-
|
100
|
-
context "demongoize" do
|
101
|
-
subject { Priceable.first.price }
|
102
|
-
it { is_expected.to be_an_instance_of(Money) }
|
103
|
-
it { is_expected.to eq(Money.new(100, 'EUR')) }
|
104
|
-
|
105
|
-
it "returns nil if a nil value was stored" do
|
106
|
-
nil_priceable = Priceable.create(price: nil)
|
107
|
-
expect(nil_priceable.price).to be_nil
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'returns nil if an unknown value was stored' do
|
111
|
-
zero_priceable = Priceable.create(price: [])
|
112
|
-
expect(zero_priceable.price).to be_nil
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "evolve" do
|
117
|
-
it "transforms correctly a Money object to a Mongo friendly value" do
|
118
|
-
expect(Priceable.where(price: Money.new(100, 'EUR')).first).to eq(priceable)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|