calendarium-romanum-remote 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1922aae05ab92482cef8245ff0af153704256dcf
4
- data.tar.gz: 37b09a459b50be3e1e8a85d5df6a55c903bb87dc
3
+ metadata.gz: a5888b0e5f69d9b5ce0050ffb65e7ce87049d411
4
+ data.tar.gz: 7a98baf6c8de7f79988fa9a92ef310f239509ef4
5
5
  SHA512:
6
- metadata.gz: a9d35cac14c7720322963a0470e7025d25a3ca834ddfe7d822459ff89d0e210d4f3125c0c91013215e0faab7d466f27ecfcf01f41add018aa4678a900a82f8b8
7
- data.tar.gz: f0306395509292979378465024b9b38bc6378acd38c195de2aa89790edcfb92df0d02d25ae49d710c27c9a28c747d2ff8344680473aae43e5c8e51ca17a2d7a9
6
+ metadata.gz: 28ca711f6238c89197d45df0c11f655484570a953eae40c57b72e6f7de0760b607569216cddc076616a9a50014e5daf7e267ab5e5820641a4e2cec270189f42e
7
+ data.tar.gz: 3a2fb22ceddb56e7d97f48726865f7892d95198d46285beaa2a411bc974379257f98e8e30cb914e28e40501ed0135489b6f077a6154b9c52f938fcb226eb3c24
@@ -2,16 +2,17 @@ module CalendariumRomanum
2
2
  module Remote; end
3
3
  end
4
4
 
5
- require 'net/http'
6
- require 'json'
5
+ require 'httpi'
6
+ require 'multi_json'
7
+ require 'dry-schema'
7
8
 
8
9
  %w(
9
10
  version
10
11
  calendar
11
- drivers
12
- drivers/net_http_driver
12
+ driver
13
13
  errors
14
- v0/deserializer
14
+ v0/denormalizer
15
+ v0/uri_scheme
15
16
  ).each do |path|
16
17
  require_relative File.join('remote', path)
17
18
  end
@@ -8,18 +8,16 @@ module CalendariumRomanum
8
8
  class Calendar
9
9
  extend Forwardable
10
10
 
11
- def initialize(year, calendar_uri, api_version: :v0, driver: :net_http)
11
+ def initialize(year, calendar_uri, driver: nil)
12
12
  @year = year
13
13
  @calendar_uri = calendar_uri
14
+
14
15
  @driver =
15
- if driver.is_a? Symbol
16
- # built-in driver specified by a Symbol
17
- Drivers.get(api_version, driver)
18
- else
19
- # driver instance
20
- driver
21
- end
22
- @deserializer = V0::Deserializer.new
16
+ driver ||
17
+ Driver.new(
18
+ V0::UriScheme.new(calendar_uri),
19
+ V0::Denormalizer.new
20
+ )
23
21
 
24
22
  # only for most fundamental computations made locally
25
23
  @temporale = Temporale.new(year)
@@ -47,8 +45,7 @@ module CalendariumRomanum
47
45
  #range_check date
48
46
  end
49
47
 
50
- serialized = @driver.get date, @calendar_uri
51
- @deserializer.call serialized
48
+ @driver.day date
52
49
  end
53
50
 
54
51
  def lectionary
@@ -68,7 +65,7 @@ module CalendariumRomanum
68
65
  private
69
66
 
70
67
  def year_spec
71
- @year_spec ||= JSON.parse(@driver.year(@year, @calendar_uri))
68
+ @year_spec ||= @driver.year(@year)
72
69
  end
73
70
  end
74
71
  end
@@ -0,0 +1,47 @@
1
+ module CalendariumRomanum
2
+ module Remote
3
+ # Orchestrates retrieval and deserialization of calendar data
4
+ # from a server accessed throught HTTP GET requests
5
+ # and returning JSON responses.
6
+ class Driver
7
+ def initialize(uri_scheme, denormalizer)
8
+ @uri_scheme = uri_scheme
9
+ @denormalizer = denormalizer
10
+ end
11
+
12
+ def day(date)
13
+ process :day, date
14
+ end
15
+
16
+ def year(year)
17
+ process :year, year
18
+ end
19
+
20
+ protected
21
+
22
+ def process(action, argument)
23
+ uri = @uri_scheme.public_send action, argument
24
+ response = request uri
25
+ handle_errors response
26
+ data = MultiJson.load response.body
27
+
28
+ @denormalizer.public_send action, data
29
+ end
30
+
31
+ def request(uri)
32
+ request = HTTPI::Request.new uri
33
+ request.headers['Accept'] = 'application/json'
34
+ request.headers['User-Agent'] =
35
+ 'calendarium-romanum-remote/' + Remote::VERSION
36
+
37
+ HTTPI.get request
38
+ end
39
+
40
+ def handle_errors(response)
41
+ if response.code != 200
42
+ raise UnexpectedResponseError.new("Unexpected HTTP status #{response.code.inspect}")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -4,12 +4,11 @@ module CalendariumRomanum
4
4
  # never itself instantiated
