gares 2.0.0.pre.dev3 → 2.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.
@@ -0,0 +1,219 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Type: text/html;charset=UTF-8
3
+ X-UA-Compatible: IE=edge
4
+ Date: Fri, 01 May 2015 10:35:36 GMT
5
+ Content-Length: 17178
6
+ Connection: keep-alive
7
+ Set-Cookie: SNC_city=SDN_PRD6; path=/; domain=.sncf.com
8
+
9
+
10
+
11
+
12
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
13
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
14
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" data-placeholder-focus="false">
15
+
16
+ <head>
17
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
18
+ <title>List of trains - Traffic &amp; timetable updates | SNCF</title>
19
+ <link rel="canonical" href="http://www.sncf.com/en/horaires-info-trafic/train/resultats" />
20
+ <meta name="revisit-after" content="1 day" />
21
+ <link rel="shortcut icon" href="/theme/favicon.ico" type="image/x-icon" />
22
+ <link href="http://www.sncf.com/fr/info-trafic" rel="canonical" />
23
+ <meta http-equiv="Content-Language" content="en" /> <link type="text/css" rel="stylesheet" media="all" href="/ressources/menu_icons/menu_icons_en.css?1" />
24
+ <link type="text/css" rel="stylesheet" media="all" href="/ressources/css/css_fa8eef945cc8331059f2b2fe01e8b03b.css" />
25
+ <link type="text/css" rel="stylesheet" media="all" href="/ressources/css/css_ec8154e529f1ae274507ee7da445a16c.css" />
26
+ <link type="text/css" rel="stylesheet" media="print" href="/ressources/css/css_37cfb2f93b571bec4cf2ecfe43124557.css" />
27
+ <!--[if IE 6]>
28
+ <link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/sncfninesixty/styles/ie6.css?1" />
29
+ <![endif]-->
30
+ <!--[if lte IE 7]>
31
+ <link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/sncfninesixty/styles/ie7-and-below.css?1" />
32
+ <![endif]-->
33
+ <!--[if IE 8]>
34
+ <link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/sncfninesixty/styles/ie8.css?1" />
35
+ <![endif]-->
36
+ <!--[if gte IE 9]>
37
+ <link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/sncfninesixty/styles/ie9-and-above.css?1" />
38
+ <![endif]-->
39
+ <link href="/css/Generic-transac.css" media="all" type="text/css" rel="stylesheet" />
40
+ <link href="/css/itineraries.css" media="all" type="text/css" rel="stylesheet" /><link href="/css/train.css" media="all" type="text/css" rel="stylesheet" />
41
+ <script type="text/javascript" src="/ressources/js/js_89f43c3221c41b67e6924fff9b6a7908.js"></script>
42
+ <script type="text/javascript">
43
+ <!--//--><![CDATA[//><!--
44
+ jQuery.extend(Drupal.settings, { "basePath": "/", "googleanalytics": { "trackOutgoing": 1, "trackMailto": 1, "trackDownload": 1, "trackDownloadExtensions": "7z|aac|arc|arj|asf|asx|avi|bin|csv|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|msi|msp|pdf|phps|png|ppt|qtm?|ra(m|r)?|sea|sit|tar|tgz|torrent|txt|wav|wma|wmv|wpd|xls|xml|z|zip" }, "sncfcom_search_hours": { "list": { "form_start": "1", "form_end": "3" }, "calendar": { "form_start": "1", "form_end": "90" } }, "user_connected": false, "user_rights": { "1": "anonymous user" }, "user_valid": false, "site_language": "en", "site_country": null, "sncfcom_feature_id_chartes": { "nid": "32510" }, "radio": { "height": "400", "width": "632" }, "sncfcom_satisfaction": { "campaigns": [ { "sid": "1", "page": "/fr/contacts/foire-aux-questions", "height_delta": "0", "width_delta": "0", "campaign_url": "", "count_url": "" }, { "sid": "2", "page": "/fr/promotions-billets-train", "height_delta": "317", "width_delta": "25", "campaign_url": "http://www.monavis.sncf.com/website/4v0voyconet0BChH0/form/86/100?responsive=0\x26toolbar=0", "count_url": "http://jcvd.myfeelback.com/indicator/monavis_feedback_dircom?campaign=86\x26formsubmissiontag=Like" }, { "sid": "3", "page": "/fr/gare-", "height_delta": "230", "width_delta": "17", "campaign_url": "http://www.monavis.sncf.com/website/4v0vosh9h4RHM3cUM/form/85/99?responsive=0\x26toolbar=0", "count_url": "http://jcvd.myfeelback.com/indicator/monavis_feedback_dircom?campaign=85\x26formsubmissiontag=Like" }, { "sid": "4", "page": "/fr/itineraire/resultats", "height_delta": "318", "width_delta": "10", "campaign_url": "http://www.monavis.sncf.com/website/4v0voobke4qGav23I/form/84/98?responsive=0\x26toolbar=0", "count_url": "http://jcvd.myfeelback.com/indicator/monavis_feedback_dircom?campaign=84\x26formsubmissiontag=Like" } ] }, "sncfcom_tagcarrier_widget": "", "addthis": { "config_default": { "services_compact": "email,facebook,twitter,google_plusone_share,linkedin,viadeo,more", "ui_language": "en", "ui_click": true, "ui_508_compliant": false, "ui_use_css": true, "data_ga_tracker": "UA-1308810-1", "data_track_clickback": true, "pubid": "xa-4e2cfd1147868c4e" }, "share_default": null, "localize": { "share_caption": "Share with friends" } }, "campaigns_tracking": { "ttl": 90, "cname": "snc_links_id" } });
45
+ //--><!]]>
46
+ </script>
47
+ <script type="text/javascript">
48
+ <!--//--><![CDATA[//><!--
49
+ var popupradio_autoplay = true;
50
+ //--><!]]>
51
+ </script>
52
+ <script src="/js/Generic-transac.js" type="text/javascript"></script>
53
+ <script src="/js/itineraries.js" type="text/javascript"></script>
54
+ <script src="/js/ga_dynamic.js" type="text/javascript"></script>
55
+ <script src="/js/map-links.js" type="text/javascript"></script>
56
+ </head>
57
+
58
+ <body class="not-front not-logged-in page-node node-type-transac-page no-sidebars sncfcom-b2c sncfcom-colors-cb0044 i18n-en not-js">
59
+
60
+
61
+ <ul id="skip-links"><li><a href="#navbar-wrapper">Go to main menu</a></li><li><a href="#left-menu">Go to secondary menu</a></li><li><a href="#content">Go to content</a></li><li><a href="#footer">Go to footer</a></li></ul>
62
+
63
+ <div id='bubble_print' class='out'>Print this page</div><div id='bubble_share' class='out'>Share this page</div>
64
+
65
+ <div id="navbar-wrapper">
66
+ <div id="navbar">
67
+ <div id="sncf-barre-galactique" class="grid_d">
68
+
69
+ <div id="primary-menu">
70
+ <ul class="links"><li class="menu-12124 active-trail first"><a href="/en/passengers" title=" (Active section)"><span><span>Passengers</span></span></a></li>
71
+ <li class="menu-12126"><a href="/en/businesses-communities"><span><span>Businesses & Communities</span></span></a></li>
72
+ <li class="menu-15545 last"><a href="/en/group"><span><span>SNCF Group</span></span></a></li>
73
+ </ul> </div>
74
+
75
+ <div class="barre_right">
76
+
77
+ <div id="radio-menu">
78
+ <a href="#" class="open_radio"><span class="bold">SNCF</span> LA RADIO</a>
79
+ </div>
80
+
81
+
82
+ <div id="menu-langue">
83
+ <div><span>en</span></div><ul class="links" title="Change language"><li class="menu-1521 first"><a href="/voyageurs"><span class="js">Français</span><span class="no-js">Fr</span></a></li>
84
+ <li class="menu-1522"><a href="/en/passengers"><span class="js">English</span><span class="no-js">En</span></a></li>
85
+ <li class="menu-1523 last"><a href="/de/fahrgaste"><span class="js">Deutsch</span><span class="no-js">De</span></a></li>
86
+ </ul> </div>
87
+
88
+ </div>
89
+
90
+ </div> </div>
91
+ </div>
92
+ <div id="navbar-spacer"></div>
93
+
94
+ <div class="container_d">
95
+
96
+
97
+ <div class="grid_a" id="sidebar-left">
98
+ <div id="left-menu">
99
+ <div class="telecommand"><div class="arrow"></div><div class="content"><div class="logo"><a href="/en/passengers" title="Logo SNCF"><img src="/theme/images/logo-sncf.png" alt="Logo SNCF" title="Logo SNCF" width="131" height="76" /></a></div><ul><li class="menu-17388 active "><div class="text"><span><span>Tickets &amp; <span class="sncfcom-colors-automatic">train status</span></span></span></div><div class="submenu"><ul class="tc-content-2"><li class="menu-17393 no-icon first "><a href="http://en.voyages-sncf.com/en/" class=" " title="" target=""><span><span>Reservations</span></span></a></li><li class="menu-67100 no-icon last "><a href="http://www.infolignes.com/index.php?lang=en" class=" " title="" target=""><span><span class='double_line'>Timetables &amp; real-time <br />traffic updates</span></span></a></li></ul></div></li><li class="menu-58934 "><div class="text"><span><span>Passenger services</span></span></div><div class="submenu"><ul class="tc-content-2"><li class="menu-58935 first "><a href="/en/sub-home/58935" class=" has_sub-home sub-home-mlid-58935 " title="" target=""><span><span>All <span class="sncfcom-colors-automatic">passengers</span></span></span></a></li><li class="menu-58942 "><a href="/en/sub-home/58942" class=" has_sub-home sub-home-mlid-58942 " title="" target=""><span><span>Business <span class="sncfcom-colors-automatic">travel</span></span></span></a></li><li class="menu-58943 "><a href="/en/sub-home/58943" class=" has_sub-home sub-home-mlid-58943 " title="" target=""><span><span>Disability <span class="sncfcom-colors-automatic">access</span></span></span></a></li><li class="menu-58944 last "><a href="/en/sub-home/58944" class=" has_sub-home sub-home-mlid-58944 " title="" target=""><span><span>Group <span class="sncfcom-colors-automatic">travel</span></span></span></a></li></ul></div></li><li class="menu-58939 "><div class="text"><span><span>Trains &amp; coaches</span></span></div><div class="submenu"><ul class="tc-content-2"><li class="menu-58945 first "><a href="/en/sub-home/58945" class=" has_sub-home sub-home-mlid-58945 " title="" target=""><span><span>French <span class="sncfcom-colors-automatic">regions</span></span></span></a></li><li class="menu-58946 "><a href="/en/trains/transilien" class=" " title="" target=""><span><span>Paris <span class="sncfcom-colors-automatic">region</span></span></span></a></li><li class="menu-58947 "><a href="/en/sub-home/58947" class=" has_sub-home sub-home-mlid-58947 " title="" target=""><span><span>France</span></span></a></li><li class="menu-58948 last "><a href="/en/sub-home/58948" class=" has_sub-home sub-home-mlid-58948 " title="" target=""><span><span>Europe</span></span></a></li></ul></div></li><li class="menu-58940 "><div class="text"><span><span>Fares &amp; cards</span></span></div><div class="submenu"><ul class="tc-content-2"><li class="menu-17377 first "><a href="/en/special-deals" class=" " title="" target=""><span><span>Special Deals</span></span></a></li><li class="menu-58949 "><a href="/en/sub-home/58949" class=" has_sub-home sub-home-mlid-58949 " title="" target=""><span><span>Cards &amp; <span class="sncfcom-colors-automatic">discounts</span></span></span></a></li><li class="menu-58950 "><a href="/en/sub-home/58950" class=" has_sub-home sub-home-mlid-58950 " title="" target=""><span><span>Special <span class="sncfcom-colors-automatic">fares</span></span></span></a></li><li class="menu-58951 last "><a href="/en/sub-home/58951" class=" has_sub-home sub-home-mlid-58951 " title="" target=""><span><span>Loyalty <span class="sncfcom-colors-automatic">programmes</span></span></span></a></li></ul></div></li><li class="menu-58941 "><div class="text"><span><span>Customer relations</span></span></div><div class="submenu"><ul class="tc-content-2"><li class="menu-58990 first "><a href="/en/sub-home/58990" class=" has_sub-home sub-home-mlid-58990 " title="" target=""><span><span>Talk to us <span class="sncfcom-colors-automatic">on line</span></span></span></a></li><li class="menu-58952 "><a href="/en/sub-home/58952" class=" has_sub-home sub-home-mlid-58952 " title="" target=""><span><span>Contact <span class="sncfcom-colors-automatic">us</span></span></span></a></li><li class="menu-58953 "><a href="/en/sub-home/58953" class=" has_sub-home sub-home-mlid-58953 " title="" target=""><span><span>Our <span class="sncfcom-colors-automatic">commitments</span></span></span></a></li><li class="menu-58954 last "><a href="/en/sub-home/58954" class=" has_sub-home sub-home-mlid-58954 " title="" target=""><span><span class='double_line'>After-sales service <br /><span class="sncfcom-colors-automatic">&amp; Ombudsman</span></span></span></a></li></ul></div></li></ul></div></div>
100
+ </div>
101
+ </div>
102
+
103
+
104
+ <div class="grid_c container_content_12" id="content">
105
+
106
+ <div id="sncf-logo-print" class="grid_12"><img src="/theme/images/logo.png" alt ="" /></div>
107
+
108
+
109
+ <div class="content_text">
110
+ <div class="breadcrumb grid_10"><ul><li>Passengers</li> / <li>Tickets & train status</li> / <li>Timetables & real-time traffic updates</li> / <li title="Active page" class="last">Résultat de recherche : fiche train (en)</li></ul></div><div class="action-links grid_2">&nbsp;<span>&nbsp; <a class="print" target="_blank" href="/en/jprint/train/resultats">
111
+ </a>
112
+ <a role="button" class="addthis_button share" href="/en/horaires-info-trafic/train/resultats#">Share this page</a></span></div><div id="node-32510" class=" node clear-block">
113
+
114
+
115
+
116
+ <div class="content">
117
+ <div id="block-itineraires" class="transac-block transac-header">
118
+
119
+ <div class="container_12">
120
+ <h1 class="grid_9">
121
+ Timetables & real-time <br/><span class="sncfcom-colors-automatic">traffic updates</span>
122
+ </h1>
123
+ <div id="description" class="grid_8">
124
+ <h2>
125
+ Your <span class="sncfcom-colors-automatic">
126
+ search </span>
127
+ </h2>
128
+
129
+ <p class="search_summary">
130
+ Train no. : <strong>12345</strong><br/>
131
+ Travel date :
132
+ <strong> Saturday 25 April </strong>
133
+ </p>
134
+
135
+ <div class="search_modify">
136
+ <a href="/sncf/train/displayForm" id="lien-modifiere" class="sncfcom-colors-action-automatic">
137
+ Modify your search </a>
138
+ </div>
139
+
140
+ </div>
141
+ </div>
142
+
143
+
144
+ <div id="results" class="grid_12">
145
+ <div id="no_results">
146
+ <hr class="border" />
147
+ <h2>
148
+ no <span class="sncfcom-colors-automatic">
149
+ results </span>
150
+ </h2>
151
+ <div class="sncfcom-colors-automatic"><b>We’re sorry. There are no results for your search.</b></div>
152
+ <div class="details">Please change your search criteria.</div>
153
+ </div>
154
+ </div>
155
+
156
+
157
+ </div>
158
+ </div>
159
+
160
+ </div>
161
+ </div>
162
+
163
+
164
+ <div class="grid_c alpha omega" id="footer">
165
+ <div class="footer_content">
166
+
167
+ <div id="forgotten_password_block">
168
+ <a id="lb-close" tabindex="2">Fermer la popin</a>
169
+ <div class="forgotten_password identity">
170
+ <h3>Mot de passe oublié ?</h3>
171
+ <hr class="clear-border" />
172
+ <span class="identity-message">Indiquez l'adresse électronique utilisée lors de la création<br /> de votre compte. Un courriel vous sera envoyé pour définir<br /> votre mot de passe.</span>
173
+ <div class="form-item mail">
174
+ <label for="forgotten_password_email">Adresse électronique :</label>
175
+ <div class="message_fpw sncfcom-colors-error-automatic sncfcom-colors-automatic"></div>
176
+ <input type="text" maxlength="60" size="60" name="email_link" id="forgotten_password_email" value="" />
177
+ </div>
178
+ <div class="form-item">
179
+ <input type="submit" name="op" id="edit-send-mail-retrieve-password" value="Envoyer" class="form-submit sncfcom-colors-action-automatic sncfcom-colors-internal-caps-automatic" />
180
+ </div>
181
+ <div class="response-forgotten-password sncfcom-colors-automatic"></div>
182
+ </div>
183
+ </div>
184
+ <div id="block-sncfcom_navigation-footer" class="block block-sncfcom_navigation">
185
+
186
+ <div class="content">
187
+
188
+ <h2 class="grid_3 omega">Quick access : </h2>
189
+ <div id="quick-access" class="grid_10 alpha omega"><ul class="menu"><li class="leaf first"><a href="/en/education/schools">Teachers</a></li>
190
+ <li class="leaf last"><a href="/en/meet-sncf/finance/news">Finance</a></li>
191
+ </ul></div>
192
+
193
+ <hr class="clear border grid_12 no-margin" />
194
+
195
+ <div id="universes" class="grid_12"><ul class="menu"><li class="grid_4 first "><span><span>Passengers</span></span><ul class="menu"><li><a href="/en/reductions/lowest-fares">Travel at the lowest fares</a></li><li><a href="/en/services/mobile-apps-old">Mobile apps</a></li><li><a href="/en/services/after-sales-services">After-sales service</a></li></ul></li><li class="grid_4 "><span><span>Business and local communities</span></span><ul class="menu"><li><a href="/en/sub-home/15515">For business</a></li><li><a href="/en/sub-home/15518">For local communities</a></li><li><a href="/en/railway-companies">Railway Companies</a></li></ul></li><li class="grid_4 last "><span><span>SNCF Group</span></span><ul class="menu"><li><a href="/en/businesses/global-presence">Our global presence</a></li><li><a href="/en/our-commitments/sncf-foundation">SNCF Foundation</a></li></ul></li></ul></div>
196
+
197
+ <div id="radio-link" class="grid_4"><a href="http://laradio.sncf.com" target="_blank"><span class="bold">SNCF</span> LA RADIO</a></div>
198
+ <div id="about" class="grid_8"><ul class="menu"><li class="leaf first"><a href="/en/footer/legal-notice">Legal notice</a></li>
199
+ <li class="leaf last"><a href="http://sncf.com/cil/registre/">Contact for IT &amp; civil liberties issues</a></li>
200
+ </ul></div>
201
+
202
+ <hr class="clear" /> </div>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+ </div>
208
+ <div class="clear"></div>
209
+
210
+ </div>
211
+ <script type="text/javascript">
212
+ <!--//--><![CDATA[//><!--
213
+ var _gaq = _gaq || [];_gaq.push(["_setAccount", "UA-1308810-17"]);_gaq.push(["b._setAccount", "UA-1308810-1"]);(function() {var ga = document.createElement("script");ga.type = "text/javascript";ga.async = true;ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ga, s);})();
214
+ //--><!]]>
215
+ </script>
216
+
217
+ </body>
218
+ </html>
219
+
Binary file
@@ -1,90 +1,127 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Gares::Search do
4
- context 'with multiple search results' do
5
- before(:each) do
6
- @search = Gares::Search.new('Aix')
7
- end
4
+ describe "search by station name" do
5
+ context 'with multiple search results' do
6
+ subject do
7
+ Gares::Search.new('saint étienne')
8
+ end
8
9
 
