Repository: infonl/dimpact-zaakafhandelcomponent
Pull request #2820: fix(TaskService): release assignee from task
Author: login: xiduzo
Created: 2025-03-05T10:49:08Z | Merged: 2025-03-05T19:53:13Z

When no user is present in the update, release the current assignee from the task when set

Solves PZ-5470


Diff:
diff --git a/src/main/kotlin/net/atos/zac/app/task/TaskRestService.kt b/src/main/kotlin/net/atos/zac/app/task/TaskRestService.kt
index a517495ff7..adf381bc59 100644
--- a/src/main/kotlin/net/atos/zac/app/task/TaskRestService.kt
+++ b/src/main/kotlin/net/atos/zac/app/task/TaskRestService.kt
@@ -222,7 +222,7 @@ class TaskRestService @Inject constructor(
     fun assign(restTaskAssignData: RestTaskAssignData) {
         val task = flowableTaskService.readOpenTask(restTaskAssignData.taakId)
         assertPolicy(TaskUtil.isOpen(task) && policyService.readTaakRechten(task).toekennen)
-        taskService.assignTask(
+        taskService.assignOrReleaseTask(
             restTaskAssignData,
             task,
             loggedInUserInstance.get()
diff --git a/src/main/kotlin/net/atos/zac/task/TaskService.kt b/src/main/kotlin/net/atos/zac/task/TaskService.kt
index 4316eb5a33..a0b8919937 100644
--- a/src/main/kotlin/net/atos/zac/task/TaskService.kt
+++ b/src/main/kotlin/net/atos/zac/task/TaskService.kt
@@ -7,9 +7,9 @@ package net.atos.zac.task
 import io.opentelemetry.instrumentation.annotations.SpanAttribute
 import io.opentelemetry.instrumentation.annotations.WithSpan
 import jakarta.inject.Inject
-import net.atos.zac.app.task.converter.RestTaskConverter
 import net.atos.zac.app.task.model.RestTaskAssignData
 import net.atos.zac.app.task.model.RestTaskDistributeData
+import net.atos.zac.app.task.model.RestTaskDistributeTask
 import net.atos.zac.app.task.model.RestTaskReleaseData
 import net.atos.zac.authentication.LoggedInUser
 import net.atos.zac.event.EventingService
@@ -32,47 +32,31 @@ class TaskService @Inject constructor(
     private val flowableTaskService: FlowableTaskService,
     private val indexingService: IndexingService,
     private val eventingService: EventingService,
-    private val restTaskConverter: RestTaskConverter,
 ) {
     companion object {
         private val LOG = Logger.getLogger(TaskService::class.java.name)
     }
 
-    fun assignTask(
+    fun assignOrReleaseTask(
         restTaskAssignData: RestTaskAssignData,
         task: Task,
         loggedInUser: LoggedInUser
     ) {
-        val groupId = restTaskConverter.extractGroupId(task.identityLinks)
-        var changed = false
-        var updatedTask = task
-        restTaskAssignData.behandelaarId?.let {
-            if (groupId != restTaskAssignData.groepId) {
-                flowableTaskService.assignTaskToGroup(
-                    updatedTask,
-                    restTaskAssignData.groepId,
-                    restTaskAssignData.reden
-                )
-                changed = true
-            }
-            if (task.assignee != it) {
-                updatedTask = assignTaskToUser(
-                    taskId = task.id,
-                    assignee = it,
-                    loggedInUser = loggedInUser,
-                    explanation = restTaskAssignData.reden
-                )
-                changed = true
-            }
-        }
-        if (changed) {
-            sendScreenEventsOnTaskChange(updatedTask, restTaskAssignData.zaakUuid)
-            indexingService.indexeerDirect(
-                restTaskAssignData.taakId,
-                ZoekObjectType.TAAK,
-                true
-            )
-        }
+        assignTasks(
+            RestTaskDistributeData(
+                taken = listOf(
+                    RestTaskDistributeTask(
+                        taakId = task.id,
+                        zaakUuid = restTaskAssignData.zaakUuid
+                    )
+                ),
+                groepId = restTaskAssignData.groepId,
+                reden = restTaskAssignData.reden,
+                behandelaarGebruikersnaam = restTaskAssignData.behandelaarId
+            ),
+            loggedInUser,
+            mutableListOf<String>()
+        )
     }
 
     /**
@@ -174,21 +158,21 @@ class TaskService @Inject constructor(
     private fun assignTasks(
         restTaskDistributeData: RestTaskDistributeData,
         loggedInUser: LoggedInUser,
-        succesfullyAssignedTaskIds: MutableList<String>
+        successfullyAssignedTaskIds: MutableList<String>
     ) {
-        restTaskDistributeData.taken.forEach { restTaakVerdelenTaak ->
+        restTaskDistributeData.taken.forEach { restTask ->
             try {
-                flowableTaskService.readOpenTask(restTaakVerdelenTaak.taakId).let { task ->
-                    assignTaskAndOptionallyReleaseFromAssignee(task, restTaskDistributeData, loggedInUser)
-                    sendScreenEventsOnTaskChange(task, restTaakVerdelenTaak.zaakUuid)
+                flowableTaskService.readOpenTask(restTask.taakId).let {
+                    assignTaskAndOptionallyReleaseFromAssignee(it, restTaskDistributeData, loggedInUser)
+                    sendScreenEventsOnTaskChange(it, restTask.zaakUuid)
                 }
-                indexingService.indexeerDirect(restTaakVerdelenTaak.taakId, ZoekObjectType.TAAK, false)
-                succesfullyAssignedTaskIds.add(restTaakVerdelenTaak.taakId)
+                indexingService.indexeerDirect(restTask.taakId, ZoekObjectType.TAAK, false)
+                successfullyAssignedTaskIds.add(restTask.taakId)
             } catch (taskNotFoundException: TaskNotFoundException) {
                 // continue assigning remaining tasks if particular open task could not be found
                 LOG.log(
                     Level.SEVERE,
-                    "No open task with ID '${restTaakVerdelenTaak.taakId}' found while assigning tasks. Skipping task.",
+                    "No open task with ID '${restTask.taakId}' found while assigning tasks. Skipping task.",
                     taskNotFoundException
                 )
             }
@@ -233,13 +217,13 @@ class TaskService @Inject constructor(
         restTaskReleaseData.taken.forEach {
             try {
                 flowableTaskService.readOpenTask(it.taakId).let { task ->
-                    releaseTask(
+                    val updatedTask = releaseTask(
                         task = task,
                         loggedInUser = loggedInUser,
                         reden = restTaskReleaseData.reden
                     )
                     indexingService.indexeerDirect(task.id, ZoekObjectType.TAAK, false)
-                    sendScreenEventsOnTaskChange(task, it.zaakUuid)
+                    sendScreenEventsOnTaskChange(updatedTask, it.zaakUuid)
                     taskIds.add(task.id)
                 }
             } catch (taskNotFoundException: TaskNotFoundException) {
@@ -256,15 +240,13 @@ class TaskService @Inject constructor(
         task: Task,
         loggedInUser: LoggedInUser,
         reden: String?
-    ) {
-        flowableTaskService.releaseTask(task, reden).run {
-            eventingService.send(
-                SignaleringEventUtil.event(
-                    SignaleringType.Type.TAAK_OP_NAAM,
-                    this,
-                    loggedInUser
-                )
+    ) = flowableTaskService.releaseTask(task, reden).also {
+        eventingService.send(
+            SignaleringEventUtil.event(
+                SignaleringType.Type.TAAK_OP_NAAM,
+                it,
+                loggedInUser
             )
-        }
+        )
     }
 }
diff --git a/src/test/kotlin/net/atos/zac/app/task/TaskRestServiceTest.kt b/src/test/kotlin/net/atos/zac/app/task/TaskRestServiceTest.kt
index dfec82fe32..7dfaef2d64 100644
--- a/src/test/kotlin/net/atos/zac/app/task/TaskRestServiceTest.kt
+++ b/src/test/kotlin/net/atos/zac/app/task/TaskRestServiceTest.kt
@@ -126,7 +126,7 @@ class TaskRestServiceTest : BehaviorSpec({
         every { getTaakStatus(task) } returns TaakStatus.NIET_TOEGEKEND
         every { task.assignee } returns ""
         every {
-            taskService.assignTask(
+            taskService.assignOrReleaseTask(
                 restTaakToekennenGegevens,
                 task,
                 loggedInUser
@@ -142,7 +142,7 @@ class TaskRestServiceTest : BehaviorSpec({
                 "the task is correctly assigned"
             ) {
                 verify(exactly = 1) {
-                    taskService.assignTask(
+                    taskService.assignOrReleaseTask(
                         restTaakToekennenGegevens,
                         task,
                         loggedInUser
diff --git a/src/test/kotlin/net/atos/zac/app/task/model/TaskRestFixtures.kt b/src/test/kotlin/net/atos/zac/app/task/model/TaskRestFixtures.kt
index 0e8da7fa1b..532d26bf65 100644
--- a/src/test/kotlin/net/atos/zac/app/task/model/TaskRestFixtures.kt
+++ b/src/test/kotlin/net/atos/zac/app/task/model/TaskRestFixtures.kt
@@ -42,7 +42,7 @@ fun createRestTaskAssignData(
     taakId: String = "dummyTaakId",
     zaakUuid: UUID = UUID.randomUUID(),
     groepId: String = "dummyGroepId",
-    behandelaarId: String = "dummyBehandelaarId",
+    behandelaarId: String? = "dummyBehandelaarId",
     reden: String = "dummyReden"
 ) = RestTaskAssignData(
     taakId = taakId,
diff --git a/src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt b/src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt
index f1054ac2c8..22581345a1 100644
--- a/src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt
+++ b/src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt
@@ -17,7 +17,6 @@ import io.mockk.mockk
 import io.mockk.runs
 import io.mockk.slot
 import io.mockk.verify
-import net.atos.zac.app.task.converter.RestTaskConverter
 import net.atos.zac.app.task.model.createRestTaskAssignData
 import net.atos.zac.app.task.model.createRestTaskDistributeData
 import net.atos.zac.app.task.model.createRestTaskDistributeTask
@@ -32,14 +31,12 @@ import net.atos.zac.websocket.event.ScreenEvent
 import net.atos.zac.websocket.event.ScreenEventType
 import net.atos.zac.zoeken.IndexingService
 import net.atos.zac.zoeken.model.zoekobject.ZoekObjectType
-import org.flowable.identitylink.api.IdentityLinkInfo
 import org.flowable.task.api.Task
 
 class TaskServiceTest : BehaviorSpec({
     val flowableTaskService = mockk<FlowableTaskService>()
     val indexingService = mockk<IndexingService>()
     val eventingService = mockk<EventingService>()
-    val restTaskConverter = mockk<RestTaskConverter>()
     val loggedInUser = mockk<LoggedInUser>()
     val task1 = mockk<Task>()
     val task2 = mockk<Task>()
@@ -47,7 +44,6 @@ class TaskServiceTest : BehaviorSpec({
         flowableTaskService = flowableTaskService,
         indexingService = indexingService,
         eventingService = eventingService,
-        restTaskConverter = restTaskConverter,
     )
     val taskId1 = "dummyTaskId1"
     val taskId2 = "dummyTaskId2"
@@ -57,22 +53,14 @@ class TaskServiceTest : BehaviorSpec({
     }
 
     Given("A task that has not yet been assigned to a specific group and user") {
-        val restTaakToekennenGegevens = createRestTaskAssignData()
         val taskId = "dummyTaskId"
+        val restTaakToekennenGegevens = createRestTaskAssignData(taakId = taskId, behandelaarId = null)
         val task = mockk<Task>()
-        val identityLinks = mutableListOf<IdentityLinkInfo>()
         val updatedTaskAfterAssigningGroup = mockk<Task>()
-        val updatedTaskAfterAssigningUser = mockk<Task>()
-        val groupId = "dummyCurrentGroupId"
-        val taakOpNaamSignaleringEventSlot = slot<SignaleringEvent<String>>()
         val screenEventSlot = mutableListOf<ScreenEvent>()
 
-        every { loggedInUser.id } returns "dummyLoggedInUserId"
-        every { task.assignee } returns "dummyCurrentAssignee"
         every { task.id } returns taskId
-        every { task.identityLinks } returns identityLinks
-        every { updatedTaskAfterAssigningUser.id } returns taskId
-        every { restTaskConverter.extractGroupId(identityLinks) } returns groupId
+        every { task.assignee } returns null
         every {
             flowableTaskService.assignTaskToGroup(
                 task,
@@ -80,33 +68,34 @@ class TaskServiceTest : BehaviorSpec({
                 restTaakToekennenGegevens.reden
             )
         } returns updatedTaskAfterAssigningGroup
-        every {
-            flowableTaskService.assignTaskToUser(
-                taskId,
-                restTaakToekennenGegevens.behandelaarId,
-                restTaakToekennenGegevens.reden
-            )
-        } returns updatedTaskAfterAssigningUser
-        every { eventingService.send(capture(taakOpNaamSignaleringEventSlot)) } just runs
+        every { flowableTaskService.readOpenTask(taskId) } returns task
         every { eventingService.send(capture(screenEventSlot)) } just runs
-        every { indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, true) } just runs
+        every { indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, any()) } returns Unit
 
         When("the 'assign task' function is called with REST taak toekennen gegevens with a group and WITHOUT a user") {
-            taskService.assignTask(
+            taskService.assignOrReleaseTask(
                 restTaakToekennenGegevens,
                 task,
                 loggedInUser
             )
-            Then("the tasks are assigned to the group and user") {
+
+            Then("the task is assigned to the group") {
                 verify(exactly = 1) {
                     flowableTaskService.assignTaskToGroup(
                         task,
                         restTaakToekennenGegevens.groepId,
                         restTaakToekennenGegevens.reden
                     )
-                    flowableTaskService.assignTaskToUser(any(), any(), any())
-                    indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, true)
                 }
+            }
+
+            And("the indexing service is called") {
+                verify(exactly = 1) {
+                    indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, false)
+                }
+            }
+
+            And("the correct screen events should be created") {
                 screenEventSlot.size shouldBe 2
                 screenEventSlot.map { it.objectType } shouldContainExactlyInAnyOrder listOf(
                     ScreenEventType.TAAK,
@@ -118,6 +107,50 @@ class TaskServiceTest : BehaviorSpec({
             }
         }
     }
+
+    Given("A task has already been assigned to a user") {
+        val taskId = "dummyTaskId"
+        val restTaakToekennenGegevens = createRestTaskAssignData(behandelaarId = null, taakId = taskId)
+        val task = mockk<Task>()
+        val updatedTaskAfterAssigningUser = mockk<Task>()
+        val taakOpNaamSignaleringEventSlot = slot<SignaleringEvent<String>>()
+        val screenEventSlot = mutableListOf<ScreenEvent>()
+
+        every { loggedInUser.id } returns "dummyLoggedInUserId"
+        every { task.assignee } returns "dummyCurrentAssignee"
+        every { task.id } returns taskId
+        every { updatedTaskAfterAssigningUser.id } returns taskId
+        every {
+            flowableTaskService.releaseTask(
+                task,
+                restTaakToekennenGegevens.reden
+            )
+        } returns updatedTaskAfterAssigningUser
+        every { eventingService.send(capture(taakOpNaamSignaleringEventSlot)) } just runs
+        every { eventingService.send(capture(screenEventSlot)) } just runs
+        every { indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, any()) } returns Unit
+        every { flowableTaskService.readOpenTask(taskId) } returns task
+        every {
+            flowableTaskService.assignTaskToGroup(task, restTaakToekennenGegevens.groepId, restTaakToekennenGegevens.reden)
+        } returns task
+
+        When("the 'assign task' function is called with REST taak toekennen gegevens with a group and WITHOUT a user") {
+            taskService.assignOrReleaseTask(restTaakToekennenGegevens, task, loggedInUser)
+
+            Then("the task is released") {
+                verify(exactly = 1) {
+                    flowableTaskService.releaseTask(task, restTaakToekennenGegevens.reden)
+                }
+            }
+
+            And("The indexing service is called") {
+                verify(exactly = 1) {
+                    indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, false)
+                }
+            }
+        }
+    }
+
     Given("Two tasks that have not yet been assigned to a specific group and user") {
         val restTaakVerdelenTaken = listOf(
             createRestTaskDistributeTask(


Reviews:
user: login: edgarvonk
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-05T13:53:20Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T15:08:44Z
user: login: edgarvonk
body: nice
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-05T19:41:46Z

Review comments:
diff_hunk: @@ -64,6 +64,11 @@ class TaskService @Inject constructor(
                 )
                 changed = true
             }
+        } ?: run {
path: src/main/kotlin/net/atos/zac/task/TaskService.kt
user: login: edgarvonk
body: ```suggestion
        } ?: {
```

I don't think `run` or any other scope function really adds any value here?
created_at: 2025-03-05T13:42:39Z
author_association: MEMBER
diff_hunk: @@ -64,6 +64,11 @@ class TaskService @Inject constructor(
                 )
                 changed = true
             }
+        } ?: run {
+            if (task.assignee != null) {
path: src/main/kotlin/net/atos/zac/task/TaskService.kt
user: login: edgarvonk
body: ```suggestion
            task.assignee?.run {
```
created_at: 2025-03-05T13:44:11Z
author_association: MEMBER
diff_hunk: @@ -256,15 +261,13 @@ class TaskService @Inject constructor(
         task: Task,
         loggedInUser: LoggedInUser,
         reden: String?
-    ) {
-        flowableTaskService.releaseTask(task, reden).run {
-            eventingService.send(
-                SignaleringEventUtil.event(
-                    SignaleringType.Type.TAAK_OP_NAAM,
-                    this,
-                    loggedInUser
-                )
+    ) = flowableTaskService.releaseTask(task, reden).apply {
path: src/main/kotlin/net/atos/zac/task/TaskService.kt
user: login: edgarvonk
body: ```suggestion
    ) = flowableTaskService.releaseTask(task, reden).also {
```

I think this is a typical use case for `also` because sending the event is sort of a side event. But yeah, quite hard to determine when to use which Kotlin scope function for sure..
created_at: 2025-03-05T13:50:48Z
author_association: MEMBER
diff_hunk: @@ -92,7 +92,7 @@ class TaskServiceTest : BehaviorSpec({
         every { indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, true) } just runs
 
         When("the 'assign task' function is called with REST taak toekennen gegevens with a group and WITHOUT a user") {
path: src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt
user: login: edgarvonk
body: `WITHOUT` is now incorrect or not? Is it ok that this test has been changed this way?
created_at: 2025-03-05T13:53:15Z
author_association: MEMBER
diff_hunk: @@ -92,7 +92,7 @@ class TaskServiceTest : BehaviorSpec({
         every { indexingService.indexeerDirect(restTaakToekennenGegevens.taakId, ZoekObjectType.TAAK, true) } just runs
 
         When("the 'assign task' function is called with REST taak toekennen gegevens with a group and WITHOUT a user") {
path: src/test/kotlin/net/atos/zac/task/TaskServiceTest.kt
user: login: xiduzo
body: looking deeper in the code there was already functionality for this. I now call this method instead of duplicating the logic
created_at: 2025-03-05T15:08:43Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-05T11:00:07Z
body: ## unit-test-results
 86 files  ±0  125 suites  ±0   1m 50s ⏱️ -1s
485 tests +1  484 ✅ +1  1 💤 ±0  0 ❌ ±0 
592 runs  +1  590 ✅ +1  2 💤 ±0  0 ❌ ±0 

Results for commit 57efb271. ± Comparison against base commit 61005947.

<details>
  <summary>This pull request <b>removes</b> 1 and <b>adds</b> 2 tests. <i>Note that renamed tests count towards both.</i></summary>

```
net.atos.zac.task.TaskServiceTest ‑ Then: the tasks are assigned to the group and user
```

```
net.atos.zac.task.TaskServiceTest ‑ Then: the task is assigned to the group
net.atos.zac.task.TaskServiceTest ‑ Then: the task is released
```
</details>

[test-results]:data:application/gzip;base64,H4sIAB51yGcC/02Myw6DIBBFf8Ww7gKog9qfMQyPhFSl4bFq+u8Fq9TlOXfmvIl1i4nk0Y3i1pGYXdqJcSioc5DJ+a0KRosoY6pzP8JJc8xK7ar/q6d71Z8mrHRLES0xmxB8OEzIW23CxA84kzDRZn7FdnEJ7nztKb+uLhUgMBiLfGADA23FXVNEjpajnIygSulRMCbQAPl8ASGwzGwIAQAA

:recycle: This comment has been updated with latest results.
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-05T11:03:53Z
body: ## integration-test-results
 31 files  ±0   31 suites  ±0   41s ⏱️ -1s
114 tests ±0  114 ✅ ±0  0 💤 ±0  0 ❌ ±0 
127 runs  ±0  127 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 57efb271. ± Comparison against base commit 61005947.

[test-results]:data:application/gzip;base64,H4sIANt2yGcC/13MSw7CIBSF4a00jB1waQF1M4ZncmNbDIVR496lpLbo8PtPclbicXQLuXc9XDqyZEynbI4qYZiLh81lStsIMHz1WLIx/+mJr5LoEbzC8Se4GEPcS8xz/WRyx3HZlPOxujmsbv9MmCZMBYRL5zWTIIFbL3pLtWbaM61uTlBj7FUACO04eX8AFLtnggYBAAA=

:recycle: This comment has been updated with latest results.
author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-03-05T11:04:23Z
body: ## [Codecov](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/2820?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 43.54%. Comparing base [(`6100594`)](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/commit/61005947c9c8bc638416715878a2f42202d9c554?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) to head [(`57efb27`)](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/commit/57efb271715df63d0bb2bf2ba9e60ccd86116be5?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).
> Report is 2 commits behind head on main.

:white_check_mark: All tests successful. No failed tests found.

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##               main    #2820      +/-   ##
============================================
- Coverage     43.55%   43.54%   -0.01%     
- Complexity     3490     3491       +1     
============================================
  Files          1335     1335              
  Lines         32321    32307      -14     
  Branches       3091     3026      -65     
============================================
- Hits          14078    14069       -9     
- Misses        17028    17420     +392     
+ Partials       1215      818     -397     
```

| [Flag](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/2820/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | Coverage Δ | |
|---|---|---|
| [integrationtests](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/2820/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | `51.45% <51.85%> (+0.02%)` | :arrow_up: |
| [unittests](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/2820/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | `29.68% <100.00%> (-0.02%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/2820?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).

<details><summary>🚀 New features to boost your workflow: </summary>

- 📦 [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE