aboutsummaryrefslogtreecommitdiffstats
path: root/spec/javascripts
diff options
context:
space:
mode:
authorLuc Donnet2017-03-22 13:33:07 +0100
committerLuc Donnet2017-03-22 13:33:07 +0100
commit78e0ef962354b9cd3e6dfb51a2ccf8ed6fe5afaf (patch)
treed194a26f6ea698a32b7f45b58abc59b10e0ae83c /spec/javascripts
parent56e6b5146aca41563b8e64ce95a7cd183fe80b13 (diff)
parentcfc35aca0f1383069e1f2cc5ed1026d085a1fc1d (diff)
downloadchouette-core-78e0ef962354b9cd3e6dfb51a2ccf8ed6fe5afaf.tar.bz2
Merge branch 'staging' of github.com:AF83/stif-boiv into staging
Diffstat (limited to 'spec/javascripts')
-rw-r--r--spec/javascripts/itineraries/actions_spec.js101
-rw-r--r--spec/javascripts/itineraries/reducers/stop_points_spec.js467
-rw-r--r--spec/javascripts/journey_patterns/actions_spec.js154
-rw-r--r--spec/javascripts/journey_patterns/reducers/journey_patterns_spec.js124
-rw-r--r--spec/javascripts/journey_patterns/reducers/modal_spec.js98
-rw-r--r--spec/javascripts/journey_patterns/reducers/pagination_spec.js93
-rw-r--r--spec/javascripts/journey_patterns/reducers/status_spec.js51
-rw-r--r--spec/javascripts/spec_helper.js35
-rw-r--r--spec/javascripts/vehicle_journeys/actions_spec.js430
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/filters_spec.js154
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/modal_spec.js170
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/pagination_spec.js123
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/status_spec.js45
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js266
14 files changed, 2311 insertions, 0 deletions
diff --git a/spec/javascripts/itineraries/actions_spec.js b/spec/javascripts/itineraries/actions_spec.js
new file mode 100644
index 000000000..2bae59987
--- /dev/null
+++ b/spec/javascripts/itineraries/actions_spec.js
@@ -0,0 +1,101 @@
+var actions = require('es6_browserified/itineraries/actions')
+
+describe('actions', () => {
+ it('should create an action to add a stop', () => {
+ const expectedAction = {
+ type: 'ADD_STOP',
+ }
+ expect(actions.addStop()).toEqual(expectedAction)
+ })
+})
+describe('actions', () => {
+ it('should create an action to move up a stop', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'MOVE_STOP_UP',
+ index
+ }
+ expect(actions.moveStopUp(index)).toEqual(expectedAction)
+ })
+})
+describe('actions', () => {
+ it('should create an action to move down a stop', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'MOVE_STOP_DOWN',
+ index
+ }
+ expect(actions.moveStopDown(index)).toEqual(expectedAction)
+ })
+})
+describe('actions', () => {
+ it('should create an action to delete a stop', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'DELETE_STOP',
+ index
+ }
+ expect(actions.deleteStop(index)).toEqual(expectedAction)
+ })
+})
+describe('actions', () => {
+ it('should create an action to update the value of a stop', () => {
+ const text = 'updated text'
+ const index = 1
+ const expectedAction = {
+ type: 'UPDATE_INPUT_VALUE',
+ index,
+ text
+ }
+ expect(actions.updateInputValue(index, text)).toEqual(expectedAction)
+ })
+})
+
+describe('actions', () => {
+ it('should create an action to update the up select of a stop', () => {
+ const event = {
+ currentTarget: {
+ value: 'forbidden',
+ id: 'up'
+ }
+ }
+ const index = 1
+ const expectedAction = {
+ type :'UPDATE_SELECT_VALUE',
+ select_id: 'up',
+ select_value: 'forbidden',
+ index
+ }
+ expect(actions.updateSelectValue(event, index)).toEqual(expectedAction)
+ })
+})
+
+describe('actions', () => {
+ it('should create an action to toggle the map', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'TOGGLE_MAP',
+ index
+ }
+ expect(actions.toggleMap(index)).toEqual(expectedAction)
+ })
+})
+
+describe('actions', () => {
+ it('should create an action to select a marker on the map', () => {
+ const index = 1
+ const data = {
+ geometry: undefined,
+ registration_number: 'rn_test',
+ stoparea_id: 'sid_test',
+ text: 't_test',
+ user_objectid: 'uoid_test'
+ }
+ const expectedAction = {
+ type: 'SELECT_MARKER',
+ index,
+ data
+ }
+ expect(actions.selectMarker(index, data)).toEqual(expectedAction)
+ })
+})
diff --git a/spec/javascripts/itineraries/reducers/stop_points_spec.js b/spec/javascripts/itineraries/reducers/stop_points_spec.js
new file mode 100644
index 000000000..6065fa4ed
--- /dev/null
+++ b/spec/javascripts/itineraries/reducers/stop_points_spec.js
@@ -0,0 +1,467 @@
+var stopPointsReducer = require('es6_browserified/itineraries/reducers/stopPoints')
+
+let state = []
+
+let fakeData = {
+ geometry: undefined,
+ registration_number: 'rn_test',
+ stoparea_id: 'sid_test',
+ text: 't_test',
+ user_objectid: 'uoid_test'
+}
+
+describe('stops reducer', () => {
+ beforeEach(()=>{
+ state = [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ stopPointsReducer(undefined, {})
+ ).toEqual([])
+ })
+
+ it('should handle ADD_STOP', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'ADD_STOP'
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: '',
+ index: 2,
+ edit: true,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle MOVE_UP_STOP', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'MOVE_STOP_UP',
+ index: 1
+ })
+ ).toEqual(
+ [
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle MOVE_DOWN_STOP', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'MOVE_STOP_DOWN',
+ index: 0
+ })
+ ).toEqual(
+ [
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle DELETE_STOP', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'DELETE_STOP',
+ index: 1
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle UPDATE_INPUT_VALUE', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'UPDATE_INPUT_VALUE',
+ index: 0,
+ edit: false,
+ text: {
+ text: "new value",
+ name: 'new',
+ stoparea_id: 1,
+ user_objectid: "1234",
+ longitude: 123,
+ latitude: 123,
+ registration_number: '0',
+ city_name: 'city',
+ area_type: 'area',
+ short_name: 'new'
+ }
+ })
+ ).toEqual(
+ [
+ {
+ text: 'new value',
+ name: 'new',
+ index: 0,
+ edit: false,
+ stoppoint_id: '',
+ stoparea_id: 1,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ user_objectid: "1234",
+ longitude: 123,
+ latitude: 123,
+ registration_number: '0',
+ city_name: 'city',
+ area_type: 'area',
+ short_name: 'new',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle UPDATE_SELECT_VALUE', () => {
+ expect(
+ stopPointsReducer(state, {
+ type :'UPDATE_SELECT_VALUE',
+ select_id: 'for_boarding',
+ select_value: 'prohibited',
+ index: 0
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'prohibited',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle TOGGLE_MAP', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'TOGGLE_MAP',
+ index: 0
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: true,
+ json: {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: undefined
+ }
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle TOGGLE_EDIT', () => {
+ expect(
+ stopPointsReducer(state, {
+ type: 'TOGGLE_EDIT',
+ index: 0
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: true,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle SELECT_MARKER', () => {
+ let openedMapState = [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: true,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ expect(
+ stopPointsReducer(openedMapState, {
+ type: 'SELECT_MARKER',
+ index: 0,
+ data: fakeData
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: true,
+ json: fakeData
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+
+ it('should handle UNSELECT_MARKER', () => {
+ let openedMapState = [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: true,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+
+ expect(
+ stopPointsReducer(openedMapState, {
+ type: 'UNSELECT_MARKER',
+ index: 0
+ })
+ ).toEqual(
+ [
+ {
+ text: 'first',
+ index: 0,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: true,
+ json: {}
+ }
+ },
+ {
+ text: 'second',
+ index: 1,
+ edit: false,
+ for_boarding: 'normal',
+ for_alighting: 'normal',
+ olMap: {
+ isOpened: false,
+ json: {}
+ }
+ }
+ ]
+ )
+ })
+})
diff --git a/spec/javascripts/journey_patterns/actions_spec.js b/spec/javascripts/journey_patterns/actions_spec.js
new file mode 100644
index 000000000..07f83ca1b
--- /dev/null
+++ b/spec/javascripts/journey_patterns/actions_spec.js
@@ -0,0 +1,154 @@
+var actions = require('es6_browserified/journey_patterns/actions')
+
+const dispatch = function(){}
+const currentPage = 1
+
+describe('when receiveJourneyPatterns is triggered', () => {
+ it('should create an action to pass json to reducer', () => {
+ const json = undefined
+ const expectedAction = {
+ type: 'RECEIVE_JOURNEY_PATTERNS',
+ json
+ }
+ expect(actions.receiveJourneyPatterns()).toEqual(expectedAction)
+ })
+})
+
+describe('when previous navigation button is clicked', () => {
+ it('should create an action to go to previous page', () => {
+ const nextPage = false
+ const pagination = {
+ totalCount: 25,
+ perPage: 12,
+ page:1
+ }
+ const expectedAction = {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage
+ }
+ expect(actions.goToPreviousPage(dispatch, pagination)).toEqual(expectedAction)
+ })
+})
+describe('when next navigation button is clicked', () => {
+ it('should create an action to go to next page', () => {
+ const nextPage = true
+ const pagination = {
+ totalCount: 25,
+ perPage: 12,
+ page:1
+ }
+ const expectedAction = {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage
+ }
+ expect(actions.goToNextPage(dispatch, pagination)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on a journey pattern checkbox', () => {
+ it('should create an action to update journey pattern stop points', () => {
+ const event = {
+ currentTarget: {
+ id: '1'
+ }
+ }
+ const index = 1
+ const expectedAction = {
+ type: 'UPDATE_CHECKBOX_VALUE',
+ id: event.currentTarget.id,
+ index,
+ }
+ expect(actions.updateCheckboxValue(event, index)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on next button', () => {
+ it('should create an action to open a confirm modal', () => {
+ const callback = function(){}
+ const expectedAction = {
+ type: 'OPEN_CONFIRM_MODAL',
+ callback
+ }
+ expect(actions.openConfirmModal(callback)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on edit button', () => {
+ it('should create an action to open a edit modal', () => {
+ const index = 1
+ const journeyPattern = {}
+ const expectedAction = {
+ type: 'EDIT_JOURNEYPATTERN_MODAL',
+ index,
+ journeyPattern,
+ }
+ expect(actions.openEditModal(index, journeyPattern)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on add button', () => {
+ it('should create an action to open a create modal', () => {
+ const expectedAction = {
+ type: 'CREATE_JOURNEYPATTERN_MODAL',
+ }
+ expect(actions.openCreateModal()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on close button inside edit or add modal', () => {
+ it('should create an action to close modal', () => {
+ const expectedAction = {
+ type: 'CLOSE_MODAL',
+ }
+ expect(actions.closeModal()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on a journey pattern delete button', () => {
+ it('should create an action to delete journey pattern', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'DELETE_JOURNEYPATTERN',
+ index
+ }
+ expect(actions.deleteJourneyPattern(index)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside edit modal', () => {
+ it('should create an action to save journey pattern modifications', () => {
+ const index = 1
+ const data = {}
+ const expectedAction = {
+ type: 'SAVE_MODAL',
+ index,
+ data
+ }
+ expect(actions.saveModal(index, data)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside create modal', () => {
+ it('should create an action to create a new journey pattern', () => {
+ const data = {}
+ const expectedAction = {
+ type: 'ADD_JOURNEYPATTERN',
+ data
+ }
+ expect(actions.addJourneyPattern(data)).toEqual(expectedAction)
+ })
+})
+describe('when submitting new journeyPatterns', () => {
+ it('should create an action to update pagination totalCount', () => {
+ const diff = 1
+ const expectedAction = {
+ type: 'UPDATE_TOTAL_COUNT',
+ diff
+ }
+ expect(actions.updateTotalCount(diff)).toEqual(expectedAction)
+ })
+})
+describe('when fetching api', () => {
+ it('should create an action to fetch api', () => {
+ const expectedAction = {
+ type: 'FETCH_API',
+ }
+ expect(actions.fetchingApi()).toEqual(expectedAction)
+ })
+})
diff --git a/spec/javascripts/journey_patterns/reducers/journey_patterns_spec.js b/spec/javascripts/journey_patterns/reducers/journey_patterns_spec.js
new file mode 100644
index 000000000..df288e530
--- /dev/null
+++ b/spec/javascripts/journey_patterns/reducers/journey_patterns_spec.js
@@ -0,0 +1,124 @@
+var jpReducer = require('es6_browserified/journey_patterns/reducers/journeyPatterns')
+let state = []
+let fakeStopPoints = [{
+ area_type : "lda",
+ checked : false,
+ id : 45289,
+ name : "Clichy Levallois",
+ object_id : "FR:92044:LDA:72073:STIF",
+ position : 0,
+},{
+ area_type : "lda",
+ checked : false,
+ id : 40534,
+ name : "Thomas Lemaître",
+ object_id : "FR:92050:LDA:70915:STIF",
+ position : 1,
+}]
+let stopPoints = [{
+ area_type : 'zdep',
+ city_name : 'Plaisir',
+ for_alighting : 'normal',
+ for_boarding : 'normal',
+ id : 14892,
+ name : 'test1',
+ object_id : 'test:StopPoint:1',
+ position : 0,
+ zip_code : '78490'
+},{
+ area_type : 'zdep',
+ city_name : 'Plaisir',
+ for_alighting : 'normal',
+ for_boarding : 'normal',
+ id : 14893,
+ name : 'test2',
+ object_id : 'test:StopPoint:2',
+ position : 1,
+ zip_code : '78490'
+}]
+
+describe('journeyPatterns reducer', () => {
+ beforeEach(()=>{
+ state = [
+ {
+ deletable: false,
+ name: 'm1',
+ object_id : 'o1',
+ published_name: 'M1',
+ registration_number: '',
+ stop_points: fakeStopPoints
+ },
+ {
+ deletable: false,
+ name: 'm2',
+ object_id : 'o2',
+ published_name: 'M2',
+ registration_number: '',
+ stop_points: fakeStopPoints
+ }
+ ]
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ jpReducer(undefined, {})
+ ).toEqual([])
+ })
+
+ it('should handle ADD_JOURNEYPATTERN', () => {
+ let fakeData = {
+ name: {value : 'm3'},
+ published_name: {value: 'M3'},
+ registration_number: {value: ''}
+ }
+ let stopPoints = stopPoints
+ expect(
+ jpReducer(state, {
+ type: 'ADD_JOURNEYPATTERN',
+ data: fakeData
+ })
+ ).toEqual([{
+ name : 'm3',
+ published_name: 'M3',
+ registration_number: '',
+ deletable: false,
+ stop_points: stopPoints
+ }, ...state])
+ })
+
+ it('should handle UPDATE_CHECKBOX_VALUE', () => {
+ let newFirstStopPoint = Object.assign({}, fakeStopPoints[0], {checked: !fakeStopPoints[0].checked} )
+ let newStopPoints = [newFirstStopPoint, fakeStopPoints[1]]
+ let newState = Object.assign({}, state[0], {stop_points: newStopPoints})
+ expect(
+ jpReducer(state, {
+ type: 'UPDATE_CHECKBOX_VALUE',
+ id: 45289,
+ index: 0
+ })
+ ).toEqual([newState, state[1]])
+ })
+
+ it('should handle DELETE_JOURNEYPATTERN', () => {
+ expect(
+ jpReducer(state, {
+ type: 'DELETE_JOURNEYPATTERN',
+ index: 1
+ })
+ ).toEqual([state[0], Object.assign({}, state[1], {deletable: true})])
+ })
+ it('should handle SAVE_MODAL', () => {
+ let newState = Object.assign({}, state[0], {name: 'p1', published_name: 'P1', registration_number: 'PP11'})
+ expect(
+ jpReducer(state, {
+ type: 'SAVE_MODAL',
+ data: {
+ name: {value: 'p1'},
+ published_name: {value: 'P1'},
+ registration_number: {value: 'PP11'}
+ },
+ index: 0
+ })
+ ).toEqual([newState, state[1]])
+ })
+})
diff --git a/spec/javascripts/journey_patterns/reducers/modal_spec.js b/spec/javascripts/journey_patterns/reducers/modal_spec.js
new file mode 100644
index 000000000..0bc7c9240
--- /dev/null
+++ b/spec/javascripts/journey_patterns/reducers/modal_spec.js
@@ -0,0 +1,98 @@
+var modalReducer = require('es6_browserified/journey_patterns/reducers/modal')
+
+let state = {}
+
+let fakeJourneyPattern = {
+ name: 'jp_test 1',
+ object_id: 'jp_test:JourneyPattern:1',
+ published_name: 'jp_test publishedname 1',
+ registration_number: 'jp_test registrationnumber 1',
+ stop_points: [],
+ deletable: false
+}
+
+const cb = function(){}
+
+describe('modal reducer', () => {
+ beforeEach(() => {
+ state = {
+ type: '',
+ modalProps: {},
+ confirmModal: {}
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ modalReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle OPEN_CONFIRM_MODAL', () => {
+ let newState = Object.assign({}, state, {
+ type: 'confirm',
+ confirmModal: {
+ callback: cb
+ }
+ })
+ expect(
+ modalReducer(state, {
+ type: 'OPEN_CONFIRM_MODAL',
+ callback: cb
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle EDIT_JOURNEYPATTERN_MODAL', () => {
+ let newState = Object.assign({}, state, {
+ type: 'edit',
+ modalProps: {
+ index: 0,
+ journeyPattern: fakeJourneyPattern
+ },
+ confirmModal: {}
+ })
+ expect(
+ modalReducer(state, {
+ type: 'EDIT_JOURNEYPATTERN_MODAL',
+ index: 0,
+ journeyPattern : fakeJourneyPattern
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle CREATE_JOURNEYPATTERN_MODAL', () => {
+ expect(
+ modalReducer(state, {
+ type: 'CREATE_JOURNEYPATTERN_MODAL'
+ })
+ ).toEqual(Object.assign({}, state, { type: 'create' }))
+ })
+
+ it('should handle DELETE_JOURNEYPATTERN', () => {
+ expect(
+ modalReducer(state, {
+ type: 'DELETE_JOURNEYPATTERN',
+ index: 0
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle SAVE_MODAL', () => {
+ expect(
+ modalReducer(state, {
+ type: 'SAVE_MODAL',
+ index: 0,
+ data: {}
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle CLOSE_MODAL', () => {
+ expect(
+ modalReducer(state, {
+ type: 'CLOSE_MODAL'
+ })
+ ).toEqual(state)
+ })
+})
diff --git a/spec/javascripts/journey_patterns/reducers/pagination_spec.js b/spec/javascripts/journey_patterns/reducers/pagination_spec.js
new file mode 100644
index 000000000..d0f9fef47
--- /dev/null
+++ b/spec/javascripts/journey_patterns/reducers/pagination_spec.js
@@ -0,0 +1,93 @@
+var reducer = require('es6_browserified/journey_patterns/reducers/pagination')
+
+const diff = 1
+let state = {
+ page : 2,
+ totalCount : 50,
+ stateChanged: false,
+ perPage: 20
+}
+let pagination = Object.assign({}, state)
+const dispatch = function(){}
+
+describe('pagination reducer, given parameters allowing page change', () => {
+
+ it('should return the initial state', () => {
+ expect(
+ reducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle GO_TO_NEXT_PAGE and change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage : true
+ })
+ ).toEqual(Object.assign({}, state, {page : state.page + 1, stateChanged: false}))
+ })
+
+ it('should return GO_TO_PREVIOUS_PAGE and change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage : false
+ })
+ ).toEqual(Object.assign({}, state, {page : state.page - 1, stateChanged: false}))
+ })
+})
+
+
+describe('pagination reducer, given parameters not allowing to go to previous page', () => {
+
+ beforeEach(()=>{
+ state.page = 1
+ pagination.page = 1
+ })
+
+ it('should return GO_TO_PREVIOUS_PAGE and not change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage : false
+ })
+ ).toEqual(state)
+ })
+})
+
+describe('pagination reducer, given parameters not allowing to go to next page', () => {
+
+ beforeEach(()=>{
+ state.page = 3
+ pagination.page = 3
+ })
+
+ it('should return GO_TO_NEXT_PAGE and not change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage : true
+ })
+ ).toEqual(state)
+ })
+})
+
+describe('pagination reducer, given parameters changing totalCount', () => {
+
+ it('should return UPDATE_TOTAL_COUNT and update totalCount', () => {
+ expect(
+ reducer(state, {
+ type: 'UPDATE_TOTAL_COUNT',
+ diff
+ })
+ ).toEqual(Object.assign({}, state, {totalCount: state.totalCount - diff}))
+ })
+})
diff --git a/spec/javascripts/journey_patterns/reducers/status_spec.js b/spec/javascripts/journey_patterns/reducers/status_spec.js
new file mode 100644
index 000000000..91cbbb0b8
--- /dev/null
+++ b/spec/javascripts/journey_patterns/reducers/status_spec.js
@@ -0,0 +1,51 @@
+var statusReducer = require('es6_browserified/journey_patterns/reducers/status')
+
+let state = {}
+
+let pagination = {
+ page : 2,
+ totalCount : 25,
+ stateChanged: false,
+ perPage: 12
+}
+const dispatch = function(){}
+
+describe('status reducer', () => {
+ beforeEach(() => {
+ state = {
+ 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 RECEIVE_JOURNEY_PATTERNS', () => {
+ expect(
+ statusReducer(state, {
+ type: 'RECEIVE_JOURNEY_PATTERNS'
+ })
+ ).toEqual(Object.assign({}, state, {fetchSuccess: true, isFetching: false}))
+ })
+
+ it('should handle FETCH_API', () => {
+ expect(
+ statusReducer(state, {
+ type: 'FETCH_API'
+ })
+ ).toEqual(Object.assign({}, state, {isFetching: true}))
+ })
+
+})
diff --git a/spec/javascripts/spec_helper.js b/spec/javascripts/spec_helper.js
new file mode 100644
index 000000000..a0285cccf
--- /dev/null
+++ b/spec/javascripts/spec_helper.js
@@ -0,0 +1,35 @@
+// Teaspoon includes some support files, but you can use anything from your own support path too.
+// require support/jasmine-jquery-1.7.0
+// require support/jasmine-jquery-2.0.0
+// require support/jasmine-jquery-2.1.0
+// require support/sinon
+// require support/your-support-file
+//= require jquery
+//= require bootstrap-sass-official
+require('es6-object-assign').polyfill();
+//
+// PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
+// Use this polyfill to avoid the confusion.
+//= require support/phantomjs-shims
+//
+// You can require your own javascript files here. By default this will include everything in application, however you
+// may get better load performance if you require the specific files that are being used in the spec that tests them.
+//= require application
+//
+// Deferring execution
+// If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
+// Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
+//
+// Teaspoon.defer = true
+// setTimeout(Teaspoon.execute, 1000)
+//
+// Matching files
+// By default Teaspoon will look for files that match _spec.{js,js.coffee,.coffee}. Add a filename_spec.js file in your
+// spec path and it'll be included in the default suite automatically. If you want to customize suites, check out the
+// configuration in teaspoon_env.rb
+//
+// Manifest
+// If you'd rather require your spec files manually (to control order for instance) you can disable the suite matcher in
+// the configuration and use this file as a manifest.
+//
+// For more information: http://github.com/modeset/teaspoon
diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js
new file mode 100644
index 000000000..351b8038b
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/actions_spec.js
@@ -0,0 +1,430 @@
+var actions = require('es6_browserified/vehicle_journeys/actions')
+
+const dispatch = function(){}
+const currentPage = 1
+
+describe('when cannot fetch api', () => {
+ it('should create an action to toggle error', () => {
+ const expectedAction = {
+ type: 'UNAVAILABLE_SERVER',
+ }
+ expect(actions.unavailableServer()).toEqual(expectedAction)
+ })
+})
+describe('when fetching api', () => {
+ it('should create an action to fetch api', () => {
+ const expectedAction = {
+ type: 'FETCH_API',
+ }
+ expect(actions.fetchingApi()).toEqual(expectedAction)
+ })
+})
+describe('when receiveJourneyPatterns is triggered', () => {
+ it('should create an action to pass json to reducer', () => {
+ const json = undefined
+ const expectedAction = {
+ type: 'RECEIVE_VEHICLE_JOURNEYS',
+ json
+ }
+ expect(actions.receiveVehicleJourneys()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on add button', () => {
+ it('should create an action to open a create modal', () => {
+ const expectedAction = {
+ type: 'CREATE_VEHICLEJOURNEY_MODAL',
+ }
+ expect(actions.openCreateModal()).toEqual(expectedAction)
+ })
+})
+describe('when using select2 to pick a journey pattern', () => {
+ it('should create an action to select a journey pattern inside modal', () => {
+ let selectedJP = {
+ id: 1,
+ object_id: 2,
+ name: 'test',
+ published_name: 'test',
+ stop_area_short_descriptions: ['test']
+ }
+ const expectedAction = {
+ type: 'SELECT_JP_CREATE_MODAL',
+ selectedItem:{
+ id: selectedJP.id,
+ objectid: selectedJP.object_id,
+ name: selectedJP.name,
+ published_name: selectedJP.published_name,
+ stop_areas: selectedJP.stop_area_short_descriptions
+ }
+ }
+ expect(actions.selectJPCreateModal(selectedJP)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside create modal', () => {
+ it('should create an action to create a new vehicle journey', () => {
+ const data = {}
+ const selectedJourneyPattern = {}
+ const selectedCompany = {}
+ const stopPointsList = []
+ const expectedAction = {
+ type: 'ADD_VEHICLEJOURNEY',
+ data,
+ selectedJourneyPattern,
+ stopPointsList,
+ selectedCompany
+ }
+ expect(actions.addVehicleJourney(data, selectedJourneyPattern, stopPointsList, selectedCompany)).toEqual(expectedAction)
+ })
+})
+describe('when previous navigation button is clicked', () => {
+ it('should create an action to go to previous page', () => {
+ const nextPage = false
+ const queryString = ''
+ const pagination = {
+ totalCount: 25,
+ perPage: 12,
+ page:1
+ }
+ const expectedAction = {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage,
+ queryString
+ }
+ expect(actions.goToPreviousPage(dispatch, pagination, queryString)).toEqual(expectedAction)
+ })
+})
+describe('when next navigation button is clicked', () => {
+ it('should create an action to go to next page', () => {
+ const queryString = ''
+ const nextPage = true
+ const pagination = {
+ totalCount: 25,
+ perPage: 12,
+ page:1
+ }
+ const expectedAction = {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage,
+ queryString
+ }
+ expect(actions.goToNextPage(dispatch, pagination, queryString)).toEqual(expectedAction)
+ })
+})
+describe('when checking a vehicleJourney', () => {
+ it('should create an action to select vj', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'SELECT_VEHICLEJOURNEY',
+ index
+ }
+ expect(actions.selectVehicleJourney(index)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on cancel selection button', () => {
+ it('should create an action to cancel whole selection', () => {
+ const index = 1
+ const expectedAction = {
+ type: 'CANCEL_SELECTION'
+ }
+ expect(actions.cancelSelection()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on delete button', () => {
+ it('should create an action to delete vj', () => {
+ const expectedAction = {
+ type: 'DELETE_VEHICLEJOURNEYS',
+ }
+ expect(actions.deleteVehicleJourneys()).toEqual(expectedAction)
+ })
+})
+describe('when toggling arrivals', () => {
+ it('should create an action to toggleArrivals', () => {
+ const expectedAction = {
+ type: 'TOGGLE_ARRIVALS',
+ }
+ expect(actions.toggleArrivals()).toEqual(expectedAction)
+ })
+})
+describe('when updating vjas time', () => {
+ it('should create an action to update time', () => {
+ const val = 33, subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true
+ const expectedAction = {
+ type: 'UPDATE_TIME',
+ val,
+ subIndex,
+ index,
+ timeUnit,
+ isDeparture,
+ isArrivalsToggled
+ }
+ expect(actions.updateTime(val, subIndex, index, timeUnit, isDeparture, isArrivalsToggled)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside shifting modal', () => {
+ it('should create an action to shift a vehiclejourney schedule', () => {
+ const data = {}
+ const expectedAction = {
+ type: 'SHIFT_VEHICLEJOURNEY',
+ data
+ }
+ expect(actions.shiftVehicleJourney(data)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside editing modal', () => {
+ it('should create an action to update a vehiclejourney', () => {
+ const data = {}
+ const selectedCompany = {}
+ const expectedAction = {
+ type: 'EDIT_VEHICLEJOURNEY',
+ data,
+ selectedCompany
+ }
+ expect(actions.editVehicleJourney(data, selectedCompany)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside duplicating modal', () => {
+ it('should create an action to duplicate a vehiclejourney schedule', () => {
+ const data = {}
+ const expectedAction = {
+ type: 'DUPLICATE_VEHICLEJOURNEY',
+ data
+ }
+ expect(actions.duplicateVehicleJourney(data)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on edit notes modal', () => {
+ it('should create an action to open footnotes modal', () => {
+ const vehicleJourney = {}
+ const expectedAction = {
+ type: 'EDIT_NOTES_VEHICLEJOURNEY_MODAL',
+ vehicleJourney
+ }
+ expect(actions.openNotesEditModal(vehicleJourney)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on a footnote button inside footnote modal', () => {
+ it('should create an action to toggle this footnote', () => {
+ const footnote = {}, isShown = true
+ const expectedAction = {
+ type: 'TOGGLE_FOOTNOTE_MODAL',
+ footnote,
+ isShown
+ }
+ expect(actions.toggleFootnoteModal(footnote, isShown)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside footnote modal', () => {
+ it('should create an action to update vj footnotes', () => {
+ const footnotes = []
+ const expectedAction = {
+ type: 'EDIT_VEHICLEJOURNEY_NOTES',
+ footnotes
+ }
+ expect(actions.editVehicleJourneyNotes(footnotes)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on calendar button in toolbox', () => {
+ it('should create an action to open calendar modal', () => {
+ const vehicleJourneys = []
+ const expectedAction = {
+ type: 'EDIT_CALENDARS_VEHICLEJOURNEY_MODAL',
+ vehicleJourneys
+ }
+ expect(actions.openCalendarsEditModal(vehicleJourneys)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on delete button next to a timetable inside modal', () => {
+ it('should create an action to delete timetable from selected vehicle journeys', () => {
+ const timetable = {}
+ const expectedAction = {
+ type: 'DELETE_CALENDAR_MODAL',
+ timetable
+ }
+ expect(actions.deleteCalendarModal(timetable)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on validate button inside calendars modal', () => {
+ it('should create an action to update vj calendars', () => {
+ const vehicleJourneys = []
+ const expectedAction = {
+ type: 'EDIT_VEHICLEJOURNEYS_CALENDARS',
+ vehicleJourneys
+ }
+ expect(actions.editVehicleJourneyCalendars(vehicleJourneys)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on add button inside calendars modal', () => {
+ it('should create an action to add the selected timetable to preselected vjs', () => {
+ const expectedAction = {
+ type: 'ADD_SELECTED_TIMETABLE',
+ }
+ expect(actions.addSelectedTimetable()).toEqual(expectedAction)
+ })
+})
+describe('when using select2 to pick a timetable', () => {
+ it('should create an action to select a timetable inside modal', () => {
+ let selectedTT = {
+ id: 1,
+ objectid: 2,
+ comment: 'test',
+ }
+ const expectedAction = {
+ type: 'SELECT_TT_CALENDAR_MODAL',
+ selectedItem:{
+ id: selectedTT.id,
+ objectid: selectedTT.objectid,
+ comment: selectedTT.comment,
+ }
+ }
+ expect(actions.selectTTCalendarsModal(selectedTT)).toEqual(expectedAction)
+ })
+})
+describe('when clicking on reset button inside query filters', () => {
+ it('should create an action to reset the query filters', () => {
+ const expectedAction = {
+ type: 'BATCH',
+ payload: [
+ {type: 'RESET_FILTERS'},
+ {type: 'RESET_PAGINATION'},
+ {type: 'QUERY_FILTER_VEHICLEJOURNEYS', dispatch: undefined},
+ ]
+ }
+ expect(actions.resetFilters()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on filter button inside query filters', () => {
+ it('should create an action to filter', () => {
+ const expectedAction = {
+ type: 'BATCH',
+ payload: [
+ {type: 'CREATE_QUERY_STRING'},
+ {type: 'RESET_PAGINATION'},
+ {type: 'QUERY_FILTER_VEHICLEJOURNEYS', dispatch: undefined},
+ ]
+ }
+ expect(actions.filterQuery()).toEqual(expectedAction)
+ })
+})
+describe('when clicking on checkbox to show vj without schedule', () => {
+ it('should create an action to toggle this filter', () => {
+ const expectedAction = {
+ type: 'TOGGLE_WITHOUT_SCHEDULE',
+ }
+ expect(actions.toggleWithoutSchedule()).toEqual(expectedAction)
+ })
+})
+describe('when setting new interval', () => {
+ const val = 1
+ const unit = 'hour'
+ it('should create actions to update intervals in state', () => {
+ let expectedAction = {
+ type: 'UPDATE_START_TIME_FILTER',
+ val,
+ unit
+ }
+ expect(actions.updateStartTimeFilter(val, unit)).toEqual(expectedAction)
+ })
+ it('should create actions to update intervals in state', () => {
+ let expectedAction = {
+ type: 'UPDATE_END_TIME_FILTER',
+ val,
+ unit
+ }
+ expect(actions.updateEndTimeFilter(val, unit)).toEqual(expectedAction)
+ })
+})
+describe('when using select2 to pick a timetable in the filters', () => {
+ it('should create an action to select a timetable as a filter', () => {
+ let selectedTT = {
+ id: 1,
+ objectid: 2,
+ comment: 'test',
+ }
+ const expectedAction = {
+ type: 'SELECT_TT_FILTER',
+ selectedItem:{
+ id: selectedTT.id,
+ objectid: selectedTT.objectid,
+ comment: selectedTT.comment,
+ }
+ }
+ expect(actions.filterSelect2Timetable(selectedTT)).toEqual(expectedAction)
+ })
+})
+describe('when using select2 to pick a journeypattern in the filters', () => {
+ it('should create an action to select a journey pattern as a filter', () => {
+ let selectedJP = {
+ id: 1,
+ object_id: 2,
+ name: 'test',
+ published_name: 'test'
+ }
+ const expectedAction = {
+ type: 'SELECT_JP_FILTER',
+ selectedItem:{
+ id: selectedJP.id,
+ objectid: selectedJP.object_id,
+ name: selectedJP.name,
+ published_name: selectedJP.published_name
+ }
+ }
+ expect(actions.filterSelect2JourneyPattern(selectedJP)).toEqual(expectedAction)
+ })
+})
+describe('when user clicked either on filter or reset button in filters', () => {
+ it('should create an action to reset pagination', () => {
+ const expectedAction = {
+ type: 'RESET_PAGINATION',
+ }
+ expect(actions.resetPagination()).toEqual(expectedAction)
+ })
+})
+describe('when user clicked either on filter or reset button in filters', () => {
+ it('should create an action to create a queryString with params filters', () => {
+ const expectedAction = {
+ type: 'CREATE_QUERY_STRING',
+ }
+ expect(actions.createQueryString()).toEqual(expectedAction)
+ })
+})
+describe('when submitting new vj', () => {
+ it('should create an action to update pagination totalCount', () => {
+ const diff = 1
+ const expectedAction = {
+ type: 'UPDATE_TOTAL_COUNT',
+ diff
+ }
+ expect(actions.updateTotalCount(diff)).toEqual(expectedAction)
+ })
+})
+describe('when receiving vj', () => {
+ it('should create an action to show pagination totalCount', () => {
+ const total = 1
+ const expectedAction = {
+ type: 'RECEIVE_TOTAL_COUNT',
+ total
+ }
+ expect(actions.receiveTotalCount(total)).toEqual(expectedAction)
+ })
+})
+describe('when using select2 to pick a company', () => {
+ it('should create an action to select a company inside modal', () => {
+ let selectedCompany = {
+ id: 1,
+ objectid: 2,
+ name: 'test',
+ }
+ const expectedAction = {
+ type: 'SELECT_CP_EDIT_MODAL',
+ selectedItem:{
+ id: selectedCompany.id,
+ objectid: selectedCompany.objectid,
+ name: selectedCompany.name,
+ }
+ }
+ expect(actions.select2Company(selectedCompany)).toEqual(expectedAction)
+ })
+})
diff --git a/spec/javascripts/vehicle_journeys/reducers/filters_spec.js b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js
new file mode 100644
index 000000000..84608243b
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/reducers/filters_spec.js
@@ -0,0 +1,154 @@
+var statusReducer = require('es6_browserified/vehicle_journeys/reducers/filters')
+
+let state = {}
+
+describe('filters reducer', () => {
+ const cleanInterval = {
+ start:{
+ hour: '00',
+ minute: '00'
+ },
+ end:{
+ hour: '23',
+ minute: '59'
+ }
+ }
+ beforeEach(() => {
+ state = {
+ toggleArrivals: false,
+ query: {
+ interval: {
+ start:{
+ hour: '11',
+ minute: '11'
+ },
+ end:{
+ hour: '22',
+ minute: '22'
+ }
+ },
+ journeyPattern: {},
+ timetable: {},
+ withoutSchedule: false,
+ },
+ queryString: ''
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ statusReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle TOGGLE_ARRIVALS', () => {
+ expect(
+ statusReducer(state, {
+ type: 'TOGGLE_ARRIVALS'
+ })
+ ).toEqual(Object.assign({}, state, {toggleArrivals: true}))
+ })
+
+ it('should handle RESET_FILTERS', () => {
+ let cleanQuery = JSON.parse(JSON.stringify(state.query))
+ cleanQuery.interval = cleanInterval
+ expect(
+ statusReducer(state, {
+ type: 'RESET_FILTERS'
+ })
+ ).toEqual(Object.assign({}, state, {query: cleanQuery}))
+ })
+
+ it('should handle TOGGLE_WITHOUT_SCHEDULE', () => {
+ let rslt = JSON.parse(JSON.stringify(state.query))
+ rslt.withoutSchedule = true
+ expect(
+ statusReducer(state, {
+ type: 'TOGGLE_WITHOUT_SCHEDULE'
+ })
+ ).toEqual(Object.assign({}, state, {query: rslt}))
+ })
+
+ it('should handle UPDATE_START_TIME_FILTER', () => {
+ let val = 12
+ let unit = 'minute'
+ let rslt = JSON.parse(JSON.stringify(state.query))
+ rslt.interval.start.minute = String(val)
+ expect(
+ statusReducer(state, {
+ type: 'UPDATE_START_TIME_FILTER',
+ val,
+ unit
+ })
+ ).toEqual(Object.assign({}, state, {query: rslt}))
+ })
+
+ it('should handle UPDATE_START_TIME_FILTER and not make any update', () => {
+ let val = 23
+ let unit = 'hour'
+ expect(
+ statusReducer(state, {
+ type: 'UPDATE_START_TIME_FILTER',
+ val,
+ unit
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle UPDATE_END_TIME_FILTER', () => {
+ let val = 12
+ let unit = 'minute'
+ let rslt = JSON.parse(JSON.stringify(state.query))
+ rslt.interval.end.minute = String(val)
+ expect(
+ statusReducer(state, {
+ type: 'UPDATE_END_TIME_FILTER',
+ val,
+ unit
+ })
+ ).toEqual(Object.assign({}, state, {query: rslt}))
+ })
+
+ it('should handle UPDATE_END_TIME_FILTER and not make any update', () => {
+ let val = 1
+ let unit = 'hour'
+ expect(
+ statusReducer(state, {
+ type: 'UPDATE_END_TIME_FILTER',
+ val,
+ unit
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle SELECT_TT_FILTER', () => {
+ let newTimetable = {timetable : {id: 1}}
+ let newQuery = Object.assign({}, state.query, newTimetable)
+ expect(
+ statusReducer(state, {
+ type: 'SELECT_TT_FILTER',
+ selectedItem: {id: 1}
+ })
+ ).toEqual(Object.assign({}, state, {query: newQuery}))
+ })
+
+ it('should handle SELECT_JP_FILTER', () => {
+ let newJourneyPattern = {journeyPattern : {id: 1}}
+ let newQuery = Object.assign({}, state.query, newJourneyPattern)
+ expect(
+ statusReducer(state, {
+ type: 'SELECT_JP_FILTER',
+ selectedItem: {id: 1}
+ })
+ ).toEqual(Object.assign({}, state, {query: newQuery}))
+ })
+
+ it('should handle SELECT_JP_FILTER', () => {
+ let strResult = "q%5Bjourney_pattern_id_eq%5D=undefined&q%5Btime_tables_id_eq%5D=undefined&q%5Bvehicle_journey_at_stops_departure_time_gteq%5D=11%3A11&q%5Bvehicle_journey_at_stops_departure_time_lteq%5D=22%3A22"
+ expect(
+ statusReducer(state, {
+ type: 'CREATE_QUERY_STRING',
+ })
+ ).toEqual(Object.assign({}, state, {queryString: strResult}))
+ })
+})
diff --git a/spec/javascripts/vehicle_journeys/reducers/modal_spec.js b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js
new file mode 100644
index 000000000..c016812da
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/reducers/modal_spec.js
@@ -0,0 +1,170 @@
+var modalReducer = require('es6_browserified/vehicle_journeys/reducers/modal')
+
+let state = {}
+
+const cb = function(){}
+
+describe('modal reducer', () => {
+ beforeEach(() => {
+ state = {
+ type: '',
+ modalProps: {},
+ confirmModal: {}
+ }
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ modalReducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle OPEN_CONFIRM_MODAL', () => {
+ let newState = Object.assign({}, state, {
+ type: 'confirm',
+ confirmModal: {
+ callback: cb
+ }
+ })
+ expect(
+ modalReducer(state, {
+ type: 'OPEN_CONFIRM_MODAL',
+ callback: cb
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle CREATE_VEHICLEJOURNEY_MODAL', () => {
+ expect(
+ modalReducer(state, {
+ type: 'CREATE_VEHICLEJOURNEY_MODAL'
+ })
+ ).toEqual(Object.assign({}, state, { type: 'create' }))
+ })
+
+ it('should handle SELECT_JP_CREATE_MODAL', () => {
+ let newModalProps = {selectedJPModal : {id: 1}}
+ expect(
+ modalReducer(state, {
+ type: 'SELECT_JP_CREATE_MODAL',
+ selectedItem: {id: 1}
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle CLOSE_MODAL', () => {
+ expect(
+ modalReducer(state, {
+ type: 'CLOSE_MODAL'
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle EDIT_NOTES_VEHICLEJOURNEY_MODAL', () => {
+ let vehicleJourney = {}
+ let modalPropsResult = {
+ vehicleJourney: {}
+ }
+ expect(
+ modalReducer(state, {
+ type: 'EDIT_NOTES_VEHICLEJOURNEY_MODAL',
+ vehicleJourney
+ })
+ ).toEqual(Object.assign({}, state, {type: 'notes_edit', modalProps: modalPropsResult}))
+ })
+
+ it('should handle TOGGLE_FOOTNOTE_MODAL', () => {
+ state.modalProps = {vehicleJourney : {footnotes: [{}, {}]}}
+ let footnote = {}
+ let newState = {
+ // for the sake of the test, no need to specify the type
+ type: '',
+ modalProps:{vehicleJourney: {footnotes: [{},{},{}]}},
+ confirmModal: {}
+ }
+ expect(
+ modalReducer(state, {
+ type: 'TOGGLE_FOOTNOTE_MODAL',
+ footnote,
+ isShown: true
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle EDIT_CALENDARS_VEHICLEJOURNEY_MODAL', () => {
+ let vehicleJourneys = []
+ let modalPropsResult = {
+ vehicleJourneys: [],
+ timetables: []
+ }
+ expect(
+ modalReducer(state, {
+ type: 'EDIT_CALENDARS_VEHICLEJOURNEY_MODAL',
+ vehicleJourneys
+ })
+ ).toEqual(Object.assign({}, state, {type: 'calendars_edit', modalProps: modalPropsResult}))
+ })
+
+ it('should handle SELECT_TT_CALENDAR_MODAL', () => {
+ let newModalProps = {selectedTimetable : {id: 1}}
+ expect(
+ modalReducer(state, {
+ type: 'SELECT_TT_CALENDAR_MODAL',
+ selectedItem: {id: 1}
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+
+ it('should handle ADD_SELECTED_TIMETABLE', () => {
+ let fakeTimetables = [{'test': 'test'}, {'test 2': 'test 2'}, {'add': 'add'}]
+ let newTimeTables = [{'test': 'test'}, {'test 2': 'test 2'}, {'add': 'add'}]
+ let fakeVehicleJourneys= [{time_tables: fakeTimetables}, {time_tables: newTimeTables}]
+ state.modalProps.vehicleJourneys = fakeVehicleJourneys
+ state.modalProps.timetables = fakeTimetables
+ state.modalProps.selectedTimetable = {'add': 'add'}
+ let newState = {
+ type: '',
+ modalProps:{
+ vehicleJourneys: [{time_tables: newTimeTables},{time_tables: newTimeTables}],
+ timetables: [{'test': 'test'},{'test 2': 'test 2'},{'add': 'add'}],
+ selectedTimetable: {'add': 'add'}
+ },
+ confirmModal: {}
+ }
+ expect(
+ modalReducer(state, {
+ type: 'ADD_SELECTED_TIMETABLE',
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle DELETE_CALENDAR_MODAL', () => {
+ let deletableTimetable = {'delete': 'delete'}
+ let fakeTimetables = [{'test': 'test'}, {'test 2': 'test 2'}, deletableTimetable]
+ let newTimeTables = [{'test': 'test'}, {'test 2': 'test 2'}]
+ let fakeVehicleJourneys= [{time_tables: fakeTimetables}, {time_tables: fakeTimetables}]
+ state.modalProps = Object.assign({}, state.modalProps,{vehicleJourneys : fakeVehicleJourneys, timetables: fakeTimetables })
+ let newState = {
+ // for the sake of the test, no need to specify the type
+ type: '',
+ modalProps:{vehicleJourneys: [{time_tables: newTimeTables},{time_tables: newTimeTables}], timetables: [{'test': 'test'},{'test 2': 'test 2'}]},
+ confirmModal: {}
+ }
+ expect(
+ modalReducer(state, {
+ type: 'DELETE_CALENDAR_MODAL',
+ timetable: deletableTimetable
+ })
+ ).toEqual(newState)
+ })
+
+ it('should handle SELECT_CP_EDIT_MODAL', () => {
+ let newModalProps = {selectedCompany : {name: 'ALBATRANS'}}
+ expect(
+ modalReducer(state, {
+ type: 'SELECT_CP_EDIT_MODAL',
+ selectedItem: {name: 'ALBATRANS'}
+ })
+ ).toEqual(Object.assign({}, state, {modalProps: newModalProps}))
+ })
+})
diff --git a/spec/javascripts/vehicle_journeys/reducers/pagination_spec.js b/spec/javascripts/vehicle_journeys/reducers/pagination_spec.js
new file mode 100644
index 000000000..57417a3b9
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/reducers/pagination_spec.js
@@ -0,0 +1,123 @@
+var reducer = require('es6_browserified/vehicle_journeys/reducers/pagination')
+
+const diff = 1
+let state = {
+ page : 2,
+ totalCount : 25,
+ stateChanged: false,
+ perPage: 12
+}
+let pagination = Object.assign({}, state)
+const dispatch = function(){}
+
+describe('pagination reducer, given parameters allowing page change', () => {
+
+ it('should return the initial state', () => {
+ expect(
+ reducer(undefined, {})
+ ).toEqual({})
+ })
+
+ it('should handle RECEIVE_TOTAL_COUNT', () => {
+ expect(
+ reducer(state, {
+ type: 'RECEIVE_TOTAL_COUNT',
+ total: 1
+ })
+ ).toEqual(Object.assign({}, state, {totalCount: 1}))
+ })
+
+ it('should handle RESET_PAGINATION', () => {
+ expect(
+ reducer(state, {
+ type: 'RESET_PAGINATION',
+ })
+ ).toEqual(Object.assign({}, state, {page: 1}))
+ })
+
+ it('should handle UPDATE_TOTAL_COUNT', () => {
+ expect(
+ reducer(state, {
+ type: 'UPDATE_TOTAL_COUNT',
+ diff: 1
+ })
+ ).toEqual(Object.assign({}, state, {totalCount: 24}))
+ })
+
+ it('should handle GO_TO_NEXT_PAGE and change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage : true
+ })
+ ).toEqual(Object.assign({}, state, {page : state.page + 1, stateChanged: false}))
+ })
+
+ it('should return GO_TO_PREVIOUS_PAGE and change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage : false
+ })
+ ).toEqual(Object.assign({}, state, {page : state.page - 1, stateChanged: false}))
+ })
+
+ it('should handle UPDATE_TIME', () => {
+ const val = '33', subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true
+ expect(
+ reducer(state, {
+ type: 'UPDATE_TIME',
+ val,
+ subIndex,
+ index,
+ timeUnit,
+ isDeparture,
+ isArrivalsToggled
+ })
+ ).toEqual(Object.assign({}, state, {stateChanged: true}))
+ })
+
+})
+
+
+describe('pagination reducer, given parameters not allowing to go to previous page', () => {
+
+ beforeEach(()=>{
+ state.page = 1
+ pagination.page = 1
+ })
+
+ it('should return GO_TO_PREVIOUS_PAGE and not change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_PREVIOUS_PAGE',
+ dispatch,
+ pagination,
+ nextPage : false
+ })
+ ).toEqual(state)
+ })
+})
+
+describe('pagination reducer, given parameters not allowing to go to next page', () => {
+
+ beforeEach(()=>{
+ state.page = 3
+ pagination.page = 3
+ })
+
+ it('should return GO_TO_NEXT_PAGE and not change state', () => {
+ expect(
+ reducer(state, {
+ type: 'GO_TO_NEXT_PAGE',
+ dispatch,
+ pagination,
+ nextPage : true
+ })
+ ).toEqual(state)
+ })
+})
diff --git a/spec/javascripts/vehicle_journeys/reducers/status_spec.js b/spec/javascripts/vehicle_journeys/reducers/status_spec.js
new file mode 100644
index 000000000..d48d48f4a
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/reducers/status_spec.js
@@ -0,0 +1,45 @@
+var statusReducer = require('es6_browserified/vehicle_journeys/reducers/status')
+
+let state = {}
+
+const dispatch = function(){}
+
+describe('status reducer', () => {
+ beforeEach(() => {
+ state = {
+ 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 RECEIVE_VEHICLE_JOURNEYS', () => {
+ expect(
+ statusReducer(state, {
+ type: 'RECEIVE_VEHICLE_JOURNEYS'
+ })
+ ).toEqual(Object.assign({}, state, {fetchSuccess: true, isFetching: false}))
+ })
+
+ it('should handle FETCH_API', () => {
+ expect(
+ statusReducer(state, {
+ type: 'FETCH_API'
+ })
+ ).toEqual(Object.assign({}, state, {isFetching: true}))
+ })
+
+})
diff --git a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
new file mode 100644
index 000000000..6dc07e9bd
--- /dev/null
+++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
@@ -0,0 +1,266 @@
+var vjReducer = require('es6_browserified/vehicle_journeys/reducers/vehicleJourneys')
+
+let state = []
+let stateModal = {
+ type: '',
+ modalProps: {},
+ confirmModal: {}
+}
+let fakeFootnotes = [{
+ id: 1,
+ code: 1,
+ label: "1"
+},{
+ id: 2,
+ code: 2,
+ label: "2"
+}]
+
+let fakeTimeTables = [{
+ published_journey_name: 'test 1',
+ objectid: '1'
+},{
+ published_journey_name: 'test 2',
+ objectid: '2'
+},{
+ published_journey_name: 'test 3',
+ objectid: '3'
+}]
+let fakeVJAS = [{
+ delta : 627,
+ arrival_time : {
+ hour: '11',
+ minute: '55'
+ },
+ departure_time : {
+ hour: '22',
+ minute: '22'
+ },
+ stop_area_object_id : "FR:92024:ZDE:420553:STIF"
+}]
+
+describe('vehicleJourneys reducer', () => {
+ beforeEach(()=>{
+ state = [
+ {
+ journey_pattern_id: 1,
+ published_journey_name: "vj1",
+ objectid: '11',
+ deletable: false,
+ selected: true,
+ footnotes: fakeFootnotes,
+ time_tables: fakeTimeTables,
+ vehicle_journey_at_stops: fakeVJAS
+ },
+ {
+ journey_pattern_id: 2,
+ published_journey_name: "vj2",
+ objectid: '22',
+ selected: false,
+ deletable: false,
+ footnotes: fakeFootnotes,
+ time_tables: fakeTimeTables,
+ vehicle_journey_at_stops: fakeVJAS
+ }
+ ]
+ })
+
+ it('should return the initial state', () => {
+ expect(
+ vjReducer(undefined, {})
+ ).toEqual([])
+ })
+
+
+ it('should handle ADD_VEHICLEJOURNEY', () => {
+ let pristineVjasList = [{
+ delta : 0,
+ arrival_time : {
+ hour: '00',
+ minute: '00'
+ },
+ departure_time : {
+ hour: '00',
+ minute: '00'
+ },
+ stop_point_objectid: 'test',
+ stop_area_cityname: 'city',
+ dummy: true
+ }]
+ let fakeData = {
+ published_journey_name: {value: 'test'}
+ }
+ let fakeSelectedJourneyPattern = {id: "1"}
+ let fakeSelectedCompany = {name: "ALBATRANS"}
+ expect(
+ vjReducer(state, {
+ type: 'ADD_VEHICLEJOURNEY',
+ data: fakeData,
+ selectedJourneyPattern: fakeSelectedJourneyPattern,
+ stopPointsList: [{object_id: 'test', city_name: 'city'}],
+ selectedCompany: fakeSelectedCompany
+ })
+ ).toEqual([{
+ journey_pattern: fakeSelectedJourneyPattern,
+ company: fakeSelectedCompany,
+ published_journey_name: 'test',
+ objectid: '',
+ footnotes: [],
+ time_tables: [],
+ vehicle_journey_at_stops: pristineVjasList,
+ selected: false,
+ deletable: false
+ }, ...state])
+ })
+
+ it('should handle RECEIVE_VEHICLE_JOURNEYS', () => {
+ expect(
+ vjReducer(state, {
+ type: 'RECEIVE_VEHICLE_JOURNEYS',
+ json: state
+ })
+ ).toEqual(state)
+ })
+
+ it('should handle UPDATE_TIME', () => {
+ const val = '33', subIndex = 0, index = 0, timeUnit = 'minute', isDeparture = true, isArrivalsToggled = true
+ let newVJAS = [{
+ delta: 638,
+ arrival_time : {
+ hour: '11',
+ minute: '55'
+ },
+ departure_time : {
+ hour: '22',
+ minute: '33'
+ },
+ stop_area_object_id : "FR:92024:ZDE:420553:STIF"
+ }]
+ let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS})
+ expect(
+ vjReducer(state, {
+ type: 'UPDATE_TIME',
+ val,
+ subIndex,
+ index,
+ timeUnit,
+ isDeparture,
+ isArrivalsToggled
+ })
+ ).toEqual([newVJ, state[1]])
+ })
+
+ it('should handle SELECT_VEHICLEJOURNEY', () => {
+ const index = 1
+ const newVJ = Object.assign({}, state[1], {selected: true})
+ expect(
+ vjReducer(state, {
+ type: 'SELECT_VEHICLEJOURNEY',
+ index
+ })
+ ).toEqual([state[0], newVJ])
+ })
+
+ it('should handle CANCEL_SELECTION', () => {
+ const index = 1
+ const newVJ = Object.assign({}, state[0], {selected: false})
+ expect(
+ vjReducer(state, {
+ type: 'CANCEL_SELECTION',
+ index
+ })
+ ).toEqual([newVJ, state[1]])
+ })
+
+ it('should handle DELETE_VEHICLEJOURNEYS', () => {
+ const newVJ = Object.assign({}, state[0], {deletable: true, selected: false})
+ expect(
+ vjReducer(state, {
+ type: 'DELETE_VEHICLEJOURNEYS'
+ })
+ ).toEqual([newVJ, state[1]])
+ })
+
+ it('should handle SHIFT_VEHICLEJOURNEY', () => {
+ let newVJAS = [{
+ delta: 627,
+ arrival_time : {
+ hour: '12',
+ minute: '00'
+ },
+ departure_time : {
+ hour: '22',
+ minute: '27'
+ },
+ stop_area_object_id : "FR:92024:ZDE:420553:STIF"
+ }]
+ let fakeData = {
+ objectid: {value : '11'},
+ additional_time: {value: '5'}
+ }
+ let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS})
+ expect(
+ vjReducer(state, {
+ type: 'SHIFT_VEHICLEJOURNEY',
+ data: fakeData
+ })
+ ).toEqual([newVJ, state[1]])
+ })
+
+ it('should handle DUPLICATE_VEHICLEJOURNEY', () => {
+ let newVJAS = [{
+ delta: 627,
+ arrival_time : {
+ hour: '12',
+ minute: '00'
+ },
+ departure_time : {
+ hour: '22',
+ minute: '27'
+ },
+ stop_area_object_id : "FR:92024:ZDE:420553:STIF"
+ }]
+ let fakeData = {
+ duplicate_number: {value : 1},
+ additional_time: {value: '5'}
+ }
+ let newVJ = Object.assign({}, state[0], {vehicle_journey_at_stops: newVJAS, selected: false})
+ newVJ.published_journey_name = state[0].published_journey_name + '-0'
+ delete newVJ['objectid']
+ expect(
+ vjReducer(state, {
+ type: 'DUPLICATE_VEHICLEJOURNEY',
+ data: fakeData
+ })
+ ).toEqual([state[0], newVJ, state[1]])
+ })
+
+ it('should handle EDIT_VEHICLEJOURNEY', () => {
+ let fakeData = {
+ published_journey_name: {value : 'test'},
+ published_journey_identifier: {value: 'test'}
+ }
+ let fakeSelectedCompany : {name : 'ALBATRANS'}
+ let newVJ = Object.assign({}, state[0], {company: fakeSelectedCompany, published_journey_name: fakeData.published_journey_name.value, published_journey_identifier: fakeData.published_journey_identifier.value})
+ expect(
+ vjReducer(state, {
+ type: 'EDIT_VEHICLEJOURNEY',
+ data: fakeData
+ })
+ ).toEqual([newVJ, state[1]])
+ })
+
+
+ it('should handle EDIT_VEHICLEJOURNEYS_CALENDARS', () => {
+ let newState = JSON.parse(JSON.stringify(state))
+ newState.map((vj, i) =>{
+ return Object.assign({}, vj, {time_tables : vj.time_tables[0]})
+ })
+ expect(
+ vjReducer(state, {
+ type: 'EDIT_VEHICLEJOURNEYS_CALENDARS',
+ vehicleJourneys: newState
+ })
+ ).toEqual(newState)
+ })
+})