5
5
  class Error < ::RuntimeError; end
6
6
 
7
- # server not found
8
- class ServerNotFoundError < Error; end
7
+ # the server responded with a response which cannot be
8
+ # transformed to valid calendar data
9
+ class UnexpectedResponseError < Error; end
9
10
 
10
- # server refuses submitted input
11
- class BadRequestError < Error; end
12
-
13
- class TransportError < Error; end
11
+ # the server returned data which we don't understand
12
+ class InvalidDataError < Error; end
14
13
  end
15
14
  end
@@ -0,0 +1,61 @@
1
+ module CalendariumRomanum
2
+ module Remote
3
+ module V0
4
+ class Denormalizer
5
+ def day(day_json)
6
+ check day_json, DaySchema
7
+
8
+ season_sym = day_json['season'].to_sym
9
+
10
+ CalendariumRomanum::Day.new(
11
+ date: Date.parse(day_json['date']),
12
+ season: CalendariumRomanum::Seasons.all.find {|s| s.symbol == season_sym},
13
+ season_week: day_json['season_week'],
14
+ celebrations: day_json['celebrations'].collect do |c|
15
+ colour_sym = c['colour'].to_sym
16
+
17
+ CalendariumRomanum::Celebration.new(
18
+ c['title'],
19
+ CalendariumRomanum::Ranks[c['rank_num']],
20
+ CalendariumRomanum::Colours.all.find {|c| c.symbol == colour_sym }
21
+ )
22
+ end
23
+ )
24
+ end
25
+
26
+ def year(year_json)
27
+ check year_json, YearSchema
28
+
29
+ # no denormalization takes place
30
+ year_json
31
+ end
32
+
33
+ protected
34
+
35
+ def check(data, schema)
36
+ errors = schema.call(data).errors
37
+
38
+ unless errors.empty?
39
+ raise InvalidDataError.new "Invalid data: #{errors.to_h}"
40
+ end
41
+ end
42
+
43
+ DaySchema = Dry::Schema.JSON do
44
+ required(:date).filled(:string, format?: /^\d{4}-\d{2}-\d{2}$/)
45
+ required(:season).filled(:string)
46
+ required(:season_week).filled(:integer)
47
+ required(:celebrations).array(:hash) do
48
+ required(:title).filled(:string)
49
+ required(:colour).filled(:string)
50
+ required(:rank_num).filled(:float)
51
+ end
52
+ end
53
+
54
+ YearSchema = Dry::Schema.JSON do
55
+ required(:lectionary).filled(:string, included_in?: %w(A B C))
56
+ required(:ferial_lectionary).filled(:integer, included_in?: [1, 2])
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,21 @@
1
+ module CalendariumRomanum
2
+ module Remote
3
+ module V0
4
+ class UriScheme
5
+ def initialize(calendar_uri)
6
+ @calendar_uri =
7
+ calendar_uri +
8
+ (calendar_uri.end_with?('/') ? '' : '/')
9
+ end
10
+
11
+ def day(date)
12
+ @calendar_uri + "#{date.year}/#{date.month}/#{date.day}"
13
+ end
14
+
15
+ def year(year)
16
+ @calendar_uri + year.to_s
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,8 @@
1
+ require 'date'
2
+
1
3
  module CalendariumRomanum
2
4
  module Remote
3
- VERSION = '0.1.0'
4
- RELEASE_DATE = Date.new(2017, 9, 2)
5
+ VERSION = '0.2.0'
6
+ RELEASE_DATE = Date.new(2019, 9, 22)
5
7
  end
6
8
  end
@@ -1,16 +1,19 @@
1
1
  require_relative 'spec_helper'
2
2
 
3
+ # integration tests exercizing the whole stack and
4
+ # making (a lot of) actual HTTP requests!
3
5
  describe CalendariumRomanum::Remote::Calendar do
4
6
  CR = CalendariumRomanum
5
- CRR = CalendariumRomanum::Remote
7
+ CRRemote = CalendariumRomanum::Remote
6
8
 
7
9
  let(:year) { 2016 }
