Skip to content

Commit

Permalink
front: create train settings reducer
Browse files Browse the repository at this point in the history
Signed-off-by: Clara Ni <[email protected]>
  • Loading branch information
clarani committed Dec 24, 2024
1 parent 41e05a4 commit 79276e5
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 131 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import OptionsSNCF from 'common/BootstrapSNCF/OptionsSNCF';
import type { Option } from 'common/BootstrapSNCF/OptionsSNCF';
import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import { comfort2pictogram } from 'modules/rollingStock/components/RollingStockSelector/RollingStockHelpers';
import type { OperationalStudiesConfSliceActions } from 'reducers/osrdconf/operationalStudiesConf';
import { useAppDispatch } from 'store';

interface RollingStockCardButtonsProps {
Expand All @@ -30,7 +31,8 @@ const RollingStockCardButtons = ({
const currentComfortInStore = useSelector(getRollingStockComfort);
const [comfort, setComfort] = useState<string>(currentComfortInStore);

const { updateRollingStockComfort, updateRollingStockID } = useOsrdConfActions();
const { updateRollingStockComfort, updateRollingStockID } =
useOsrdConfActions() as OperationalStudiesConfSliceActions;

const selectRollingStock = () => {
setOpenedRollingStockCardId(undefined);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import { useTranslation } from 'react-i18next';
import type { Distribution } from 'common/api/osrdEditoastApi';
import OptionsSNCF from 'common/BootstrapSNCF/OptionsSNCF';
import { useOsrdConfActions } from 'common/osrdContext';
import type { OperationalStudiesConfSliceActions } from 'reducers/osrdconf/operationalStudiesConf';
import { useAppDispatch } from 'store';

type Props = {
constraintDistribution: Distribution;
};
const ConstraintDistributionSwitch = ({ constraintDistribution }: Props) => {
const { updateConstraintDistribution } = useOsrdConfActions();
const { updateConstraintDistribution } = useOsrdConfActions() as OperationalStudiesConfSliceActions;
const dispatch = useAppDispatch();
const [constraint, setConstraint] = useState(constraintDistribution);
const { t } = useTranslation(['operationalStudies/allowances', 'translation']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import { useSelector } from 'react-redux';
import electricalProfilesIcon from 'assets/pictures/components/electricalProfiles.svg';
import SwitchSNCF, { SWITCH_TYPES } from 'common/BootstrapSNCF/SwitchSNCF/SwitchSNCF';
import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import type { OperationalStudiesConfSliceActions } from 'reducers/osrdconf/operationalStudiesConf';
import { useAppDispatch } from 'store';

export default function ElectricalProfiles() {
const { getUsingElectricalProfiles } = useOsrdConfSelectors();
const { toggleUsingElectricalProfiles } = useOsrdConfActions();
const { toggleUsingElectricalProfiles } =
useOsrdConfActions() as OperationalStudiesConfSliceActions;
const dispatch = useAppDispatch();
const usingElectricalProfiles = useSelector(getUsingElectricalProfiles);
const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { isInvalidName } from 'applications/operationalStudies/utils';
import ChipsSNCF from 'common/BootstrapSNCF/ChipsSNCF';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import type { OperationalStudiesConfSliceActions } from 'reducers/osrdconf/operationalStudiesConf';
import { useAppDispatch } from 'store';
import { parseLocalDateTime, formatLocalDateTime } from 'utils/date';
import { useDebounce } from 'utils/helpers';
Expand All @@ -19,7 +20,8 @@ export default function TrainSettings() {
const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);

const { getLabels, getInitialSpeed, getName, getStartTime } = useOsrdConfSelectors();
const { updateLabels, updateInitialSpeed, updateName, updateStartTime } = useOsrdConfActions();
const { updateLabels, updateInitialSpeed, updateName, updateStartTime } =
useOsrdConfActions() as OperationalStudiesConfSliceActions;

const labels = useSelector(getLabels);
const nameFromStore = useSelector(getName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import {
type OperationalStudiesConfState,
} from 'reducers/osrdconf/operationalStudiesConf';
import { defaultCommonConf } from 'reducers/osrdconf/osrdConfCommon';
import commonConfBuilder from 'reducers/osrdconf/osrdConfCommon/__tests__/commonConfBuilder';
import testCommonConfReducers from 'reducers/osrdconf/osrdConfCommon/__tests__/utils';
import type { PathStep } from 'reducers/osrdconf/types';
import { createStoreWithoutMiddleware } from 'store';

import commonConfBuilder from '../osrdConfCommon/__tests__/commonConfBuilder';
import type { PathStep } from '../types';
import testTrainSettingsReducer from './trainSettingsReducer';

const createStore = (extraInitialState?: Partial<OperationalStudiesConfState>) =>
createStoreWithoutMiddleware({
Expand Down Expand Up @@ -160,4 +161,5 @@ describe('simulationConfReducer', () => {
});

testCommonConfReducers(operationalStudiesConfSlice);
testTrainSettingsReducer();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import { beforeEach, it, expect } from 'vitest';

import type { Distribution, TrainScheduleBase } from 'common/api/osrdEditoastApi';
import {
operationalStudiesConfSlice,
type OperationalStudiesConfState,
} from 'reducers/osrdconf/operationalStudiesConf';
import { defaultCommonConf } from 'reducers/osrdconf/osrdConfCommon';
import { createStoreWithoutMiddleware } from 'store';

const createStore = (extraInitialState?: Partial<OperationalStudiesConfState>) =>
createStoreWithoutMiddleware({
[operationalStudiesConfSlice.name]: {
...defaultCommonConf,
...extraInitialState,
},
});

const testTrainSettingsReducer = () => {
let defaultStore: ReturnType<typeof createStore>;
const slice = operationalStudiesConfSlice;
const {
updateConstraintDistribution,
updateName,
updateTrainCount,
updateTrainDelta,
updateTrainStep,
toggleUsingElectricalProfiles,
updateLabels,
updateInitialSpeed,
updateRollingStockComfort,
updateStartTime,
} = slice.actions;

const getState = () => defaultStore.getState()[operationalStudiesConfSlice.name];

beforeEach(() => {
defaultStore = createStore(operationalStudiesConfSlice);
});

it('should handle updateConstraintDistribution', () => {
const newConstraintDistribution: Distribution = 'STANDARD';
defaultStore.dispatch(updateConstraintDistribution(newConstraintDistribution));

const state = getState();
expect(state.constraintDistribution).toBe(newConstraintDistribution);
});

it('should handle updateName', () => {
const newName = 'New Simulation Name';
defaultStore.dispatch(updateName(newName));

const state = getState();
expect(state.name).toBe(newName);
});

it('should handle updateTrainCount', () => {
const newTrainCount = 5;
defaultStore.dispatch(updateTrainCount(newTrainCount));

const state = getState();
expect(state.trainCount).toBe(newTrainCount);
});

it('should handle updateTrainDelta', () => {
const newTrainDelta = 5;
defaultStore.dispatch(updateTrainDelta(newTrainDelta));

const state = getState();
expect(state.trainDelta).toBe(newTrainDelta);
});

it('should handle updateTrainStep', () => {
const newTrainStep = 5;
defaultStore.dispatch(updateTrainStep(newTrainStep));

const state = getState();
expect(state.trainStep).toBe(newTrainStep);
});

it('should handle toggleUsingElectricalProfiles', () => {
defaultStore.dispatch(toggleUsingElectricalProfiles());

let state = getState();
expect(state.usingElectricalProfiles).toBe(false);

defaultStore.dispatch(toggleUsingElectricalProfiles());
state = getState();
expect(state.usingElectricalProfiles).toBe(true);
});

it('should handle updateLabels', () => {
const newLabels = ['A', 'B'];
defaultStore.dispatch(updateLabels(newLabels));
const state = getState();
expect(state.labels).toBe(newLabels);
});

it('should handle updateInitialSpeed', () => {
const newInitialSpeed = 50;
defaultStore.dispatch(updateInitialSpeed(newInitialSpeed));
const state = getState();
expect(state.initialSpeed).toBe(newInitialSpeed);
});

it('should handle updateRollingStockComfort', () => {
const newRollingStockComfort: TrainScheduleBase['comfort'] = 'AIR_CONDITIONING';
defaultStore.dispatch(updateRollingStockComfort(newRollingStockComfort));
const state = getState();
expect(state.rollingStockComfort).toBe(newRollingStockComfort);
});

it('should handle updateStartTime', () => {
const newStartTime = new Date('2024-05-01T11:08:00.000+01:00');
defaultStore.dispatch(updateStartTime(newStartTime));
const state = getState();
expect(state.startTime).toBe(newStartTime);
});
};

export default testTrainSettingsReducer;
2 changes: 2 additions & 0 deletions front/src/reducers/osrdconf/operationalStudiesConf/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type { OsrdConfState } from 'reducers/osrdconf/types';
import { msToKmh } from 'utils/physics';

import { builPowerRestrictionReducer } from './powerRestrictionReducer';
import { buildTrainSettingsReducer } from './trainSettingsReducer';
import { upsertPathStep } from '../helpers';

export type OperationalStudiesConfState = OsrdConfState;
Expand All @@ -18,6 +19,7 @@ export const operationalStudiesConfSlice = createSlice({
reducers: {
...buildCommonConfReducers<OperationalStudiesConfState>(),
...builPowerRestrictionReducer<OperationalStudiesConfState>(),
...buildTrainSettingsReducer(),
selectTrainToEdit(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<TrainScheduleWithDetails>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import type { PayloadAction } from '@reduxjs/toolkit';
import type { Draft } from 'immer';

import type { OsrdConfState } from 'reducers/osrdconf/types';
import type { OperationalStudiesConfState } from '.';

export function buildTrainSettingsReducer() {
return {
updateConstraintDistribution(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['constraintDistribution']>
) {
state.constraintDistribution = action.payload;
},
updateName(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['name']>
) {
state.name = action.payload;
},
updateTrainCount(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['trainCount']>
) {
state.trainCount = action.payload;
},
updateTrainDelta(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OsrdConfState['trainDelta']>
) {
state.trainDelta = action.payload;
},
updateTrainStep(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['trainStep']>
) {
state.trainStep = action.payload;
},
toggleUsingElectricalProfiles(state: Draft<OperationalStudiesConfState>) {
state.usingElectricalProfiles = !state.usingElectricalProfiles;
},
updateLabels(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['labels']>
) {
state.labels = action.payload;
},
updateInitialSpeed(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['initialSpeed']>
) {
state.initialSpeed = action.payload;
},
updateStartTime(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['startTime']>
) {
state.startTime = action.payload;
},
updateRollingStockComfort(
state: Draft<OperationalStudiesConfState>,
action: PayloadAction<OperationalStudiesConfState['rollingStockComfort']>
) {
state.rollingStockComfort = action.payload;
},
};
}
Loading

0 comments on commit 79276e5

Please sign in to comment.