EGP_Rates 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ describe EGPRates::Bank do
3
+ subject(:bank) { described_class.new }
4
+
5
+ describe '#exchange_rates' do
6
+ it 'Raises NotImplementedError' do
7
+ expect { bank.exchange_rates }.to raise_error NotImplementedError
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+ describe EGPRates::CBE do
3
+ subject(:bank) { described_class.new }
4
+
5
+ it 'Live Testing', :live do
6
+ expect(bank.exchange_rates).to include(:buy, :sell)
7
+ end
8
+
9
+ describe '.new' do
10
+ it 'initialize instance variables' do
11
+ expect(bank.sym).to eq :CBE
12
+ expect(bank.instance_variable_get(:@uri)).to be_a URI
13
+ end
14
+ end
15
+
16
+ describe '#exchange_rates', vcr: { cassette_name: :CBE } do
17
+ it 'calls #parse with #raw_exchange_rates' do
18
+ expect(bank).to receive(:raw_exchange_rates)
19
+ expect(bank).to receive(:parse)
20
+ bank.exchange_rates
21
+ end
22
+ end
23
+
24
+ describe '#raw_exchange_rates' do
25
+ it 'raises ResponseError unless Net::HTTPSuccess', :no_vcr do
26
+ stub_request(:get, /.*cbe.*/).to_return(body: '', status: 500)
27
+ expect { bank.send(:raw_exchange_rates) }.to raise_error\
28
+ EGPRates::ResponseError, '500'
29
+ end
30
+
31
+ it 'raises ResponseError if HTML structure changed', :no_vcr do
32
+ stub_request(:get, /.*cbe.*/).to_return(body: '', status: 200)
33
+ expect { bank.send(:raw_exchange_rates) }.to raise_error\
34
+ EGPRates::ResponseError, 'Unknown HTML'
35
+ end
36
+
37
+ it 'returns <#Enumerator::Lazy> of 9 rows', vcr: { cassette_name: :CBE } do
38
+ lazy_enumerator = bank.send(:raw_exchange_rates)
39
+ expect(lazy_enumerator).to be_a Enumerator::Lazy
40
+ expect(lazy_enumerator.size).to eq 9
41
+ end
42
+ end
43
+
44
+ describe '#currency_symbol' do
45
+ %w(US Euro Sterling Swiss Japanese Saudi Kuwait UAE Chinese)\
46
+ .each do |currency|
47
+ it "returns currency :SYM for #{currency}" do
48
+ symbols = %i(USD EUR GBP CHF JPY SAR KWD AED CNY)
49
+ expect(symbols).to include(bank.send(:currency_symbol, currency))
50
+ end
51
+ end
52
+
53
+ it 'raises ResponseError when Unknown Currency' do
54
+ expect { bank.send(:currency_symbol, 'Egyptian pound') }.to raise_error\
55
+ EGPRates::ResponseError, 'Unknown currency Egyptian pound'
56
+ end
57
+ end
58
+
59
+ describe '#parse', vcr: { cassette_name: :CBE } do
60
+ let(:raw_data) { bank.send(:raw_exchange_rates) }
61
+
62
+ it 'returns sell: hash of selling prices' do
63
+ expect(bank.send(:parse, raw_data)[:sell]).to include(
64
+ AED: 4.6524,
65
+ CHF: 17.3096,
66
+ CNY: 2.5138,
67
+ EUR: 18.6155,
68
+ GBP: 21.2365,
69
+ JPY: 16.0014,
70
+ KWD: 56.3718,
71
+ SAR: 4.5562,
72
+ USD: 17.0863
73
+ )
74
+ end
75
+
76
+ it 'returns buy: hash of buying prices' do
77
+ expect(bank.send(:parse, raw_data)[:buy]).to include(
78
+ AED: 4.4518,
79
+ CHF: 16.551,
80
+ CNY: 2.4052,
81
+ EUR: 17.8111,
82
+ GBP: 20.3231,
83
+ JPY: 15.3113,
84
+ KWD: 53.8492,
85
+ SAR: 4.3603,
86
+ USD: 16.354
87
+ )
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+ describe EGPRates::NBE do
3
+ subject(:bank) { described_class.new }
4
+
5
+ it 'Live Testing', :live do
6
+ expect(bank.exchange_rates).to include(:buy, :sell)
7
+ end
8
+
9
+ describe '.new' do
10
+ it 'initialize instance variables' do
11
+ expect(bank.sym).to eq :NBE
12
+ expect(bank.instance_variable_get(:@uri)).to be_a URI
13
+ end
14
+ end
15
+
16
+ describe '#exchange_rates', vcr: { cassette_name: :NBE } do
17
+ it 'calls #parse with #raw_exchange_rates' do
18
+ expect(bank).to receive(:raw_exchange_rates)
19
+ expect(bank).to receive(:parse)
20
+ bank.exchange_rates
21
+ end
22
+ end
23
+
24
+ describe '#raw_exchange_rates' do
25
+ it 'raises ResponseError unless Net::HTTPSuccess', :no_vcr do
26
+ stub_request(:get, /.*nbe.*/).to_return(body: '', status: 500)
27
+ expect { bank.send(:raw_exchange_rates) }.to raise_error\
28
+ EGPRates::ResponseError, '500'
29
+ end
30
+
31
+ it 'raises ResponseError if HTML structure changed', :no_vcr do
32
+ stub_request(:get, /.*nbe.*/).to_return(body: '', status: 200)
33
+ expect { bank.send(:raw_exchange_rates) }.to raise_error\
34
+ EGPRates::ResponseError, 'Unknown HTML'
35
+ end
36
+
37
+ it 'returns <#Enumerator::Lazy> of 17 rows', vcr: { cassette_name: :NBE } do
38
+ lazy_enumerator = bank.send(:raw_exchange_rates)
39
+ expect(lazy_enumerator).to be_a Enumerator::Lazy
40
+ expect(lazy_enumerator.size).to eq 17
41
+ end
42
+ end
43
+
44
+ describe '#parse', vcr: { cassette_name: :NBE } do
45
+ let(:raw_data) { bank.send(:raw_exchange_rates) }
46
+
47
+ it 'returns sell: hash of selling prices' do
48
+ expect(bank.send(:parse, raw_data)[:sell]).to include(
49
+ AED: 4.3697,
50
+ AUD: 12.2445,
51
+ BAD: 42.5854,
52
+ CAD: 11.9278,
53
+ CHF: 16.3259,
54
+ DKK: 2.3557,
55
+ EUR: 17.5314,
56
+ GBP: 20.3402,
57
+ JOD: 22.6567,
58
+ JPY: 15.1358,
59
+ NOK: 1.9223,
60
+ KWD: 53.0228,
61
+ OMR: 41.6991,
62
+ QTR: 4.4084,
63
+ SAR: 4.2794,
64
+ SEK: 1.7786,
65
+ USD: 16.05
66
+ )
67
+ end
68
+
69
+ it 'returns buy: hash of buying prices' do
70
+ expect(bank.send(:parse, raw_data)[:buy]).to include(
71
+ AED: 4.3288,
72
+ AUD: 11.9663,
73
+ BAD: 42.1538,
74
+ CAD: 11.7369,
75
+ CHF: 16.0687,
76
+ DKK: 2.3138,
77
+ EUR: 17.2213,
78
+ GBP: 19.9179,
79
+ JOD: 22.4354,
80
+ JPY: 14.8695,
81
+ KWD: 52.3715,
82
+ NOK: 1.8842,
83
+ OMR: 41.2612,
84
+ QTR: 4.3665,
85
+ SAR: 4.2393,
86
+ SEK: 1.7447,
87
+ USD: 15.9
88
+ )
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+ describe EGPRates do
3
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'pry'
4
+ require 'webmock/rspec'
5
+ require 'vcr'
6
+ require 'simplecov'
7
+ SimpleCov.start do
8
+ add_filter '/spec/'
9
+ end
10
+
11
+ require 'egp_rates'
12
+
13
+ WebMock.disable_net_connect!
14
+
15
+ VCR.configure do |config|
16
+ config.cassette_library_dir = 'spec/cassettes'
17
+ config.hook_into :webmock
18
+ config.allow_http_connections_when_no_cassette = false
19
+ config.configure_rspec_metadata!
20
+ end
21
+
22
+ RSpec.configure do |config|
23
+ config.order = 'random'
24
+
25
+ config.around(:each) do |ex|
26
+ if ex.metadata.key?(:live)
27
+ WebMock.allow_net_connect!
28
+ VCR.turned_off { ex.run }
29
+ WebMock.disable_net_connect!
30
+ elsif ex.metadata.key?(:no_vcr)
31
+ VCR.turned_off { ex.run }
32
+ elsif ex.metadata.key?(:vcr)
33
+ VCR.configuration.default_cassette_options[:record] = :once
34
+ ex.run
35
+ else
36
+ ex.run
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,209 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: EGP_Rates
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ahmed Abdel-Razzak
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: codeclimate-test-reporter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: oga
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description:
168
+ email:
169
+ - abdelrazzak.ahmed@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - lib/egp_rates.rb
175
+ - lib/egp_rates/bank.rb
176
+ - lib/egp_rates/cbe.rb
177
+ - lib/egp_rates/nbe.rb
178
+ - spec/cassettes/CBE.yml
179
+ - spec/cassettes/NBE.yml
180
+ - spec/egp_rates/bank_spec.rb
181
+ - spec/egp_rates/cbe_spec.rb
182
+ - spec/egp_rates/nbe_spec.rb
183
+ - spec/egp_rates_spec.rb
184
+ - spec/spec_helper.rb
185
+ homepage: https://github.com/mad-raz/EGP-Rates
186
+ licenses:
187
+ - MIT
188
+ metadata: {}
189
+ post_install_message:
190
+ rdoc_options: []
191
+ require_paths:
192
+ - lib
193
+ required_ruby_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: 2.3.0
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ requirements: []
204
+ rubyforge_project:
205
+ rubygems_version: 2.5.1
206
+ signing_key:
207
+ specification_version: 4
208
+ summary: Scrape EGP exchange rate from different EG Banks
209
+ test_files: []