aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/chouette_routes.rb11
-rw-r--r--spec/factories/chouette_vehicle_journey.rb30
-rw-r--r--spec/javascripts/time_table/actions_spec.js155
-rw-r--r--spec/javascripts/time_table/reducers/metas_spec.js2
-rw-r--r--spec/javascripts/time_table/reducers/modal_spec.js249
-rw-r--r--spec/javascripts/time_table/reducers/pagination_spec.js128
-rw-r--r--spec/javascripts/time_table/reducers/status_spec.js50
-rw-r--r--spec/javascripts/time_table/reducers/timetable_spec.js184
-rw-r--r--spec/models/chouette/route/route_base_spec.rb69
-rw-r--r--spec/models/chouette/route/route_destroy_spec.rb45
-rw-r--r--spec/models/chouette/route/route_stop_points_spec.rb (renamed from spec/models/chouette/route_spec.rb)69
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb89
-rw-r--r--spec/models/time_table_combination_spec.rb32
13 files changed, 1031 insertions, 82 deletions
diff --git a/spec/factories/chouette_routes.rb b/spec/factories/chouette_routes.rb
index e872d24f5..c1a9423c5 100644
--- a/spec/factories/chouette_routes.rb
+++ b/spec/factories/chouette_routes.rb
@@ -20,7 +20,18 @@ FactoryGirl.define do
create_list(:stop_point, evaluator.stop_points_count, route: route)
end
+ factory :route_with_journey_patterns do
+ transient do
+ journey_patterns_count 2
+ end
+
+ after(:create) do |route, evaluator|
+ create_list(:journey_pattern, evaluator.journey_patterns_count, route: route)
+ end
+
+ end
end
+
end
end
diff --git a/spec/factories/chouette_vehicle_journey.rb b/spec/factories/chouette_vehicle_journey.rb
index b7c5e37d5..9ba660800 100644
--- a/spec/factories/chouette_vehicle_journey.rb
+++ b/spec/factories/chouette_vehicle_journey.rb
@@ -3,29 +3,31 @@ FactoryGirl.define do
factory :vehicle_journey_common, :class => Chouette::VehicleJourney do
sequence(:objectid) { |n| "test:VehicleJourney:#{n}" }
- factory :vehicle_journey do
+ factory :vehicle_journey_empty do
association :journey_pattern, :factory => :journey_pattern
after(:build) do |vehicle_journey|
vehicle_journey.route = vehicle_journey.journey_pattern.route
end
- after(:create) do |vehicle_journey|
- vehicle_journey.journey_pattern.stop_points.each_with_index do |stop_point, index|
- vehicle_journey.vehicle_journey_at_stops << create(:vehicle_journey_at_stop,
- :vehicle_journey => vehicle_journey,
- :stop_point => stop_point,
- :arrival_time => '2000-01-01 01:00:00 UTC',
- :departure_time => '2000-01-01 03:00:00 UTC')
+ factory :vehicle_journey do
+ after(:create) do |vehicle_journey|
+ vehicle_journey.journey_pattern.stop_points.each_with_index do |stop_point, index|
+ vehicle_journey.vehicle_journey_at_stops << create(:vehicle_journey_at_stop,
+ :vehicle_journey => vehicle_journey,
+ :stop_point => stop_point,
+ :arrival_time => '2000-01-01 01:00:00 UTC',
+ :departure_time => '2000-01-01 03:00:00 UTC')
+ end
end
- end
- factory :vehicle_journey_odd do
- association :journey_pattern, :factory => :journey_pattern_odd
- end
+ factory :vehicle_journey_odd do
+ association :journey_pattern, :factory => :journey_pattern_odd
+ end
- factory :vehicle_journey_even do
- association :journey_pattern, :factory => :journey_pattern_even
+ factory :vehicle_journey_even do
+ association :journey_pattern, :factory => :journey_pattern_even
+ end
end
end
end
diff --git a/spec/javascripts/time_table/actions_spec.js b/spec/javascripts/time_table/actions_spec.js
index eac2f86bb..1ab5635a0 100644
--- a/spec/javascripts/time_table/actions_spec.js
+++ b/spec/javascripts/time_table/actions_spec.js
@@ -1,5 +1,16 @@
var actions = require('es6_browserified/time_tables/actions')
-
+const dispatch = function(){}
+const dayTypes = [true, true, true, true, true, true, true]
+const day = {
+ date : "2017-05-01",
+ day : "lundi",
+ excluded_date : false,
+ in_periods : true,
+ include_date : false,
+ mday : 1,
+ wday : 1,
+ wnumber : "18"
+}
describe('actions', () => {
it('should create an action to update dayTypes', () => {
const expectedAction = {
@@ -48,4 +59,146 @@ describe('actions', () => {
}
expect(actions.unselect2Tags(selectedItem)).toEqual(expectedAction)
})
+
+ it('should create an action to go to previous page', () => {
+ let pagination = {
+ currentPage: '2017-01-01',
+ periode_range: [],
+ stateChanged: false
+ }
+ const expectedAction = {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage: false
+ }
+ expect(actions.goToPreviousPage(dispatch, pagination)).toEqual(expectedAction)
+ })
+
+ it('should create an action to go to next page', () => {
+ let pagination = {
+ currentPage: '2017-01-01',
+ periode_range: [],
+ stateChanged: false
+ }
+ const expectedAction = {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage: true
+ }
+ expect(actions.goToNextPage(dispatch, pagination)).toEqual(expectedAction)
+ })
+
+ it('should create an action to change page', () => {
+ let page = '2017-05-04'
+ const expectedAction = {
+ type: 'CHANGE_PAGE',
+ dispatch,
+ page: page
+ }
+ expect(actions.changePage(dispatch, page)).toEqual(expectedAction)
+ })
+
+ it('should create an action to delete period', () => {
+ let index = 1
+ const expectedAction = {
+ type: 'DELETE_PERIOD',
+ index,
+ dayTypes
+ }
+ expect(actions.deletePeriod(index, dayTypes)).toEqual(expectedAction)
+ })
+
+ it('should create an action to open add period form', () => {
+ const expectedAction = {
+ type: 'OPEN_ADD_PERIOD_FORM',
+ }
+ expect(actions.openAddPeriodForm()).toEqual(expectedAction)
+ })
+
+ it('should create an action to open edit period form', () => {
+ let period = {
+ id : 1,
+ period_end : "2017-03-05",
+ period_start : "2017-02-23"
+ }
+ let index = 1
+ const expectedAction = {
+ type: 'OPEN_EDIT_PERIOD_FORM',
+ period,
+ index
+ }
+ expect(actions.openEditPeriodForm(period, index)).toEqual(expectedAction)
+ })
+
+ it('should create an action to close period form', () => {
+ const expectedAction = {
+ type: 'CLOSE_PERIOD_FORM',
+ }
+ expect(actions.closePeriodForm()).toEqual(expectedAction)
+ })
+
+ it('should create an action to update period form', () => {
+ let val = "11"
+ let group = "start"
+ let selectType = "day"
+ const expectedAction = {
+ type: 'UPDATE_PERIOD_FORM',
+ val,
+ group,
+ selectType
+ }
+ expect(actions.updatePeriodForm(val, group, selectType)).toEqual(expectedAction)
+ })
+
+ it('should create an action to validate period form', () => {
+ let modalProps = {}
+ let timeTablePeriods = []
+ let metas = {}
+ const expectedAction = {
+ type: 'VALIDATE_PERIOD_FORM',
+ modalProps,
+ timeTablePeriods,
+ metas
+ }
+ expect(actions.validatePeriodForm(modalProps, timeTablePeriods, metas)).toEqual(expectedAction)
+ })
+
+ it('should create an action to include date in period', () => {
+ let index = 1
+ const expectedAction = {
+ type: 'INCLUDE_DATE_IN_PERIOD',
+ index,
+ dayTypes
+ }
+ expect(actions.includeDateInPeriod(index, dayTypes)).toEqual(expectedAction)
+ })
+
+ it('should create an action to exclude date from period', () => {
+ let index = 1
+ const expectedAction = {
+ type: 'EXCLUDE_DATE_FROM_PERIOD',
+ index,
+ dayTypes
+ }
+ expect(actions.excludeDateFromPeriod(index, dayTypes)).toEqual(expectedAction)
+ })
+
+ it('should create an action to open confirm modal', () => {
+ let callback = function(){}
+ const expectedAction = {
+ type: 'OPEN_CONFIRM_MODAL',
+ callback
+ }
+ expect(actions.openConfirmModal(callback)).toEqual(expectedAction)
+ })
+
+ it('should create an action to close modal', () => {
+ const expectedAction = {
+ type: 'CLOSE_MODAL',
+ }
+ expect(actions.closeModal()).toEqual(expectedAction)
+ })
+
})
diff --git a/spec/javascripts/time_table/reducers/metas_spec.js b/spec/javascripts/time_table/reducers/metas_spec.js
index adc6a9d05..61e3048db 100644
--- a/spec/javascripts/time_table/reducers/metas_spec.js
+++ b/spec/javascripts/time_table/reducers/metas_spec.js
@@ -2,7 +2,7 @@ var metasReducer = require('es6_browserified/time_tables/reducers/metas')
let state = {}
-describe('status reducer', () => {
+describe('metas reducer', () => {
beforeEach(() => {
let tag = {
id: 0,
diff --git a/spec/javascripts/time_table/reducers/modal_spec.js b/spec/javascripts/time_table/reducers/modal_spec.js
new file mode 100644
index 000000000..4246027b8
--- /dev/null
+++ b/spec/javascripts/time_table/reducers/modal_spec.js
@@ -0,0 +1,249 @@
+var modalReducer = require('es6_browserified/time_tables/reducers/modal')
+
+let state = {}
+
+describe('modal reducer', () => {
+ beforeEach(() => {
+ state = {
+ confirmModal: {},
+ modalProps: {
+ active: false,
+ begin: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ end: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ index: false,
+ error: ''
+ },
+ type: ""
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ modalReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle OPEN_CONFIRM_MODAL', () => {
+ let callback = function(){}
+ expect(
+ modalReducer(state, {
+ type: 'OPEN_CONFIRM_MODAL',
+ callback
+ })
+ ).toEqual(Object.assign({}, state, {type: "confirm", confirmModal: { callback: callback }}))
+ })
+
+ it('should handle CLOSE_PERIOD_FORM', () => {
+ let newModalProps = Object.assign({}, state.modalProps, {active: false})
+ expect(
+ modalReducer(state, {
+ type: 'CLOSE_PERIOD_FORM'
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle OPEN_EDIT_PERIOD_FORM', () => {
+ let period = {
+ id : 1,
+ period_end : "2017-03-05",
+ period_start : "2017-02-23"
+ }
+ let period_start = period.period_start.split('-')
+ let period_end = period.period_end.split('-')
+
+ let index = 1
+
+ let newModalProps = {
+ active: true,
+ begin: {
+ day: period_start[2],
+ month: period_start[1],
+ year: period_start[0]
+ },
+ end: {
+ day: period_end[2],
+ month: period_end[1],
+ year: period_end[0]
+ },
+ index: index,
+ error: ''
+ }
+ expect(
+ modalReducer(state, {
+ type: 'OPEN_EDIT_PERIOD_FORM',
+ period,
+ index
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle OPEN_ADD_PERIOD_FORM', () => {
+ let emptyDate = {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ }
+ let newModalProps = Object.assign({}, state.modalProps, {
+ active: true,
+ begin: emptyDate,
+ end: emptyDate,
+ index: false,
+ error: ""
+ })
+
+ expect(
+ modalReducer(state, {
+ type: 'OPEN_ADD_PERIOD_FORM'
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle UPDATE_PERIOD_FORM', () => {
+ let val = "11"
+ let group = "begin"
+ let selectType = "day"
+
+ let newModalProps = {
+ active: false,
+ begin: {
+ day: val,
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ end: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ index: false,
+ error: ''
+ }
+
+ expect(
+ modalReducer(state, {
+ type: 'UPDATE_PERIOD_FORM',
+ val,
+ group,
+ selectType
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle VALIDATE_PERIOD_FORM and throw error if period starts after the end', () => {
+ let modProps = {
+ active: false,
+ begin: {
+ day: '13',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ end: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ index: false,
+ error: ''
+ }
+ let newModalProps = {
+ active: false,
+ begin: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ end: {
+ day: '01',
+ month: '01',
+ year: String(new Date().getFullYear())
+ },
+ index: false,
+ error: 'La date de départ doit être antérieure à la date de fin'
+ }
+
+ let ttperiods = []
+
+ expect(
+ modalReducer(state, {
+ type: 'VALIDATE_PERIOD_FORM',
+ modalProps : modProps,
+ timeTablePeriods: ttperiods
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle VALIDATE_PERIOD_FORM and throw error if periods overlap', () => {
+ let state2 = {
+ confirmModal: {},
+ modalProps: {
+ active: false,
+ begin: {
+ day: '03',
+ month: '05',
+ year: '2017'
+ },
+ end: {
+ day: '09',
+ month: '05',
+ year: '2017'
+ },
+ index: false,
+ error: ''
+ },
+ type: ''
+ }
+ let modProps2 = {
+ active: false,
+ begin: {
+ day: '03',
+ month: '05',
+ year: '2017'
+ },
+ end: {
+ day: '09',
+ month: '05',
+ year: '2017'
+ },
+ index: false,
+ error: ''
+ }
+ let ttperiods2 = [
+ {id: 261, period_start: '2017-02-23', period_end: '2017-03-05'},
+ {id: 262, period_start: '2017-03-15', period_end: '2017-03-25'},
+ {id: 264, period_start: '2017-04-24', period_end: '2017-05-04'},
+ {id: 265, period_start: '2017-05-14', period_end: '2017-05-24'}
+ ]
+
+ let newModalProps2 = {
+ active: true,
+ begin: {
+ day: '03',
+ month: '05',
+ year: '2017'
+ },
+ end: {
+ day: '09',
+ month: '05',
+ year: '2017'
+ },
+ index: false,
+ error: "Les périodes ne peuvent pas se chevaucher"
+ }
+
+ expect(
+ modalReducer(state2, {
+ type: 'VALIDATE_PERIOD_FORM',
+ modalProps : modProps2,
+ timeTablePeriods: ttperiods2
+ })
+ ).toEqual(Object.assign({}, state2, {modalProps: newModalProps2}))
+ })
+})
diff --git a/spec/javascripts/time_table/reducers/pagination_spec.js b/spec/javascripts/time_table/reducers/pagination_spec.js
new file mode 100644
index 000000000..740ded3ac
--- /dev/null
+++ b/spec/javascripts/time_table/reducers/pagination_spec.js
@@ -0,0 +1,128 @@
+var paginationReducer = require('es6_browserified/time_tables/reducers/pagination')
+
+const dispatch = function(){}
+
+let pagination = {
+ currentPage: "1982-02-15",
+ periode_range: ["1982-02-01", "1982-02-02", "1982-02-03"],
+ stateChanged: false
+}
+
+let state = {}
+
+describe('pagination reducer', () => {
+ beforeEach(() => {
+ state = {
+ currentPage: "",
+ periode_range: [],
+ stateChanged: false
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ paginationReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle RECEIVE_TIME_TABLES', () => {
+ let json = [{
+ current_periode_range: "1982-02-15",
+ periode_range: ["1982-02-01", "1982-02-02", "1982-02-03"]
+ }]
+ expect(
+ paginationReducer(state, {
+ type: 'RECEIVE_TIME_TABLES',
+ json
+ })
+ ).toEqual(Object.assign({}, state, {currentPage: json.current_periode_range, periode_range: json.periode_range}))
+ })
+
+ it('should handle GO_TO_PREVIOUS_PAGE', () => {
+ let nextPage = nextPage ? 1 : -1
+ let newPage = pagination.periode_range[pagination.periode_range.indexOf(pagination.currentPage) + nextPage]
+
+ expect(
+ paginationReducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage: false
+ })
+ ).toEqual(Object.assign({}, state, {currentPage : newPage, stateChanged: false}))
+ })
+ it('should handle GO_TO_NEXT_PAGE', () => {
+ let nextPage = nextPage ? 1 : -1
+ let newPage = pagination.periode_range[pagination.periode_range.indexOf(pagination.currentPage) + nextPage]
+
+ expect(
+ paginationReducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage: false
+ })
+ ).toEqual(Object.assign({}, state, {currentPage : newPage, stateChanged: false}))
+ })
+
+ it('should handle CHANGE_PAGE', () => {
+ let page = "1982-02-15"
+ expect(
+ paginationReducer(state, {
+ type: 'CHANGE_PAGE',
+ dispatch,
+ page
+ })
+ ).toEqual(Object.assign({}, state, {currentPage : page, stateChanged: false}))
+ })
+
+ it('should handle INCLUDE_DATE_IN_PERIOD', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'INCLUDE_DATE_IN_PERIOD'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle EXCLUDE_DATE_FROM_PERIOD', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'EXCLUDE_DATE_FROM_PERIOD'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle DELETE_PERIOD', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'DELETE_PERIOD'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle VALIDATE_PERIOD_FORM', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'VALIDATE_PERIOD_FORM'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle UPDATE_COMMENT', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'UPDATE_COMMENT'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle UPDATE_COLOR', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'UPDATE_COLOR'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+ it('should handle UPDATE_DAY_TYPES', () => {
+ expect(
+ paginationReducer(state, {
+ type: 'UPDATE_DAY_TYPES'
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+})
diff --git a/spec/javascripts/time_table/reducers/status_spec.js b/spec/javascripts/time_table/reducers/status_spec.js
new file mode 100644
index 000000000..f000324cc
--- /dev/null
+++ b/spec/javascripts/time_table/reducers/status_spec.js
@@ -0,0 +1,50 @@
+var statusReducer = require('es6_browserified/time_tables/reducers/status')
+
+let state = {}
+
+describe('status reducer', () => {
+ beforeEach(() => {
+ state = {
+ actionType: "edit",
+ fetchSuccess: true,
+ isFetching: false
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ statusReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle UNAVAILABLE_SERVER', () => {
+ expect(
+ statusReducer(state, {
+ type: 'UNAVAILABLE_SERVER'
+ })
+ ).toEqual(Object.assign({}, state, {fetchSuccess: false}))
+ })
+
+ it('should handle FETCH_API', () => {
+ expect(
+ statusReducer(state, {
+ type: 'FETCH_API'
+ })
+ ).toEqual(Object.assign({}, state, {isFetching: true}))
+ })
+
+ it('should handle RECEIVE_TIME_TABLES', () => {
+ expect(
+ statusReducer(state, {
+ type: 'RECEIVE_TIME_TABLES'
+ })
+ ).toEqual(Object.assign({}, state, {fetchSuccess: true, isFetching: false}))
+ })
+ it('should handle RECEIVE_MONTH', () => {
+ expect(
+ statusReducer(state, {
+ type: 'RECEIVE_MONTH'
+ })
+ ).toEqual(Object.assign({}, state, {fetchSuccess: true, isFetching: false}))
+ })
+})
diff --git a/spec/javascripts/time_table/reducers/timetable_spec.js b/spec/javascripts/time_table/reducers/timetable_spec.js
new file mode 100644
index 000000000..0b418a52e
--- /dev/null
+++ b/spec/javascripts/time_table/reducers/timetable_spec.js
@@ -0,0 +1,184 @@
+require('whatwg-fetch')
+var timetableReducer = require('es6_browserified/time_tables/reducers/timetable')
+
+let state = {}
+const dispatch = function(){}
+let arrDayTypes = [true, true, true, true, true, true, true]
+let strDayTypes = 'LuMaMeJeVeSaDi'
+let time_table_periods = [{"id":261,"period_start":"2017-02-23","period_end":"2017-03-05"},{"id":262,"period_start":"2017-03-15","period_end":"2017-03-25"},{"id":263,"period_start":"2017-04-04","period_end":"2017-04-14"},{"id":264,"period_start":"2017-04-24","period_end":"2017-05-04"},{"id":265,"period_start":"2017-05-14","period_end":"2017-05-24"}]
+let current_periode_range = "2017-05-01"
+let periode_range = ["2014-05-01","2014-06-01","2014-07-01","2014-08-01","2014-09-01","2014-10-01","2014-11-01","2014-12-01","2015-01-01","2015-02-01","2015-03-01","2015-04-01","2015-05-01","2015-06-01","2015-07-01","2015-08-01","2015-09-01","2015-10-01","2015-11-01","2015-12-01","2016-01-01","2016-02-01","2016-03-01","2016-04-01","2016-05-01","2016-06-01","2016-07-01","2016-08-01","2016-09-01","2016-10-01","2016-11-01","2016-12-01","2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01","2017-07-01","2017-08-01","2017-09-01","2017-10-01","2017-11-01","2017-12-01","2018-01-01","2018-02-01","2018-03-01","2018-04-01","2018-05-01","2018-06-01","2018-07-01","2018-08-01","2018-09-01","2018-10-01","2018-11-01","2018-12-01","2019-01-01","2019-02-01","2019-03-01","2019-04-01","2019-05-01","2019-06-01","2019-07-01","2019-08-01","2019-09-01","2019-10-01","2019-11-01","2019-12-01","2020-01-01","2020-02-01","2020-03-01","2020-04-01","2020-05-01"]
+let current_month = [{"day":"lundi","date":"2017-05-01","wday":1,"wnumber":"18","mday":1,"include_date":false,"excluded_date":false},{"day":"mardi","date":"2017-05-02","wday":2,"wnumber":"18","mday":2,"include_date":false,"excluded_date":false},{"day":"mercredi","date":"2017-05-03","wday":3,"wnumber":"18","mday":3,"include_date":false,"excluded_date":false},{"day":"jeudi","date":"2017-05-04","wday":4,"wnumber":"18","mday":4,"include_date":false,"excluded_date":false},{"day":"vendredi","date":"2017-05-05","wday":5,"wnumber":"18","mday":5,"include_date":false,"excluded_date":false},{"day":"samedi","date":"2017-05-06","wday":6,"wnumber":"18","mday":6,"include_date":false,"excluded_date":false},{"day":"dimanche","date":"2017-05-07","wday":0,"wnumber":"18","mday":7,"include_date":false,"excluded_date":false},{"day":"lundi","date":"2017-05-08","wday":1,"wnumber":"19","mday":8,"include_date":false,"excluded_date":false},{"day":"mardi","date":"2017-05-09","wday":2,"wnumber":"19","mday":9,"include_date":false,"excluded_date":false},{"day":"mercredi","date":"2017-05-10","wday":3,"wnumber":"19","mday":10,"include_date":false,"excluded_date":false},{"day":"jeudi","date":"2017-05-11","wday":4,"wnumber":"19","mday":11,"include_date":false,"excluded_date":false},{"day":"vendredi","date":"2017-05-12","wday":5,"wnumber":"19","mday":12,"include_date":false,"excluded_date":false},{"day":"samedi","date":"2017-05-13","wday":6,"wnumber":"19","mday":13,"include_date":false,"excluded_date":false},{"day":"dimanche","date":"2017-05-14","wday":0,"wnumber":"19","mday":14,"include_date":false,"excluded_date":false},{"day":"lundi","date":"2017-05-15","wday":1,"wnumber":"20","mday":15,"include_date":false,"excluded_date":false},{"day":"mardi","date":"2017-05-16","wday":2,"wnumber":"20","mday":16,"include_date":false,"excluded_date":false},{"day":"mercredi","date":"2017-05-17","wday":3,"wnumber":"20","mday":17,"include_date":false,"excluded_date":false},{"day":"jeudi","date":"2017-05-18","wday":4,"wnumber":"20","mday":18,"include_date":false,"excluded_date":false},{"day":"vendredi","date":"2017-05-19","wday":5,"wnumber":"20","mday":19,"include_date":false,"excluded_date":false},{"day":"samedi","date":"2017-05-20","wday":6,"wnumber":"20","mday":20,"include_date":false,"excluded_date":false},{"day":"dimanche","date":"2017-05-21","wday":0,"wnumber":"20","mday":21,"include_date":false,"excluded_date":false},{"day":"lundi","date":"2017-05-22","wday":1,"wnumber":"21","mday":22,"include_date":false,"excluded_date":false},{"day":"mardi","date":"2017-05-23","wday":2,"wnumber":"21","mday":23,"include_date":false,"excluded_date":false},{"day":"mercredi","date":"2017-05-24","wday":3,"wnumber":"21","mday":24,"include_date":false,"excluded_date":false},{"day":"jeudi","date":"2017-05-25","wday":4,"wnumber":"21","mday":25,"include_date":false,"excluded_date":false},{"day":"vendredi","date":"2017-05-26","wday":5,"wnumber":"21","mday":26,"include_date":false,"excluded_date":false},{"day":"samedi","date":"2017-05-27","wday":6,"wnumber":"21","mday":27,"include_date":false,"excluded_date":false},{"day":"dimanche","date":"2017-05-28","wday":0,"wnumber":"21","mday":28,"include_date":false,"excluded_date":false},{"day":"lundi","date":"2017-05-29","wday":1,"wnumber":"22","mday":29,"include_date":false,"excluded_date":false},{"day":"mardi","date":"2017-05-30","wday":2,"wnumber":"22","mday":30,"include_date":false,"excluded_date":false},{"day":"mercredi","date":"2017-05-31","wday":3,"wnumber":"22","mday":31,"include_date":false,"excluded_date":false}]
+
+let newCurrentMonth = [{"day":"lundi","date":"2017-05-01","wday":1,"wnumber":"18","mday":1,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mardi","date":"2017-05-02","wday":2,"wnumber":"18","mday":2,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mercredi","date":"2017-05-03","wday":3,"wnumber":"18","mday":3,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"jeudi","date":"2017-05-04","wday":4,"wnumber":"18","mday":4,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"vendredi","date":"2017-05-05","wday":5,"wnumber":"18","mday":5,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"samedi","date":"2017-05-06","wday":6,"wnumber":"18","mday":6,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"dimanche","date":"2017-05-07","wday":0,"wnumber":"18","mday":7,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"lundi","date":"2017-05-08","wday":1,"wnumber":"19","mday":8,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"mardi","date":"2017-05-09","wday":2,"wnumber":"19","mday":9,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"mercredi","date":"2017-05-10","wday":3,"wnumber":"19","mday":10,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"jeudi","date":"2017-05-11","wday":4,"wnumber":"19","mday":11,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"vendredi","date":"2017-05-12","wday":5,"wnumber":"19","mday":12,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"samedi","date":"2017-05-13","wday":6,"wnumber":"19","mday":13,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"dimanche","date":"2017-05-14","wday":0,"wnumber":"19","mday":14,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"lundi","date":"2017-05-15","wday":1,"wnumber":"20","mday":15,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mardi","date":"2017-05-16","wday":2,"wnumber":"20","mday":16,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mercredi","date":"2017-05-17","wday":3,"wnumber":"20","mday":17,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"jeudi","date":"2017-05-18","wday":4,"wnumber":"20","mday":18,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"vendredi","date":"2017-05-19","wday":5,"wnumber":"20","mday":19,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"samedi","date":"2017-05-20","wday":6,"wnumber":"20","mday":20,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"dimanche","date":"2017-05-21","wday":0,"wnumber":"20","mday":21,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"lundi","date":"2017-05-22","wday":1,"wnumber":"21","mday":22,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mardi","date":"2017-05-23","wday":2,"wnumber":"21","mday":23,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"mercredi","date":"2017-05-24","wday":3,"wnumber":"21","mday":24,"include_date":false,"excluded_date":false,"in_periods":true},{"day":"jeudi","date":"2017-05-25","wday":4,"wnumber":"21","mday":25,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"vendredi","date":"2017-05-26","wday":5,"wnumber":"21","mday":26,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"samedi","date":"2017-05-27","wday":6,"wnumber":"21","mday":27,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"dimanche","date":"2017-05-28","wday":0,"wnumber":"21","mday":28,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"lundi","date":"2017-05-29","wday":1,"wnumber":"22","mday":29,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"mardi","date":"2017-05-30","wday":2,"wnumber":"22","mday":30,"include_date":false,"excluded_date":false,"in_periods":false},{"day":"mercredi","date":"2017-05-31","wday":3,"wnumber":"22","mday":31,"include_date":false,"excluded_date":false,"in_periods":false}]
+
+let json = {
+ current_month: current_month,
+ current_periode_range: current_periode_range,
+ periode_range: periode_range,
+ time_table_periods: time_table_periods,
+ day_types: strDayTypes
+}
+
+describe('timetable reducer with empty state', () => {
+ beforeEach(() => {
+ state = {
+ current_month: [],
+ current_periode_range: "",
+ periode_range: [],
+ time_table_periods: []
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ timetableReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle RECEIVE_TIME_TABLES', () => {
+ let newState = {
+ current_month: newCurrentMonth,
+ current_periode_range: current_periode_range,
+ periode_range: periode_range,
+ time_table_periods: time_table_periods,
+ }
+ expect(
+ timetableReducer(state, {
+ type: 'RECEIVE_TIME_TABLES',
+ json
+ })
+ ).toEqual(newState)
+ })
+})
+
+describe('timetable reducer with filled state', () => {
+ beforeEach(() => {
+ state = {
+ current_month: newCurrentMonth,
+ current_periode_range: current_periode_range,
+ periode_range: periode_range,
+ time_table_periods: time_table_periods,
+ }
+ })
+
+ it('should handle RECEIVE_MONTH', () => {
+ expect(
+ timetableReducer(state, {
+ type: 'RECEIVE_MONTH',
+ json: {
+ days: current_month,
+ day_types: strDayTypes
+ }
+ })
+ ).toEqual(state)
+ })
+
+
+ it('should handle GO_TO_PREVIOUS_PAGE', () => {
+ let pagination = {
+ periode_range: periode_range,
+ currentPage: current_periode_range
+ }
+ expect(
+ timetableReducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage: false
+ })
+ ).toEqual(Object.assign({}, state, {current_periode_range: '2017-04-01'}))
+ })
+
+ it('should handle GO_TO_NEXT_PAGE', () => {
+ let pagination = {
+ periode_range: periode_range,
+ currentPage: current_periode_range
+ }
+ expect(
+ timetableReducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage: true
+ })
+ ).toEqual(Object.assign({}, state, {current_periode_range: '2017-06-01'}))
+ })
+
+ it('should handle CHANGE_PAGE', () => {
+ const actions = {
+ fetchTimeTables: function(){}
+ }
+ let newPage = '2017-05-01'
+ expect(
+ timetableReducer(state, {
+ type: 'CHANGE_PAGE',
+ dispatch,
+ page: newPage
+ })
+ ).toEqual(Object.assign({}, state, {current_periode_range: newPage}))
+ })
+
+ it('should handle DELETE_PERIOD', () => {
+ state.time_table_periods[0].deleted = true
+ expect(
+ timetableReducer(state, {
+ type: 'DELETE_PERIOD',
+ index: 0,
+ dayTypes: arrDayTypes
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle INCLUDE_DATE_IN_PERIOD', () => {
+ state.current_month[4].include_date = true
+ expect(
+ timetableReducer(state, {
+ type: 'INCLUDE_DATE_IN_PERIOD',
+ index: 4,
+ dayTypes: arrDayTypes
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle EXCLUDE_DATE_FROM_PERIOD', () => {
+ state.current_month[0].excluded_date = true
+ expect(
+ timetableReducer(state, {
+ type: 'EXCLUDE_DATE_FROM_PERIOD',
+ index: 0,
+ dayTypes: arrDayTypes
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle VALIDATE_PERIOD_FORM', () => {
+ state.current_month[13].in_periods = false
+ state.time_table_periods[4].period_start = '2017-05-15'
+ let modalProps = {
+ active: false,
+ begin: {
+ day: '15',
+ month: '05',
+ year: '2017'
+ },
+ end: {
+ day: '24',
+ month: '05',
+ year: '2017'
+ },
+ error: '',
+ index: 4
+ }
+ expect(
+ timetableReducer(state, {
+ type: 'VALIDATE_PERIOD_FORM',
+ modalProps: modalProps,
+ timeTablePeriods: state.time_table_periods,
+ metas: {
+ day_types: arrDayTypes
+ }
+ })
+ ).toEqual(state)
+ })
+})
diff --git a/spec/models/chouette/route/route_base_spec.rb b/spec/models/chouette/route/route_base_spec.rb
new file mode 100644
index 000000000..08f201022
--- /dev/null
+++ b/spec/models/chouette/route/route_base_spec.rb
@@ -0,0 +1,69 @@
+RSpec.describe Chouette::Route, :type => :model do
+
+ subject { create(:route) }
+
+ describe '#objectid' do
+ subject { super().objectid }
+ it { is_expected.to be_kind_of(Chouette::ObjectId) }
+ end
+
+ it { is_expected.to enumerize(:direction).in(:straight_forward, :backward, :clockwise, :counter_clockwise, :north, :north_west, :west, :south_west, :south, :south_east, :east, :north_east) }
+ it { is_expected.to enumerize(:wayback).in(:straight_forward, :backward) }
+
+ #it { is_expected.to validate_presence_of :name }
+ it { is_expected.to validate_presence_of :line }
+ it { is_expected.to validate_uniqueness_of :objectid }
+ #it { is_expected.to validate_presence_of :wayback_code }
+ #it { is_expected.to validate_presence_of :direction_code }
+ it { is_expected.to validate_inclusion_of(:direction).in_array(%i(straight_forward backward clockwise counter_clockwise north north_west west south_west south south_east east north_east)) }
+ it { is_expected.to validate_inclusion_of(:wayback).in_array(%i(straight_forward backward)) }
+
+ context "reordering methods" do
+ let(:bad_stop_point_ids){subject.stop_points.map { |sp| sp.id + 1}}
+ let(:ident){subject.stop_points.map(&:id)}
+ let(:first_last_swap){ [ident.last] + ident[1..-2] + [ident.first]}
+
+ describe "#reorder!" do
+ context "invalid stop_point_ids" do
+ let(:new_stop_point_ids) { bad_stop_point_ids}
+ it { expect(subject.reorder!( new_stop_point_ids)).to be_falsey}
+ end
+
+ context "swaped last and first stop_point_ids" do
+ let!(:new_stop_point_ids) { first_last_swap}
+ let!(:old_stop_point_ids) { subject.stop_points.map(&:id) }
+ let!(:old_stop_area_ids) { subject.stop_areas.map(&:id) }
+
+ it "should keep stop_point_ids order unchanged" do
+ expect(subject.reorder!( new_stop_point_ids)).to be_truthy
+ expect(subject.stop_points.map(&:id)).to eq( old_stop_point_ids)
+ end
+ # This test is no longer relevant, as reordering is done with Reactux
+ # it "should have changed stop_area_ids order" do
+ # expect(subject.reorder!( new_stop_point_ids)).to be_truthy
+ # subject.reload
+ # expect(subject.stop_areas.map(&:id)).to eq( [old_stop_area_ids.last] + old_stop_area_ids[1..-2] + [old_stop_area_ids.first])
+ # end
+ end
+ end
+
+ describe "#stop_point_permutation?" do
+ context "invalid stop_point_ids" do
+ let( :new_stop_point_ids ) { bad_stop_point_ids}
+ it { is_expected.not_to be_stop_point_permutation( new_stop_point_ids)}
+ end
+ context "unchanged stop_point_ids" do
+ let(:new_stop_point_ids) { ident}
+ it { is_expected.to be_stop_point_permutation( new_stop_point_ids)}
+ end
+ context "swaped last and first stop_point_ids" do
+ let(:new_stop_point_ids) { first_last_swap}
+ it { is_expected.to be_stop_point_permutation( new_stop_point_ids)}
+ end
+ end
+ end
+
+end
+
+
+
diff --git a/spec/models/chouette/route/route_destroy_spec.rb b/spec/models/chouette/route/route_destroy_spec.rb
new file mode 100644
index 000000000..930ce521a
--- /dev/null
+++ b/spec/models/chouette/route/route_destroy_spec.rb
@@ -0,0 +1,45 @@
+RSpec.describe Chouette::Route, :type => :model do
+
+ subject { create( :route_with_journey_patterns ) }
+
+
+ context "delete a route" do
+ let( :vehicle_journey ){ create :vehicle_journey }
+
+ it "deletes the associated journey_patterns" do
+ expected_delta = subject.journey_patterns.count
+ expect( expected_delta > 0 ).to eq(true)
+ expect{ subject.destroy }.to change{Chouette::JourneyPattern.count}.by -expected_delta
+ end
+
+ it "deletes the associated stop_points" do
+ expected_delta = subject.stop_points.count
+ expect( expected_delta > 0 ).to eq(true)
+ expect{ subject.destroy }.to change{Chouette::StopPoint.count}.by -expected_delta
+ end
+
+ it "does not delete the associated stop_areas" do
+ count = subject.stop_points.count
+ expect( count > 0 ).to eq(true)
+ expect{ subject.destroy }.not_to change{Chouette::StopArea.count}
+ end
+
+ it "deletes the associated vehicle_journeys" do
+ vehicle_journey
+ expect{ vehicle_journey.route.destroy}.to change{Chouette::VehicleJourney.count}.by -1
+ end
+
+ it "does not delete the corresponding time_tables" do
+ tt = create :time_table
+ tt.vehicle_journeys << vehicle_journey
+ tables = vehicle_journey.route.time_tables
+ expect( tables ).not_to be_empty
+ expect{ vehicle_journey.route.destroy }.not_to change{Chouette::TimeTable.count}
+ end
+
+ it "does not delete the associated line" do
+ expect( subject.line ).not_to be_nil
+ expect{ subject.destroy }.not_to change{Chouette::Line.count}
+ end
+ end
+end
diff --git a/spec/models/chouette/route_spec.rb b/spec/models/chouette/route/route_stop_points_spec.rb
index 6138f28b9..03c53b4cf 100644
--- a/spec/models/chouette/route_spec.rb
+++ b/spec/models/chouette/route/route_stop_points_spec.rb
@@ -1,72 +1,10 @@
-require 'spec_helper'
+RSpec.describe Chouette::Route, :type => :model do
-describe Chouette::Route, :type => :model do
subject { create(:route) }
- describe '#objectid' do
- subject { super().objectid }
- it { is_expected.to be_kind_of(Chouette::ObjectId) }
- end
-
- it { is_expected.to enumerize(:direction).in(:straight_forward, :backward, :clockwise, :counter_clockwise, :north, :north_west, :west, :south_west, :south, :south_east, :east, :north_east) }
- it { is_expected.to enumerize(:wayback).in(:straight_forward, :backward) }
-
- #it { is_expected.to validate_presence_of :name }
- it { is_expected.to validate_presence_of :line }
- it { is_expected.to validate_uniqueness_of :objectid }
- #it { is_expected.to validate_presence_of :wayback_code }
- #it { is_expected.to validate_presence_of :direction_code }
- it { is_expected.to validate_inclusion_of(:direction).in_array(%i(straight_forward backward clockwise counter_clockwise north north_west west south_west south south_east east north_east)) }
- it { is_expected.to validate_inclusion_of(:wayback).in_array(%i(straight_forward backward)) }
-
- context "reordering methods" do
- let( :bad_stop_point_ids){subject.stop_points.map { |sp| sp.id + 1}}
- let( :ident){subject.stop_points.map(&:id)}
- let( :first_last_swap){ [ident.last] + ident[1..-2] + [ident.first]}
-
- describe "#reorder!" do
- context "invalid stop_point_ids" do
- let( :new_stop_point_ids) { bad_stop_point_ids}
- it { expect(subject.reorder!( new_stop_point_ids)).to be_falsey}
- end
-
- context "swaped last and first stop_point_ids" do
- let!( :new_stop_point_ids) { first_last_swap}
- let!( :old_stop_point_ids) { subject.stop_points.map(&:id) }
- let!( :old_stop_area_ids) { subject.stop_areas.map(&:id) }
-
- it "should keep stop_point_ids order unchanged" do
- expect(subject.reorder!( new_stop_point_ids)).to be_truthy
- expect(subject.stop_points.map(&:id)).to eq( old_stop_point_ids)
- end
- # This test is no longer relevant, as reordering is done with Reactux
- # it "should have changed stop_area_ids order" do
- # expect(subject.reorder!( new_stop_point_ids)).to be_truthy
- # subject.reload
- # expect(subject.stop_areas.map(&:id)).to eq( [old_stop_area_ids.last] + old_stop_area_ids[1..-2] + [old_stop_area_ids.first])
- # end
- end
- end
-
- describe "#stop_point_permutation?" do
- context "invalid stop_point_ids" do
- let( :new_stop_point_ids) { bad_stop_point_ids}
- it { is_expected.not_to be_stop_point_permutation( new_stop_point_ids)}
- end
- context "unchanged stop_point_ids" do
- let( :new_stop_point_ids) { ident}
- it { is_expected.to be_stop_point_permutation( new_stop_point_ids)}
- end
- context "swaped last and first stop_point_ids" do
- let( :new_stop_point_ids) { first_last_swap}
- it { is_expected.to be_stop_point_permutation( new_stop_point_ids)}
- end
- end
- end
-
describe "#stop_points_attributes=" do
- let( :journey_pattern) { create( :journey_pattern, :route => subject )}
- let( :vehicle_journey) { create( :vehicle_journey, :journey_pattern => journey_pattern)}
+ let(:journey_pattern) { create( :journey_pattern, :route => subject )}
+ let(:vehicle_journey) { create( :vehicle_journey, :journey_pattern => journey_pattern)}
def subject_stop_points_attributes
{}.tap do |hash|
subject.stop_points.each_with_index { |sp,index| hash[ index.to_s ] = sp.attributes }
@@ -171,3 +109,4 @@ describe Chouette::Route, :type => :model do
end
end
end
+
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index 3d3a948bc..b22183ab6 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -221,6 +221,95 @@ describe Chouette::VehicleJourney, :type => :model do
end
end
+ describe ".with_stops" do
+ def initialize_stop_times(vehicle_journey, &block)
+ vehicle_journey
+ .vehicle_journey_at_stops
+ .each_with_index do |at_stop, index|
+ at_stop.update(
+ departure_time: at_stop.departure_time + block.call(index),
+ arrival_time: at_stop.arrival_time + block.call(index)
+ )
+ end
+ end
+
+ it "selects vehicle journeys including stops in order or earliest departure time" do
+ # Create later vehicle journey to give it a later id, such that it should
+ # appear last if the order in the query isn't right.
+ journey_late = create(:vehicle_journey)
+ journey_early = create(
+ :vehicle_journey,
+ route: journey_late.route,
+ journey_pattern: journey_late.journey_pattern
+ )
+
+ initialize_stop_times(journey_early) do |index|
+ (index + 5).minutes
+ end
+ initialize_stop_times(journey_late) do |index|
+ (index + 65).minutes
+ end
+
+ expected_journey_order = [journey_early, journey_late]
+
+ expect(
+ journey_late
+ .route
+ .vehicle_journeys
+ .with_stops
+ .to_a
+ ).to eq(expected_journey_order)
+ end
+
+ it "orders journeys with nil times at the end" do
+ journey_nil = create(:vehicle_journey_empty)
+ journey = create(
+ :vehicle_journey,
+ route: journey_nil.route,
+ journey_pattern: journey_nil.journey_pattern
+ )
+
+ expected_journey_order = [journey, journey_nil]
+
+ expect(
+ journey
+ .route
+ .vehicle_journeys
+ .with_stops
+ .to_a
+ ).to eq(expected_journey_order)
+ end
+
+ it "journeys that skip the first stop(s) get ordered by the time of the \
+ first stop that they make" do
+ journey_missing_stop = create(:vehicle_journey)
+ journey_early = create(
+ :vehicle_journey,
+ route: journey_missing_stop.route,
+ journey_pattern: journey_missing_stop.journey_pattern
+ )
+
+ initialize_stop_times(journey_early) do |index|
+ (index + 5).minutes
+ end
+ initialize_stop_times(journey_missing_stop) do |index|
+ (index + 65).minutes
+ end
+
+ journey_missing_stop.vehicle_journey_at_stops.first.destroy
+
+ expected_journey_order = [journey_early, journey_missing_stop]
+
+ expect(
+ journey_missing_stop
+ .route
+ .vehicle_journeys
+ .with_stops
+ .to_a
+ ).to eq(expected_journey_order)
+ end
+ end
+
subject { create(:vehicle_journey_odd) }
describe "in_relation_to_a_journey_pattern methods" do
let!(:route) { create(:route)}
diff --git a/spec/models/time_table_combination_spec.rb b/spec/models/time_table_combination_spec.rb
index 46d5f8504..4c99a14fa 100644
--- a/spec/models/time_table_combination_spec.rb
+++ b/spec/models/time_table_combination_spec.rb
@@ -4,7 +4,37 @@ describe TimeTableCombination, :type => :model do
let!(:source){ create(:time_table)}
let!(:combined){create(:time_table)}
subject {build(:time_table_combination)}
-
+
+ describe '#continuous_dates' do
+ it 'should group continuous dates' do
+ dates = source.dates.where(in_out: true)
+ expect(source.continuous_dates[0].count).to eq(dates.count)
+
+ # 6 more continuous date, 1 isolated date
+ (10..15).each do |n|
+ source.dates.create(date: Date.today + n.day, in_out: true)
+ end
+ source.dates.create(date: Date.today + 1.year, in_out: true)
+ expect(source.reload.continuous_dates[1].count).to eq(6)
+ expect(source.reload.continuous_dates[2].count).to eq(1)
+ end
+ end
+
+ describe '#convert_continuous_dates_to_periods' do
+ it 'should convert continuous dates to periods' do
+ (10..12).each do |n|
+ source.dates.create(date: Date.today + n.day, in_out: true)
+ end
+ source.dates.create(date: Date.today + 1.year, in_out: true)
+
+ expect {
+ source.reload.convert_continuous_dates_to_periods
+ }.to change {source.periods.count}.by(2)
+
+ expect(source.reload.dates.where(in_out: true).count).to eq(1)
+ end
+ end
+
describe "#combine" do
context "when operation is union" do
before(:each) do