iex-ruby-client 0.4.4 → 1.0.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.
Files changed (129) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +6 -0
  3. data/.rubocop_todo.yml +8 -36
  4. data/CHANGELOG.md +5 -0
  5. data/LICENSE.md +1 -1
  6. data/README.md +113 -160
  7. data/UPGRADING.md +55 -3
  8. data/iex-ruby-client.gemspec +1 -1
  9. data/lib/iex-ruby-client.rb +2 -0
  10. data/lib/iex/api.rb +15 -31
  11. data/lib/iex/api/client.rb +30 -0
  12. data/lib/iex/api/config.rb +45 -0
  13. data/lib/iex/cloud.rb +3 -0
  14. data/lib/iex/cloud/connection.rb +37 -0
  15. data/lib/iex/cloud/request.rb +38 -0
  16. data/lib/iex/cloud/response.rb +20 -0
  17. data/lib/iex/endpoints/chart.rb +39 -0
  18. data/lib/iex/endpoints/company.rb +11 -0
  19. data/lib/iex/endpoints/crypto.rb +11 -0
  20. data/lib/iex/endpoints/dividends.rb +18 -0
  21. data/lib/iex/endpoints/earnings.rb +13 -0
  22. data/lib/iex/endpoints/key_stats.rb +11 -0
  23. data/lib/iex/endpoints/largest_trades.rb +13 -0
  24. data/lib/iex/endpoints/logo.rb +11 -0
  25. data/lib/iex/endpoints/news.rb +19 -0
  26. data/lib/iex/endpoints/ohlc.rb +17 -0
  27. data/lib/iex/endpoints/price.rb +11 -0
  28. data/lib/iex/endpoints/quote.rb +11 -0
  29. data/lib/iex/endpoints/sectors.rb +17 -0
  30. data/lib/iex/errors.rb +1 -0
  31. data/lib/iex/errors/client_error.rb +13 -1
  32. data/lib/iex/errors/permission_denied_error.rb +5 -0
  33. data/lib/iex/logger.rb +13 -0
  34. data/lib/iex/resources.rb +0 -1
  35. data/lib/iex/resources/chart.rb +38 -21
  36. data/lib/iex/resources/company.rb +2 -8
  37. data/lib/iex/resources/crypto.rb +10 -18
  38. data/lib/iex/resources/dividends.rb +5 -15
  39. data/lib/iex/resources/earnings.rb +1 -15
  40. data/lib/iex/resources/key_stats.rb +11 -57
  41. data/lib/iex/resources/largest_trades.rb +0 -10
  42. data/lib/iex/resources/logo.rb +0 -8
  43. data/lib/iex/resources/news.rb +1 -11
  44. data/lib/iex/resources/ohlc.rb +8 -16
  45. data/lib/iex/resources/quote.rb +0 -8
  46. data/lib/iex/resources/resource.rb +19 -2
  47. data/lib/iex/resources/sectors.rb +0 -10
  48. data/lib/iex/version.rb +1 -1
  49. data/spec/fixtures/iex/chart/1d.yml +472 -444
  50. data/spec/fixtures/iex/chart/20190306.yml +475 -0
  51. data/spec/fixtures/iex/chart/bad_option.yml +80 -62
  52. data/spec/fixtures/iex/chart/chartInterval.yml +121 -98
  53. data/spec/fixtures/iex/chart/dynamic/1m.yml +106 -81
  54. data/spec/fixtures/iex/chart/invalid.yml +80 -58
  55. data/spec/fixtures/iex/chart/msft.yml +106 -81
  56. data/spec/fixtures/iex/client/access_denied.yml +49 -0
  57. data/spec/fixtures/iex/company/invalid.yml +80 -58
  58. data/spec/fixtures/iex/company/msft.yml +87 -65
  59. data/spec/fixtures/iex/crypto/btcusdt.yml +87 -0
  60. data/spec/fixtures/iex/dividends/invalid.yml +80 -62
  61. data/spec/fixtures/iex/dividends/msft.yml +88 -66
  62. data/spec/fixtures/iex/dividends/msft_1y.yml +92 -68
  63. data/spec/fixtures/iex/dividends/msft_default_range.yml +85 -65
  64. data/spec/fixtures/iex/dividends/msft_invalid_range.yml +82 -64
  65. data/spec/fixtures/iex/earnings/invalid.yml +80 -62
  66. data/spec/fixtures/iex/earnings/msft.yml +84 -68
  67. data/spec/fixtures/iex/key_stats/invalid.yml +80 -62
  68. data/spec/fixtures/iex/key_stats/msft.yml +84 -65
  69. data/spec/fixtures/iex/largest-trades/aapl.yml +91 -73
  70. data/spec/fixtures/iex/largest-trades/invalid.yml +80 -62
  71. data/spec/fixtures/iex/logo/msft.yml +82 -64
  72. data/spec/fixtures/iex/news/invalid.yml +80 -58
  73. data/spec/fixtures/iex/news/msft.yml +83 -61
  74. data/spec/fixtures/iex/news/msft_7.yml +83 -61
  75. data/spec/fixtures/iex/ohlc/market.yml +82 -65
  76. data/spec/fixtures/iex/ohlc/msft.yml +82 -64
  77. data/spec/fixtures/iex/price/invalid.yml +80 -58
  78. data/spec/fixtures/iex/price/msft.yml +82 -60
  79. data/spec/fixtures/iex/quote/invalid.yml +80 -62
  80. data/spec/fixtures/iex/quote/msft.yml +84 -66
  81. data/spec/fixtures/iex/sectors/invalid.yml +80 -62
  82. data/spec/fixtures/iex/sectors/sectors-performance.yml +88 -69
  83. data/spec/iex/client_spec.rb +138 -0
  84. data/spec/iex/config_spec.rb +22 -0
  85. data/spec/iex/{resources → endpoints}/chart_spec.rb +23 -21
  86. data/spec/iex/{resources → endpoints}/company_spec.rb +11 -7
  87. data/spec/iex/endpoints/crypto_spec.rb +66 -0
  88. data/spec/iex/{resources → endpoints}/dividends_spec.rb +17 -14
  89. data/spec/iex/endpoints/earnings_spec.rb +36 -0
  90. data/spec/iex/endpoints/key_stats_spec.rb +62 -0
  91. data/spec/iex/{resources → endpoints}/largest_trades_spec.rb +8 -6
  92. data/spec/iex/{resources → endpoints}/logo_spec.rb +3 -1
  93. data/spec/iex/endpoints/news_spec.rb +36 -0
  94. data/spec/iex/{resources → endpoints}/ohlc_spec.rb +15 -13
  95. data/spec/iex/{resources → endpoints}/price_spec.rb +6 -4
  96. data/spec/iex/endpoints/quote_spec.rb +38 -0
  97. data/spec/iex/{resources → endpoints}/sectors_spec.rb +7 -6
  98. data/spec/iex/resources/{base_spec.rb → resource_spec.rb} +6 -6
  99. data/spec/spec_helper.rb +2 -0
  100. data/spec/support/client.rb +6 -0
  101. metadata +66 -59
  102. data/lib/iex/api/chart.rb +0 -24
  103. data/lib/iex/api/company.rb +0 -13
  104. data/lib/iex/api/crypto.rb +0 -13
  105. data/lib/iex/api/dividends.rb +0 -17
  106. data/lib/iex/api/earnings.rb +0 -13
  107. data/lib/iex/api/key_stats.rb +0 -13
  108. data/lib/iex/api/largest_trades.rb +0 -13
  109. data/lib/iex/api/logo.rb +0 -13
  110. data/lib/iex/api/news.rb +0 -18
  111. data/lib/iex/api/ohlc.rb +0 -17
  112. data/lib/iex/api/price.rb +0 -13
  113. data/lib/iex/api/quote.rb +0 -13
  114. data/lib/iex/api/sectors.rb +0 -16
  115. data/lib/iex/resources/base.rb +0 -27
  116. data/lib/iex/resources/chart/base.rb +0 -14
  117. data/lib/iex/resources/chart/default.rb +0 -21
  118. data/lib/iex/resources/chart/one_day.rb +0 -20
  119. data/lib/iex/resources/ohlc/base.rb +0 -14
  120. data/lib/iex/resources/ohlc/timed_price.rb +0 -12
  121. data/lib/iex/resources/price.rb +0 -13
  122. data/spec/fixtures/iex/chart/20180227.yml +0 -452
  123. data/spec/fixtures/iex/crypto.yml +0 -101
  124. data/spec/fixtures/iex/news/market.yml +0 -64
  125. data/spec/iex/resources/crypto_spec.rb +0 -65
  126. data/spec/iex/resources/earnings_spec.rb +0 -38
  127. data/spec/iex/resources/key_stats_spec.rb +0 -94
  128. data/spec/iex/resources/news_spec.rb +0 -44
  129. data/spec/iex/resources/quote_spec.rb +0 -38
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe IEX::Api::Client do
4
+ before do
5
+ IEX::Api.config.reset!
6
+ end
7
+ context 'with defaults' do
8
+ let(:client) { described_class.new }
9
+ context '#initialize' do
10
+ it 'implements endpoint' do
11
+ expect(client.endpoint).to_not be nil
12
+ end
13
+ it 'includes default http configuration' do
14
+ expect(client.user_agent).to eq "IEX Ruby Client/#{IEX::VERSION}"
15
+ end
16
+ it 'sets user-agent' do
17
+ expect(client.user_agent).to eq IEX::Api::Config.user_agent
18
+ expect(client.user_agent).to include IEX::VERSION
19
+ end
20
+ (IEX::Api::Config::ATTRIBUTES - [:logger]).each do |key|
21
+ it "sets #{key}" do
22
+ expect(client.send(key)).to eq IEX::Api::Config.send(key)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ context 'with custom settings' do
28
+ context '#initialize' do
29
+ IEX::Api::Config::ATTRIBUTES.each do |key|
30
+ context key.to_s do
31
+ let(:client) { described_class.new(key => 'custom') }
32
+ it "sets #{key}" do
33
+ expect(client.send(key)).to_not eq IEX::Api::Config.send(key)
34
+ expect(client.send(key)).to eq 'custom'
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ context 'global config' do
41
+ let(:client) { described_class.new }
42
+ context 'user-agent' do
43
+ before do
44
+ IEX::Api.configure do |config|
45
+ config.user_agent = 'custom/user-agent'
46
+ end
47
+ end
48
+ context '#initialize' do
49
+ it 'sets user-agent' do
50
+ expect(client.user_agent).to eq 'custom/user-agent'
51
+ end
52
+ it 'creates a connection with the custom user-agent' do
53
+ expect(client.send(:connection).headers).to include(
54
+ 'Accept' => 'application/json; charset=utf-8',
55
+ 'User-Agent' => 'custom/user-agent'
56
+ )
57
+ end
58
+ end
59
+ end
60
+ context 'proxy' do
61
+ before do
62
+ IEX::Api.configure do |config|
63
+ config.proxy = 'http://localhost:8080'
64
+ end
65
+ end
66
+ context '#initialize' do
67
+ it 'sets proxy' do
68
+ expect(client.proxy).to eq 'http://localhost:8080'
69
+ end
70
+ it 'creates a connection with the proxy' do
71
+ expect(client.send(:connection).proxy.uri.to_s).to eq 'http://localhost:8080'
72
+ end
73
+ end
74
+ end
75
+ context 'SSL options' do
76
+ before do
77
+ IEX::Api.configure do |config|
78
+ config.ca_path = '/ca_path'
79
+ config.ca_file = '/ca_file'
80
+ end
81
+ end
82
+ context '#initialize' do
83
+ it 'sets ca_path and ca_file' do
84
+ expect(client.ca_path).to eq '/ca_path'
85
+ expect(client.ca_file).to eq '/ca_file'
86
+ end
87
+ it 'creates a connection with ssl options' do
88
+ ssl = client.send(:connection).ssl
89
+ expect(ssl.ca_path).to eq '/ca_path'
90
+ expect(ssl.ca_file).to eq '/ca_file'
91
+ end
92
+ end
93
+ end
94
+ context 'logger option' do
95
+ let(:logger) { Logger.new(STDOUT) }
96
+ before do
97
+ IEX::Api.configure do |config|
98
+ config.logger = logger
99
+ end
100
+ end
101
+ context '#initialize' do
102
+ it 'sets logger' do
103
+ expect(client.logger).to eq logger
104
+ end
105
+ it 'creates a connection with a logger' do
106
+ expect(client.send(:connection).builder.handlers).to include ::Faraday::Response::Logger
107
+ end
108
+ end
109
+ end
110
+ context 'timeout options' do
111
+ before do
112
+ IEX::Api.configure do |config|
113
+ config.timeout = 10
114
+ config.open_timeout = 15
115
+ end
116
+ end
117
+ context '#initialize' do
118
+ it 'sets timeout and open_timeout' do
119
+ expect(client.timeout).to eq 10
120
+ expect(client.open_timeout).to eq 15
121
+ end
122
+ it 'creates a connection with timeout options' do
123
+ conn = client.send(:connection)
124
+ expect(conn.options.timeout).to eq 10
125
+ expect(conn.options.open_timeout).to eq 15
126
+ end
127
+ end
128
+ end
129
+ context 'without a token' do
130
+ let(:client) { described_class.new }
131
+ it 'results in an API key error', vcr: { cassette_name: 'client/access_denied' } do
132
+ expect do
133
+ client.get '/stock/msft/quote'
134
+ end.to raise_error IEX::Errors::PermissionDeniedError, /The API key provided is not valid./
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe IEX::Api::Config do
4
+ before do
5
+ IEX::Api.config.reset!
6
+ end
7
+ describe '#defaults' do
8
+ it 'sets endpoint' do
9
+ expect(IEX::Api.config.endpoint).to eq 'https://cloud.iexapis.com/v1'
10
+ end
11
+ end
12
+ describe '#configure' do
13
+ before do
14
+ IEX::Api.configure do |config|
15
+ config.endpoint = 'updated'
16
+ end
17
+ end
18
+ it 'sets endpoint' do
19
+ expect(IEX::Api.config.endpoint).to eq 'updated'
20
+ end
21
+ end
22
+ end
@@ -1,42 +1,44 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe IEX::Resources::Chart do
4
+ include_context 'client'
5
+
4
6
  context 'known symbol', vcr: { cassette_name: 'chart/msft' } do
