ninoxe 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ninoxe/version.rb +1 -1
  3. data/spec/dummy/README.rdoc +261 -0
  4. data/spec/dummy/Rakefile +6 -0
  5. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  6. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  7. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  8. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  9. data/spec/dummy/app/mailers/.gitkeep +0 -0
  10. data/spec/dummy/app/models/.gitkeep +0 -0
  11. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  12. data/spec/dummy/config/application.rb +56 -0
  13. data/spec/dummy/config/boot.rb +10 -0
  14. data/spec/dummy/config/database.yml +9 -0
  15. data/spec/dummy/config/environment.rb +7 -0
  16. data/spec/dummy/config/environments/development.rb +37 -0
  17. data/spec/dummy/config/environments/production.rb +67 -0
  18. data/spec/dummy/config/environments/test.rb +37 -0
  19. data/spec/dummy/config/initializers/active_record.rb +2 -0
  20. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  21. data/spec/dummy/config/initializers/inflections.rb +15 -0
  22. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  23. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  24. data/spec/dummy/config/initializers/session_store.rb +8 -0
  25. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  26. data/spec/dummy/config/locales/en.yml +5 -0
  27. data/spec/dummy/config/routes.rb +4 -0
  28. data/spec/dummy/config.ru +4 -0
  29. data/spec/dummy/db/test.sqlite3 +0 -0
  30. data/spec/dummy/lib/assets/.gitkeep +0 -0
  31. data/spec/dummy/log/.gitkeep +0 -0
  32. data/spec/dummy/public/404.html +26 -0
  33. data/spec/dummy/public/422.html +26 -0
  34. data/spec/dummy/public/500.html +25 -0
  35. data/spec/dummy/public/favicon.ico +0 -0
  36. data/spec/dummy/script/rails +6 -0
  37. data/spec/models/chouette/access_link_spec.rb +78 -0
  38. data/spec/models/chouette/access_point_spec.rb +193 -0
  39. data/spec/models/chouette/active_record_spec.rb +121 -0
  40. data/spec/models/chouette/area_type_spec.rb +53 -0
  41. data/spec/models/chouette/company_spec.rb +51 -0
  42. data/spec/models/chouette/connection_link_spec.rb +56 -0
  43. data/spec/models/chouette/direction_spec.rb +60 -0
  44. data/spec/models/chouette/exporter_spec.rb +28 -0
  45. data/spec/models/chouette/file_validator_spec.rb +28 -0
  46. data/spec/models/chouette/group_of_line_spec.rb +31 -0
  47. data/spec/models/chouette/journey_pattern_spec.rb +62 -0
  48. data/spec/models/chouette/line_spec.rb +106 -0
  49. data/spec/models/chouette/loader_spec.rb +69 -0
  50. data/spec/models/chouette/network_spec.rb +22 -0
  51. data/spec/models/chouette/object_id_spec.rb +146 -0
  52. data/spec/models/chouette/route_spec.rb +159 -0
  53. data/spec/models/chouette/stop_area_spec.rb +354 -0
  54. data/spec/models/chouette/stop_point_spec.rb +39 -0
  55. data/spec/models/chouette/time_table_spec.rb +372 -0
  56. data/spec/models/chouette/transport_mode_spec.rb +64 -0
  57. data/spec/models/chouette/vehicle_journey_at_stop_spec.rb +46 -0
  58. data/spec/models/chouette/vehicle_journey_spec.rb +204 -0
  59. data/spec/presenters/chouette/geometry/general_presenter.rb +1 -0
  60. data/spec/presenters/chouette/geometry/line_presenter_spec.rb +13 -0
  61. data/spec/spec_helper.rb +45 -0
  62. metadata +210 -130