9
- it 'should remember the query' do
10
- expect(@search.query).to eql('Aix')
11
- end
10
+ it 'should remember the query' do
11
+ expect(subject.query).to eql('saint étienne')
12
+ end
12
13
 
13
- it 'should find 28 results' do
14
- expect(@search.stations.size).to eql(28)
15
- end
14
+ it 'should find 11 results' do
15
+ expect(subject.stations.size).to eql(11)
16
+ end
16
17
 
17
- it 'should return Gares::Station objects only' do
18
- expect(@search.stations).to all(be_an(Gares::Station))
19
- end
18
+ it 'should return Gares::Station objects only' do
19
+ expect(subject.stations).to all(be_an(Gares::Station))
20
+ end
20
21
 
21
- it 'should not return gares with no name' do
22
- @search.stations.each { |gare| expect(gare.name).to_not be_blank }
23
- end
22
+ it 'should not return gares with no name' do
23
+ subject.stations.each { |gare| expect(gare.name).to_not be_blank }
24
+ end
24
25
 
25
- it 'should return only the name of the result' do
26
- expect(@search.stations.first.name).to eql('Roubaix')
26
+ it 'should return only the name of the result' do
27
+ expect(subject.stations.first.name).to eql('St-Étienne-du-Rouvray')
28
+ end
27
29
  end