5
7
  subject do
6
- IEX::Resources::Chart.get('MSFT')
8
+ client.chart('MSFT')
7
9
  end
8
10
  let(:first) { subject.first }
9
11
  let(:last) { subject.last }
10
12
  it 'retrieves a default chart' do
11
- expect(subject.count).to eq 21
13
+ expect(subject.count).to eq 23
12
14
  expect(first).to be_a IEX::Resources::Chart::Default
13
- expect(first.label).to eq 'Feb 26'
14
- expect(first.change_percent_s).to eq '+1.45%'
15
- expect(first.close).to eq 95.42
16
- expect(first.date).to eq Date.new(2018, 2, 26)
17
- expect(last.label).to eq 'Mar 26'
15
+ expect(first.label).to eq 'Mar 6'
16
+ expect(first.change_percent_s).to eq '0.00%'
17
+ expect(first.close).to eq 111.75
18
+ expect(first.date).to eq Date.new(2019, 3, 6)
19
+ expect(last.label).to eq 'Apr 5'
18
20
  end
19
21
  end
20
22
 
21
23
  context '1d', vcr: { cassette_name: 'chart/1d' } do
22
24
  subject do
23
- IEX::Resources::Chart.get('MSFT', '1d')
25
+ client.chart('MSFT', '1d')
24
26
  end
