money 4.0.1 → 4.0.2

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.
data/money.gemspec CHANGED
@@ -1,29 +1,29 @@
1
- # -*- encoding: utf-8 -*-
2
- Gem::Specification.new do |s|
3
- s.name = "money"
4
- s.version = "4.0.1"
5
- s.platform = Gem::Platform::RUBY
6
- s.authors = ["Tobias Luetke", "Hongli Lai", "Jeremy McNevin",
7
- "Shane Emmons", "Simone Carletti"]
8
- s.email = ["semmons99+RubyMoney@gmail.com"]
9
- s.homepage = "http://money.rubyforge.org"
10
- s.summary = "Money and currency exchange support library."
11
- s.description = "This library aids one in handling money and different currencies."
12
-
13
- s.required_rubygems_version = ">= 1.3.6"
14
- s.rubyforge_project = "money"
15
-
16
- s.add_dependency "i18n", "~> 0.4"
17
- s.add_dependency "json"
18
-
19
- s.add_development_dependency "rspec", ">= 2.0.0"
20
- s.add_development_dependency "yard"
21
-
22
- s.requirements << "json"
23
-
24
- s.files = Dir.glob("{config,lib,spec}/**/*")
25
- s.files += %w(CHANGELOG.md LICENSE README.md)
26
- s.files += %w(Rakefile .gemtest money.gemspec)
27
-
28
- s.require_path = "lib"
29
- end
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |s|
3
+ s.name = "money"
4
+ s.version = "4.0.2"
5
+ s.platform = Gem::Platform::RUBY
6
+ s.authors = ["Tobias Luetke", "Hongli Lai", "Jeremy McNevin",
7
+ "Shane Emmons", "Simone Carletti"]
8
+ s.email = ["semmons99+RubyMoney@gmail.com"]
9
+ s.homepage = "https://github.com/RubyMoney/money"
10
+ s.summary = "Money and currency exchange support library."
11
+ s.description = "This library aids one in handling money and different currencies."
12
+
13
+ s.required_rubygems_version = ">= 1.3.6"
14
+ s.rubyforge_project = "money"
15
+
16
+ s.add_dependency "i18n", "~> 0.4"
17
+ s.add_dependency "json"
18
+
19
+ s.add_development_dependency "rspec", "~> 2.8.0"
20
+ s.add_development_dependency "yard"
21
+
22
+ s.requirements << "json"
23
+
24
+ s.files = Dir.glob("{config,lib,spec}/**/*")
25
+ s.files += %w(CHANGELOG.md LICENSE README.md)
26
+ s.files += %w(Rakefile .gemtest money.gemspec)
27
+
28
+ s.require_path = "lib"
29
+ end
@@ -1,72 +1,69 @@
1
- require "spec_helper"
2
-
3
- describe Money::Bank::Base do
4
- before :each do
5
- @bank = Money::Bank::Base.new
6
- end
7
-
8
- describe '#new with &block' do
9
- it 'should store @rounding_method' do
10
- proc = Proc.new{|n| n.ceil}
11
- bank = Money::Bank::Base.new(&proc)
12
- bank.rounding_method.should == proc
13
- end
14
- end
15
-
16
- describe '#setup' do
17
- it 'should call #setup after #initialize' do
18
- class MyBank < Money::Bank::Base
19
- attr_reader :setup_called
20
-
21
- def setup
22
- @setup_called = true
23
- end
24
- end
25
-
26
- bank = MyBank.new
27
- bank.setup_called.should == true
28
- end
29
- end
30
-
31
- describe '#exchange_with' do
32
- it 'should raise NotImplementedError' do
33
- lambda { @bank.exchange_with(Money.new(100, 'USD'), 'EUR') }.should raise_exception(NotImplementedError)
34
- end
35
- end
36
-
37
- describe '#same_currency?' do
38
- it 'should accept str/str' do
39
- lambda{@bank.send(:same_currency?, 'USD', 'EUR')}.should_not raise_exception
40
- end
41
-
42
- it 'should accept currency/str' do
43
- lambda{@bank.send(:same_currency?, Money::Currency.wrap('USD'), 'EUR')}.should_not raise_exception
44
- end
45
-
46
- it 'should accept str/currency' do
47
- lambda{@bank.send(:same_currency?, 'USD', Money::Currency.wrap('EUR'))}.should_not raise_exception
48
- end
49
-
50
- it 'should accept currency/currency' do
51
- lambda{@bank.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR'))}.should_not raise_exception
52
- end
53
-
54
- it 'should return `true` when currencies match' do
55
- @bank.send(:same_currency?, 'USD', 'USD').should == true
56
- @bank.send(:same_currency?, Money::Currency.wrap('USD'), 'USD').should == true
57
- @bank.send(:same_currency?, 'USD', Money::Currency.wrap('USD')).should == true
58
- @bank.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('USD')).should == true
59
- end
60
-
61
- it 'should return `false` when currencies do not match' do
62
- @bank.send(:same_currency?, 'USD', 'EUR').should == false
63
- @bank.send(:same_currency?, Money::Currency.wrap('USD'), 'EUR').should == false
64
- @bank.send(:same_currency?, 'USD', Money::Currency.wrap('EUR')).should == false
65
- @bank.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR')).should == false
66
- end
67
-
68
- it 'should raise an UnknownCurrency exception when an unknown currency is passed' do
69
- lambda{@bank.send(:same_currency?, 'AAA', 'BBB')}.should raise_exception(Money::Currency::UnknownCurrency)
70
- end
71
- end
72
- end
1
+ require 'spec_helper'
2
+
3
+ describe Money::Bank::Base do
4
+
5
+ describe "#initialize" do
6
+ it "accepts a block and stores @rounding_method" do
7
+ proc = Proc.new { |n| n.ceil }
8
+ bank = Money::Bank::Base.new(&proc)
9
+ bank.rounding_method.should == proc
10
+ end
11
+ end
12
+
13
+ describe "#setup" do
14
+ it "calls #setup after #initialize" do
15
+ class MyBank < Money::Bank::Base
16
+ attr_reader :setup_called
17
+
18
+ def setup
19
+ @setup_called = true
20
+ end
21
+ end
22
+
23
+ bank = MyBank.new
24
+ bank.setup_called.should == true
25
+ end
26
+ end
27
+
28
+ describe "#exchange_with" do
29
+ it "is not implemented" do
30
+ expect { subject.exchange_with(Money.new(100, 'USD'), 'EUR') }.to raise_exception(NotImplementedError)
31
+ end
32
+ end
33
+
34
+ describe "#same_currency?" do
35
+ it "accepts str/str" do
36
+ expect { subject.send(:same_currency?, 'USD', 'EUR') }.to_not raise_exception
37
+ end
38
+
39
+ it "accepts currency/str" do
40
+ expect { subject.send(:same_currency?, Money::Currency.wrap('USD'), 'EUR') }.to_not raise_exception
41
+ end
42
+
43
+ it "accepts str/currency" do
44
+ expect { subject.send(:same_currency?, 'USD', Money::Currency.wrap('EUR')) }.to_not raise_exception
45
+ end
46
+
47
+ it "accepts currency/currency" do
48
+ expect { subject.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR')) }.to_not raise_exception
49
+ end
50
+
51
+ it "returns true when currencies match" do
52
+ subject.send(:same_currency?, 'USD', 'USD').should be_true
53
+ subject.send(:same_currency?, Money::Currency.wrap('USD'), 'USD').should be_true
54
+ subject.send(:same_currency?, 'USD', Money::Currency.wrap('USD')).should be_true
55
+ subject.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('USD')).should be_true
56
+ end
57
+
58
+ it "returns false when currencies do not match" do
59
+ subject.send(:same_currency?, 'USD', 'EUR').should be_false
60
+ subject.send(:same_currency?, Money::Currency.wrap('USD'), 'EUR').should be_false
61
+ subject.send(:same_currency?, 'USD', Money::Currency.wrap('EUR')).should be_false
62
+ subject.send(:same_currency?, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR')).should be_false
63
+ end
64
+
65
+ it "raises an UnknownCurrency exception when an unknown currency is passed" do
66
+ expect { subject.send(:same_currency?, 'AAA', 'BBB') }.to raise_exception(Money::Currency::UnknownCurrency)
67
+ end
68
+ end
69
+ end
@@ -1,238 +1,233 @@
1
- require "spec_helper"
2
- require "json"
3
- require "yaml"
4
-
5
- describe Money::Bank::VariableExchange do
6
-
7
- describe '#new without block' do
8
- before :each do
9
- @bank = Money::Bank::VariableExchange.new
10
- end
11
-
12
- describe '#exchange_with' do
13
- before :each do
14
- @bank.send(:set_rate, 'USD', 'EUR', 1.33)
15
- end
16
-
17
- it 'should accept str' do
18
- lambda{@bank.exchange_with(Money.new(100, 'USD'), 'EUR')}.should_not raise_exception
19
- end
20
-
21
- it 'should accept currency' do
22
- lambda{@bank.exchange_with(Money.new(100, 'USD'), Money::Currency.wrap('EUR'))}.should_not raise_exception
23
- end
24
-
25
- it 'should exchange one currency to another' do
26
- @bank.exchange_with(Money.new(100, 'USD'), 'EUR').should == Money.new(133, 'EUR')
27
- end
28
-
29
- it 'should truncate extra digits' do
30
- @bank.exchange_with(Money.new(10, 'USD'), 'EUR').should == Money.new(13, 'EUR')
31
- end
32
-
33
- it 'should raise an UnknownCurrency exception when an unknown currency is requested' do
34
- lambda{@bank.exchange_with(Money.new(100, 'USD'), 'BBB')}.should raise_exception(Money::Currency::UnknownCurrency)
35
- end
36
-
37
- it 'should raise an UnknownRate exception when an unknown rate is requested' do
38
- lambda{@bank.exchange_with(Money.new(100, 'USD'), 'JPY')}.should raise_exception(Money::Bank::UnknownRate)
39
- end
40
-
41
- #it 'should round the exchanged result down' do
42
- # @bank.add_rate("USD", "EUR", 0.788332676)
43
- # @bank.add_rate("EUR", "YEN", 122.631477)
44
- # @bank.exchange_with(Money.new(10_00, "USD"), "EUR").should == Money.new(788, "EUR")
45
- # @bank.exchange_with(Money.new(500_00, "EUR"), "YEN").should == Money.new(6131573, "YEN")
46
- #end
47
-
48
- it 'should accept a custom truncation method' do
49
- proc = Proc.new { |n| n.ceil }
50
- @bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc).should == Money.new(14, 'EUR')
51
- end
52
- end
53
-
54
- describe "#add_rate" do
55
- it "should add rates correctly" do
56
- @bank.add_rate("USD", "EUR", 0.788332676)
57
- @bank.add_rate("EUR", "YEN", 122.631477)
58
-
59
- @bank.instance_variable_get(:@rates)['USD_TO_EUR'].should == 0.788332676
60
- @bank.instance_variable_get(:@rates)['EUR_TO_JPY'].should == 122.631477
61
- end
62
-
63
- it "should treat currency names case-insensitively" do
64
- @bank.add_rate("usd", "eur", 1)
65
- @bank.instance_variable_get(:@rates)['USD_TO_EUR'].should == 1
66
- end
67
- end
68
-
69
- describe '#set_rate' do
70
- it 'should set a rate' do
71
- @bank.set_rate('USD', 'EUR', 1.25)
72
- @bank.instance_variable_get(:@rates)['USD_TO_EUR'].should == 1.25
73
- end
74
-
75
- it 'should raise an UnknownCurrency exception when an unknown currency is passed' do
76
- lambda{ @bank.set_rate('AAA', 'BBB', 1.25) }.should raise_exception(Money::Currency::UnknownCurrency)
77
- end
78
- end
79
-
80
- describe '#get_rate' do
81
- it 'should return a rate' do
82
- @bank.set_rate('USD', 'EUR', 1.25)
83
- @bank.get_rate('USD', 'EUR').should == 1.25
84
- end
85
-
86
- it 'should raise an UnknownCurrency exception when an unknown currency is requested' do
87
- lambda{ @bank.get_rate('AAA', 'BBB') }.should raise_exception(Money::Currency::UnknownCurrency)
88
- end
89
- end
90
-
91
- describe '#export_rates' do
92
- before :each do
93
- @bank.set_rate('USD', 'EUR', 1.25)
94
- @bank.set_rate('USD', 'JPY', 2.55)
95
-
96
- @rates = {"USD_TO_EUR"=>1.25,"USD_TO_JPY"=>2.55}
97
- end
98
-
99
- describe 'with format == :json' do
100
- it 'should return rates formatted as json' do
101
- json = @bank.export_rates(:json)
102
- JSON.load(json).should == @rates
103
- end
104
- end
105
-
106
- describe 'with format == :ruby' do
107
- it 'should return rates formatted as ruby objects' do
108
- Marshal.load(@bank.export_rates(:ruby)).should == @rates
109
- end
110
- end
111
-
112
- describe 'with format == :yaml' do
113
- it 'should return rates formatted as yaml' do
114
- yaml = @bank.export_rates(:yaml)
115
- YAML.load(yaml).should == @rates
116
- end
117
- end
118
-
119
- describe 'with unknown format' do
120
- it 'should raise `UnknownRateFormat`' do
121
- lambda{@bank.export_rates(:foo)}.should raise_error Money::Bank::UnknownRateFormat
122
- end
123
- end
124
-
125
- describe 'with :file provided' do
126
- it 'should write rates to file' do
127
- f = mock('IO')
128
- File.should_receive(:open).with('null', 'w').and_return(f)
129
- f.should_receive(:write).with(@rates.to_json)
130
-
131
- @bank.export_rates(:json, 'null')
132
- end
133
- end
134
- end
135
-
136
- describe '#import_rates' do
137
- describe 'with format == :json' do
138
- it 'should load the rates provided' do
139
- s = '{"USD_TO_EUR":1.25,"USD_TO_JPY":2.55}'
140
- @bank.import_rates(:json, s)
141
- @bank.get_rate('USD', 'EUR').should == 1.25
142
- @bank.get_rate('USD', 'JPY').should == 2.55
143
- end
144
- end
145
-
146
- describe 'with format == :ruby' do
147
- it 'should load the rates provided' do
148
- s = Marshal.dump({"USD_TO_EUR"=>1.25,"USD_TO_JPY"=>2.55})
149
- @bank.import_rates(:ruby, s)
150
- @bank.get_rate('USD', 'EUR').should == 1.25
151
- @bank.get_rate('USD', 'JPY').should == 2.55
152
- end
153
- end
154
-
155
- describe 'with format == :yaml' do
156
- it 'should load the rates provided' do
157
- s = "--- \nUSD_TO_EUR: 1.25\nUSD_TO_JPY: 2.55\n"
158
- @bank.import_rates(:yaml, s)
159
- @bank.get_rate('USD', 'EUR').should == 1.25
160
- @bank.get_rate('USD', 'JPY').should == 2.55
161
- end
162
- end
163
-
164
- describe 'with unknown format' do
165
- it 'should raise `UnknownRateFormat`' do
166
- lambda{@bank.import_rates(:foo, "")}.should raise_error Money::Bank::UnknownRateFormat
167
- end
168
- end
169
- end
170
-
171
- describe '#rate_key_for' do
172
- it 'should accept str/str' do
173
- lambda{@bank.send(:rate_key_for, 'USD', 'EUR')}.should_not raise_exception
174
- end
175
-
176
- it 'should accept currency/str' do
177
- lambda{@bank.send(:rate_key_for, Money::Currency.wrap('USD'), 'EUR')}.should_not raise_exception
178
- end
179
-
180
- it 'should accept str/currency' do
181
- lambda{@bank.send(:rate_key_for, 'USD', Money::Currency.wrap('EUR'))}.should_not raise_exception
182
- end
183
-
184
- it 'should accept currency/currency' do
185
- lambda{@bank.send(:rate_key_for, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR'))}.should_not raise_exception
186
- end
187
-
188
- it 'should return a hashkey based on the passed arguments' do
189
- @bank.send(:rate_key_for, 'USD', 'EUR').should == 'USD_TO_EUR'
190
- @bank.send(:rate_key_for, Money::Currency.wrap('USD'), 'EUR').should == 'USD_TO_EUR'
191
- @bank.send(:rate_key_for, 'USD', Money::Currency.wrap('EUR')).should == 'USD_TO_EUR'
192
- @bank.send(:rate_key_for, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR')).should == 'USD_TO_EUR'
193
- end
194
-
195
- it 'should raise an UnknownCurrency exception when an unknown currency is passed' do
196
- lambda{@bank.send(:rate_key_for, 'AAA', 'BBB')}.should raise_exception(Money::Currency::UnknownCurrency)
197
- end
198
- end
199
-
200
- end
201
-
202
-
203
- describe '#new with &block' do
204
- before :each do
205
- proc = Proc.new { |n| n.ceil }
206
- @bank = Money::Bank::VariableExchange.new(&proc)
207
- @bank.add_rate('USD', 'EUR', 1.33)
208
- end
209
-
210
- describe '#exchange_with' do
211
- it 'should use a stored truncation method' do
212
- @bank.exchange_with(Money.new(10, 'USD'), 'EUR').should == Money.new(14, 'EUR')
213
- end
214
-
215
- it 'should use a custom truncation method over a stored one' do
216
- proc = Proc.new { |n| n.ceil + 1 }
217
- @bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc).should == Money.new(15, 'EUR')
218
- end
219
- end
220
- end
221
-
222
- describe "#marshal_dump" do
223
- before :each do
224
- @bank = Money::Bank::VariableExchange.new
225
- end
226
-
227
- it 'should not raise an error' do
228
- lambda{Marshal.dump(@bank)}.should_not raise_error
229
- end
230
-
231
- it 'should work with Marshal.load' do
232
- b = Marshal.load(Marshal.dump(@bank))
233
-
234
- b.rates.should == @bank.rates
235
- b.rounding_method.should == @bank.rounding_method
236
- end
237
- end
238
- end
1
+ require 'spec_helper'
2
+ require 'json'
3
+ require 'yaml'
4
+
5
+ describe Money::Bank::VariableExchange do
6
+
7
+ describe "#initialize" do
8
+ context "without &block" do
9
+ let(:bank) {
10
+ Money::Bank::VariableExchange.new.tap do |bank|
11
+ bank.add_rate('USD', 'EUR', 1.33)
12
+ end
13
+ }
14
+
15
+ describe "#exchange_with" do
16
+ it "accepts str" do
17
+ expect { bank.exchange_with(Money.new(100, 'USD'), 'EUR') }.to_not raise_exception
18
+ end
19
+
20
+ it "accepts currency" do
21
+ expect { bank.exchange_with(Money.new(100, 'USD'), Money::Currency.wrap('EUR')) }.to_not raise_exception
22
+ end
23
+
24
+ it "exchanges one currency to another" do
25
+ bank.exchange_with(Money.new(100, 'USD'), 'EUR').should == Money.new(133, 'EUR')
26
+ end
27
+
28
+ it "truncates extra digits" do
29
+ bank.exchange_with(Money.new(10, 'USD'), 'EUR').should == Money.new(13, 'EUR')
30
+ end
31
+
32
+ it "raises an UnknownCurrency exception when an unknown currency is requested" do
33
+ expect { bank.exchange_with(Money.new(100, 'USD'), 'BBB') }.to raise_exception(Money::Currency::UnknownCurrency)
34
+ end
35
+
36
+ it "raises an UnknownRate exception when an unknown rate is requested" do
37
+ expect { bank.exchange_with(Money.new(100, 'USD'), 'JPY') }.to raise_exception(Money::Bank::UnknownRate)
38
+ end
39
+
40
+ #it "rounds the exchanged result down" do
41
+ # bank.add_rate("USD", "EUR", 0.788332676)
42
+ # bank.add_rate("EUR", "YEN", 122.631477)
43
+ # bank.exchange_with(Money.new(10_00, "USD"), "EUR").should == Money.new(788, "EUR")
44
+ # bank.exchange_with(Money.new(500_00, "EUR"), "YEN").should == Money.new(6131573, "YEN")
45
+ #end
46
+
47
+ it "accepts a custom truncation method" do
48
+ proc = Proc.new { |n| n.ceil }
49
+ bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc).should == Money.new(14, 'EUR')
50
+ end
51
+ end
52
+ end
53
+
54
+ context "with &block" do
55
+ let(:bank) {
56
+ proc = Proc.new { |n| n.ceil }
57
+ Money::Bank::VariableExchange.new(&proc).tap do |bank|
58
+ bank.add_rate('USD', 'EUR', 1.33)
59
+ end
60
+ }
61
+
62
+ describe "#exchange_with" do
63
+ it "uses the stored truncation method" do
64
+ bank.exchange_with(Money.new(10, 'USD'), 'EUR').should == Money.new(14, 'EUR')
65
+ end
66
+
67
+ it "accepts a custom truncation method" do
68
+ proc = Proc.new { |n| n.ceil + 1 }
69
+ bank.exchange_with(Money.new(10, 'USD'), 'EUR', &proc).should == Money.new(15, 'EUR')
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#add_rate" do
76
+ it "adds rates correctly" do
77
+ subject.add_rate("USD", "EUR", 0.788332676)
78
+ subject.add_rate("EUR", "YEN", 122.631477)
79
+
80
+ subject.instance_variable_get(:@rates)['USD_TO_EUR'].should == 0.788332676
81
+ subject.instance_variable_get(:@rates)['EUR_TO_JPY'].should == 122.631477
82
+ end
83
+
84
+ it "treats currency names case-insensitively" do
85
+ subject.add_rate("usd", "eur", 1)
86
+ subject.instance_variable_get(:@rates)['USD_TO_EUR'].should == 1
87
+ end
88
+ end
89
+
90
+ describe "#set_rate" do
91
+ it "sets a rate" do
92
+ subject.set_rate('USD', 'EUR', 1.25)
93
+ subject.instance_variable_get(:@rates)['USD_TO_EUR'].should == 1.25
94
+ end
95
+
96
+ it "raises an UnknownCurrency exception when an unknown currency is passed" do
97
+ expect { subject.set_rate('AAA', 'BBB', 1.25) }.to raise_exception(Money::Currency::UnknownCurrency)
98
+ end
99
+ end
100
+
101
+ describe "#get_rate" do
102
+ it "returns a rate" do
103
+ subject.set_rate('USD', 'EUR', 1.25)
104
+ subject.get_rate('USD', 'EUR').should == 1.25
105
+ end
106
+
107
+ it "raises an UnknownCurrency exception when an unknown currency is passed" do
108
+ expect { subject.get_rate('AAA', 'BBB') }.to raise_exception(Money::Currency::UnknownCurrency)
109
+ end
110
+ end
111
+
112
+ describe "#export_rates" do
113
+ before :each do
114
+ subject.set_rate('USD', 'EUR', 1.25)
115
+ subject.set_rate('USD', 'JPY', 2.55)
116
+
117
+ @rates = { "USD_TO_EUR" => 1.25, "USD_TO_JPY" => 2.55 }
118
+ end
119
+
120
+ context "with format == :json" do
121
+ it "should return rates formatted as json" do
122
+ json = subject.export_rates(:json)
123
+ JSON.load(json).should == @rates
124
+ end
125
+ end
126
+
127
+ context "with format == :ruby" do
128
+ it "should return rates formatted as ruby objects" do
129
+ Marshal.load(subject.export_rates(:ruby)).should == @rates
130
+ end
131
+ end
132
+
133
+ context "with format == :yaml" do
134
+ it "should return rates formatted as yaml" do
135
+ yaml = subject.export_rates(:yaml)
136
+ YAML.load(yaml).should == @rates
137
+ end
138
+ end
139
+
140
+ context "with unknown format" do
141
+ it "raises Money::Bank::UnknownRateFormat" do
142
+ expect { subject.export_rates(:foo)}.should raise_error Money::Bank::UnknownRateFormat
143
+ end
144
+ end
145
+
146
+ context "with :file provided" do
147
+ it "writes rates to file" do
148
+ f = mock('IO')
149
+ File.should_receive(:open).with('null', 'w').and_return(f)
150
+ f.should_receive(:write).with(@rates.to_json)
151
+
152
+ subject.export_rates(:json, 'null')
153
+ end
154
+ end
155
+ end
156
+
157
+ describe "#import_rates" do
158
+ context "with format == :json" do
159
+ it "loads the rates provided" do
160
+ s = '{"USD_TO_EUR":1.25,"USD_TO_JPY":2.55}'
161
+ subject.import_rates(:json, s)
162
+ subject.get_rate('USD', 'EUR').should == 1.25
163
+ subject.get_rate('USD', 'JPY').should == 2.55
164
+ end
165
+ end
166
+
167
+ context "with format == :ruby" do
168
+ it "loads the rates provided" do
169
+ s = Marshal.dump({"USD_TO_EUR"=>1.25,"USD_TO_JPY"=>2.55})
170
+ subject.import_rates(:ruby, s)
171
+ subject.get_rate('USD', 'EUR').should == 1.25
172
+ subject.get_rate('USD', 'JPY').should == 2.55
173
+ end
174
+ end
175
+
176
+ context "with format == :yaml" do
177
+ it "loads the rates provided" do
178
+ s = "--- \nUSD_TO_EUR: 1.25\nUSD_TO_JPY: 2.55\n"
179
+ subject.import_rates(:yaml, s)
180
+ subject.get_rate('USD', 'EUR').should == 1.25
181
+ subject.get_rate('USD', 'JPY').should == 2.55
182
+ end
183
+ end
184
+
185
+ context "with unknown format" do
186
+ it "raises Money::Bank::UnknownRateFormat" do
187
+ expect { subject.import_rates(:foo, "")}.should raise_error Money::Bank::UnknownRateFormat
188
+ end
189
+ end
190
+ end
191
+
192
+ describe "#rate_key_for" do
193
+ it "accepts str/str" do
194
+ expect { subject.send(:rate_key_for, 'USD', 'EUR')}.to_not raise_exception
195
+ end
196
+
197
+ it "accepts currency/str" do
198
+ expect { subject.send(:rate_key_for, Money::Currency.wrap('USD'), 'EUR')}.to_not raise_exception
199
+ end
200
+
201
+ it "accepts str/currency" do
202
+ expect { subject.send(:rate_key_for, 'USD', Money::Currency.wrap('EUR'))}.to_not raise_exception
203
+ end
204
+
205
+ it "accepts currency/currency" do
206
+ expect { subject.send(:rate_key_for, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR'))}.to_not raise_exception
207
+ end
208
+
209
+ it "returns a hashkey based on the passed arguments" do
210
+ subject.send(:rate_key_for, 'USD', 'EUR').should == 'USD_TO_EUR'
211
+ subject.send(:rate_key_for, Money::Currency.wrap('USD'), 'EUR').should == 'USD_TO_EUR'
212
+ subject.send(:rate_key_for, 'USD', Money::Currency.wrap('EUR')).should == 'USD_TO_EUR'
213
+ subject.send(:rate_key_for, Money::Currency.wrap('USD'), Money::Currency.wrap('EUR')).should == 'USD_TO_EUR'
214
+ end
215
+
216
+ it "raises a Money::Currency::UnknownCurrency exception when an unknown currency is passed" do
217
+ expect { subject.send(:rate_key_for, 'AAA', 'BBB')}.should raise_exception(Money::Currency::UnknownCurrency)
218
+ end
219
+ end
220
+
221
+ describe "#marshal_dump" do
222
+ it "does not raise an error" do
223
+ expect { Marshal.dump(subject) }.should_not raise_error
224
+ end
225
+
226
+ it "works with Marshal.load" do
227
+ bank = Marshal.load(Marshal.dump(subject))
228
+
229
+ bank.rates.should == subject.rates
230
+ bank.rounding_method.should == subject.rounding_method
231
+ end
232
+ end
233
+ end