28
- end
29
30
 
30
- context 'with an exact match' do
31
- it 'should not raise an exception' do
32
- expect do
33
- @search = Gares::Search.new('Paris Austerlitz').stations
34
- end.not_to raise_error
35
- end
31
+ describe 'with name that has utf-8 characters' do
32
+ subject { Gares::Station.search('Saone').first }
36
33
 
37
- it 'should return the gare sncf_id.downcase correctly' do
38
- @search = Gares::Search.new('Paris Austerlitz')
39
- expect(@search.stations.first.sncf_id.downcase).to eql('frpaz')
34
+ it 'should give the proper name' do
35
+ expect(subject.name).to eql('Saône')
36
+ end
40
37
  end
41
- end
42
38
 
43
- context 'with a fuzzy match' do
44
- it 'should not raise an exception' do
45
- expect do
46
- @search = Gares::Search.new('CULMONT CHALINDREY').stations
47
- end.not_to raise_error
48
- end
39
+ context 'with an exact match' do
40
+ subject { Gares::Search.new('Paris Austerlitz') }
49
41
 
50
- it 'should return the gare sncf_id.downcase correctly' do
51
- @search = Gares::Search.new('CULMONT CHALINDREY')
52
- expect(@search.stations.first.sncf_id.downcase).to eql('frccy')
53
- end
42
+ it 'should not raise an exception' do
43
+ expect do
44
+ subject.stations
45
+ end.not_to raise_error
46
+ end
54
47
 