25
27
  let(:first) { subject.first }
26
28
  let(:last) { subject.last }
27
29
  it 'retrieves a 1 day chart' do
28
- expect(subject.count).to eq 385
30
+ expect(subject.count).to eq 390
29
31
  expect(first).to be_a IEX::Resources::Chart::OneDay
30
32
  expect(first.label).to eq '09:30 AM'
31
- expect(first.high).to eq 94.97
32
- expect(first.low).to eq 94.76
33
+ expect(first.high).to eq 119.67
34
+ expect(first.low).to eq 119.43
33
35
  expect(first.minute).to eq '09:30'
34
36
  end
35
37
  end
36
38
 
37
39
  context 'with options', vcr: { cassette_name: 'chart/chartInterval' } do
38
40
  subject do
39
- IEX::Resources::Chart.get('MSFT', '1d', chart_interval: 10)
41
+ client.chart('MSFT', '1d', chart_interval: 10)
40
42
  end
41
43
  let(:first) { subject.first }
42
44
  it 'retrieves a 1 day chart with chartInterval applied' do
@@ -45,33 +47,33 @@ describe IEX::Resources::Chart do
45
47
  end
46
48
  end
47
49
 
48
- context 'date', vcr: { cassette_name: 'chart/20180227' } do
50
+ context 'date', vcr: { cassette_name: 'chart/20190306' } do
49
51
  subject do
