money 4.0.1 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
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