@@ -0,0 +1,372 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chouette::TimeTable do
4
+
5
+ subject { Factory(:time_table) }
6
+
7
+ it { should validate_presence_of :comment }
8
+ it { should validate_uniqueness_of :objectid }
9
+
10
+ describe "#periods_max_date" do
11
+ context "when all period extends from 04/10/2013 to 04/15/2013," do
12
+ before(:each) do
13
+ p1 = Chouette::TimeTablePeriod.new( :period_start => Date.strptime("04/10/2013", '%m/%d/%Y'), :period_end => Date.strptime("04/12/2013", '%m/%d/%Y'))
14
+ p2 = Chouette::TimeTablePeriod.new( :period_start => Date.strptime("04/13/2013", '%m/%d/%Y'), :period_end => Date.strptime("04/15/2013", '%m/%d/%Y'))
15
+ subject.periods = [ p1, p2]
16
+ subject.save
17
+ end
18
+
19
+ it "should retreive 04/15/2013" do
20
+ subject.periods_max_date.should == Date.strptime("04/15/2013", '%m/%d/%Y')
21
+ end
22
+ context "when day_types select only sunday and saturday," do
23
+ before(:each) do
24
+ # jeudi, vendredi
25
+ subject.update_attributes( :int_day_types => (2**(1+6) + 2**(1+7)))
26
+ end
27
+ it "should retreive 04/14/2013" do
28
+ subject.periods_max_date.should == Date.strptime("04/14/2013", '%m/%d/%Y')
29
+ end
30
+ end
31
+ context "when day_types select only friday," do
32
+ before(:each) do
33
+ # jeudi, vendredi
34
+ subject.update_attributes( :int_day_types => (2**(1+6)))
35
+ end
36
+ it "should retreive 04/12/2013" do
37
+ subject.periods_max_date.should == Date.strptime("04/13/2013", '%m/%d/%Y')
38
+ end
39
+ end
40
+ context "when day_types select only thursday," do
41
+ before(:each) do
42
+ # mardi
43
+ subject.update_attributes( :int_day_types => (2**(1+2)))
44
+ end
45
+ it "should retreive 04/12/2013" do
46
+ # 04/15/2013 is monday !
47
+ subject.periods_max_date.should be_nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+ describe "#periods_min_date" do
53
+ context "when all period extends from 04/10/2013 to 04/15/2013," do
54
+ before(:each) do
55
+ p1 = Chouette::TimeTablePeriod.new( :period_start => Date.strptime("04/10/2013", '%m/%d/%Y'), :period_end => Date.strptime("04/12/2013", '%m/%d/%Y'))
56
+ p2 = Chouette::TimeTablePeriod.new( :period_start => Date.strptime("04/13/2013", '%m/%d/%Y'), :period_end => Date.strptime("04/15/2013", '%m/%d/%Y'))
57
+ subject.periods = [ p1, p2]
58
+ subject.save
59
+ end
60
+
61
+ it "should retreive 04/10/2013" do
62
+ subject.periods_min_date.should == Date.strptime("04/10/2013", '%m/%d/%Y')
63
+ end
64
+ context "when day_types select only tuesday and friday," do
65
+ before(:each) do
66
+ # jeudi, vendredi
67
+ subject.update_attributes( :int_day_types => (2**(1+4) + 2**(1+5)))
68
+ end
69
+ it "should retreive 04/11/2013" do
70
+ subject.periods_min_date.should == Date.strptime("04/11/2013", '%m/%d/%Y')
71
+ end
72
+ end
73
+ context "when day_types select only friday," do
74
+ before(:each) do
75
+ # jeudi, vendredi
76
+ subject.update_attributes( :int_day_types => (2**(1+5)))
77
+ end
78
+ it "should retreive 04/12/2013" do
79
+ subject.periods_min_date.should == Date.strptime("04/12/2013", '%m/%d/%Y')
80
+ end
81
+ end
82
+ context "when day_types select only thursday," do
83
+ before(:each) do
84
+ # mardi
85
+ subject.update_attributes( :int_day_types => (2**(1+2)))
86
+ end
87
+ it "should retreive 04/12/2013" do
88
+ # 04/15/2013 is monday !
89
+ subject.periods_min_date.should be_nil
90
+ end
91
+ end
92
+ end
93
+ end
94
+ describe "#periods.build" do
95
+ it "should add a new instance of period, and periods_max_date should not raise error" do
96
+ period = subject.periods.build
97
+ subject.periods_max_date
98
+ period.period_start.should be_nil
99
+ period.period_end.should be_nil
100
+ end
101
+ end
102
+ describe "#periods" do
103
+ context "when a period is added," do
104
+ before(:each) do
105
+ subject.periods << Chouette::TimeTablePeriod.new( :period_start => (subject.bounding_dates.min - 1), :period_end => (subject.bounding_dates.max + 1))
106
+ subject.save
107
+ end
108
+ it "should update shortcut" do
109
+ subject.start_date.should == subject.bounding_dates.min
110
+ subject.end_date.should == subject.bounding_dates.max
111
+ end
112
+ end
113
+ context "when a period is removed," do
114
+ before(:each) do
115
+ subject.dates = []
116
+ subject.periods = []
117
+ subject.periods << Chouette::TimeTablePeriod.new(
118
+ :period_start => 4.days.since.to_date,
119
+ :period_end => 6.days.since.to_date)
120
+ subject.periods << Chouette::TimeTablePeriod.new(
121
+ :period_start => 1.days.since.to_date,
122
+ :period_end => 10.days.since.to_date)
123
+ subject.save
124
+ subject.periods = subject.periods - [subject.periods.last]
125
+ end
126
+ def read_tm
127
+ Chouette::TimeTable.find subject.id
128
+ end
129
+ it "should update shortcut" do
130
+ tm = read_tm
131
+ subject.start_date.should == subject.bounding_dates.min
132
+ subject.start_date.should == tm.bounding_dates.min
133
+ subject.start_date.should == 4.days.since.to_date
134
+ subject.end_date.should == subject.bounding_dates.max
135
+ subject.end_date.should == tm.bounding_dates.max
136
+ subject.end_date.should == 6.days.since.to_date
137
+ end
138
+ end
139
+ end
140
+ describe "#dates" do
141
+ context "when a date is added," do
142
+ before(:each) do
143
+ subject.dates << Chouette::TimeTableDate.new( :date => (subject.bounding_dates.max + 1))
144
+ subject.save
145
+ end
146
+ it "should update shortcut" do
147
+ subject.start_date.should == subject.bounding_dates.min
148
+ subject.end_date.should == subject.bounding_dates.max
149
+ end
150
+ end
151
+ context "when a date is removed," do
152
+ before(:each) do
153
+ subject.periods = []
154
+ subject.dates = subject.dates - [subject.bounding_dates.max + 1]
155
+ end
156
+ it "should update shortcut" do
157
+ subject.start_date.should == subject.bounding_dates.min
158
+ subject.end_date.should == subject.bounding_dates.max
159
+ end
160
+ end
161
+ context "when all the dates and periods are removed," do
162
+ before(:each) do
163
+ subject.periods = []
164
+ subject.dates = []
165
+ end
166
+ it "should update shortcut" do
167
+ subject.start_date.should be_nil
168
+ subject.end_date.should be_nil
169
+ end
170
+ end
171
+ end
172
+
173
+ describe "#valid_days" do
174
+ it "should begin with position 0" do
175
+ subject.int_day_types = 128
176
+ subject.valid_days.should == [6]
177
+ end
178
+ end
179
+
180
+ describe "#intersects" do
181
+ it "should return day if a date equal day" do
182
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1")
183
+ time_table_date = Factory(:time_table_date, :date => Date.today, :time_table_id => time_table.id)
184
+ time_table.intersects([Date.today]).should == [Date.today]
185
+ end
186
+
187
+ it "should return [] if a period not include days" do
188
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1", :int_day_types => 12)
189
+ time_table_period = Factory(:time_table_period, :period_start => Date.new(2013, 05, 27),:period_end => Date.new(2013, 05, 30), :time_table_id => time_table.id)
190
+ time_table.intersects([ Date.new(2013, 05, 29), Date.new(2013, 05, 30)]).should == []
191
+ end
192
+
193
+ it "should return days if a period include day" do
194
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1", :int_day_types => 12) # Day type monday and tuesday
195
+ time_table_period = Factory(:time_table_period, :period_start => Date.new(2013, 05, 27),:period_end => Date.new(2013, 05, 30), :time_table_id => time_table.id)
196
+ time_table.intersects([ Date.new(2013, 05, 27), Date.new(2013, 05, 28)]).should == [ Date.new(2013, 05, 27), Date.new(2013, 05, 28)]
197
+ end
198
+
199
+
200
+ end
201
+
202
+ describe "#include_day?" do
203
+ it "should return true if a date equal day" do
204
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1")
205
+ time_table_date = Factory(:time_table_date, :date => Date.today, :time_table_id => time_table.id)
206
+ time_table.include_day?(Date.today).should == true
207
+ end
208
+
209
+ it "should return true if a period include day" do
210
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1", :int_day_types => 12) # Day type monday and tuesday
211
+ time_table_period = Factory(:time_table_period, :period_start => Date.new(2013, 05, 27),:period_end => Date.new(2013, 05, 29), :time_table_id => time_table.id)
212
+ time_table.include_day?( Date.new(2013, 05, 27)).should == true
213
+ end
214
+ end
215
+
216
+ describe "#include_in_dates?" do
217
+ it "should return true if a date equal day" do
218
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1")
219
+ time_table_date = Factory(:time_table_date, :date => Date.today, :time_table_id => time_table.id)
220
+ time_table.include_in_dates?(Date.today).should == true
221
+ end
222
+ end
223
+
224
+ describe "#include_in_periods?" do
225
+ it "should return true if a period include day" do
226
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1", :int_day_types => 4)
227
+ time_table_period = Factory(:time_table_period, :period_start => Date.new(2012, 1, 1),:period_end => Date.new(2012, 01, 30), :time_table_id => time_table.id)
228
+ time_table.include_in_periods?(Date.new(2012, 1, 2)).should == true
229
+ end
230
+ end
231
+
232
+ describe "#include_in_overlap_dates?" do
233
+ it "should return true if a day is included in overlap dates" do
234
+ time_table = Chouette::TimeTable.create!(:comment => "Test", :objectid => "test:Timetable:1", :int_day_types => 4)
235
+ time_table_period = Factory(:time_table_period, :period_start => Date.new(2012, 1, 1),:period_end => Date.new(2012, 01, 30), :time_table_id => time_table.id)
236
+ time_table_date = Factory(:time_table_date, :date => Date.new(2012, 1, 2), :time_table_id => time_table.id)
237
+ time_table.include_in_overlap_dates?(Date.new(2012, 1, 2)).should == true
238
+ end
239
+ end
240
+
241
+ describe "#dates" do
242
+ it "should have with position 0" do
243
+ subject.dates.first.position.should == 0
244
+ end
245
+ context "when first date has been removed" do
246
+ before do
247
+ subject.dates.first.destroy
248
+ end
249
+ it "should begin with position 0" do
250
+ subject.dates.first.position.should == 0
251
+ end
252
+ end
253
+ end
254
+ describe "#validity_out_between?" do
255
+ let(:empty_tm) {Factory.build(:time_table)}
256
+ it "should be false if empty calendar" do
257
+ empty_tm.validity_out_between?( Date.today, Date.today + 7.day).should be_false
258
+ end
259
+ it "should be true if caldendar is out during start_date and end_date period" do
260
+ start_date = subject.bounding_dates.max - 2.day
261
+ end_date = subject.bounding_dates.max + 2.day
262
+ subject.validity_out_between?( start_date, end_date).should be_true
263
+ end
264
+ it "should be false if calendar is out on start date" do
265
+ start_date = subject.bounding_dates.max
266
+ end_date = subject.bounding_dates.max + 2.day
267
+ subject.validity_out_between?( start_date, end_date).should be_false
268
+ end
269
+ it "should be false if calendar is out on end date" do
270
+ start_date = subject.bounding_dates.max - 2.day
271
+ end_date = subject.bounding_dates.max
272
+ subject.validity_out_between?( start_date, end_date).should be_true
273
+ end
274
+ it "should be false if calendar is out after start_date" do
275
+ start_date = subject.bounding_dates.max + 2.day
276
+ end_date = subject.bounding_dates.max + 4.day
277
+ subject.validity_out_between?( start_date, end_date).should be_false
278
+ end
279
+ end
280
+ describe "#validity_out_from_on?" do
281
+ let(:empty_tm) {Factory.build(:time_table)}
282
+ it "should be false if empty calendar" do
283
+ empty_tm.validity_out_from_on?( Date.today).should be_false
284
+ end
285
+ it "should be true if caldendar ends on expected date" do
286
+ expected_date = subject.bounding_dates.max
287
+ subject.validity_out_from_on?( expected_date).should be_true
288
+ end
289
+ it "should be true if calendar ends before expected date" do
290
+ expected_date = subject.bounding_dates.max + 30.day
291
+ subject.validity_out_from_on?( expected_date).should be_true
292
+ end
293
+ it "should be false if calendars ends after expected date" do
294
+ expected_date = subject.bounding_dates.max - 30.day
295
+ subject.validity_out_from_on?( expected_date).should be_false
296
+ end
297
+ end
298
+ describe "#bounding_dates" do
299
+ context "when timetable contains only periods" do
300
+ before do
301
+ subject.dates = []
302
+ subject.save
303
+ end
304
+ it "should retreive periods.period_start.min and periods.period_end.max" do
305
+ subject.bounding_dates.min.should == subject.periods.map(&:period_start).min
306
+ subject.bounding_dates.max.should == subject.periods.map(&:period_end).max
307
+ end
308
+ end
309
+ context "when timetable contains only dates" do
310
+ before do
311
+ subject.periods = []
312
+ subject.save
313
+ end
314
+ it "should retreive dates.min and dates.max" do
315
+ subject.bounding_dates.min.should == subject.dates.map(&:date).min
316
+ subject.bounding_dates.max.should == subject.dates.map(&:date).max
317
+ end
318
+ end
319
+ it "should contains min date" do
320
+ min_date = subject.bounding_dates.min
321
+ subject.dates.each do |tm_date|
322
+ (min_date <= tm_date.date).should be_true
323
+ end
324
+ subject.periods.each do |tm_period|
325
+ (min_date <= tm_period.period_start).should be_true
326
+ end
327
+
328
+ end
329
+ it "should contains max date" do
330
+ max_date = subject.bounding_dates.max
331
+ subject.dates.each do |tm_date|
332
+ (tm_date.date <= max_date).should be_true
333
+ end
334
+ subject.periods.each do |tm_period|
335
+ (tm_period.period_end <= max_date).should be_true
336
+ end
337
+
338
+ end
339
+ end
340
+ describe "#periods" do
341
+ it "should begin with position 0" do
342
+ subject.periods.first.position.should == 0
343
+ end
344
+ context "when first period has been removed" do
345
+ before do
346
+ subject.periods.first.destroy
347
+ end
348
+ it "should begin with position 0" do
349
+ subject.periods.first.position.should == 0
350
+ end
351
+ end
352
+ it "should have period_start before period_end" do
353
+ period = Chouette::TimeTablePeriod.new
354
+ period.period_start = Date.today
355
+ period.period_end = Date.today + 10
356
+ period.valid?.should be_true
357
+ end
358
+ it "should not have period_start after period_end" do
359
+ period = Chouette::TimeTablePeriod.new
360
+ period.period_start = Date.today
361
+ period.period_end = Date.today - 10
362
+ period.valid?.should be_false
363
+ end
364
+ it "should not have period_start equal to period_end" do
365
+ period = Chouette::TimeTablePeriod.new
366
+ period.period_start = Date.today
367
+ period.period_end = Date.today
368
+ period.valid?.should be_false
369
+ end
370
+ end
371
+
372
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chouette::TransportMode do
4
+
5
+ def mode(text_code = "test", numerical_code = nil)
6
+ numerical_code ||= 1 if text_code == "test"
7
+ Chouette::TransportMode.new(text_code, numerical_code)
8
+ end
9
+
10
+ describe "#to_i" do
11
+
12
+ it "should return numerical code" do
13
+ mode("test", 1).to_i.should == 1
14
+ end
15
+
16
+ end
17
+
18
+ it "should return true to #test? when text code is 'test'" do
19
+ mode("test").should be_test
20
+ end
21
+
22
+ it "should be equal when text codes are identical" do
23
+ mode("test",1).should == mode("test", 2)
24
+ end
25
+
26
+ describe ".new" do
27
+
28
+ it "should find numerical code from text code" do
29
+ mode("unknown").to_i.should == 0
30
+ end
31
+
32
+ it "should find text code from numerical code" do
33
+ mode(0).should be_unknown
34
+ end
35
+
36
+ it "should accept another mode" do
37
+ Chouette::TransportMode.new(mode("test")).should == mode("test")
38
+ end
39
+
40
+ end
41
+
42
+ describe "#public_transport?" do
43
+
44
+ it "should return false for interchange" do
45
+ mode("interchange").should_not be_public_transport
46
+ end
47
+
48
+ it "should return true for other modes" do
49
+ mode("unknown").should be_public_transport
50
+ end
51
+
52
+ end
53
+
54
+ describe ".all" do
55
+
56
+ Chouette::TransportMode.definitions.each do |text_code, numerical_code|
57
+ it "should include a TransportMode #{text_code}" do
58
+ Chouette::TransportMode.all.should include(Chouette::TransportMode.new(text_code))
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chouette::VehicleJourneyAtStop do
4
+ let!(:vehicle_journey){ Factory(:vehicle_journey_odd)}
5
+ subject { vehicle_journey.vehicle_journey_at_stops.first }
6
+
7
+ describe "#exceeds_gap?" do
8
+ it "should return false if gap < 1.hour" do
9
+ t1 = 1.minutes.ago
10
+ t2 = 1.minutes.ago + 3.hour
11
+ subject.exceeds_gap?(t1, t2).should be_true
12
+ end
13
+ it "should return false if gap > 2.hour" do
14
+ t1 = 1.minutes.ago
15
+ t2 = 1.minutes.ago + 3.minutes
16
+ subject.exceeds_gap?(t1, t2).should be_false
17
+ end
18
+ end
19
+
20
+ describe "#increasing_times_validate" do
21
+ let(:vjas1){ vehicle_journey.vehicle_journey_at_stops[0]}
22
+ let(:vjas2){ vehicle_journey.vehicle_journey_at_stops[1]}
23
+ context "when vjas#arrival_time exceeds gap" do
24
+ it "should add errors on arrival_time" do
25
+ vjas1.arrival_time = vjas2.arrival_time - 3.hour
26
+ vjas2.increasing_times_validate(vjas1).should be_false
27
+ vjas2.errors.should_not be_empty
28
+ vjas2.errors[:arrival_time].should_not be_blank
29
+ end
30
+ end
31
+ context "when vjas#departure_time exceeds gap" do
32
+ it "should add errors on departure_time" do
33
+ vjas1.departure_time = vjas2.departure_time - 3.hour
34
+ vjas2.increasing_times_validate(vjas1).should be_false
35
+ vjas2.errors.should_not be_empty
36
+ vjas2.errors[:departure_time].should_not be_blank
37
+ end
38
+ end
39
+ context "when vjas does'nt exceed gap" do
40
+ it "should not add errors" do
41
+ vjas2.increasing_times_validate(vjas1).should be_true
42
+ vjas2.errors.should be_empty
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,204 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chouette::VehicleJourney do
4
+ subject { Factory(:vehicle_journey_odd) }
5
+
6
+ describe "in_relation_to_a_journey_pattern methods" do
7
+ let!(:route) { Factory(:route)}
8
+ let!(:journey_pattern) { Factory(:journey_pattern, :route => route)}
9
+ let!(:journey_pattern_odd) { Factory(:journey_pattern_odd, :route => route)}
10
+ let!(:journey_pattern_even) { Factory(:journey_pattern_even, :route => route)}
11
+
12
+ context "when vehicle_journey is on odd stop whereas selected journey_pattern is on all stops" do
13
+ subject { Factory(:vehicle_journey, :route => route, :journey_pattern => journey_pattern_odd)}
14
+ describe "#extra_stops_in_relation_to_a_journey_pattern" do
15
+ it "should be empty" do
16
+ subject.extra_stops_in_relation_to_a_journey_pattern( journey_pattern).should be_empty
17
+ end
18
+ end
19
+ describe "#extra_vjas_in_relation_to_a_journey_pattern" do
20
+ it "should be empty" do
21
+ subject.extra_vjas_in_relation_to_a_journey_pattern( journey_pattern).should be_empty
22
+ end
23
+ end
24
+ describe "#missing_stops_in_relation_to_a_journey_pattern" do
25
+ it "should return even stops" do
26
+ result = subject.missing_stops_in_relation_to_a_journey_pattern( journey_pattern)
27
+ result.should == journey_pattern_even.stop_points
28
+ end
29
+ end
30
+ describe "#update_journey_pattern" do
31
+ it "should new_record for added vjas" do
32
+ subject.update_journey_pattern( journey_pattern)
33
+ subject.vehicle_journey_at_stops.select{ |vjas| vjas.new_record? }.each do |vjas|
34
+ journey_pattern_even.stop_points.should include( vjas.stop_point)
35
+ end
36
+ end
37
+ it "should add vjas on each even stops" do
38
+ subject.update_journey_pattern( journey_pattern)
39
+ vehicle_stops = subject.vehicle_journey_at_stops.map(&:stop_point)
40
+ journey_pattern_even.stop_points.each do |sp|
41
+ vehicle_stops.should include(sp)
42
+ end
43
+ end
44
+ it "should not mark any vjas as _destroy" do
45
+ subject.update_journey_pattern( journey_pattern)
46
+ subject.vehicle_journey_at_stops.any?{ |vjas| vjas._destroy }.should be_false
47
+ end
48
+ end
49
+ end
50
+ context "when vehicle_journey is on all stops whereas selected journey_pattern is on odd stops" do
51
+ subject { Factory(:vehicle_journey, :route => route, :journey_pattern => journey_pattern)}
52
+ describe "#missing_stops_in_relation_to_a_journey_pattern" do
53
+ it "should be empty" do
54
+ subject.missing_stops_in_relation_to_a_journey_pattern( journey_pattern_odd).should be_empty
55
+ end
56
+ end
57
+ describe "#extra_stops_in_relation_to_a_journey_pattern" do
58
+ it "should return even stops" do
59
+ result = subject.extra_stops_in_relation_to_a_journey_pattern( journey_pattern_odd)
60
+ result.should == journey_pattern_even.stop_points
61
+ end
62
+ end
63
+ describe "#extra_vjas_in_relation_to_a_journey_pattern" do
64
+ it "should return vjas on even stops" do
65
+ result = subject.extra_vjas_in_relation_to_a_journey_pattern( journey_pattern_odd)
66
+ result.map(&:stop_point).should == journey_pattern_even.stop_points
67
+ end
68
+ end
69
+ describe "#update_journey_pattern" do
70
+ it "should add no new vjas" do
71
+ subject.update_journey_pattern( journey_pattern_odd)
72
+ subject.vehicle_journey_at_stops.any?{ |vjas| vjas.new_record? }.should be_false
73
+ end
74
+ it "should mark vehicle_journey_at_stops as _destroy on even stops" do
75
+ subject.update_journey_pattern( journey_pattern_odd)
76
+ subject.vehicle_journey_at_stops.each { |vjas|
77
+ vjas._destroy.should == journey_pattern_even.stop_points.include?(vjas.stop_point)
78
+ }
79
+ end
80
+ end
81
+ end
82
+
83
+ end
84
+ context "when following departure times exceeds gap" do
85
+ describe "#increasing_times" do
86
+ before(:each) do
87
+ subject.vehicle_journey_at_stops[0].departure_time = subject.vehicle_journey_at_stops[1].departure_time - 2.hour
88
+ subject.vehicle_journey_at_stops[0].arrival_time = subject.vehicle_journey_at_stops[0].departure_time
89
+ subject.vehicle_journey_at_stops[1].arrival_time = subject.vehicle_journey_at_stops[1].departure_time
90
+ end
91
+ it "should make instance invalid" do
92
+ subject.increasing_times
93
+ subject.vehicle_journey_at_stops[1].errors[:departure_time].should_not be_blank
94
+ subject.should_not be_valid
95
+ end
96
+ end
97
+ describe "#update_attributes" do
98
+ let!(:params){ {"vehicle_journey_at_stops_attributes" => {
99
+ "0"=>{"id" => subject.vehicle_journey_at_stops[0].id ,"arrival_time" => 1.minutes.ago,"departure_time" => 1.minutes.ago},
100
+ "1"=>{"id" => subject.vehicle_journey_at_stops[1].id, "arrival_time" => (1.minutes.ago + 2.hour),"departure_time" => (1.minutes.ago + 2.hour)}
101
+ }}}
102
+ it "should return false" do
103
+ subject.update_attributes(params).should be_false
104
+ end
105
+ it "should make instance invalid" do
106
+ subject.update_attributes(params)
107
+ subject.should_not be_valid
108
+ end
109
+ it "should let first vjas without any errors" do
110
+ subject.update_attributes(params)
111
+ subject.vehicle_journey_at_stops[0].errors.should be_empty
112
+ end
113
+ it "should add an error on second vjas" do
114
+ subject.update_attributes(params)
115
+ subject.vehicle_journey_at_stops[1].errors[:departure_time].should_not be_blank
116
+ end
117
+ end
118
+ end
119
+
120
+ context "#time_table_tokens=" do
121
+ let!(:tm1){Factory(:time_table, :comment => "TM1")}
122
+ let!(:tm2){Factory(:time_table, :comment => "TM2")}
123
+
124
+ it "should return associated time table ids" do
125
+ subject.update_attributes :time_table_tokens => [tm1.id, tm2.id].join(',')
126
+ subject.time_tables.should include( tm1)
127
+ subject.time_tables.should include( tm2)
128
+ end
129
+ end
130
+ describe "#bounding_dates" do
131
+ before(:each) do
132
+ tm1 = Factory.build(:time_table, :dates =>
133
+ [ Factory.build(:time_table_date, :date => 1.days.ago.to_date),
134
+ Factory.build(:time_table_date, :date => 2.days.ago.to_date)])
135
+ tm2 = Factory.build(:time_table, :periods =>
136
+ [ Factory.build(:time_table_period, :period_start => 4.days.ago.to_date, :period_end => 3.days.ago.to_date)])
137
+ tm3 = Factory.build(:time_table)
138
+ subject.time_tables = [ tm1, tm2, tm3]
139
+ end
140
+ it "should return min date from associated calendars" do
141
+ subject.bounding_dates.min.should == 4.days.ago.to_date
142
+ end
143
+ it "should return max date from associated calendars" do
144
+ subject.bounding_dates.max.should == 1.days.ago.to_date
145
+ end
146
+ end
147
+ context "#vehicle_journey_at_stops" do
148
+ it "should be ordered like stop_points on route" do
149
+ route = subject.route
150
+ vj_stop_ids = subject.vehicle_journey_at_stops.map(&:stop_point_id)
151
+ expected_order = route.stop_points.map(&:id).select {|s_id| vj_stop_ids.include?(s_id)}
152
+
153
+ vj_stop_ids.should == expected_order
154
+ end
155
+
156
+ end
157
+
158
+ describe "#transport_mode_name" do
159
+
160
+ def self.legacy_transport_modes
161
+ %w{Air Train LongDistanceTrain LocalTrain RapidTransit Metro Tramway Coach Bus Ferry Waterborne PrivateVehicle Walk Trolleybus Bicycle Shuttle Taxi VAL Other}
162
+ end
163
+
164
+ legacy_transport_modes.each do |transport_mode|
165
+ context "when transport_mode is #{transport_mode}" do
166
+ transport_mode_name = Chouette::TransportMode.new(transport_mode.underscore)
167
+ it "should be #{transport_mode_name}" do
168
+ subject.transport_mode = transport_mode
169
+ subject.transport_mode_name.should == transport_mode_name
170
+ end
171
+ end
172
+ end
173
+ context "when transport_mode is nil" do
174
+ it "should be nil" do
175
+ subject.transport_mode = nil
176
+ subject.transport_mode_name.should be_nil
177
+ end
178
+ end
179
+
180
+ end
181
+
182
+ describe "#transport_mode_name=" do
183
+
184
+ it "should change transport_mode with TransportMode#name" do
185
+ subject.transport_mode_name = "Test"
186
+ subject.transport_mode.should == "Test"
187
+ end
188
+
189
+ end
190
+
191
+ describe ".transport_mode_names" do
192
+
193
+ it "should not include unknown transport_mode_name" do
194
+ Chouette::VehicleJourney.transport_mode_names.should_not include(Chouette::TransportMode.new("unknown"))
195
+ end
196
+
197
+ it "should not include interchange transport_mode" do
198
+ Chouette::VehicleJourney.transport_mode_names.should_not include(Chouette::TransportMode.new("interchange"))
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+