50
- IEX::Resources::Chart.get('MSFT', Date.new(2018, 2, 27))
52
+ client.chart('MSFT', Date.new(2019, 3, 6))
51
53
  end
52
54
  let(:first) { subject.first }
53
- it 'retrieves a 1 day chart from 2018/2/27' do
55
+ it 'retrieves a 1 day chart from 2019/3/6' do
54
56
  expect(subject.count).to eq 390
55
57
  expect(first).to be_a IEX::Resources::Chart::OneDay
56
- expect(first.date).to eq Date.new(2018, 2, 27)
58
+ expect(first.date).to eq Date.new(2019, 3, 6)
57
59
  end
58
60
  end
59
61
 
60
62
  context 'dynamic 1m', vcr: { cassette_name: 'chart/dynamic/1m' } do
61
63
  subject do
62
- IEX::Resources::Chart.get('MSFT', :dynamic)
64
+ client.chart('MSFT', :dynamic)
63
65
  end
64
66
  let(:first) { subject.first }
65
67
  it 'retrieves a 1m chart from' do
66
- expect(subject.count).to eq 21
68
+ expect(subject.count).to eq 23
67
69
  expect(first).to be_a IEX::Resources::Chart::Default
68
- expect(first.date).to eq Date.new(2018, 2, 26)
70
+ expect(first.date).to eq Date.new(2019, 3, 6)
69
71
  end