8
- let(:calendar) { described_class.new year, REMOTE_CALENDAR_URI }
10
+ let(:uri) { REMOTE_CALENDAR_URI }
11
+ let(:calendar) { described_class.new year, uri }
9
12
 
10
13
  describe '#year' do
11
14
  it 'returns the year passed to the constructor' do
12
15
  y = 2200
13
- cal = described_class.new y, REMOTE_CALENDAR_URI
16
+ cal = described_class.new y, uri
14
17
  expect(cal.year).to eq y
15
18
  end
16
19
  end
@@ -25,7 +28,7 @@ describe CalendariumRomanum::Remote::Calendar do
25
28
 
26
29
  describe '#==' do
27
30
  describe 'same year and URI' do
28
- let(:c) { described_class.new year, REMOTE_CALENDAR_URI }
31
+ let(:c) { described_class.new year, uri }
29
32
 
30
33
  it 'is same' do
31
34
  expect(c == calendar).to be true
@@ -33,7 +36,7 @@ describe CalendariumRomanum::Remote::Calendar do
33
36
  end
34
37
 
35
38
  describe 'year differs' do
36
- let(:c) { described_class.new year + 1, REMOTE_CALENDAR_URI }
39
+ let(:c) { described_class.new year + 1, uri }
37
40
 
38
41
  it 'is different' do
39
42
  expect(c == calendar).to be false
@@ -50,15 +53,13 @@ describe CalendariumRomanum::Remote::Calendar do
50
53
  end
51
54
 
52
55
  describe 'API-compatibility with Calendar' do
53
- cls = CR::Calendar
54
-
55
56
  describe 'instance methods' do
56
57
  let(:year) { 2000 }
57
58
 
58
59
  let(:origin) { CR::Calendar.new(year) }
59
- let(:mirror) { CRR::Calendar.new(year, REMOTE_CALENDAR_URI) }
60
+ let(:mirror) { CRRemote::Calendar.new(year, uri) }
60
61
 
61
- cls.public_instance_methods.each do |method|
62
+ CR::Calendar.public_instance_methods.each do |method|
62
63
  describe method do
63
64
  it 'is defined by origin' do
64
65
  expect(origin).to respond_to method
@@ -81,24 +82,76 @@ describe CalendariumRomanum::Remote::Calendar do
81
82
  end
82
83
 
83
84
  describe 'returns the same data as Calendar' do
84
- let(:year) { 2016 }
85
-
86
- # classical calendar
85
+ # classical calendar with the same settings as `calendar`
87
86
  let(:sanctorale) { CR::Data::GENERAL_ROMAN_ENGLISH.load }
88
- let(:calendar) { CR::Calendar.new(year, sanctorale) }
87
+ let(:local_calendar) { CR::Calendar.new(year, sanctorale) }
89
88
 
90
- # remote calendar with the same settings
91
- let(:uri) { REMOTE_CALENDAR_URI }
92
- let(:remote) { described_class.new(year, uri) }
89
+ let(:remote_calendar) { calendar }
93
90
 
94
91
  days = (CR::Temporale::Dates.first_advent_sunday(2016) ... CR::Temporale::Dates.first_advent_sunday(2017))
95
92
  days.each do |date|
96
93
  it date do
97
- c = calendar.day date
98
- r = remote.day date
94
+ c = local_calendar.day date
95
+ r = remote_calendar.day date
99
96
 
100
97
  expect(r).to eq c
101
98
  end
102
99
  end
103
100
  end