55
- context 'with a "st" searching for "saint"' do
56
48
  it 'should return the gare sncf_id.downcase correctly' do
57
- @search = Gares::Search.new('ST ETIENNE CHATEAUCREUX')
58
- expect(@search.stations.first.sncf_id.downcase).to eql('frhhd')
49
+ expect(subject.stations.first.sncf_id.downcase).to eql('frpaz')
59
50
  end
60
51
  end
61
52
 
62
- context 'with a multi-terms search' do
63
- it 'should return the gare sncf_id.downcase correctly' do
64
- @search = Gares::Search.new('BAR SUR AUBE')
65
- expect(@search.stations.first.sncf_id.downcase).to eql('frapx')
53
+ context 'with a fuzzy match' do
54
+ subject { Gares::Search.new('CULMONT CHALINDREY') }
55
+ it 'should not raise an exception' do
56
+ expect do
57
+ subject.stations
58
+ end.not_to raise_error
66
59
  end
67
60
 
68
61
  it 'should return the gare sncf_id.downcase correctly' do
69
- @search = Gares::Search.new('NOGENT SUR SEINE')
70
- expect(@search.stations.first.sncf_id.downcase).to eql('frapm')
62
+ expect(subject.stations.first.sncf_id.downcase).to eql('frccy')
71
63
  end
