amtrak 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/amtrak/train_fetcher/main_page.rb +2 -4
- data/lib/amtrak/train_parser.rb +31 -31
- data/lib/amtrak/version.rb +1 -1
- data/spec/amtrak/train_fetcher/main_page_spec.rb +4 -4
- data/spec/amtrak/train_fetcher/train_page_spec.rb +5 -5
- data/spec/amtrak/train_fetcher_spec.rb +16 -16
- data/spec/amtrak/train_parser_spec.rb +20 -177
- data/spec/amtrak_spec.rb +5 -228
- data/spec/fixtures/html/pvd_to_bby.html +2803 -2392
- data/spec/fixtures/json/_get.json +1 -0
- data/spec/fixtures/json/_parse.json +1 -0
- data/spec/fixtures/vcr/Amtrak/_get/returns_a_list_of_train_times.yml +599 -690
- data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/does_the_same_as_get.yml +455 -718
- data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_a_valid_date_and_invalid_train_stations/does_not_include_various_classes_and_includes_an_error.yml +129 -115
- data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_a_valid_date_and_train_stations/includes_various_classes.yml +449 -717
- data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_an_invalid_date_and_valid_train_stations/does_not_include_various_classes_and_includes_an_error.yml +127 -109
- data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_session_id/pulls_the_session_id_from_the_cookies.yml +295 -366
- data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_more_than_one_page_exists_on_the_website/returns_2.yml +295 -358
- data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_only_one_page_exists_on_the_website/returns_1.yml +289 -363
- data/spec/fixtures/vcr/Amtrak_TrainFetcher_TrainPage/_get/when_it_works/includes_various_classes.yml +164 -213
- metadata +6 -4
- data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_more_than_one_page_exists_on_the_website/returns_1.yml +0 -1076
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ec72cfc1f5a1b52b737a3b1744af0f11a097347
|
4
|
+
data.tar.gz: 4552142bd84a4699d7fad70183378a6d5ce1523a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1766915385f034a27c00210e732f9ff4b7725323d312153d732074b0d6c3da19806c3de6e1ff61b89431ff0d15bdd187c38c2e52f765d787ff19888ed1467560
|
7
|
+
data.tar.gz: 9c56312cbf9c98572d199fcd437dcff6e0abd25fe2252ea0b5f124f9bab01dbaa3c70eb49235a53deb1895129ebdfa9c89ab48a87261d3988d680e8e20d5e437
|
@@ -33,11 +33,9 @@ module Amtrak
|
|
33
33
|
{
|
34
34
|
"_handler=amtrak.presentation.handler.request.rail.AmtrakRailTrainStatusSearchRequestHandler/_xpath=/sessionWorkflow/productWorkflow[@product='Rail']" => '',
|
35
35
|
"/sessionWorkflow/productWorkflow[@product='Rail']/tripRequirements/journeyRequirements[1]/departDate.date" => departure_date,
|
36
|
+
"/sessionWorkflow/productWorkflow[@product='Rail']/tripRequirements/@trainStatusType" => 'statusByCityPair',
|
37
|
+
"/sessionWorkflow/productWorkflow[@product='Rail']/tripRequirements/journeyRequirements[1]/departDate/@radioSelect" => 'arrivalTime',
|
36
38
|
'requestor' => 'amtrak.presentation.handler.page.rail.AmtrakRailGetTrainStatusPageHandler',
|
37
|
-
'xwdf_trainNumber' => "/sessionWorkflow/productWorkflow[@product='Rail']/tripRequirements/journeyRequirements[1]/segmentRequirements[1]/serviceCode",
|
38
|
-
'wdf_trainNumber' => 'optional',
|
39
|
-
'xwdf_SortBy' => "/sessionWorkflow/productWorkflow[@product='Rail']/tripRequirements/journeyRequirements[1]/departDate/@radioSelect",
|
40
|
-
'wdf_SortBy' => 'arrivalTime',
|
41
39
|
'xwdf_origin' => "/sessionWorkflow/productWorkflow[@product='Rail']/travelSelection/journeySelection[1]/departLocation/search",
|
42
40
|
'wdf_origin' => from.to_s,
|
43
41
|
'xwdf_destination' => "/sessionWorkflow/productWorkflow[@product='Rail']/travelSelection/journeySelection[1]/arriveLocation/search",
|
data/lib/amtrak/train_parser.rb
CHANGED
@@ -19,12 +19,11 @@ module Amtrak
|
|
19
19
|
def parse
|
20
20
|
trains = []
|
21
21
|
|
22
|
-
|
23
|
-
departure, arrival = train_nodes.shift(2)
|
22
|
+
while train_node = train_nodes.shift
|
24
23
|
trains << {
|
25
|
-
number: parse_train_number(
|
26
|
-
departure: parse_train(
|
27
|
-
arrival: parse_train(
|
24
|
+
number: parse_train_number(train_node),
|
25
|
+
departure: parse_train(find_depart_status(train_node)),
|
26
|
+
arrival: parse_train(find_arrive_status(train_node))
|
28
27
|
}
|
29
28
|
end
|
30
29
|
|
@@ -35,33 +34,39 @@ module Amtrak
|
|
35
34
|
|
36
35
|
def train_nodes
|
37
36
|
@train_nodes ||= document.search(
|
38
|
-
"//
|
37
|
+
"//div[@id='train_status_resp_by_citypair']"
|
39
38
|
).tap { |results| fail 'No trains found' unless results.count > 0 }.to_a
|
40
39
|
end
|
41
40
|
|
41
|
+
def find_depart_status(node)
|
42
|
+
find!(node, ".//div[@id='resp_by_citypair_depart_status_details']")
|
43
|
+
end
|
44
|
+
|
45
|
+
def find_arrive_status(node)
|
46
|
+
find!(node, ".//div[@id='resp_by_citypair_arrive_status_details']")
|
47
|
+
end
|
48
|
+
|
42
49
|
def parse_train_number(node)
|
43
50
|
find!(
|
44
|
-
node,
|
51
|
+
node,
|
52
|
+
".//div[@id='resp_by_citypair_subheading']/\
|
53
|
+
div[@id='resp_by_citypair_subheading_trainname']/text()"
|
45
54
|
).to_s.to_i
|
46
55
|
end
|
47
56
|
|
48
57
|
def parse_train(node) # rubocop:disable Metrics/MethodLength
|
49
|
-
|
50
|
-
node, ".//
|
51
|
-
).to_s
|
52
|
-
estimated_date = find!(
|
53
|
-
node, ".//td[@class='act_est']/div[@class='date']/text()"
|
58
|
+
date = find!(
|
59
|
+
node, ".//div[@class='arriveDepartDate']/text()"
|
54
60
|
).to_s
|
55
|
-
scheduled_time =
|
56
|
-
find!(node, ".//
|
57
|
-
)
|
58
|
-
estimated_time = remove_parentheses(
|
59
|
-
find!(node, ".//td[@class='act_est']/div[@class='time']/text()").to_s
|
61
|
+
scheduled_time = clean_msg(
|
62
|
+
find!(node, ".//div[@class='scheduledArriveDepartMsg']/text()").to_s
|
60
63
|
)
|
64
|
+
estimated_time = find(
|
65
|
+
node, ".//div[@class='arriveDepartTime']/text()"
|
66
|
+
).to_s
|
61
67
|
|
62
68
|
{
|
63
|
-
|
64
|
-
estimated_date: estimated_date,
|
69
|
+
date: date,
|
65
70
|
scheduled_time: scheduled_time,
|
66
71
|
estimated_time: estimated_time
|
67
72
|
}
|
@@ -71,20 +76,15 @@ module Amtrak
|
|
71
76
|
node.search(xpath).tap { |rs| fail "#{rs.count} results" if rs.count > 1 }
|
72
77
|
end
|
73
78
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
else
|
78
|
-
DateTime.parse("#{date} at #{time}")
|
79
|
-
end
|
79
|
+
def find(node, xpath)
|
80
|
+
find!(node, xpath)
|
81
|
+
rescue RuntimeError # rubocop:disable Lint/HandleExceptions
|
80
82
|
end
|
81
83
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
time_string
|
87
|
-
end
|
84
|
+
def clean_msg(time_msg)
|
85
|
+
return unless matches = /\d+:\d+ (a|p)m/.match(time_msg)
|
86
|
+
|
87
|
+
matches[0]
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
data/lib/amtrak/version.rb
CHANGED
@@ -34,7 +34,7 @@ describe Amtrak::TrainFetcher::MainPage do
|
|
34
34
|
|
35
35
|
describe '#total_pages' do
|
36
36
|
context 'when only one page exists on the website' do
|
37
|
-
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-
|
37
|
+
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-12-07')) }
|
38
38
|
|
39
39
|
it 'returns 1', :vcr do
|
40
40
|
expect(subject.total_pages).to eq(1)
|
@@ -42,7 +42,7 @@ describe Amtrak::TrainFetcher::MainPage do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'when more than one page exists on the website' do
|
45
|
-
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-
|
45
|
+
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-12-06')) }
|
46
46
|
|
47
47
|
it 'returns 2', :vcr do
|
48
48
|
expect(subject.total_pages).to eq(2)
|
@@ -51,9 +51,9 @@ describe Amtrak::TrainFetcher::MainPage do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
describe '#session_id' do
|
54
|
-
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-
|
54
|
+
subject { described_class.new('pvd', 'bby', date: Date.parse('2014-12-06')) }
|
55
55
|
it 'pulls the session id from the cookies', :vcr do
|
56
|
-
expect(subject.session_id).to eq('
|
56
|
+
expect(subject.session_id).to eq('0000faPsyYZwp2n8Wb_4BDhukyg:187j59p07')
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -5,18 +5,18 @@ describe Amtrak::TrainFetcher::TrainPage do
|
|
5
5
|
|
6
6
|
describe '#get', :vcr do
|
7
7
|
context 'when it works' do
|
8
|
-
let(:session_id) { '
|
8
|
+
let(:session_id) { '0000faPsyYZwp2n8Wb_4BDhukyg:187j59p07' }
|
9
9
|
let(:page) { '1' }
|
10
10
|
|
11
11
|
it 'includes various classes' do
|
12
|
-
expect(subject).to include('
|
13
|
-
expect(subject).to include('
|
14
|
-
expect(subject).to include('
|
12
|
+
expect(subject).to include('resp_by_citypair_subheading_trainname')
|
13
|
+
expect(subject).to include('resp_by_citypair_depart_status_details')
|
14
|
+
expect(subject).to include('resp_by_citypair_arrive_status_details')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'when Excon raises an error' do
|
19
|
-
let(:session_id) { '
|
19
|
+
let(:session_id) { '0000faPsyYZwp2n8Wb_4BDhukyg:187j59p07' }
|
20
20
|
let(:page) { '1' }
|
21
21
|
|
22
22
|
it 'reraises as a TrainFetcher::Error' do
|
@@ -3,56 +3,56 @@ require 'spec_helper'
|
|
3
3
|
describe Amtrak::TrainFetcher do
|
4
4
|
describe '.get', :vcr do
|
5
5
|
let(:output) do
|
6
|
-
described_class.get('pvd', 'bby', date: Date.parse('2014-
|
6
|
+
described_class.get('pvd', 'bby', date: Date.parse('2014-12-07'))
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'does the same as #get' do
|
10
|
-
expect(output.join).to include('
|
11
|
-
expect(output.join).to include('
|
12
|
-
expect(output.join).to include('
|
10
|
+
expect(output.join).to include('resp_by_citypair_subheading_trainname')
|
11
|
+
expect(output.join).to include('resp_by_citypair_depart_status_details')
|
12
|
+
expect(output.join).to include('resp_by_citypair_arrive_status_details')
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe '#get', :vcr do
|
17
17
|
describe 'given a valid date and train stations' do
|
18
18
|
subject do
|
19
|
-
described_class.new('pvd', 'bby', date: Date.parse('2014-
|
19
|
+
described_class.new('pvd', 'bby', date: Date.parse('2014-12-07'))
|
20
20
|
end
|
21
21
|
|
22
22
|
let(:output) { subject.get }
|
23
23
|
|
24
24
|
it 'includes various classes' do
|
25
|
-
expect(output.join).to include('
|
26
|
-
expect(output.join).to include('
|
27
|
-
expect(output.join).to include('
|
25
|
+
expect(output.join).to include('resp_by_citypair_subheading_trainname')
|
26
|
+
expect(output.join).to include('resp_by_citypair_depart_status_details')
|
27
|
+
expect(output.join).to include('resp_by_citypair_arrive_status_details')
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
describe 'given an invalid date and valid train stations' do
|
32
32
|
subject do
|
33
|
-
described_class.new('pvd', 'bby', date: Date.parse('2014-11-
|
33
|
+
described_class.new('pvd', 'bby', date: Date.parse('2014-11-06'))
|
34
34
|
end
|
35
35
|
|
36
36
|
let(:output) { subject.get }
|
37
37
|
|
38
38
|
it 'does not include various classes and includes an error' do
|
39
|
-
expect(output.join).to_not include('
|
40
|
-
expect(output.join).to_not include('
|
41
|
-
expect(output.join).to_not include('
|
39
|
+
expect(output.join).to_not include('resp_by_citypair_subheading_trainname')
|
40
|
+
expect(output.join).to_not include('resp_by_citypair_depart_status_details')
|
41
|
+
expect(output.join).to_not include('resp_by_citypair_arrive_status_details')
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
describe 'given a valid date and invalid train stations' do
|
46
46
|
subject do
|
47
|
-
described_class.new('askdf', 'bby', date: Date.parse('2014-
|
47
|
+
described_class.new('askdf', 'bby', date: Date.parse('2014-12-07'))
|
48
48
|
end
|
49
49
|
|
50
50
|
let(:output) { subject.get }
|
51
51
|
|
52
52
|
it 'does not include various classes and includes an error' do
|
53
|
-
expect(output.join).to_not include('
|
54
|
-
expect(output.join).to_not include('
|
55
|
-
expect(output.join).to_not include('
|
53
|
+
expect(output.join).to_not include('resp_by_citypair_subheading_trainname')
|
54
|
+
expect(output.join).to_not include('resp_by_citypair_depart_status_details')
|
55
|
+
expect(output.join).to_not include('resp_by_citypair_arrive_status_details')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -1,75 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Amtrak::TrainParser do
|
4
|
-
describe '#
|
4
|
+
describe '#clean_msg' do
|
5
5
|
subject { described_class.new('') }
|
6
|
-
let(:output) { subject.
|
6
|
+
let(:output) { subject.clean_msg(message) }
|
7
7
|
|
8
|
-
context 'on a string with no
|
9
|
-
let(:message) { '
|
10
|
-
let(:expected) {
|
11
|
-
|
12
|
-
it 'returns the statement' do
|
13
|
-
expect(output).to eq(expected)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'on a string with a leading parentheses' do
|
18
|
-
let(:message) { '(3:30 pm' }
|
19
|
-
let(:expected) { '(3:30 pm' }
|
20
|
-
|
21
|
-
it 'returns the statement' do
|
22
|
-
expect(output).to eq(expected)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'on a string with a trailing parentheses' do
|
27
|
-
let(:message) { '3:30 pm)' }
|
28
|
-
let(:expected) { '3:30 pm)' }
|
8
|
+
context 'on a string with no time' do
|
9
|
+
let(:message) { 'Scheduled arrival' }
|
10
|
+
let(:expected) { nil }
|
29
11
|
|
30
|
-
it 'returns
|
12
|
+
it 'returns nil' do
|
31
13
|
expect(output).to eq(expected)
|
32
14
|
end
|
33
15
|
end
|
34
16
|
|
35
|
-
context 'on a string with
|
36
|
-
let(:message) { '
|
17
|
+
context 'on a string with a time' do
|
18
|
+
let(:message) { 'Scheduled arrival 3:30 pm' }
|
37
19
|
let(:expected) { '3:30 pm' }
|
38
20
|
|
39
|
-
it 'returns the
|
21
|
+
it 'returns the time' do
|
40
22
|
expect(output).to eq(expected)
|
41
23
|
end
|
42
24
|
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#make_datetime' do
|
46
|
-
subject { described_class.new('') }
|
47
|
-
let(:output) { subject.make_datetime(date, time) }
|
48
25
|
|
49
|
-
context '
|
50
|
-
let(:
|
51
|
-
let(:
|
52
|
-
|
53
|
-
it 'returns nil' do
|
54
|
-
expect(output).to be_nil
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'given no time' do
|
59
|
-
let(:date) { 'Wed Nov 19, 2014' }
|
60
|
-
let(:time) { nil }
|
61
|
-
|
62
|
-
it 'returns nil' do
|
63
|
-
expect(output).to be_nil
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'given a string date and time' do
|
68
|
-
let(:date) { 'Wed Nov 19, 2014' }
|
69
|
-
let(:time) { '3:30 pm' }
|
70
|
-
let(:expected) { DateTime.new(2014, 11, 19, 15, 30) }
|
26
|
+
context 'on a string with only a time' do
|
27
|
+
let(:message) { '3:30 pm' }
|
28
|
+
let(:expected) { '3:30 pm' }
|
71
29
|
|
72
|
-
it 'returns
|
30
|
+
it 'returns the time' do
|
73
31
|
expect(output).to eq(expected)
|
74
32
|
end
|
75
33
|
end
|
@@ -90,131 +48,16 @@ describe Amtrak::TrainParser do
|
|
90
48
|
let(:document) do
|
91
49
|
File.read(File.join('spec', 'fixtures', 'html', 'pvd_to_bby.html'))
|
92
50
|
end
|
51
|
+
let(:expected) do
|
52
|
+
JSON.parse(
|
53
|
+
File.read(File.join('spec', 'fixtures', 'json', '_parse.json')),
|
54
|
+
symbolize_names: true
|
55
|
+
)
|
56
|
+
end
|
93
57
|
|
94
58
|
context 'without an error' do
|
95
59
|
it 'returns a list of train times' do
|
96
|
-
expect(output).to eq(
|
97
|
-
{
|
98
|
-
number: 174,
|
99
|
-
departure: {
|
100
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
101
|
-
estimated_date: '',
|
102
|
-
scheduled_time: '5:30 pm',
|
103
|
-
estimated_time: '5:52 pm'
|
104
|
-
},
|
105
|
-
arrival: {
|
106
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
107
|
-
estimated_date: 'Wed Nov 19, 2014',
|
108
|
-
scheduled_time: '6:25 pm',
|
109
|
-
estimated_time: '6:27 pm'
|
110
|
-
}
|
111
|
-
},
|
112
|
-
{
|
113
|
-
number: 2164,
|
114
|
-
departure: {
|
115
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
116
|
-
estimated_date: '',
|
117
|
-
scheduled_time: '5:50 pm',
|
118
|
-
estimated_time: '6:45 pm'
|
119
|
-
},
|
120
|
-
arrival: {
|
121
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
122
|
-
estimated_date: 'Wed Nov 19, 2014',
|
123
|
-
scheduled_time: '6:34 pm',
|
124
|
-
estimated_time: '7:14 pm'
|
125
|
-
}
|
126
|
-
},
|
127
|
-
{
|
128
|
-
number: 2166,
|
129
|
-
departure: {
|
130
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
131
|
-
estimated_date: '',
|
132
|
-
scheduled_time: '6:54 pm',
|
133
|
-
estimated_time: ''
|
134
|
-
},
|
135
|
-
arrival: {
|
136
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
137
|
-
estimated_date: 'Wed Nov 19, 2014',
|
138
|
-
scheduled_time: '7:35 pm',
|
139
|
-
estimated_time: '7:28 pm'
|
140
|
-
}
|
141
|
-
},
|
142
|
-
{
|
143
|
-
number: 176,
|
144
|
-
departure: {
|
145
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
146
|
-
estimated_date: 'Wed Nov 19, 2014',
|
147
|
-
scheduled_time: '7:19 pm',
|
148
|
-
estimated_time: '7:22 pm'
|
149
|
-
},
|
150
|
-
arrival: {
|
151
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
152
|
-
estimated_date: 'Wed Nov 19, 2014',
|
153
|
-
scheduled_time: '8:06 pm',
|
154
|
-
estimated_time: '7:51 pm'
|
155
|
-
}
|
156
|
-
},
|
157
|
-
{
|
158
|
-
number: 2168,
|
159
|
-
departure: {
|
160
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
161
|
-
estimated_date: 'Wed Nov 19, 2014',
|
162
|
-
scheduled_time: '7:56 pm',
|
163
|
-
estimated_time: '7:57 pm'
|
164
|
-
},
|
165
|
-
arrival: {
|
166
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
167
|
-
estimated_date: 'Wed Nov 19, 2014',
|
168
|
-
scheduled_time: '8:38 pm',
|
169
|
-
estimated_time: '8:34 pm'
|
170
|
-
}
|
171
|
-
},
|
172
|
-
{
|
173
|
-
number: 2170,
|
174
|
-
departure: {
|
175
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
176
|
-
estimated_date: 'Wed Nov 19, 2014',
|
177
|
-
scheduled_time: '8:54 pm',
|
178
|
-
estimated_time: '8:55 pm'
|
179
|
-
},
|
180
|
-
arrival: {
|
181
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
182
|
-
estimated_date: 'Wed Nov 19, 2014',
|
183
|
-
scheduled_time: '9:34 pm',
|
184
|
-
estimated_time: '9:32 pm'
|
185
|
-
}
|
186
|
-
},
|
187
|
-
{
|
188
|
-
number: 94,
|
189
|
-
departure: {
|
190
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
191
|
-
estimated_date: 'Wed Nov 19, 2014',
|
192
|
-
scheduled_time: '9:16 pm',
|
193
|
-
estimated_time: '9:22 pm'
|
194
|
-
},
|
195
|
-
arrival: {
|
196
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
197
|
-
estimated_date: 'Wed Nov 19, 2014',
|
198
|
-
scheduled_time: '10:02 pm',
|
199
|
-
estimated_time: '9:51 pm'
|
200
|
-
}
|
201
|
-
},
|
202
|
-
{
|
203
|
-
number: 2172,
|
204
|
-
departure: {
|
205
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
206
|
-
estimated_date: 'Wed Nov 19, 2014',
|
207
|
-
scheduled_time: '9:54 pm',
|
208
|
-
estimated_time: '9:55 pm'
|
209
|
-
},
|
210
|
-
arrival: {
|
211
|
-
scheduled_date: 'Wed Nov 19, 2014',
|
212
|
-
estimated_date: 'Wed Nov 19, 2014',
|
213
|
-
scheduled_time: '10:35 pm',
|
214
|
-
estimated_time: '10:32 pm'
|
215
|
-
}
|
216
|
-
}
|
217
|
-
])
|
60
|
+
expect(output).to eq(expected)
|
218
61
|
end
|
219
62
|
|
220
63
|
context 'with an error' do
|