Skip to content

Commit

Permalink
legger til tester for timer og minutter/desimaler conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
vebnor committed Nov 1, 2023
1 parent f31864d commit 6184d7f
Show file tree
Hide file tree
Showing 5 changed files with 227 additions and 13 deletions.
37 changes: 32 additions & 5 deletions cypress/e2e/pleiepenger/PleiepengerPunsj.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,36 @@ describe('Pleiepenger punsj', () => {
cy.findByText(/10 dager registrert/i).should('exist');
});

// sjekke at journalpostnummer fra flere saker vises
// sjekk av validering og feilmeldinger på alle felter
// sjekk at man ikke får sende inn dersom man har valideringsfeil
// sjekk at alle input-felter fungerer og oppdaterer state?
// sjekke at eksisterende søknadsperioder vises?
it('kan bytte bytte mellom timer og minutter og desimaler i arbeidstid', () => {
cy.get('.soknadsperiodecontainer').within(() => {
cy.findByLabelText(/Fra og med/i)
.should('exist')
.type('08.11.2021');
cy.findByLabelText(/Til og med/i)
.should('exist')
.type('11.11.2021');
});

cy.findByRole('button', { name: /Arbeidsforhold og arbeidstid i søknadsperioden/i }).click();
cy.findByText(/Arbeidstaker/i).click();
cy.findByRole('button', { name: /Registrer arbeidstid for en lengre periode/i }).click();

cy.get('.ReactModalPortal').within(() => {
cy.findAllByLabelText('Timer').eq(0).clear().type(7);
cy.findAllByLabelText('Minutter').eq(0).clear().type(30);
cy.findAllByLabelText('Timer').eq(1).clear().type(2);
cy.findByRole('radio', { name: /Desimaltall/i }).click();
cy.findByLabelText('Normal arbeidstid').should('have.value', '7.5');
cy.findByLabelText('Faktisk arbeidstid').should('have.value', '2');
cy.findByLabelText('Normal arbeidstid').clear().type(5.75);
cy.findByLabelText('Faktisk arbeidstid').clear().type(4);
cy.findByRole('radio', { name: /Timer og minutter/i }).click();
cy.findAllByLabelText('Timer').eq(0).should('have.value', '5');
cy.findAllByLabelText('Minutter').eq(0).should('have.value', '45');
cy.findAllByLabelText('Timer').eq(1).should('have.value', '4');
cy.findByRole('button', { name: /Lagre/i }).click();
});
cy.findByRole('button', { name: /vis mer/i }).click();
cy.findByText(/4 dager registrert/i).should('exist');
});
});
11 changes: 4 additions & 7 deletions src/app/components/timefoering/TimerMedDesimaler.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { uniqueId } from 'lodash';
import { Input } from 'nav-frontend-skjema';
import React from 'react';

import { Detail, ErrorMessage, Label } from '@navikt/ds-react';
import { ErrorMessage, Label } from '@navikt/ds-react';

import './timerOgMinutter.less';

