diff --git a/api/pom.xml b/api/pom.xml index 34d69bd94f..a3a38780a9 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -69,7 +69,7 @@ org.openapitools openapi-generator-maven-plugin - 7.17.0 + 7.21.0 generate-api-v2 diff --git a/api/src/main/openapi/openapi.yaml b/api/src/main/openapi/openapi.yaml index 077e776e4f..c0e5eaf6fc 100644 --- a/api/src/main/openapi/openapi.yaml +++ b/api/src/main/openapi/openapi.yaml @@ -133,8 +133,8 @@ paths: $ref: "./paths/metrics_vulnerabilities.yaml" /projects/{uuid}/advisories: $ref: "./paths/projects__uuid__advisories.yaml" - /projects/{projectUuid}/advisories/{advisoryId}/findings: - $ref: "./paths/projects__projectUuid__advisories__advisoryId__findings.yaml" + /projects/{uuid}/advisories/{advisoryId}/findings: + $ref: "./paths/projects__uuid__advisories__advisoryId__findings.yaml" /projects/{uuid}/clone: $ref: "./paths/projects__uuid__clone.yaml" /projects/{uuid}/components: diff --git a/api/src/main/openapi/paths/projects__uuid__advisories.yaml b/api/src/main/openapi/paths/projects__uuid__advisories.yaml index de38b58139..9aa12dcfa5 100644 --- a/api/src/main/openapi/paths/projects__uuid__advisories.yaml +++ b/api/src/main/openapi/paths/projects__uuid__advisories.yaml @@ -22,7 +22,7 @@ get: Requires the `VIEW_VULNERABILITY` permission. tags: - - Advisories + - Projects parameters: - name: uuid in: path diff --git a/api/src/main/openapi/paths/projects__projectUuid__advisories__advisoryId__findings.yaml b/api/src/main/openapi/paths/projects__uuid__advisories__advisoryId__findings.yaml similarity index 97% rename from api/src/main/openapi/paths/projects__projectUuid__advisories__advisoryId__findings.yaml rename to api/src/main/openapi/paths/projects__uuid__advisories__advisoryId__findings.yaml index 7c220fb0ca..cfd4a500ce 100644 --- a/api/src/main/openapi/paths/projects__projectUuid__advisories__advisoryId__findings.yaml +++ b/api/src/main/openapi/paths/projects__uuid__advisories__advisoryId__findings.yaml @@ -19,9 +19,9 @@ get: summary: List findings by project and advisory description: Requires permission VIEW_VULNERABILITY tags: - - Advisories + - Projects parameters: - - name: projectUuid + - name: uuid in: path description: The UUID of the project required: true diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/AdvisoriesResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/AdvisoriesResource.java index 490895c931..2acf4893f1 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/AdvisoriesResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/AdvisoriesResource.java @@ -21,15 +21,12 @@ import alpine.server.auth.PermissionRequired; import io.csaf.retrieval.RetrievedDocument; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.AdvisoriesApi; import org.dependencytrack.api.v2.model.GetAdvisoryResponse; import org.dependencytrack.api.v2.model.ListAdvisoriesResponse; import org.dependencytrack.api.v2.model.ListAdvisoriesResponseItem; -import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponse; -import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponseItem; -import org.dependencytrack.api.v2.model.ListProjectAdvisoryFindingsResponseItem; import org.dependencytrack.auth.Permissions; import org.dependencytrack.common.pagination.Page; import org.dependencytrack.csaf.CsafModelConverter; @@ -39,9 +36,6 @@ import org.dependencytrack.persistence.jdbi.AdvisoryDao; import org.dependencytrack.persistence.jdbi.AdvisoryDao.AdvisoryDetailRow; import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListAdvisoriesRow; -import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListProjectAdvisoriesRow; -import org.dependencytrack.persistence.jdbi.ProjectDao; -import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesForProjectQuery; import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesQuery; import org.dependencytrack.resources.AbstractApiResource; import org.owasp.security.logging.SecurityMarkers; @@ -54,7 +48,6 @@ import java.io.UncheckedIOException; import java.time.Instant; import java.util.HashSet; -import java.util.List; import java.util.UUID; import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction; @@ -67,7 +60,7 @@ * @author Christian Banse * @since 5.7.0 */ -@Path("/") +@Provider public class AdvisoriesResource extends AbstractApiResource implements AdvisoriesApi { private static final Logger LOGGER = LoggerFactory.getLogger(AdvisoriesResource.class); @@ -252,78 +245,4 @@ public Response getAdvisoryById(UUID id) { return Response.ok(response).build(); } - @Override - @PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY) - public Response listAdvisoriesForProject(UUID projectUuid, String pageToken, Integer limit) { - final Page projectAdvisories = - inJdbiTransaction(getAlpineRequest(), handle -> { - requireProjectAccess(handle, projectUuid); - - final long projectId = handle.attach(ProjectDao.class).getProjectId(projectUuid); - - return handle.attach(AdvisoryDao.class).listForProject( - new ListAdvisoriesForProjectQuery(projectId) - .withPageToken(pageToken) - .withLimit(limit)); - }); - - final var responseItems = projectAdvisories.items().stream() - .map( - advisory -> ListProjectAdvisoriesResponseItem.builder() - .id(advisory.id()) - .publisher(advisory.publisher()) - .name(advisory.name()) - .version(advisory.version()) - .url(advisory.url()) - .title(advisory.title()) - .format(advisory.format()) - .seenAt(advisory.seenAt() != null - ? advisory.seenAt().toEpochMilli() - : null) - .lastFetched(advisory.lastFetched() != null - ? advisory.lastFetched().toEpochMilli() - : null) - .findingsCount(advisory.findingsCount()) - .build()) - .toList(); - - final var response = ListProjectAdvisoriesResponse.builder() - .items(responseItems) - .nextPageToken(projectAdvisories.nextPageToken()) - .total(convertTotalCount(projectAdvisories.totalCount())) - .build(); - - return Response.ok(response).build(); - } - - // TODO: What is the purpose of this endpoint? Do we really need it? - // Can we include this in a more general /findings endpoint and add a filter option - // for advisories, e.g. `/findings?project_uuid=foo&advisory_id=bar`? - @Override - @PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY) - public Response getFindingsByProjectAdvisory(UUID projectUuid, UUID advisoryId) { - return inJdbiTransaction(getAlpineRequest(), handle -> { - requireProjectAccess(handle, projectUuid); - - final long projectId = handle.attach(ProjectDao.class).getProjectId(projectUuid); - - List advisoryRows = handle.attach(AdvisoryDao.class) - .getFindingsByProjectAdvisory(projectId, advisoryId); - final long totalCount = advisoryRows.size(); - - final List responseItems = advisoryRows.stream() - .map( - row -> ListProjectAdvisoryFindingsResponseItem.builder() - .name(row.name()) - .confidence((int) row.confidence()) - .desc(row.desc()) - .group(row.group()) - .version(row.version()) - .componentUuid(UUID.fromString(row.componentUuid())) - .build()) - .toList(); - - return Response.ok(responseItems).header(TOTAL_COUNT_HEADER, totalCount).build(); - }); - } } diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/ComponentsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/ComponentsResource.java index 752eac737a..bde07eb6e3 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/ComponentsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/ComponentsResource.java @@ -22,10 +22,10 @@ import jakarta.ws.rs.ClientErrorException; import jakarta.ws.rs.NotAuthorizedException; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.ext.Provider; import org.apache.commons.lang3.StringUtils; import org.dependencytrack.api.v2.ComponentsApi; import org.dependencytrack.api.v2.model.CreateComponentRequest; @@ -48,7 +48,7 @@ import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapOrganizationalContacts; import static org.dependencytrack.util.PersistenceUtil.isUniqueConstraintViolation; -@Path("/") +@Provider public class ComponentsResource extends AbstractApiResource implements ComponentsApi { private static final Logger LOGGER = LoggerFactory.getLogger(ComponentsResource.class); diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/CsafResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/CsafResource.java index 9e3659ee88..511018a8bc 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/CsafResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/CsafResource.java @@ -22,8 +22,8 @@ import jakarta.inject.Inject; import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.CsafApi; import org.dependencytrack.api.v2.model.CreateCsafAggregatorRequest; import org.dependencytrack.api.v2.model.CreateCsafProviderRequest; @@ -59,7 +59,7 @@ * * @since 5.7.0 */ -@Path("/") +@Provider public class CsafResource extends AbstractApiResource implements CsafApi { private static final Logger LOGGER = LoggerFactory.getLogger(CsafResource.class); diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java index 005d064c7c..09bb675b61 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java @@ -26,8 +26,8 @@ import jakarta.json.Json; import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.ExtensionsApi; import org.dependencytrack.api.v2.model.GetExtensionConfigResponse; import org.dependencytrack.api.v2.model.ListExtensionPointsResponse; @@ -69,7 +69,7 @@ /** * @since 5.7.0 */ -@Path("/") +@Provider public class ExtensionsResource extends AbstractApiResource implements ExtensionsApi { private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionsResource.class); diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/MetricsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/MetricsResource.java index f8175ecc58..d233b0ae5c 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/MetricsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/MetricsResource.java @@ -19,8 +19,8 @@ package org.dependencytrack.resources.v2; import alpine.server.auth.PermissionRequired; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.MetricsApi; import org.dependencytrack.api.v2.model.ListVulnerabilityMetricsResponse; import org.dependencytrack.api.v2.model.ListVulnerabilityMetricsResponseItem; @@ -34,7 +34,7 @@ import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction; import static org.dependencytrack.persistence.jdbi.JdbiFactory.withJdbiHandle; -@Path("/") +@Provider public class MetricsResource extends AbstractApiResource implements MetricsApi { @Override diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/ProjectsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/ProjectsResource.java index 9c9849d502..bf88bc226a 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/ProjectsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/ProjectsResource.java @@ -20,34 +20,41 @@ import alpine.server.auth.PermissionRequired; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.ProjectsApi; import org.dependencytrack.api.v2.model.CloneProjectInclude; import org.dependencytrack.api.v2.model.CloneProjectRequest; import org.dependencytrack.api.v2.model.CloneProjectResponse; import org.dependencytrack.api.v2.model.ListComponentsResponse; import org.dependencytrack.api.v2.model.ListComponentsResponseItem; +import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponse; +import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponseItem; +import org.dependencytrack.api.v2.model.ListProjectAdvisoryFindingsResponseItem; import org.dependencytrack.auth.Permissions; import org.dependencytrack.common.pagination.Page; import org.dependencytrack.model.Component; +import org.dependencytrack.persistence.jdbi.AdvisoryDao; +import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListProjectAdvisoriesRow; import org.dependencytrack.persistence.jdbi.ComponentDao; import org.dependencytrack.persistence.jdbi.ProjectDao; import org.dependencytrack.persistence.jdbi.command.CloneProjectCommand; +import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesForProjectQuery; import org.dependencytrack.resources.AbstractApiResource; import org.owasp.security.logging.SecurityMarkers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; import java.util.UUID; import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction; import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapHashes; import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapLicense; -@Path("/") +@Provider public class ProjectsResource extends AbstractApiResource implements ProjectsApi { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectsResource.class); @@ -136,4 +143,76 @@ public Response cloneProject(final UUID projectUuid, final CloneProjectRequest r .build(); } + @Override + @PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY) + public Response listAdvisoriesForProject(UUID uuid, String pageToken, Integer limit) { + final Page projectAdvisories = + inJdbiTransaction(getAlpineRequest(), handle -> { + requireProjectAccess(handle, uuid); + + final long projectId = handle.attach(ProjectDao.class).getProjectId(uuid); + + return handle.attach(AdvisoryDao.class).listForProject( + new ListAdvisoriesForProjectQuery(projectId) + .withPageToken(pageToken) + .withLimit(limit)); + }); + + final var responseItems = projectAdvisories.items().stream() + .map( + advisory -> ListProjectAdvisoriesResponseItem.builder() + .id(advisory.id()) + .publisher(advisory.publisher()) + .name(advisory.name()) + .version(advisory.version()) + .url(advisory.url()) + .title(advisory.title()) + .format(advisory.format()) + .seenAt(advisory.seenAt() != null + ? advisory.seenAt().toEpochMilli() + : null) + .lastFetched(advisory.lastFetched() != null + ? advisory.lastFetched().toEpochMilli() + : null) + .findingsCount(advisory.findingsCount()) + .build()) + .toList(); + + final var response = ListProjectAdvisoriesResponse.builder() + .items(responseItems) + .nextPageToken(projectAdvisories.nextPageToken()) + .total(convertTotalCount(projectAdvisories.totalCount())) + .build(); + + return Response.ok(response).build(); + } + + @Override + @PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY) + public Response getFindingsByProjectAdvisory(UUID uuid, UUID advisoryId) { + return inJdbiTransaction(getAlpineRequest(), handle -> { + requireProjectAccess(handle, uuid); + + final long projectId = handle.attach(ProjectDao.class).getProjectId(uuid); + + List advisoryRows = handle.attach(AdvisoryDao.class) + .getFindingsByProjectAdvisory(projectId, advisoryId); + final long totalCount = advisoryRows.size(); + + final List responseItems = advisoryRows.stream() + .map( + row -> ListProjectAdvisoryFindingsResponseItem.builder() + .name(row.name()) + .confidence((int) row.confidence()) + .desc(row.desc()) + .group(row.group()) + .version(row.version()) + .componentUuid(UUID.fromString(row.componentUuid())) + .build()) + .toList(); + + return Response.ok(responseItems).header(TOTAL_COUNT_HEADER, totalCount).build(); + }); + } + } diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/SecretsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/SecretsResource.java index 619db67c98..a41bcb0f73 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/SecretsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/SecretsResource.java @@ -22,8 +22,8 @@ import jakarta.inject.Inject; import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.SecretsApi; import org.dependencytrack.api.v2.model.CreateSecretRequest; import org.dependencytrack.api.v2.model.ListSecretsResponse; @@ -40,7 +40,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Path("/") +@Provider public class SecretsResource extends AbstractApiResource implements SecretsApi { private static final Logger LOGGER = LoggerFactory.getLogger(SecretsResource.class); diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/TaskQueuesResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/TaskQueuesResource.java index 386740251a..72069fcd29 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/TaskQueuesResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/TaskQueuesResource.java @@ -20,8 +20,8 @@ import alpine.server.auth.PermissionRequired; import jakarta.inject.Inject; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.TaskQueuesApi; import org.dependencytrack.api.v2.model.ListTaskQueuesResponse; import org.dependencytrack.api.v2.model.TaskQueue; @@ -40,7 +40,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Path("/") +@Provider @NullMarked public final class TaskQueuesResource extends AbstractApiResource implements TaskQueuesApi { diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/TeamsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/TeamsResource.java index ae56377296..45b16514f8 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/TeamsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/TeamsResource.java @@ -23,10 +23,10 @@ import alpine.model.User; import alpine.server.auth.PermissionRequired; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.TeamsApi; import org.dependencytrack.api.v2.model.CreateTeamMembershipRequest; import org.dependencytrack.api.v2.model.CreateTeamRequest; @@ -52,7 +52,7 @@ import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction; import static org.dependencytrack.util.PersistenceUtil.isUniqueConstraintViolation; -@Path("/") +@Provider public class TeamsResource extends AbstractApiResource implements TeamsApi { private static final Logger LOGGER = LoggerFactory.getLogger(TeamsResource.class); diff --git a/apiserver/src/main/java/org/dependencytrack/resources/v2/WorkflowsResource.java b/apiserver/src/main/java/org/dependencytrack/resources/v2/WorkflowsResource.java index 42013580a5..425d28613c 100644 --- a/apiserver/src/main/java/org/dependencytrack/resources/v2/WorkflowsResource.java +++ b/apiserver/src/main/java/org/dependencytrack/resources/v2/WorkflowsResource.java @@ -24,8 +24,8 @@ import com.google.protobuf.util.JsonFormat; import jakarta.inject.Inject; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.Provider; import org.dependencytrack.api.v2.WorkflowsApi; import org.dependencytrack.api.v2.model.ListWorkflowRunEventsResponse; import org.dependencytrack.api.v2.model.ListWorkflowRunEventsResponseItem; @@ -64,7 +64,7 @@ import java.util.Set; import java.util.UUID; -@Path("/") +@Provider @NullMarked public class WorkflowsResource extends AbstractApiResource implements WorkflowsApi { diff --git a/apiserver/src/test/java/org/dependencytrack/notification/NotificationOutboxRelayTest.java b/apiserver/src/test/java/org/dependencytrack/notification/NotificationOutboxRelayTest.java index 1379703cb9..0fae80c59b 100644 --- a/apiserver/src/test/java/org/dependencytrack/notification/NotificationOutboxRelayTest.java +++ b/apiserver/src/test/java/org/dependencytrack/notification/NotificationOutboxRelayTest.java @@ -104,7 +104,7 @@ void shouldRelayNotification() { ArgumentCaptor.forClass(Collection.class); await("Workflow run creation") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> Mockito.verify(dexEngineMock).createRuns(createRunsCaptor.capture())); assertThat(createRunsCaptor.getValue()).satisfiesExactly(request -> { @@ -121,7 +121,7 @@ void shouldRelayNotification() { }); await("Outbox record removal") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> assertThat(qm.getNotificationOutbox()).isEmpty()); } @@ -141,7 +141,7 @@ void shouldNotRelayNotificationWhenNoMatchingRuleExists() { relay.start(); await("Outbox record removal") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> assertThat(qm.getNotificationOutbox()).isEmpty()); Mockito.verify(dexEngineMock, never()).createRuns(anyCollection()); @@ -169,7 +169,7 @@ void shouldRetryOnFailedSend() { ArgumentCaptor.forClass(Collection.class); await("Workflow run creation") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> Mockito.verify(dexEngineMock, times(2)).createRuns(requestsCaptor.capture())); assertThat(requestsCaptor.getAllValues()) @@ -182,7 +182,7 @@ void shouldRetryOnFailedSend() { }); await("Outbox record removal") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> assertThat(qm.getNotificationOutbox()).isEmpty()); } @@ -208,7 +208,7 @@ void shouldOffloadLargeNotificationsToFileStorage() { ArgumentCaptor.forClass(Collection.class); await("Workflow run creation") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> Mockito.verify(dexEngineMock).createRuns(createRunsCaptor.capture())); assertThat(createRunsCaptor.getValue()).satisfiesExactly(request -> { @@ -231,7 +231,7 @@ void shouldOffloadLargeNotificationsToFileStorage() { }); await("Outbox record removal") - .atMost(1, TimeUnit.SECONDS) + .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> assertThat(qm.getNotificationOutbox()).isEmpty()); }