calendarium-romanum-remote 0.1.0 → 0.2.0

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