70
72
  end
71
73
 
72
74
  context 'invalid symbol', vcr: { cassette_name: 'chart/invalid' } do
73
75
  subject do
74
- IEX::Resources::Chart.get('INVALID')
76
+ client.chart('INVALID')
75
77
  end
76
78
  it 'fails with SymbolNotFoundError' do
77
79
  expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
@@ -80,7 +82,7 @@ describe IEX::Resources::Chart do
80
82
 
81
83
  context 'with client error', vcr: { cassette_name: 'chart/bad_option' } do
82
84
  subject do
83
- IEX::Resources::Chart.get('MSFT', '1d', chart_interval: 10, bad_option: 'option')
85
+ client.chart('MSFT', '1d', chart_interval: 10, bad_option: 'option')
84
86
  end
85
87
 
86
88
  it 'fails with ClientError' do
@@ -1,25 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe IEX::Resources::Company do
4
+ include_context 'client'
5
+
4
6
  context 'known symbol', vcr: { cassette_name: 'company/msft' } do
5
7
  subject do
6
- IEX::Resources::Company.get('MSFT')
8
+ client.company('MSFT')
7
9
  end
8
10
  it 'retrieves company information' do
9
11
  expect(subject.symbol).to eq 'MSFT'
10
12
  expect(subject.ceo).to eq 'Satya Nadella'
11
- expect(subject.company_name).to eq 'Microsoft Corporation'
12
- expect(subject.description).to include 'Microsoft Corp is a technology company.'
13
- expect(subject.exchange).to eq 'Nasdaq Global Select'
14
- expect(subject.industry).to eq 'Application Software'
13
+ expect(subject.company_name).to eq 'Microsoft Corp.'
14
+ expect(subject.description).to include 'Develops, manufactures and distributes software products'
15
+ expect(subject.exchange).to eq 'NASDAQ'
16
+ expect(subject.industry).to eq 'Packaged Software'
15
17
  expect(subject.issue_type).to eq 'cs'
16
18
  expect(subject.website).to eq 'http://www.microsoft.com'
17
- expect(subject.sector).to eq 'Technology'
19
+ expect(subject.sector).to eq 'Technology Services'
20
+ expect(subject.employees).to eq 131_000
21
+ expect(subject.security_name).to eq 'Microsoft Corporation'
18
22
  end
19
23
  end
20
24
  context 'invalid symbol', vcr: { cassette_name: 'company/invalid' } do
21
25
  subject do
22
- IEX::Resources::Company.get('INVALID')
26
+ client.company('INVALID')
23
27
  end
24
28
  it 'fails with SymbolNotFoundError' do
25
29
  expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe IEX::Resources::Crypto do
