Skip to content

Commit

Permalink
tech: add case for completed mission
Browse files Browse the repository at this point in the history
  • Loading branch information
maximeperrault committed Jan 16, 2025
1 parent 1d392bd commit 4025640
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package fr.gouv.cacem.monitorenv.domain.validators.mission

import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.ActionTargetTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.infraction.InfractionTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionSurveillance.EnvActionSurveillanceEntity
Expand All @@ -20,12 +21,11 @@ class MissionValidator : Validator<MissionEntity> {

override fun validate(mission: MissionEntity) {
logger.info("Validating mission: ${mission.id}")
val isMissionEnded = mission.endDateTimeUtc != null && ZonedDateTime.now().isAfter(mission.endDateTimeUtc)

validateOngoingMission(mission)
validateMission(mission)
}

private fun validateOngoingMission(mission: MissionEntity) {
private fun validateMission(mission: MissionEntity) {
if (mission.startDateTimeUtc.isAfter(mission.endDateTimeUtc)) {
throw BackendUsageException(
BackendUsageErrorCode.UNVALID_PROPERTY,
Expand All @@ -52,13 +52,16 @@ class MissionValidator : Validator<MissionEntity> {
"Le trigramme \"ouvert par\" doit avoir 3 lettres",
)
}
validateEnvAction(mission)
validateEnvActions(mission)
}

private fun validateEnvAction(mission: MissionEntity) {
private fun validateEnvActions(mission: MissionEntity) {
val isMissionEnded =
mission.endDateTimeUtc != null && (mission.endDateTimeUtc?.isAfter(ZonedDateTime.now()) == true)

mission.envActions?.forEach { envAction ->
if (envAction is EnvActionControlEntity) {
validateControl(envAction, mission)
validateControl(envAction, mission, isMissionEnded)
}

if (envAction is EnvActionSurveillanceEntity) {
Expand All @@ -70,9 +73,19 @@ class MissionValidator : Validator<MissionEntity> {
private fun validateControl(
control: EnvActionControlEntity,
mission: MissionEntity,
isMissionEnded: Boolean
) {
validateEnvAction(control, mission)

if (isMissionEnded) {
if (control.vehicleType === null && control.actionTargetType === ActionTargetTypeEnum.VEHICLE) {
throw BackendUsageException(
BackendUsageErrorCode.UNVALID_PROPERTY,
"Le type de véhicule est obligatoire",
)
}
}

val sumOfNbTarget = control.infractions?.sumOf { infraction -> infraction.nbTarget }
if (sumOfNbTarget != null) {
if (control.actionNumberOfControls == null || sumOfNbTarget > control.actionNumberOfControls) {
Expand All @@ -82,6 +95,7 @@ class MissionValidator : Validator<MissionEntity> {
)
}
}

control.infractions?.forEach { infraction ->
if (infraction.infractionType !== InfractionTypeEnum.WAITING && infraction.natinf?.isEmpty() == true) {
throw BackendUsageException(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.actions.fixtures

import com.fasterxml.jackson.databind.ObjectMapper
import fr.gouv.cacem.monitorenv.domain.entities.VehicleTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.ActionCompletionEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.MonitorFishActionTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.ActionTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionControlPlanEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.EnvActionEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.ActionTargetTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.EnvActionControlEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.infraction.AdministrativeResponseEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.infraction.FormalNoticeEnum
Expand Down Expand Up @@ -59,6 +61,8 @@ class EnvActionFixture {
openBy: String = "MPE",
infractions: List<InfractionEntity> = listOf(),
actionNumberOfControls: Int? = infractions.size,
actionTargetTypeEnum: ActionTargetTypeEnum? = null,
vehicleTypeEnum: VehicleTypeEnum? = null,
): EnvActionControlEntity {
return EnvActionControlEntity(
id = UUID.randomUUID(),
Expand All @@ -67,6 +71,8 @@ class EnvActionFixture {
openBy = openBy,
infractions = infractions,
actionNumberOfControls = actionNumberOfControls,
actionTargetType = actionTargetTypeEnum,
vehicleType = vehicleTypeEnum
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.gouv.cacem.monitorenv.domain.validators.mission

import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.ActionTargetTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.envAction.envActionControl.infraction.InfractionTypeEnum
import fr.gouv.cacem.monitorenv.domain.exceptions.BackendUsageException
import fr.gouv.cacem.monitorenv.domain.use_cases.actions.fixtures.EnvActionFixture.Companion.anEnvActionControl
Expand Down Expand Up @@ -161,6 +162,30 @@ class MissionValidatorUTest {
assertThat(assertThrows.message).isEqualTo("Le trigramme \"ouvert par\" doit avoir 3 lettres")
}

@Test
fun `validate should throw an exception if there is a control actionTargetType as VEHICULE without vehiculeType when mission has ended`(
) {
val endDateTimeUtc = ZonedDateTime.now().plusSeconds(1)
val anEnvActionControl = anEnvActionControl(actionTargetTypeEnum = ActionTargetTypeEnum.VEHICLE)
val mission = aMissionEntity(endDateTimeUtc = endDateTimeUtc, envAction = listOf(anEnvActionControl))

val assertThrows = assertThrows(BackendUsageException::class.java) { missionValidator.validate(mission) }
assertThat(assertThrows.message).isEqualTo("Le type de véhicule est obligatoire")
}


@ParameterizedTest
@EnumSource(value = ActionTargetTypeEnum::class, names = ["VEHICLE"], mode = EnumSource.Mode.EXCLUDE)
fun `validate should pass if there is a control actionTargetType as targetType other than VEHICLE without vehiculeType when mission has ended`(
targetType: ActionTargetTypeEnum,
) {
val endDateTimeUtc = ZonedDateTime.now().plusSeconds(1)
val anEnvActionControl = anEnvActionControl(actionTargetTypeEnum = targetType)
val mission = aMissionEntity(endDateTimeUtc = endDateTimeUtc, envAction = listOf(anEnvActionControl))

missionValidator.validate(mission)
}

@Test
fun `validate should throw an exception if there is a surveillance with a start date before mission starting date`() {
val startDateTimeUtc = ZonedDateTime.parse("2020-03-04T00:00:00.000Z")
Expand Down

0 comments on commit 4025640

Please sign in to comment.