Expand All @@ -23,7 +23,9 @@ const TimerMedDesimaler = ({ label, onChange, onBlur, value, error }: OwnProps)
return (
<div className="timer-og-minutter min-w-[8rem]">
<div>
<Label size="small">{label}</Label>
<Label size="small" htmlFor={timerId}>
{label}
</Label>
</div>
<div className="tid-container">
<div className="input-row">
Expand All @@ -39,11 +41,6 @@ const TimerMedDesimaler = ({ label, onChange, onBlur, value, error }: OwnProps)
onBlur={onBlur}
feil={!!error}
/>
<div>
<label htmlFor={timerId} className="sr-only">
<Detail>Timer</Detail>
</label>
</div>
</div>
</div>
{error && <ErrorMessage size="small">{error}</ErrorMessage>}
Expand Down
2 changes: 1 addition & 1 deletion src/app/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ export const getModiaPath = (fødselsnummer?: string) => {
};

export function timerOgMinutterTilTimerMedDesimaler({ timer, minutter }: { timer: string; minutter: string }): string {
const totalMinutes = parseInt(timer, 10) * 60 + parseInt(minutter, 10);
const totalMinutes = parseInt(timer || '0', 10) * 60 + parseInt(minutter || '0', 10);
const timerOgDesimaler = totalMinutes / 60;
if (Number.isNaN(timerOgDesimaler)) {
return '0';
Expand Down
105 changes: 105 additions & 0 deletions src/test/components/skjema/FaktiskOgNormalTid.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import React from 'react';
import userEvent from '@testing-library/user-event';
import { renderWithIntl } from '../../testUtils';
import FaktiskOgNormalTid from '../../../app/components/timefoering/FaktiskOgNormalTid';
import { waitFor } from '@testing-library/react';

describe('FaktiskOgNormalTid', () => {
const mockLagre = jest.fn();
const mockToggleModal = jest.fn();
const mockClearSelectedDates = jest.fn();

it('renderWithIntls without crashing', () => {
renderWithIntl(<FaktiskOgNormalTid lagre={mockLagre} toggleModal={mockToggleModal} selectedDates={[]} />);
});

it('updates value when input is changed', async () => {
const { getAllByLabelText } = renderWithIntl(
<FaktiskOgNormalTid lagre={mockLagre} toggleModal={mockToggleModal} selectedDates={[]} />,
);
const input = getAllByLabelText('Timer')[0];
await userEvent.type(input, '7');

expect(input.value).toBe('7');
});

it('toggles time format and converts time correctly', async () => {
const { getByLabelText, getByText, getAllByLabelText } = renderWithIntl(
<FaktiskOgNormalTid
lagre={mockLagre}
toggleModal={mockToggleModal}
selectedDates={[]}
clearSelectedDates={mockClearSelectedDates}
/>,
);
// Initialize the time
const normalArbeidstidTimer = getAllByLabelText('Timer')[0];
const normalArbeidstidMinutter = getAllByLabelText('Minutter')[0];
await userEvent.type(normalArbeidstidTimer, '2');
await userEvent.type(normalArbeidstidMinutter, '30');

// Toggle to decimal format
const desimaltallToggle = getByText('Desimaltall');
await userEvent.click(desimaltallToggle);

// Verify time has been converted to decimal
const normalArbeidstidDesimaler = getByLabelText('Normal arbeidstid');
expect(normalArbeidstidDesimaler.value).toBe('2.5');

// Toggle back to hours and minutes format
const timerOgMinutterToggle = getByText('Timer og minutter');
await userEvent.click(timerOgMinutterToggle);

// Verify time has been converted back to hours and minutes
expect(normalArbeidstidTimer.value).toBe('2');
expect(normalArbeidstidMinutter.value).toBe('30');
});

it('converts correctly after changing numbers', async () => {
const { getByLabelText, getByRole, getAllByLabelText } = renderWithIntl(
<FaktiskOgNormalTid
lagre={mockLagre}
toggleModal={mockToggleModal}
selectedDates={[]}
clearSelectedDates={mockClearSelectedDates}
/>,
);

// Initialize the time
const normalArbeidstidTimer = getAllByLabelText('Timer')[0];
const normalArbeidstidMinutter = getAllByLabelText('Minutter')[0];
await userEvent.type(normalArbeidstidTimer, '3');
await userEvent.type(normalArbeidstidMinutter, '45');

// Toggle to decimal format
const desimaltallToggle = getByRole('radio', { name: /Desimaltall/i });
await userEvent.click(desimaltallToggle);

// Check that time has been converted to decimal format
const normalArbeidstidDesimaler = getByLabelText('Normal arbeidstid');
expect(normalArbeidstidDesimaler.value).toBe('3.75');

await userEvent.clear(normalArbeidstidDesimaler);
await userEvent.type(normalArbeidstidDesimaler, '4');

// Verify time has been converted to decimal format
const normalArbeidstidDesimalerAfter = getByLabelText('Normal arbeidstid');

await waitFor(() => {
expect(normalArbeidstidDesimalerAfter.value).toBe('4');
});
// Toggle back to hours and minutes format
const timerOgMinutterToggle = getByRole('radio', { name: /Timer og minutter/i });
await userEvent.click(timerOgMinutterToggle);

// Verify time has been converted back to hours and minutes

const normalArbeidstidTimer2 = getAllByLabelText('Timer')[0];
const normalArbeidstidMinutter2 = getAllByLabelText('Minutter')[0];

await waitFor(() => {
expect(normalArbeidstidTimer2.value).toBe('4');
expect(normalArbeidstidMinutter2.value).toBe('0');
});
});
});
85 changes: 85 additions & 0 deletions src/test/components/skjema/TimerOgMinutter.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import TimerOgMinutter from '../../../app/components/timefoering/TimerOgMinutter';

describe('TimerOgMinutter', () => {
const mockOnChangeTimer = jest.fn();
const mockOnChangeMinutter = jest.fn();
const mockOnBlur = jest.fn();

it('renders without crashing', () => {
render(
<TimerOgMinutter
label="Test Label"
onChangeTimer={mockOnChangeTimer}
onChangeMinutter={mockOnChangeMinutter}
onBlur={mockOnBlur}
timer=""
minutter=""
/>,
);
});

it('calls onChangeTimer when timer input is changed', () => {
const { getByLabelText } = render(
<TimerOgMinutter
label="Test Label"
onChangeTimer={mockOnChangeTimer}
onChangeMinutter={mockOnChangeMinutter}
onBlur={mockOnBlur}
timer=""
minutter=""
/>,
);
const input = getByLabelText('Timer');
fireEvent.change(input, { target: { value: '7' } });
expect(mockOnChangeTimer).toHaveBeenCalledWith('7');
});

it('calls onChangeMinutter when minutter input is changed', () => {
const { getByLabelText } = render(
<TimerOgMinutter
label="Test Label"
onChangeTimer={mockOnChangeTimer}
onChangeMinutter={mockOnChangeMinutter}
onBlur={mockOnBlur}
timer=""
minutter=""
/>,
);
const input = getByLabelText('Minutter');
fireEvent.change(input, { target: { value: '30' } });
expect(mockOnChangeMinutter).toHaveBeenCalledWith('30');
});

it('calls onBlur when input loses focus', () => {
const { getByLabelText } = render(
<TimerOgMinutter
label="Test Label"
onChangeTimer={mockOnChangeTimer}
onChangeMinutter={mockOnChangeMinutter}
onBlur={mockOnBlur}
timer=""
minutter=""
/>,
);
const input = getByLabelText('Timer');
fireEvent.blur(input);
expect(mockOnBlur).toHaveBeenCalled();
});

it('displays error message when error prop is provided', () => {
const { getByText } = render(
<TimerOgMinutter
label="Test Label"
onChangeTimer={mockOnChangeTimer}
onChangeMinutter={mockOnChangeMinutter}
onBlur={mockOnBlur}
timer=""
minutter=""
error="Test error message"
/>,
);
expect(getByText('Test error message')).toBeInTheDocument();
});
});

0 comments on commit 6184d7f

Please sign in to comment.