tests: ajoute des tests pour la réduction générale mois par mois

pull/3197/head
Alice Dahan 2024-10-25 15:07:16 +02:00 committed by liliced
parent a62f1cda6f
commit 67ac8277c5
5 changed files with 176 additions and 99 deletions

View File

@ -1,89 +1,155 @@
import { checkA11Y, fr } from '../../support/utils'
describe('Réduction générale', { testIsolation: false }, function () {
if (!fr) {
return
describe(
'Simulateur réduction générale',
{ testIsolation: false },
function () {
if (!fr) {
return
}
const inputSelector =
'div[id="simulator-legend"] input[inputmode="numeric"]'
before(function () {
return cy.visit('/simulateurs/réduction-générale')
})
it('should not crash', function () {
cy.contains('Salaire brut')
})
it('should allow to select a company size', function () {
cy.get(inputSelector).first().type('{selectall}2000')
cy.contains('Plus de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('100')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
cy.contains('Moins de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('10')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
})
it('should allow to change time period', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}2000')
cy.contains('Réduction annuelle').click()
cy.get(inputSelector).first().should('have.value', '24000 €')
})
it('should display values for the réduction générale', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}1900')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale-value"]'
).should('include.text', '493,43 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '92,85 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '400,58 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '62,57 €')
})
it('should display a warning for a remuneration too high', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}3000')
cy.get('div[id="simulator-legend"]').should(
'include.text',
'La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.'
)
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '0 €')
})
it('should display remuneration and RGCP month by month', function () {
cy.contains('Réduction annuelle').click()
cy.get(inputSelector).first().type('{selectall}30000')
cy.contains('Réduction mois par mois').click()
cy.contains('Réduction générale mois par mois :')
cy.get(inputSelector)
.should('have.length', 12)
.each(($input) => {
cy.wrap($input).should('have.value', '2500 €')
})
cy.get(
'td[id^="salarié___cotisations___exonérations___réduction_générale-"]'
)
.should('have.length', 12)
.each(($td) => {
cy.wrap($td).should('include.text', '174 €')
})
})
it('should calculate RGCP month by month independently', function () {
cy.contains('Moins de 50 salariés').click()
cy.contains('Réduction mois par mois').click()
cy.get(inputSelector).first().type('{selectall}1900')
cy.get(inputSelector).last().type('{selectall}2000')
cy.get(
'td[id="salarié___cotisations___exonérations___réduction_générale-janvier"]'
).should('include.text', '493,43 €')
cy.get(
'td[id="salarié___cotisations___exonérations___réduction_générale-décembre"]'
).should('include.text', '440,20 €')
})
it('should save remuneration between tabs', function () {
cy.contains('Moins de 50 salariés').click()
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}1900')
cy.contains('Réduction mois par mois').click()
cy.get(inputSelector).first().type('{selectall}2000')
cy.get(inputSelector).last().type('{selectall}2000')
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().should('have.value', '1916,67 €')
cy.contains('Réduction annuelle').click()
cy.get(inputSelector).first().should('have.value', '23000 €')
cy.contains('Réduction mois par mois').click()
cy.get(inputSelector).each(($input, index) => {
let expectedValue = '1900 €'
if (index === 0 || index === 11) {
expectedValue = '2000 €'
}
cy.wrap($input).should('have.value', expectedValue)
})
})
it('should be RGAA compliant', function () {
cy.contains('Réduction mensuelle').click()
checkA11Y()
cy.contains('Réduction annuelle').click()
checkA11Y()
cy.contains('Réduction mois par mois').click()
checkA11Y()
})
}
const inputSelector = 'div[id="simulator-legend"] input[inputmode="numeric"]'
before(function () {
return cy.visit('/simulateurs/réduction-générale')
})
it('should not crash', function () {
cy.contains('Salaire brut')
})
it('should allow to select a company size', function () {
cy.get(inputSelector).first().type('{selectall}2000')
cy.contains('Plus de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('100')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
cy.contains('Moins de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('10')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
})
it('should allow to change time period', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}2000')
cy.contains('Réduction annuelle').click()
cy.get(inputSelector).first().should('have.value', '24000 €')
})
it('should display values for the réduction générale', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}1900')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale-value"]'
).should('include.text', '493,43 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '92,85 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '400,58 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '62,57 €')
})
it('should display a warning for a salary too high', function () {
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}3000')
cy.get('div[id="simulator-legend"]').should(
'include.text',
'La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.'
)
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '0 €')
})
it('should be RGAA compliant', function () {
checkA11Y()
})
})
)

