Skip to content

Commit

Permalink
feature(PublicMissionApi): add filter by controlUnits (#1044)
Browse files Browse the repository at this point in the history
## Description

Ajout d'un filtre par controlUnits sur l'endpoint Missions de l'API
publique.

J'ai choisi de faire le filtre au niveau du UseCase plutot que dans la
query car elle est native, que je ne maitrise pas du tout ce format et
que le temps presse avant que les premiers tests de RapportNav ne
commencent.

Dîtes moi si c'est ok.

----

- [ ] Tests E2E (Cypress)
  • Loading branch information
lwih authored Dec 8, 2023
2 parents 942b9e0 + df1876f commit 1d9a895
Show file tree
Hide file tree
Showing 3 changed files with 226 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ class GetMissions(private val missionRepository: IMissionRepository) {
pageNumber: Int?,
pageSize: Int?,
seaFronts: List<String>?,
controlUnits: List<Int>? = null,
): List<MissionEntity> {
val missions =
var missions: List<MissionEntity> =
missionRepository.findAll(
startedAfter = startedAfterDateTime?.toInstant()
?: ZonedDateTime.now().minusDays(30).toInstant(),
Expand All @@ -49,6 +50,16 @@ class GetMissions(private val missionRepository: IMissionRepository) {
},
)

if (controlUnits != null) {
missions = missions.filter { mission ->
controlUnits.any { unitId ->
mission.controlUnits.any { controlUnit ->
controlUnit.id == unit
}
}
}.toList()
}

logger.info("Found ${missions.size} mission(s)")

return missions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ class ApiMissionsController(
@Parameter(description = "Facades")
@RequestParam(name = "seaFronts", required = false)
seaFronts: List<String>?,
@Parameter(description = "Unités de contrôle")
@RequestParam(name = "controlUnits", required = false)
controlUnits: List<Int>? = null,
): List<MissionDataOutput> {
val missions =
getMissions.execute(
Expand All @@ -68,6 +71,7 @@ class ApiMissionsController(
missionStatuses = missionStatuses,
missionTypes = missionTypes,
seaFronts = seaFronts,
controlUnits = controlUnits,
pageNumber = pageNumber,
pageSize = pageSize,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package fr.gouv.cacem.monitorenv.domain.use_cases.missions

import com.nhaarman.mockitokotlin2.given
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionEntity
import fr.gouv.cacem.monitorenv.domain.repositories.IMissionRepository
import fr.gouv.cacem.monitorenv.domain.entities.controlUnit.LegacyControlUnitEntity
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionTypeEnum
import fr.gouv.cacem.monitorenv.domain.entities.mission.MissionSourceEnum
import java.time.ZonedDateTime
import org.assertj.core.api.Assertions.assertThat
import org.junit.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.mock.mockito.MockBean
import org.springframework.test.context.junit.jupiter.SpringExtension
import com.nhaarman.mockitokotlin2.any

@ExtendWith(SpringExtension::class)
class GetMissionsUTests {
@MockBean
private lateinit var missionRepository: IMissionRepository

private val controlUnit1: LegacyControlUnitEntity = LegacyControlUnitEntity(
id = 1,
administration = "whatever",
isArchived = false,
name = "whatever",
resources = listOf(),
)

private val controlUnit2: LegacyControlUnitEntity = LegacyControlUnitEntity(
id = 2,
administration = "whatever",
isArchived = false,
name = "whatever",
resources = listOf(),
)

private val controlUnit3: LegacyControlUnitEntity = LegacyControlUnitEntity(
id = 3,
administration = "whatever",
isArchived = false,
name = "whatever",
resources = listOf(),
)

private val mission1 =
MissionEntity(
id = 10,
missionTypes = listOf(MissionTypeEnum.SEA),
startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"),
isDeleted = false,
missionSource = MissionSourceEnum.MONITORFISH,
isClosed = false,
hasMissionOrder = false,
isUnderJdp = false,
isGeometryComputedFromControls = false,
controlUnits = listOf(controlUnit1, controlUnit2)
)

private val mission2 =
MissionEntity(
id = 11,
missionTypes = listOf(MissionTypeEnum.SEA),
startDateTimeUtc = ZonedDateTime.parse("2022-01-15T04:50:09Z"),
isDeleted = false,
missionSource = MissionSourceEnum.MONITORFISH,
isClosed = false,
hasMissionOrder = false,
isUnderJdp = false,
isGeometryComputedFromControls = false,
controlUnits = listOf(controlUnit1, controlUnit3)
)

@Test
fun `execute should return all missions when filter for controlUnits is null`() {
given(missionRepository.findAll(
startedAfter = any(),
startedBefore = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
seaFronts = any(),
pageable = any(),
)).willReturn(listOf(mission1, mission2))

val result = GetMissions(missionRepository).execute(
startedAfterDateTime = any(),
startedBeforeDateTime = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
pageNumber = any(),
pageSize = any(),
seaFronts = any(),
controlUnits = null
)

assertThat(result.size).isEqualTo(2)
}

@Test
fun `execute should return all missions when filter for controlUnits is an empty list`() {
given(missionRepository.findAll(
startedAfter = any(),
startedBefore = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
seaFronts = any(),
pageable = any(),
)).willReturn(listOf(mission1, mission2))

val result = GetMissions(missionRepository).execute(
startedAfterDateTime = any(),
startedBeforeDateTime = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
pageNumber = any(),
pageSize = any(),
seaFronts = any(),
controlUnits = listOf()
)

assertThat(result.size).isEqualTo(2)
}

@Test
fun `execute should only one missions when the controlUnits input matches 1 mission`() {
given(missionRepository.findAll(
startedAfter = any(),
startedBefore = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
seaFronts = any(),
pageable = any(),
)).willReturn(listOf(mission1, mission2))

val result = GetMissions(missionRepository).execute(
startedAfterDateTime = any(),
startedBeforeDateTime = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
pageNumber = any(),
pageSize = any(),
seaFronts = any(),
controlUnits = listOf(controlUnit2.id)
)

assertThat(result.size).isEqualTo(1)
assertThat(result.first()).isEqualTo(controlUnit2)
}

@Test
fun `execute should only two missions when the same controlUnits input matches 2 missions`() {
given(missionRepository.findAll(
startedAfter = any(),
startedBefore = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
seaFronts = any(),
pageable = any(),
)).willReturn(listOf(mission1, mission2))

val result = GetMissions(missionRepository).execute(
startedAfterDateTime = any(),
startedBeforeDateTime = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
pageNumber = any(),
pageSize = any(),
seaFronts = any(),
controlUnits = listOf(controlUnit1.id)
)

assertThat(result.size).isEqualTo(2)
}

@Test
fun `execute should return filtered missions matching nultiple controlUnits input`() {
given(missionRepository.findAll(
startedAfter = any(),
startedBefore = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
seaFronts = any(),
pageable = any(),
)).willReturn(listOf(mission1, mission2))

val result = GetMissions(missionRepository).execute(
startedAfterDateTime = any(),
startedBeforeDateTime = any(),
missionSources = any(),
missionTypes = any(),
missionStatuses = any(),
pageNumber = any(),
pageSize = any(),
seaFronts = any(),
controlUnits = listOf(controlUnit2.id, controlUnit3.id)
)

assertThat(result.size).isEqualTo(2)
}

}

0 comments on commit 1d9a895

Please sign in to comment.