exchange 0.5.1 → 0.6.0
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/Gemfile +17 -8
- data/Gemfile.lock +12 -6
- data/LICENSE.txt +1 -1
- data/README.rdoc +15 -12
- data/VERSION +1 -1
- data/exchange.gemspec +13 -23
- data/lib/core_extensions/conversability.rb +5 -4
- data/lib/exchange.rb +6 -11
- data/lib/exchange/base.rb +19 -0
- data/lib/exchange/cache/base.rb +57 -32
- data/lib/exchange/cache/file.rb +41 -45
- data/lib/exchange/cache/memcached.rb +28 -29
- data/lib/exchange/cache/no_cache.rb +4 -24
- data/lib/exchange/cache/rails.rb +26 -26
- data/lib/exchange/cache/redis.rb +30 -33
- data/lib/exchange/configuration.rb +167 -73
- data/lib/exchange/currency.rb +61 -30
- data/lib/exchange/external_api.rb +2 -0
- data/lib/exchange/external_api/base.rb +11 -5
- data/lib/exchange/external_api/call.rb +10 -7
- data/lib/exchange/external_api/currency_bot.rb +9 -5
- data/lib/exchange/external_api/ecb.rb +29 -13
- data/lib/exchange/external_api/json.rb +22 -0
- data/lib/exchange/external_api/xavier_media.rb +6 -5
- data/lib/exchange/external_api/xml.rb +22 -0
- data/lib/exchange/gem_loader.rb +35 -0
- data/lib/exchange/helper.rb +22 -15
- data/lib/exchange/iso_4217.rb +55 -44
- data/spec/core_extensions/conversability_spec.rb +2 -2
- data/spec/exchange/cache/base_spec.rb +7 -7
- data/spec/exchange/cache/file_spec.rb +19 -18
- data/spec/exchange/cache/memcached_spec.rb +29 -26
- data/spec/exchange/cache/no_cache_spec.rb +12 -6
- data/spec/exchange/cache/rails_spec.rb +13 -9
- data/spec/exchange/cache/redis_spec.rb +24 -24
- data/spec/exchange/configuration_spec.rb +38 -30
- data/spec/exchange/currency_spec.rb +33 -21
- data/spec/exchange/external_api/base_spec.rb +3 -1
- data/spec/exchange/external_api/call_spec.rb +5 -1
- data/spec/exchange/external_api/currency_bot_spec.rb +5 -1
- data/spec/exchange/external_api/ecb_spec.rb +9 -5
- data/spec/exchange/external_api/xavier_media_spec.rb +5 -1
- data/spec/exchange/gem_loader_spec.rb +29 -0
- data/spec/spec_helper.rb +1 -1
- metadata +12 -87
@@ -7,14 +7,20 @@ describe "Exchange::Cache::Rails" do
|
|
7
7
|
end
|
8
8
|
subject { Exchange::Cache::NoCache }
|
9
9
|
before(:each) do
|
10
|
-
Exchange::Configuration.
|
11
|
-
c.cache
|
12
|
-
|
10
|
+
Exchange.configuration = Exchange::Configuration.new { |c|
|
11
|
+
c.cache = {
|
12
|
+
:class => :no_cache
|
13
|
+
}
|
14
|
+
}
|
13
15
|
end
|
14
16
|
after(:each) do
|
15
|
-
Exchange::Configuration.
|
16
|
-
c.cache
|
17
|
-
|
17
|
+
Exchange.configuration = Exchange::Configuration.new { |c|
|
18
|
+
c.cache = {
|
19
|
+
:class => :memcached,
|
20
|
+
:host => 'localhost',
|
21
|
+
:port => 11211
|
22
|
+
}
|
23
|
+
}
|
18
24
|
end
|
19
25
|
describe "cached" do
|
20
26
|
it "should directly call the block" do
|
@@ -5,16 +5,20 @@ describe "Exchange::Cache::Rails" do
|
|
5
5
|
class ::Rails
|
6
6
|
end
|
7
7
|
end
|
8
|
-
subject { Exchange::Cache::Rails }
|
8
|
+
subject { Exchange::Cache::Rails.instance }
|
9
9
|
before(:each) do
|
10
|
-
Exchange::Configuration.
|
11
|
-
c.cache
|
12
|
-
|
10
|
+
Exchange.configuration = Exchange::Configuration.new { |c|
|
11
|
+
c.cache = {
|
12
|
+
:class => :rails
|
13
|
+
}
|
14
|
+
}
|
13
15
|
end
|
14
16
|
after(:each) do
|
15
|
-
Exchange::Configuration.
|
16
|
-
c.cache
|
17
|
-
|
17
|
+
Exchange.configuration = Exchange::Configuration.new { |c|
|
18
|
+
c.cache = {
|
19
|
+
:class => :memcached
|
20
|
+
}
|
21
|
+
}
|
18
22
|
end
|
19
23
|
describe "client" do
|
20
24
|
let(:client) { mock('rails_cache') }
|
@@ -41,13 +45,13 @@ describe "Exchange::Cache::Rails" do
|
|
41
45
|
end
|
42
46
|
context "with an hourly cache" do
|
43
47
|
before(:each) do
|
44
|
-
Exchange
|
48
|
+
Exchange.configuration.cache.expire = :hourly
|
45
49
|
subject.should_receive(:key).with('API_CLASS', {}).and_return('KEY')
|
46
50
|
::Rails.should_receive(:cache).and_return(client)
|
47
51
|
client.should_receive(:fetch).with('KEY', :expires_in => 3600).and_return "{\"RESULT\":\"YAY\"}"
|
48
52
|
end
|
49
53
|
after(:each) do
|
50
|
-
Exchange
|
54
|
+
Exchange.configuration.cache.expire = :daily
|
51
55
|
end
|
52
56
|
it "should return the JSON loaded result" do
|
53
57
|
subject.cached('API_CLASS') { 'something' }.should == "{\"RESULT\":\"YAY\"}"
|
@@ -1,25 +1,30 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'redis'
|
2
3
|
|
3
4
|
describe "Exchange::Cache::Redis" do
|
4
|
-
subject { Exchange::Cache::Redis }
|
5
|
+
subject { Exchange::Cache::Redis.instance }
|
5
6
|
before(:each) do
|
6
|
-
Exchange::Configuration.
|
7
|
-
c.cache
|
8
|
-
|
9
|
-
|
7
|
+
Exchange.configuration = Exchange::Configuration.new do |c|
|
8
|
+
c.cache = {
|
9
|
+
:class => :redis,
|
10
|
+
:host => 'HOST',
|
11
|
+
:port => 'PORT'
|
12
|
+
}
|
10
13
|
end
|
11
14
|
end
|
12
15
|
after(:each) do
|
13
|
-
Exchange::Configuration.
|
14
|
-
c.cache
|
15
|
-
|
16
|
-
|
16
|
+
Exchange.configuration = Exchange::Configuration.new do |c|
|
17
|
+
c.cache = {
|
18
|
+
:class => :memcached,
|
19
|
+
:host => 'localhost',
|
20
|
+
:port => 11211
|
21
|
+
}
|
17
22
|
end
|
18
23
|
end
|
19
24
|
describe "client" do
|
20
25
|
let(:client) { mock('redis') }
|
21
26
|
after(:each) do
|
22
|
-
subject.
|
27
|
+
subject.instance_variable_set "@client", nil
|
23
28
|
end
|
24
29
|
it "should set up a client on the specified host and port for the cache" do
|
25
30
|
::Redis.should_receive(:new).with(:host => 'HOST', :port => 'PORT').and_return(client)
|
@@ -27,17 +32,17 @@ describe "Exchange::Cache::Redis" do
|
|
27
32
|
end
|
28
33
|
end
|
29
34
|
describe "cached" do
|
35
|
+
let(:client) { mock('redis', :get => nil) }
|
36
|
+
before(:each) do
|
37
|
+
::Redis.should_receive(:new).with(:host => 'HOST', :port => 'PORT').and_return(client)
|
38
|
+
end
|
39
|
+
after(:each) do
|
40
|
+
subject.instance_variable_set "@client", nil
|
41
|
+
end
|
30
42
|
it "should raise an error if no block was given" do
|
31
43
|
lambda { subject.cached('API_CLASS') }.should raise_error(Exchange::Cache::CachingWithoutBlockError)
|
32
44
|
end
|
33
45
|
context "when a cached result exists" do
|
34
|
-
let(:client) { mock('redis') }
|
35
|
-
before(:each) do
|
36
|
-
::Redis.should_receive(:new).with(:host => 'HOST', :port => 'PORT').and_return(client)
|
37
|
-
end
|
38
|
-
after(:each) do
|
39
|
-
subject.send(:remove_class_variable, "@@client")
|
40
|
-
end
|
41
46
|
context "when loading json" do
|
42
47
|
before(:each) do
|
43
48
|
subject.should_receive(:key).with('API_CLASS', {}).and_return('KEY')
|
@@ -62,15 +67,10 @@ describe "Exchange::Cache::Redis" do
|
|
62
67
|
end
|
63
68
|
end
|
64
69
|
context "when no cached result exists" do
|
65
|
-
let(:client) { mock('redis') }
|
66
70
|
before(:each) do
|
67
71
|
subject.should_receive(:key).with('API_CLASS', {}).at_most(3).times.and_return('KEY')
|
68
|
-
::Redis.should_receive(:new).with(:host => 'HOST', :port => 'PORT').and_return(client)
|
69
72
|
client.should_receive(:get).with('KEY').and_return nil
|
70
73
|
end
|
71
|
-
after(:each) do
|
72
|
-
subject.send(:remove_class_variable, "@@client")
|
73
|
-
end
|
74
74
|
context "with daily cache" do
|
75
75
|
it "should call the block and set and return the result" do
|
76
76
|
client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}").once
|
@@ -80,10 +80,10 @@ describe "Exchange::Cache::Redis" do
|
|
80
80
|
end
|
81
81
|
context "with hourly cache" do
|
82
82
|
before(:each) do
|
83
|
-
Exchange
|
83
|
+
Exchange.configuration.cache.expire = :hourly
|
84
84
|
end
|
85
85
|
after(:each) do
|
86
|
-
Exchange
|
86
|
+
Exchange.configuration.cache.expire = :daily
|
87
87
|
end
|
88
88
|
it "should call the block and set and return the result" do
|
89
89
|
client.should_receive(:set).with('KEY', "{\"RESULT\":\"YAY\"}").once
|
@@ -1,47 +1,55 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Exchange::Configuration" do
|
4
|
-
let(:subject) { Exchange::Configuration }
|
4
|
+
let(:subject) { Exchange::Configuration.new }
|
5
5
|
it "should have a standard configuration" do
|
6
|
-
subject.api.should ==
|
7
|
-
subject.
|
8
|
-
subject.cache.should ==
|
9
|
-
subject.
|
10
|
-
subject.
|
11
|
-
subject.
|
12
|
-
subject.retries.should == 5
|
6
|
+
subject.api.retries.should == 5
|
7
|
+
subject.api.subclass.should == Exchange::ExternalAPI::XavierMedia
|
8
|
+
subject.cache.subclass.should == Exchange::Cache::Memcached
|
9
|
+
subject.cache.host.should == 'localhost'
|
10
|
+
subject.cache.port.should == 11211
|
11
|
+
subject.cache.expire.should == :daily
|
13
12
|
end
|
14
13
|
it "should respond to all configuration getters and setters" do
|
15
|
-
[:api, :
|
14
|
+
[:api, :allow_mixed_operations, :cache].each do |k|
|
16
15
|
subject.should be_respond_to(k)
|
17
16
|
subject.should be_respond_to(:"#{k}=")
|
18
17
|
end
|
19
18
|
end
|
20
|
-
it
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
it 'should respond to nested getters and setters for the api and the cache' do
|
20
|
+
{:api => [:subclass, :retries], :cache => [:subclass, :host, :port, :expire]}.each do |k,m|
|
21
|
+
m.each do |meth|
|
22
|
+
subject.send(k).should be_respond_to(meth)
|
23
|
+
subject.send(k).should be_respond_to(:"#{meth}=")
|
24
|
+
end
|
25
25
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
end
|
27
|
+
it "should allow to be defined with a block" do
|
28
|
+
Exchange.configuration = Exchange::Configuration.new {|c|
|
29
|
+
c.api = {
|
30
|
+
:subclass => :xavier_media,
|
31
|
+
:retries => 60
|
32
|
+
}
|
33
|
+
c.cache = {
|
34
|
+
:subclass => :redis
|
35
|
+
}
|
36
|
+
}
|
37
|
+
Exchange.configuration.api.subclass.should == Exchange::ExternalAPI::XavierMedia
|
38
|
+
Exchange.configuration.api.retries.should == 60
|
39
|
+
Exchange.configuration.cache.subclass.should == Exchange::Cache::Redis
|
31
40
|
end
|
32
41
|
it "should allow to be set directly" do
|
33
|
-
subject.api =
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
subject.
|
38
|
-
subject.retries.should == 1
|
42
|
+
subject.api = {
|
43
|
+
:subclass => :ecb,
|
44
|
+
:retries => 1
|
45
|
+
}
|
46
|
+
subject.api.subclass.should == Exchange::ExternalAPI::Ecb
|
47
|
+
subject.api.retries.should == 1
|
39
48
|
end
|
40
49
|
after(:all) do
|
41
|
-
subject.api =
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
subject.retries = 5
|
50
|
+
subject.api = {
|
51
|
+
:subclass => :currency_bot,
|
52
|
+
:retries => 5
|
53
|
+
}
|
46
54
|
end
|
47
55
|
end
|
@@ -3,13 +3,22 @@ require 'spec_helper'
|
|
3
3
|
describe "Exchange::Currency" do
|
4
4
|
subject { Exchange::Currency.new(40, :usd) }
|
5
5
|
before(:all) do
|
6
|
-
Exchange::Configuration.
|
7
|
-
c.api =
|
8
|
-
|
6
|
+
Exchange.configuration = Exchange::Configuration.new do |c|
|
7
|
+
c.api = {
|
8
|
+
:subclass => :currency_bot
|
9
|
+
}
|
10
|
+
c.cache = {
|
11
|
+
:subclass => :no_cache
|
12
|
+
}
|
13
|
+
c.allow_mixed_operations = true
|
9
14
|
end
|
10
15
|
end
|
11
16
|
after(:all) do
|
12
|
-
Exchange::Configuration.
|
17
|
+
Exchange.configuration = Exchange::Configuration.new do |c|
|
18
|
+
c.api = {
|
19
|
+
:subclass => :memcached
|
20
|
+
}
|
21
|
+
end
|
13
22
|
end
|
14
23
|
it "should initialize with a number and a currency" do
|
15
24
|
subject.value.should == 40
|
@@ -37,15 +46,15 @@ describe "Exchange::Currency" do
|
|
37
46
|
(subject + Exchange::Currency.new(30, :sek)).currency.should == :usd
|
38
47
|
end
|
39
48
|
it "should raise when currencies get mixed and the configuration does not allow it" do
|
40
|
-
Exchange
|
49
|
+
Exchange.configuration.allow_mixed_operations = false
|
41
50
|
lambda { subject + Exchange::Currency.new(30, :chf) }.should raise_error(Exchange::CurrencyMixError)
|
42
|
-
Exchange
|
51
|
+
Exchange.configuration.allow_mixed_operations = true
|
43
52
|
end
|
44
53
|
it "should not raise when currencies get mixed and the configuration does not allow if the other currency is the same" do
|
45
|
-
Exchange
|
54
|
+
Exchange.configuration.allow_mixed_operations = false
|
46
55
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
47
56
|
lambda { subject + Exchange::Currency.new(30, :usd) }.should_not raise_error
|
48
|
-
Exchange
|
57
|
+
Exchange.configuration.allow_mixed_operations = true
|
49
58
|
end
|
50
59
|
end
|
51
60
|
describe "- other" do
|
@@ -57,19 +66,20 @@ describe "Exchange::Currency" do
|
|
57
66
|
end
|
58
67
|
it "should be able to subtract another currency value" do
|
59
68
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
69
|
+
Exchange.configuration.allow_mixed_operations = true
|
60
70
|
(subject + Exchange::Currency.new(10, :chf)).value.round(2).should == 50.96
|
61
71
|
(subject + Exchange::Currency.new(23.3, :eur)).currency.should == :usd
|
62
72
|
end
|
63
73
|
it "should raise when currencies get mixed and the configuration does not allow it" do
|
64
|
-
Exchange
|
74
|
+
Exchange.configuration.allow_mixed_operations = false
|
65
75
|
lambda { subject - Exchange::Currency.new(30, :chf) }.should raise_error(Exchange::CurrencyMixError)
|
66
|
-
Exchange
|
76
|
+
Exchange.configuration.allow_mixed_operations = true
|
67
77
|
end
|
68
78
|
it "should not raise when currencies get mixed and the configuration does not allow if the other currency is the same" do
|
69
|
-
Exchange
|
79
|
+
Exchange.configuration.allow_mixed_operations = false
|
70
80
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
71
81
|
lambda { subject - Exchange::Currency.new(30, :usd) }.should_not raise_error
|
72
|
-
Exchange
|
82
|
+
Exchange.configuration.allow_mixed_operations = true
|
73
83
|
end
|
74
84
|
end
|
75
85
|
describe "* other" do
|
@@ -81,19 +91,20 @@ describe "Exchange::Currency" do
|
|
81
91
|
end
|
82
92
|
it "should be able to multiply by another currency value" do
|
83
93
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
94
|
+
Exchange.configuration.allow_mixed_operations = true
|
84
95
|
(subject * Exchange::Currency.new(10, :chf)).value.round(1).should == 438.3
|
85
96
|
(subject * Exchange::Currency.new(23.3, :eur)).currency.should == :usd
|
86
97
|
end
|
87
98
|
it "should raise when currencies get mixed and the configuration does not allow it" do
|
88
|
-
Exchange
|
99
|
+
Exchange.configuration.allow_mixed_operations = false
|
89
100
|
lambda { subject * Exchange::Currency.new(30, :chf) }.should raise_error(Exchange::CurrencyMixError)
|
90
|
-
Exchange
|
101
|
+
Exchange.configuration.allow_mixed_operations = true
|
91
102
|
end
|
92
103
|
it "should not raise when currencies get mixed and the configuration does not allow if the other currency is the same" do
|
93
|
-
Exchange
|
104
|
+
Exchange.configuration.allow_mixed_operations = false
|
94
105
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
95
106
|
lambda { subject * Exchange::Currency.new(30, :usd) }.should_not raise_error
|
96
|
-
Exchange
|
107
|
+
Exchange.configuration.allow_mixed_operations = true
|
97
108
|
end
|
98
109
|
end
|
99
110
|
describe "/ other" do
|
@@ -105,19 +116,20 @@ describe "Exchange::Currency" do
|
|
105
116
|
end
|
106
117
|
it "should be able to multiply by another currency value" do
|
107
118
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
119
|
+
Exchange.configuration.allow_mixed_operations = true
|
108
120
|
(subject / Exchange::Currency.new(10, :chf)).value.round(2).should == BigDecimal.new("3.65")
|
109
121
|
(subject / Exchange::Currency.new(23.3, :eur)).currency.should == :usd
|
110
122
|
end
|
111
123
|
it "should raise when currencies get mixed and the configuration does not allow it" do
|
112
|
-
Exchange
|
124
|
+
Exchange.configuration.allow_mixed_operations = false
|
113
125
|
lambda { subject / Exchange::Currency.new(30, :chf) }.should raise_error(Exchange::CurrencyMixError)
|
114
|
-
Exchange
|
126
|
+
Exchange.configuration.allow_mixed_operations = true
|
115
127
|
end
|
116
128
|
it "should not raise when currencies get mixed and the configuration does not allow if the other currency is the same" do
|
117
|
-
Exchange
|
129
|
+
Exchange.configuration.allow_mixed_operations = false
|
118
130
|
mock_api("http://openexchangerates.org/api/latest.json?app_id=", fixture('api_responses/example_json_api.json'), 2)
|
119
131
|
lambda { subject / Exchange::Currency.new(30, :usd) }.should_not raise_error
|
120
|
-
Exchange
|
132
|
+
Exchange.configuration.allow_mixed_operations = true
|
121
133
|
end
|
122
134
|
end
|
123
135
|
describe "comparison" do
|
@@ -272,7 +284,7 @@ describe "Exchange::Currency" do
|
|
272
284
|
5.eur(:at => Time.gm(2011,1,1)).to_usd.value.should == 5.eur.to_usd(:at => Time.gm(2011,1,1)).value
|
273
285
|
end
|
274
286
|
it "should raise errors for currency conversions it does not have rates for" do
|
275
|
-
lambda { subject.to_ssp }.should raise_error(NoRateError)
|
287
|
+
lambda { subject.to_ssp }.should raise_error(Exchange::NoRateError)
|
276
288
|
end
|
277
289
|
it "should pass on methods it does not understand to its number" do
|
278
290
|
subject.to_f.should == 40
|
@@ -3,7 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe "Exchange::ExternalAPI::Base" do
|
4
4
|
subject { Exchange::ExternalAPI::Base.new }
|
5
5
|
before(:each) do
|
6
|
-
Exchange
|
6
|
+
Exchange.configuration = Exchange::Configuration.new{|c|
|
7
|
+
c.cache = {:subclass => :no_cache}
|
8
|
+
}
|
7
9
|
end
|
8
10
|
before(:each) do
|
9
11
|
subject.instance_variable_set("@rates", {'EUR' => BigDecimal.new("3.45"), 'CHF' => BigDecimal.new("5.565")})
|
@@ -2,7 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Exchange::ExternalAPI::Call" do
|
4
4
|
before(:all) do
|
5
|
-
Exchange
|
5
|
+
Exchange.configuration = Exchange::Configuration.new{|c|
|
6
|
+
c.cache = {
|
7
|
+
:subclass => :no_cache
|
8
|
+
}
|
9
|
+
}
|
6
10
|
end
|
7
11
|
describe "initialization" do
|
8
12
|
context "with a json api" do
|
@@ -2,7 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Exchange::ExternalAPI::CurrencyBot" do
|
4
4
|
before(:all) do
|
5
|
-
Exchange
|
5
|
+
Exchange.configuration = Exchange::Configuration.new{|c|
|
6
|
+
c.cache = {
|
7
|
+
:subclass => :no_cache
|
8
|
+
}
|
9
|
+
}
|
6
10
|
end
|
7
11
|
describe "updating rates" do
|
8
12
|
subject { Exchange::ExternalAPI::CurrencyBot.new }
|
@@ -1,15 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Exchange::ExternalAPI::
|
3
|
+
describe "Exchange::ExternalAPI::Ecb" do
|
4
4
|
before(:all) do
|
5
|
-
Exchange::Configuration.
|
5
|
+
Exchange.configuration = Exchange::Configuration.new { |c|
|
6
|
+
c.cache = {
|
7
|
+
:subclass => :no_cache
|
8
|
+
}
|
9
|
+
}
|
6
10
|
end
|
7
11
|
before(:each) do
|
8
12
|
time = Time.gm(2012,2,3)
|
9
13
|
Time.stub! :now => time
|
10
14
|
end
|
11
15
|
describe "updating rates" do
|
12
|
-
subject { Exchange::ExternalAPI::
|
16
|
+
subject { Exchange::ExternalAPI::Ecb.new }
|
13
17
|
before(:each) do
|
14
18
|
mock_api("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml", fixture('api_responses/example_ecb_xml_90d.xml'))
|
15
19
|
end
|
@@ -23,7 +27,7 @@ describe "Exchange::ExternalAPI::ECB" do
|
|
23
27
|
end
|
24
28
|
end
|
25
29
|
describe "conversion" do
|
26
|
-
subject { Exchange::ExternalAPI::
|
30
|
+
subject { Exchange::ExternalAPI::Ecb.new }
|
27
31
|
before(:each) do
|
28
32
|
mock_api("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml", fixture('api_responses/example_ecb_xml_90d.xml'))
|
29
33
|
end
|
@@ -38,7 +42,7 @@ describe "Exchange::ExternalAPI::ECB" do
|
|
38
42
|
end
|
39
43
|
end
|
40
44
|
describe "historic conversion" do
|
41
|
-
subject { Exchange::ExternalAPI::
|
45
|
+
subject { Exchange::ExternalAPI::Ecb.new }
|
42
46
|
before(:each) do
|
43
47
|
mock_api("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml", fixture('api_responses/example_ecb_xml_history.xml'))
|
44
48
|
end
|