72
64
 
73
- it 'should return the gare sncf_id.downcase correctly' do
74
- @stations = Gares::Station.search('MONTELIMAR GARE SNCF')
75
- expect(@stations.first.sncf_id.downcase).to eql('frmtl')
65
+ context 'with a "st" searching for "saint"' do
66
+ it 'should return the gare sncf_id.downcase correctly' do
67
+ subject = Gares::Search.new('ST ETIENNE CHATEAUCREUX')
68
+ expect(subject.stations.first.sncf_id.downcase).to eql('frhhd')
69
+ end
76
70
  end
77
71
 
78
- it 'should return the gare sncf_id.downcase correctly' do
79
- @stations = Gares::Station.search('MONTPELLIER SAINT-ROCH')
80
- expect(@stations.first.sncf_id.downcase).to eql('frmpl')
72
+ context 'with a multi-terms search' do
73
+ it 'should return the gare sncf_id.downcase correctly' do
74
+ subject = Gares::Search.new('BAR SUR AUBE')
75
+ expect(subject.stations.first.sncf_id.downcase).to eql('frapx')
76
+ end
77
+
78
+ it 'should return the gare sncf_id.downcase correctly' do
79
+ subject = Gares::Search.new('NOGENT SUR SEINE')
80
+ expect(subject.stations.first.sncf_id.downcase).to eql('frapm')
81
+ end
82
+
83
+ it 'should return the gare sncf_id.downcase correctly' do
84
+ subject = Gares::Station.search('MONTELIMAR GARE SNCF')
85
+ expect(subject.first.sncf_id.downcase).to eql('frmtl')
86
+ end
87
+
88
+ it 'should return the gare sncf_id.downcase correctly' do
89
+ subject = Gares::Station.search('MONTPELLIER SAINT-ROCH')
90
+ expect(subject.first.sncf_id.downcase).to eql('frmpl')
91
+ end
92
+
93
+ it 'should return the gare sncf_id.downcase correctly' do
94
+ subject = Gares::Station.search('CHALON SUR SAONE')
95
+ expect(subject.first.sncf_id.downcase).to eql('frxcd')
96
+ end
97
+
81
98
  end