4
+ include_context 'client'
5
+
6
+ context 'gets crypto information', vcr: { cassette_name: 'crypto/btcusdt' } do
7
+ subject do
8
+ client.crypto('BTCUSDT')
9
+ end
10
+ it 'retrieves real-time information' do
11
+ expect(subject.symbol).to eq 'BTCUSDT'
12
+ expect(subject.company_name).to eq 'Bitcoin USD'
13
+ expect(subject.primary_exchange).to eq 'crypto'
14
+ expect(subject.sector).to eq 'cryptocurrency'
15
+ expect(subject.calculation_price).to eq 'realtime'
16
+ expect(subject.open).to eq 3527.79
17
+ expect(subject.open_dollar).to eq '$3,527'
18
+ expect(subject.open_time).to eq 1_548_082_840_296
19
+ expect(subject.close).to eq 3522.05522498
20
+ expect(subject.close_dollar).to eq '$3,522'
21
+ expect(subject.close_time).to eq 1_548_169_240_296
22
+ expect(subject.high).to eq 3590.51
23
+ expect(subject.high_dollar).to eq '$3,590'
24
+ expect(subject.low).to eq 3434.85
25
+ expect(subject.low_dollar).to eq '$3,434'
26
+ expect(subject.latest_price).to eq 3563.22
27
+ expect(subject.latest_price_dollar).to eq '$3,563'
28
+ expect(subject.latest_source).to eq 'Real time price'
29
+ expect(subject.latest_time).to eq '10:00:40 AM'
30
+ expect(subject.latest_update).to eq 1_548_169_240_296
31
+ expect(subject.latest_volume).to eq 28_053.196533
32
+ expect(subject.latest_volume_dollar).to eq '$28,053'
33
+ expect(subject.iex_realtime_price).to eq nil
34
+ expect(subject.iex_realtime_size).to eq nil
35
+ expect(subject.iex_last_updated).to eq nil
36
+ expect(subject.delayed_price).to eq nil
37
+ expect(subject.delayed_price_time).to eq nil
38
+ expect(subject.extended_change).to eq nil
39
+ expect(subject.extended_change_percent).to eq nil
40
+ expect(subject.extended_price_time).to eq nil
41
+ expect(subject.previous_close).to eq 3527.79
42
+ expect(subject.previous_close_dollar).to eq '$3,527'
43
+ expect(subject.change).to eq 35.43
44
+ expect(subject.change_percent).to eq 0.01004
45
+ expect(subject.change_percent_s).to eq '+1.00%'
46
+ expect(subject.iex_market_percent).to eq nil
47
+ expect(subject.iex_volume).to eq nil
48
+ expect(subject.avg_total_volume).to eq nil
49
+ expect(subject.iex_bid_price).to eq nil
50
+ expect(subject.iex_bid_size).to eq nil
51
+ expect(subject.iex_ask_price).to eq nil
52
+ expect(subject.iex_ask_size).to eq nil
53
+ expect(subject.market_cap).to eq nil
54
+ expect(subject.pe_ratio).to eq nil
55
+ expect(subject.week52_high).to eq nil
56
+ expect(subject.week52_high_dollar).to eq nil
57
+ expect(subject.week52_low).to eq nil
58
+ expect(subject.week52_low_dollar).to eq nil
59
+ expect(subject.ytd_change).to eq nil
60
+ expect(subject.bid_price).to eq 3562.94
61
+ expect(subject.bid_size).to eq 0.061728
62
+ expect(subject.ask_price).to eq 3563.22
63
+ expect(subject.ask_size).to eq 0.134326
64
+ end
65
+ end
66
+ end
@@ -1,26 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe IEX::Resources::Dividends do
4
+ include_context 'client'
5
+
4
6
  context 'known symbol' do
5
7
  context 'with defaults', vcr: { cassette_name: 'dividends/msft' } do
6
8
  subject do
7
- IEX::Resources::Dividends.get('MSFT', '6m')
9
+ client.dividends('MSFT', '6m')
8
10
  end
9
11
  let(:dividends) { subject.first }
10
12
  it 'retrieves dividends' do