101
+
102
+ describe 'errors' do
103
+ let(:date) { Date.new year, 1, 1 }
104
+
105
+ describe 'server does not exist' do
106
+ let(:uri) { 'http://does-not-exist.local/' }
107
+
108
+ it 'throws SocketError' do
109
+ expect do
110
+ calendar.day date
111
+ end.to raise_exception ::SocketError
112
+ end
113
+ end
114
+
115
+ describe 'server exists, wrong calendar URI' do
116
+ let(:wrong_calendar_uri) { uri + 'another-path-segment/' }
117
+ let(:calendar) { described_class.new year, wrong_calendar_uri }
118
+
119
+ it 'throws CalendariumRomanum::Remote::UnexpectedResponseError' do
120
+ expect do
121
+ calendar.day date
122
+ end.to raise_exception CRRemote::UnexpectedResponseError, /Unexpected HTTP status 404/
123
+ end
124
+ end
125
+
126
+ describe 'bad request - invalid date' do
127
+ # this shouldn't ever happen, but it's the easiest way
128
+ # to check how the calendar behaves in bad request scenarios
129
+ let(:date) do
130
+ d = Date.new
131
+ d.stub(:year) { 2000 }
132
+ d.stub(:month) { 13 }
133
+ d.stub(:day) { 40 }
134
+
135
+ d
136
+ end
137
+
138
+ it 'throws CalendariumRomanum::Remote::UnexpectedResponseError' do
139
+ expect do
140
+ calendar.day date
141
+ end.to raise_exception CRRemote::UnexpectedResponseError, /Unexpected HTTP status 400/
142
+ end
143
+ end
144
+
145
+ describe 'unsupported response content' do
146
+ it 'fails' do
147
+ # HTTP request will return empty JSON
148
+ response = HTTPI::Response.new 200, {}, '{}'
149
+ allow(HTTPI).to receive(:get).and_return(response)
150
+
151
+ expect do
152
+ calendar.day date
153
+ end.to raise_exception CRRemote::InvalidDataError, /Invalid data: {:date=>\["is missing"/
154
+ end
155
+ end
156
+ end
104
157
  end
@@ -1,3 +1,6 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
1
4
  # This file was generated by the `rspec --init` command. Conventionally, all
2
5
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
6
  # The generated `.rspec` file contains `--require spec_helper` which will cause
@@ -103,3 +106,5 @@ require_relative '../lib/calendarium-romanum-remote'
103
106
 
104
107
  REMOTE_CALENDAR_URI =
105
108
  ENV['REMOTE_CALENDAR'] || 'http://calapi.inadiutorium.cz/api/v0/en/calendars/general-en/'
109
+
110
+ HTTPI.log = false
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calendarium-romanum-remote
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub Pavlík
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-02 00:00:00.000000000 Z
11
+ date: 2019-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: calendarium-romanum
@@ -24,6 +24,48 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: httpi
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.13'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dry-schema
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: rake
29
71
  requirement: !ruby/object:Gem::Requirement
@@ -61,13 +103,12 @@ files:
61
103
  - lib/calendarium-romanum-remote.rb
62
104
  - lib/calendarium-romanum/remote.rb
63
105
  - lib/calendarium-romanum/remote/calendar.rb
64
- - lib/calendarium-romanum/remote/drivers.rb
65
- - lib/calendarium-romanum/remote/drivers/net_http_driver.rb
106
+ - lib/calendarium-romanum/remote/driver.rb
66
107
  - lib/calendarium-romanum/remote/errors.rb
67
- - lib/calendarium-romanum/remote/v0/deserializer.rb
108
+ - lib/calendarium-romanum/remote/v0/denormalizer.rb
109
+ - lib/calendarium-romanum/remote/v0/uri_scheme.rb
68
110
  - lib/calendarium-romanum/remote/version.rb
69
111
  - spec/calendar_spec.rb
70
- - spec/drivers_spec.rb
71
112
  - spec/readme_spec.rb
72
113
  - spec/spec_helper.rb
73
114
  homepage: http://github.com/igneus/calendarium-romanum-remote
@@ -91,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
132
  version: '0'
92
133
  requirements: []
93
134
  rubyforge_project:
94
- rubygems_version: 2.5.1
135
+ rubygems_version: 2.6.11
95
136
  signing_key:
96
137
  specification_version: 4
97
138
  summary: remote calendar extension for calendarium-romanum
@@ -1,17 +0,0 @@
1
- module CalendariumRomanum
2
- module Remote
3
- module Drivers
4
- def self.get(api_version, driver_id)
5
- if api_version == :v0
6
- if driver_id == :net_http
7
- return NetHttpDriver.new
8
- else
9
- raise ArgumentError.new("Unsupported driver #{driver_id}")
10
- end
11
- else
12
- raise ArgumentError.new("Unsupported API version #{api_version.inspect}")
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,52 +0,0 @@
1
- module CalendariumRomanum
2
- module Remote
3
- module Drivers
4
- # Communicates with the remote API using Ruby standard library
5
- class NetHttpDriver
6
- def get(date, calendar_uri)
7
- uri_str =
8
- calendar_uri +
9
- (calendar_uri.end_with?('/') ? '' : '/') +
10
- "#{date.year}/#{date.month}/#{date.day}"
11
- uri = URI(uri_str)
12
-
13
- get_request uri
14
- end
15
-
16
- def year(year, calendar_uri)
17
- uri_str =
18
- calendar_uri +
19
- (calendar_uri.end_with?('/') ? '' : '/') +
20
- year.to_s
21
- uri = URI(uri_str)
22
-
23
- get_request uri
24
- end
25
-
26
- private
27
-
28
- def get_request(uri)
29
- begin
30
- response = Net::HTTP.get_response uri
31
- rescue SocketError, Errno::ECONNREFUSED => err
32
- raise ServerNotFoundError.new err.message
33
- rescue Timeout::Error, Errno::EINVAL,
34
- Errno::ECONNRESET, EOFError,
35
- Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
36
- Net::ProtocolError => err
37
- raise TransportError.new err.message
38
- end
39
-
40
- if response.code == '200'
41
- return response.body
42
- elsif response.code == '400'
43
- json = JSON.parse(response.body)
44
- raise BadRequestError.new(json['error'])
45
- else
46
- raise Error.new("Unexpected status #{response.code.inspect}")
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,28 +0,0 @@
1
- module CalendariumRomanum
2
- module Remote
3
- module V0
4
- class Deserializer
5
- def call(day_str)
6
- parsed = JSON.parse day_str
7
-
8
- season_sym = parsed['season'].to_sym
9
-
10
- CalendariumRomanum::Day.new(
11
- date: Date.parse(parsed['date']),
12
- season: CalendariumRomanum::Seasons.all.find {|s| s.symbol == season_sym},
13
- season_week: parsed['season_week'],
14
- celebrations: parsed['celebrations'].collect do |c|
15
- colour_sym = c['colour'].to_sym
16
-
17
- CalendariumRomanum::Celebration.new(
18
- c['title'],
19
- CalendariumRomanum::Ranks[c['rank_num']],
20
- CalendariumRomanum::Colours.all.find {|c| c.symbol == colour_sym }
21
- )
22
- end
23
- )
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,94 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe CalendariumRomanum::Remote::Drivers do
4
- CRRem = CalendariumRomanum::Remote
5
-
6
- let(:base_uri) { REMOTE_CALENDAR_URI }
7
- let(:date) { Date.new 2000, 1, 1 }
8
-
9
- shared_examples 'any driver' do
10
- describe 'success' do
11
- it 'returns a string' do
12
- r = driver.get date, base_uri
13
- expect(r).to be_a String
14
- expect(r).not_to be_empty
15
- end
16
-
17
- it 'returns a valid JSON' do
18
- r = driver.get date, base_uri
19
- expect do
20
- JSON.parse(r)
21
- end.not_to raise_exception
22
- end
23
- end
24
-
25
- describe 'server not found' do
26
- let(:base_uri) { 'http://unknown.server.xyz' }
27
-
28
- it 'fails' do
29
- expect do
30
- driver.get date, base_uri
31
- end.to raise_exception CRRem::ServerNotFoundError
32
- end
33
- end
34
-
35
- describe 'connection refused' do
36
- let(:base_uri) { 'http://localhost:33333' }
37
-
38
- it 'fails' do
39
- expect do
40
- driver.get date, base_uri
41
- end.to raise_exception CRRem::ServerNotFoundError
42
- end
43
- end
44
-
45
- describe 'calendar not found' do
46
- let(:base_uri) { REMOTE_CALENDAR_URI.sub(/(?<=calendars\/).*$/, 'unknown-calendar') }
47
-
48
- it 'fails' do
49
- expect do
50
- driver.get date, base_uri
51
- end.to raise_exception CRRem::BadRequestError
52
- end
53
- end
54
-
55
- describe 'invalid date' do
56
- # this won't ever happen, but the driver must be prepared
57
- # to handle bad request scenarios
58
- let(:date) { double(year: 2000, month: 13, day: 40) }
59
-
60
- it 'fails' do
61
- expect do
62
- driver.get date, base_uri
63
- end.to raise_exception CRRem::BadRequestError
64
- end
65
- end
66
- end
67
-
68
- describe CalendariumRomanum::Remote::Drivers::NetHttpDriver do
69
- let(:driver) { described_class.new }
70
-
71
- it_behaves_like 'any driver'
72
-
73
- # implementation-specific error handling
74
- describe 'network error' do
75
- [
76
- Timeout::Error,
77
- Errno::EINVAL,
78
- Errno::ECONNRESET,
79
- EOFError,
80
- Net::HTTPBadResponse,
81
- Net::HTTPHeaderSyntaxError,
82
- Net::ProtocolError
83
- ].each do |etype|
84
- it 'fails' do
85
- allow(Net::HTTP).to receive(:get_response).and_raise(etype)
86
-
87
- expect do
88
- driver.get date, base_uri
89
- end.to raise_exception CRRem::TransportError
90
- end
91
- end
92
- end
93
- end
94
- end