99
+ end
100
+ end
82
101
 
83
- it 'should return the gare sncf_id.downcase correctly' do
84
- @stations = Gares::Station.search('CHALON SUR SAONE')
85
- expect(@stations.first.sncf_id.downcase).to eql('frxcd')
102
+ describe "search by sncf_id" do
103
+ context 'with an exact match' do
104
+ subject { Gares::Search.new('frlpd', :sncf_id) }
105
+
106
+ it 'should not raise an exception' do
107
+ expect do
108
+ subject.stations
109
+ end.not_to raise_error
86
110
  end
87
111
 
112
+ it 'returns the good station' do
113
+ expect(subject.stations.first.sncf_id.downcase).to eql('frlpd')
114
+ expect(subject.stations.first.name).to eql('Lyon Part-Dieu')
115
+ end
88
116
  end
89
117
  end
118
+
119
+ describe "search by unsupported field" do
120
+ it 'raises an exception' do
121
+ expect do
122
+ Gares::Search.new('Paris Austerlitz', :foo)
123
+ end.to raise_error
124
+ end
125
+ end
126
+
90
127
  end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ # This test uses "Lyon Part-Dieu" as a testing sample:
4
+ #
5
+ describe Gares::Station do
6
+
7
+ describe 'valid gare' do
8
+
9
+ subject do
10
+ # Get gare de Lyon Part-Dieu
11
+ Gares::Station.find_by_sncf_id('frlpd')
12
+ end
13
+
14
+ it 'should find the name' do
15
+ expect(subject.name).to eql('Lyon Part-Dieu')
16
+ end
17
+
18
+ it 'should find the sncf_id' do
19
+ expect(subject.sncf_id).to eql('FRLPD')
20
+ # Still supports deprecated fields
21
+ expect(subject.slug).to eql(subject.sncf_id.downcase)
22
+ end
23
+
24
+ it 'should find the TVS number' do
25
+ expect(subject.send(:tvs)).to eql('LYD')
26
+ end
27
+
28
+ it 'should find the geolocation coordinates' do
29
+ expect(subject.latitude).to eql(45.760568)
30
+ expect(subject.longitude).to eql(4.859991)
31
+ # Still supports deprecated fields
32
+ expect(subject.lat).to eql(subject.latitude)
33
+ expect(subject.long).to eql(subject.longitude)
34
+ end
35
+
36
+ it 'has a list of departure trains' do
37
+ expect(subject.departures.size).to eq(20)
38
+ expect(subject.departures.first.origdest.name).to eq('Bruxelles')
39
+ expect(subject.departures.first.heure).to eq('05:50')
40
+ expect(subject.departures.first.type).to eq('TGV')
41
+ end
42
+
43
+ it 'has a list of arrivals' do
44
+ expect(subject.arrivals.last.origdest.name).to eq('Chambéry Challes-les-Eaux')
45
+ expect(subject.arrivals.last.voie).to eq('')
46
+ expect(subject.arrivals.last.platform).to eq(subject.arrivals.last.voie)
47
+ expect(subject.arrivals.last.num).to eq(18542)
48
+ end
49
+
50
+ context 'Station of Agde' do
51
+ subject do
52
+ # Get gare de Agde
53
+ Gares::Station.find_by_sncf_id('frxag')
54
+ end
55
+
56
+ describe 'a gare with a BLS' do
57
+ it { expect(subject.has_borne?).to be(true) }
58
+ end
59
+ end
60
+ end
61
+ end
@@ -3,6 +3,27 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Gares::Train do
6
+
7
+ subject do
8
+ Gares::Train.new(num: train_number, date: date)
9
+ end
10
+
11
+ describe 'no results' do
12
+
13
+ let (:train_number) { 12345 }
14
+ let (:date) { Time.parse("2015-04-25") }
15
+
16
+ before do
17
+ # See tasks/fixtures.rake to change dataset
18
+ fake_response_for_train(train_number)
19
+ end
20
+
21
+ it "raises an error for any method called on it" do
22
+ expect { subject.departure }.to raise_error
23
+ end
24
+
25
+ end
26
+
6
27
  describe 'a delayed train' do