11
- expect(dividends.payment_date).to eq '2018-03-08'
12
- expect(dividends.record_date).to eq '2018-02-15'
13
- expect(dividends.declared_date).to eq '2017-11-29'
14
- expect(dividends.amount_dollar).to eq '$0.42'
15
- expect(dividends.flag).to eq ''
16
- expect(dividends.type).to eq 'Dividend income'
17
- expect(dividends.qualified).to eq 'Q'
18
- expect(dividends.indicated).to eq ''
13
+ expect(dividends.ex_date).to eq '2019-05-15'
14
+ expect(dividends.payment_date).to eq '2019-06-13'
15
+ expect(dividends.record_date).to eq '2019-05-16'
16
+ expect(dividends.declared_date).to eq '2019-03-11'
17
+ expect(dividends.amount).to eq 0.46
18
+ expect(dividends.amount_dollar).to eq '$0.46'
19
+ expect(dividends.currency).to eq 'USD'
20
+ expect(dividends.description).to eq 'Microsoft Corp. Declares Quarterly Dividend of $0.46 Per Share'
21
+ expect(dividends.frequency).to eq 'Quarterly'
19
22
  end
20
23
  end
21
24
  context 'without range', vcr: { cassette_name: 'dividends/msft_default_range' } do
22
25
  subject do
23
- IEX::Resources::Dividends.get('MSFT')
26
+ client.dividends('MSFT')
24
27
  end
25
28
  it 'retrieves dividends when no range is passed' do
26
29
  expect(subject.size).to eq 1
@@ -28,7 +31,7 @@ describe IEX::Resources::Dividends do
28
31
  end
29
32
  context 'invalid range', vcr: { cassette_name: 'dividends/msft_invalid_range' } do
30
33
  subject do
31
- IEX::Resources::Dividends.get('MSFT', 'INVALID')
34
+ client.dividends('MSFT', 'INVALID')
32
35
  end
33
36
  let(:dividends) { subject.first }
34
37
  it 'retrieves dividends when invalid range is passed' do
@@ -37,16 +40,16 @@ describe IEX::Resources::Dividends do
37
40
  end
38
41
  context 'with range', vcr: { cassette_name: 'dividends/msft_1y' } do
39
42
  subject do
40
- IEX::Resources::Dividends.get('MSFT', '1y')
43
+ client.dividends('MSFT', '1y')
41
44
  end
42
45
  it 'retrieves dividends with range of 1 year' do
43
- expect(subject.size).to eq 4
46
+ expect(subject.size).to eq 5
44
47
  end
45
48
  end
46
49
  end
47
50
  context 'invalid symbol', vcr: { cassette_name: 'dividends/invalid' } do
48
51
  subject do
49
- IEX::Resources::Dividends.get('INVALID', 'INVALID')
52
+ client.dividends('INVALID', 'INVALID')
50
53
  end
51
54
  it 'fails with SymbolNotFoundError' do
52
55
  expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe IEX::Resources::Earnings do
4
+ include_context 'client'
5
+
6
+ context 'known symbol' do
7
+ context 'with defaults', vcr: { cassette_name: 'earnings/msft' } do
8
+ subject do
9
+ client.earnings('MSFT')
10
+ end
11
+ let(:earnings) { subject.first }
12
+ it 'retrieves earnings' do
13
+ expect(subject.size).to eq 1
14
+ expect(earnings.actual_eps).to eq 1.1
15
+ expect(earnings.consensus_eps).to eq 1.09
16
+ expect(earnings.announce_time).to eq 'AMC'
17
+ expect(earnings.number_of_estimates).to eq 29
18
+ expect(earnings.eps_surprise_dollar).to eq 0.01
19
+ expect(earnings.eps_report_date).to eq '2019-01-30'
20
+ expect(earnings.fiscal_period).to eq 'Q4 2018'
21
+ expect(earnings.fiscal_end_date).to eq '2018-12-31'
22
+ expect(earnings.year_ago).to eq 0.96
23
+ expect(earnings.year_ago_change_percent).to eq 0.1458
24
+ expect(earnings.year_ago_change_percent_s).to eq '+14.58%'
25
+ end
26
+ end
27
+ end
28
+ context 'invalid symbol', vcr: { cassette_name: 'earnings/invalid' } do
29
+ subject do
30
+ client.earnings('INVALID')
31
+ end
32
+ it 'fails with SymbolNotFoundError' do
33
+ expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
34
+ end
35
+ end
36
+ end