View File

@ -30,6 +30,7 @@ import {
getInitialRéductionGénéraleMoisParMois,
getRéductionGénéraleFromRémunération,
MonthState,
réductionGénéraleDottedName,
reevaluateRéductionGénéraleMoisParMois,
rémunérationBruteDottedName,
} from './utils'
@ -174,9 +175,9 @@ function RéductionGénéraleSimulationGoals({
</Message>
</Condition>
<Condition expression="salarié . cotisations . exonérations . réduction générale >= 0">
<Condition expression={`${réductionGénéraleDottedName} >= 0`}>
<SimulationValue
dottedName="salarié . cotisations . exonérations . réduction générale"
dottedName={réductionGénéraleDottedName}
isInfoMode={true}
round={false}
/>

View File

@ -13,7 +13,11 @@ import { Tooltip } from '@/design-system/tooltip'
import Répartition from './components/Répartition'
import Warnings from './components/Warnings'
import WarningSalaireTrans from './components/WarningSalaireTrans'
import { MonthState, rémunérationBruteDottedName } from './utils'
import {
MonthState,
réductionGénéraleDottedName,
rémunérationBruteDottedName,
} from './utils'
type RémunérationBruteInput = {
unité: string
@ -85,10 +89,7 @@ export default function RéductionGénéraleMoisParMois({
</th>
<th scope="col">
{t('Réduction générale')}
<ExplicableRule
dottedName="salarié . cotisations . exonérations . réduction générale"
light
/>
<ExplicableRule dottedName={réductionGénéraleDottedName} light />
</th>
</tr>
</thead>
@ -113,7 +114,7 @@ export default function RéductionGénéraleMoisParMois({
id={`${rémunérationBruteDottedName.replace(
/\s|\./g,
'_'
)}-${monthIndex}`}
)}-${monthName}`}
aria-label={`${engine.getRule(rémunérationBruteDottedName)
?.title} (${monthName})`}
onChange={(rémunérationBrute?: PublicodesExpression) =>
@ -128,7 +129,12 @@ export default function RéductionGénéraleMoisParMois({
}}
/>
</td>
<td>
<td
id={`${réductionGénéraleDottedName.replace(
/\s|\./g,
'_'
)}-${monthName}`}
>
{data[monthIndex].réductionGénérale ? (
<Tooltip tooltip={tooltip} hasArrow={true}>
<StyledDiv>

View File

@ -7,6 +7,8 @@ import { Li, Ul } from '@/design-system/typography/list'
import { Body } from '@/design-system/typography/paragraphs'
import { Contexte } from '@/domaine/Contexte'
import { réductionGénéraleDottedName } from '../utils'
type Props = {
contexte?: Contexte
}
@ -22,19 +24,19 @@ export default function Répartition({ contexte = {} }: Props) {
<StyledUl>
<StyledLi>
<SimulationValue
dottedName="salarié . cotisations . exonérations . réduction générale . part retraite"
dottedName={`${réductionGénéraleDottedName} . part retraite`}
contexte={contexte}
round={false}
/>
</StyledLi>
<StyledLi>
<SimulationValue
dottedName="salarié . cotisations . exonérations . réduction générale . part Urssaf"
dottedName={`${réductionGénéraleDottedName} . part Urssaf`}
contexte={contexte}
round={false}
/>
<SimulationValue
dottedName="salarié . cotisations . exonérations . réduction générale . part Urssaf . part chômage"
dottedName={`${réductionGénéraleDottedName} . part Urssaf . part chômage`}
label="dont chômage"
contexte={contexte}
round={false}

View File

@ -4,6 +4,8 @@ import Engine from 'publicodes'
// TODO: remplacer "salarié . cotisations . assiette" par "salarié . rémunération . brut"
// lorsqu'elle n'incluera plus les frais professionnels.
export const rémunérationBruteDottedName = 'salarié . cotisations . assiette'
export const réductionGénéraleDottedName =
'salarié . cotisations . exonérations . réduction générale'
export type MonthState = {
rémunérationBrute: number
@ -15,7 +17,7 @@ export const getRéductionGénéraleFromRémunération = (
rémunérationBrute: number
): number => {
const réductionGénérale = engine.evaluate({
valeur: 'salarié . cotisations . exonérations . réduction générale',
valeur: réductionGénéraleDottedName,
unité: '€/mois',
contexte: {
[rémunérationBruteDottedName]: rémunérationBrute,