7
28
 
8
29
  let (:train_number) { 17709 }
@@ -14,7 +35,7 @@ describe Gares::Train do
14
35
  end
15
36
 
16
37
  subject do
17
- Gares::Train.new(train_number, date)
38
+ Gares::Train.new(num: train_number, date: date)
18
39
  end
19
40
 
20
41
  it "is delayed" do
@@ -61,7 +82,7 @@ describe Gares::Train do
61
82
  end
62
83
 
63
84
  subject do
64
- Gares::Train.new(train_number, date)
85
+ Gares::Train.new(num: train_number, date: date)
65
86
  end
66
87
 
67
88
  it "is delayed" do
@@ -77,7 +98,7 @@ describe Gares::Train do
77
98
  expect(subject.departure.delayed?).to be(false)
78
99
  end
79
100
 
80
- it "has stops", focus: true do
101
+ it "has stops" do
81
102
  expect(subject.stops.size).to eq(7)
82
103
  expect(subject.stops.first.station.name).to eq('Nogent-sur-Seine')
83
104
 
@@ -104,7 +125,7 @@ describe Gares::Train do
104
125
  end
105
126
 
106
127
  subject do
107
- Gares::Train.new(train_number, date)
128
+ Gares::Train.new(num: train_number, date: date)
108
129
  end
109
130
 
110
131
  it "selects always the first itinerary", focus: true do
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # By default if you have the FakeWeb gem installed when the specs are
2
2
  # run they will hit recorded responses. However, if you don't have
3
3
  # the FakeWeb gem installed or you set the environment variable
4
- # LIVE_TEST then the tests will hit the live site gares-en-mouvement.com.
4
+ # LIVE_TEST then the tests will hit the live site gares-sncf.com and sncf.com.
5
5
  #
6
6
  # Having both methods available for testing allows you to quickly
7
7
  # refactor and add features, while also being able to make sure that
8
- # no changes to the gares-en-mouvement.com interface have affected the parser.
8
+ # no changes to the gares-sncf.com interface have affected the parser.
9
9
  ###
10
10
 
11
11
  require 'simplecov'
@@ -16,24 +16,17 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
16
16
  ]
17
17
  SimpleCov.start
18
18
 
19
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
20
- require 'gares'
21
-
22
19
  def read_fixture(path)
23
20
  File.read(File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', path)))
24
21
  end
25
22
 
26
23
  # Fixtures for Gares
27
24
  GARES_SAMPLES = {
28
- 'http://www.gares-en-mouvement.com/fr/frqxb/services-en-gare/vente/' => 'frqxb-services-vente',
29
- 'http://www.gares-en-mouvement.com/fr/frqxb/services-en-gare/service/' => 'frqxb-services',
30
- 'http://www.gares-en-mouvement.com/fr/frabt/services-en-gare/vente/' => 'frabt-services-vente',
31
- 'http://www.gares-en-mouvement.com/fr/frlpd/services-en-gare/vente/' => 'frlpd-services-vente',
32
- 'http://www.gares-en-mouvement.com/fr/frlpd/services-en-gare/service/' => 'frlpd-services',
33
- 'http://www.gares-en-mouvement.com/fr/frxag/votre-gare' => 'frxag',
34
- 'http://www.gares-en-mouvement.com/fr/frlpd/votre-gare' => 'frlpd',
35
- 'http://www.gares-en-mouvement.com/fr/frhco/votre-gare' => 'frhco',
36
- 'https://raw.githubusercontent.com/capitainetrain/stations/master/stations.csv' => 'stations.csv'
25
+ 'https://raw.githubusercontent.com/capitainetrain/stations/master/stations.csv' => 'stations.csv',
26
+ 'https://raw.githubusercontent.com/paulrbr/stations/stations-with-bls/stations.csv' => 'bls.csv',
27
+ 'https://ressources.data.sncf.com/api/records/1.0/search?dataset=referentiel-gares-voyageurs&q=0087723197' => '87723197.json',
28
+ 'http://www.gares-sncf.com/fr/train-times/arrival/LYD/gl' => 'LYD-arrivals.json',
29
+ 'http://www.gares-sncf.com/fr/train-times/departure/LYD/gl' => 'LYD-departures.json'
37
30
  }
38
31
 
39
32
  # Sample fixtures for Trains
@@ -41,6 +34,7 @@ TRAINS_SAMPLES = [
41
34
  { 17709 => 'train-17709' },
42
35
  { 11641 => 'train-11641' },
43
36
  { 17495 => 'train-17495' },
37
+ { 12345 => 'train-12345' },
44
38
  { 6815 => 'train-6815' }, # Multi-itinerary see MULTI_TRAINS_SAMPLES
45
39
  ]
46
40
 
@@ -58,7 +52,7 @@ unless ENV['LIVE_TEST']
58
52
  FakeWeb.register_uri(:get, url, response: read_fixture(response))
59
53
  end
60
54
  rescue LoadError
61
- puts 'Could not load FakeWeb, these tests will hit gares-en-mouvement.com'
55
+ puts 'Could not load FakeWeb, these tests will hit gares-sncf.com and sncf.com'
62
56
  puts 'You can run `gem install fakeweb` to stub out the responses.'
63
57
  end
64
58
  end
@@ -80,8 +74,12 @@ def fake_response_for_train(number)
80
74
  FakeWeb.register_uri(:get, sncf_get_data_url, response: read_fixture("get-#{multi_response}-data"))
81
75
  end
82
76
  rescue LoadError
83
- puts 'Could not load FakeWeb, these tests will hit gares-en-mouvement.com'
77
+ puts 'Could not load FakeWeb, these tests will hit gares-sncf.com and sncf.com'
84
78
  puts 'You can run `gem install fakeweb` to stub out the responses.'
85
79
  end
86
80
  end
87
81
  end
82
+
83
+ # Now that we mocked http requests, load the gem
84
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
85
+ require 'gares'