diff --git a/src/main/java/org/broadinstitute/consent/http/ConsentModule.java b/src/main/java/org/broadinstitute/consent/http/ConsentModule.java index 481ac9128..393f7b75e 100644 --- a/src/main/java/org/broadinstitute/consent/http/ConsentModule.java +++ b/src/main/java/org/broadinstitute/consent/http/ConsentModule.java @@ -537,11 +537,7 @@ MailMessageDAO providesMailMessageDAO() { @Provides MetricsService providesMetricsService() { - return new MetricsService( - providesDatasetDAO(), - providesDataAccessRequestDAO(), - providesDARCollectionDAO(), - providesElectionDAO()); + return new MetricsService(providesDatasetDAO(), providesDataAccessRequestDAO()); } @Provides diff --git a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java index 589135088..e2e93287f 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/DataAccessRequestDAO.java @@ -101,6 +101,61 @@ AND dar.collection_id NOT IN ( """) List findApprovedDARsByDatasetId(@Bind("datasetId") Integer datasetId); + /** + * This query finds DARs submitted on dar-dataset combinations where the most recent vote is true + * similar to {@link #findApprovedDARsByDatasetId(Integer datasetId) findApprovedDARsByDatasetId}. + * The primary difference is that we want to include expired DARs to show in dataset usage + * metrics. + * + * @param datasetId The dataset id + * @return List of approved DARs for the dataset + */ + @UseRowReducer(DataAccessRequestReducer.class) + @SqlQuery( + """ + SELECT dar.id, dar.reference_id, dar.collection_id, dar.parent_id, dar.user_id, + dar.create_date, dar.submission_date, dar.update_date, dar.data, dar.era_commons_id, + dar.approving_so_id, dar.approving_so_timestamp, dar.requires_so_approval, + dar.closeout_so_approval_timestamp, dar.closeout_approving_so_id, + dd.dataset_id, collection.dar_code + FROM data_access_request dar + LEFT JOIN dar_collection collection on collection.collection_id = dar.collection_id + INNER JOIN dar_dataset dd ON dd.reference_id = dar.reference_id + INNER JOIN ( + SELECT DISTINCT e.reference_id, e.dataset_id, LAST_VALUE(v.vote) + OVER( + PARTITION BY e.reference_id, e.dataset_id + ORDER BY v.create_date + RANGE BETWEEN + UNBOUNDED PRECEDING AND + UNBOUNDED FOLLOWING + ) last_vote + FROM election e + INNER JOIN vote v ON e.election_id = v.election_id AND v.vote IS NOT NULL + AND LOWER(e.election_type) = 'dataaccess' + AND LOWER(v.type) IN ('final', 'radar_approve')) final_access_vote ON final_access_vote.reference_id = dar.reference_id AND final_access_vote.dataset_id = dd.dataset_id + WHERE dd.dataset_id = :datasetId + AND dar.submission_date IS NOT NULL + AND final_access_vote.last_vote = TRUE + AND (LOWER(dar.data->>'status') != 'archived' OR dar.data->>'status' IS NULL) + -- Pull in all closeouts for this dataset. Closeouts do not have elections, + -- but we want to include them in the dataset usage metrics. + UNION + SELECT dar.id, dar.reference_id, dar.collection_id, dar.parent_id, dar.user_id, + dar.create_date, dar.submission_date, dar.update_date, dar.data, dar.era_commons_id, + dar.approving_so_id, dar.approving_so_timestamp, dar.requires_so_approval, + dar.closeout_so_approval_timestamp, dar.closeout_approving_so_id, + dd.dataset_id, collection.dar_code + FROM data_access_request dar + LEFT JOIN dar_collection collection on collection.collection_id = dar.collection_id + INNER JOIN dar_dataset dd ON dd.reference_id = dar.reference_id + WHERE dd.dataset_id = :datasetId + AND dar.submission_date IS NOT NULL + AND data ->> 'closeoutSupplement' IS NOT NULL + """) + List findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( + @Bind("datasetId") Integer datasetId); + /** * This query finds dataset ids on dar-dataset combinations where the most recent vote is true. * This includes datasets that are a part of expired DARs, UNLIKE findApprovedDARsByDatasetId. The @@ -305,11 +360,6 @@ void updateDataByReferenceId( """) void deleteByReferenceId(@Bind("referenceId") String referenceId); - @SqlUpdate("DELETE FROM data_access_request WHERE reference_id IN ()") - void deleteByReferenceIds( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds); - @SqlUpdate( """ UPDATE data_access_request @@ -494,16 +544,6 @@ INSERT INTO dar_dataset (reference_id, dataset_id) """) void deleteDARDatasetRelationByReferenceId(@Bind("referenceId") String referenceId); - /** - * Delete rows which have a referenceId that is in the list referenceIds - * - * @param referenceIds List - */ - @SqlUpdate("DELETE FROM dar_dataset WHERE reference_id in ()") - void deleteDARDatasetRelationByReferenceIds( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds); - /** * Returns all dataset_ids that match any of the referenceIds inside the "referenceIds" list * diff --git a/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java b/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java index 4fbbed4a0..f253341b2 100644 --- a/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java +++ b/src/main/java/org/broadinstitute/consent/http/db/ElectionDAO.java @@ -151,25 +151,6 @@ List findOpenElectionsByReferenceIds( @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) List referenceIds); - @SqlQuery( - """ - SELECT distinct * - FROM election e - INNER JOIN - (SELECT reference_id, MAX(create_date) max_date - FROM election e WHERE LOWER(e.election_type) = LOWER(:type) - GROUP BY reference_id) election_view - ON election_view.max_date = e.create_date - AND election_view.reference_id = e.reference_id - WHERE e.reference_id in () - AND LOWER(e.election_type) = LOWER(:type) - """) - @UseRowMapper(SimpleElectionMapper.class) - List findLastElectionsByReferenceIdsAndType( - @BindList(value = "referenceIds", onEmpty = EmptyHandling.NULL_STRING) - List referenceIds, - @Bind("type") String type); - @SqlQuery( """ SELECT e.* FROM election e diff --git a/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java new file mode 100644 index 000000000..f366ec242 --- /dev/null +++ b/src/main/java/org/broadinstitute/consent/http/models/DarMetricsSummary.java @@ -0,0 +1,22 @@ +package org.broadinstitute.consent.http.models; + +import java.sql.Timestamp; + +public record DarMetricsSummary( + Timestamp updateDate, + String projectTitle, + String darCode, + String nonTechRus, + String referenceId, + Boolean expired) { + + public DarMetricsSummary(DataAccessRequest dar) { + this( + dar != null ? dar.getUpdateDate() : null, + dar != null && dar.getData() != null ? dar.getData().getProjectTitle() : null, + dar != null ? dar.getDarCode() : null, + dar != null && dar.getData() != null ? dar.getData().getNonTechRus() : null, + dar != null ? dar.getReferenceId() : null, + dar == null || dar.getSubmissionDate() == null || dar.getExpired()); + } +} diff --git a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java index a0d3fb9f1..7133d4ccd 100644 --- a/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java +++ b/src/main/java/org/broadinstitute/consent/http/models/DatasetMetrics.java @@ -1,21 +1,10 @@ package org.broadinstitute.consent.http.models; import java.util.List; -import org.broadinstitute.consent.http.service.MetricsService.DarMetricsSummary; public class DatasetMetrics { - private Dataset dataset; private List dars; - private List elections; - - public Dataset getDataset() { - return dataset; - } - - public void setDataset(Dataset dataset) { - this.dataset = dataset; - } public List getDars() { return dars; @@ -24,12 +13,4 @@ public List getDars() { public void setDars(List dars) { this.dars = dars; } - - public List getElections() { - return elections; - } - - public void setElections(List elections) { - this.elections = elections; - } } diff --git a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java index 4b6f85306..536d60bb8 100644 --- a/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java +++ b/src/main/java/org/broadinstitute/consent/http/resources/MetricsResource.java @@ -1,15 +1,20 @@ package org.broadinstitute.consent.http.resources; import com.google.inject.Inject; +import io.dropwizard.auth.Auth; +import jakarta.annotation.security.PermitAll; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; +import java.util.List; +import org.broadinstitute.consent.http.models.DarMetricsSummary; import org.broadinstitute.consent.http.models.DatasetMetrics; +import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; -@Path("/metrics") +@Path("{api : (api/)?}metrics") public class MetricsResource extends Resource { private final MetricsService metricsService; @@ -19,6 +24,12 @@ public MetricsResource(MetricsService metricsService) { this.metricsService = metricsService; } + /** + * @deprecated + * @param datasetId the id of the dataset for which to generate metrics + * @return Response containing DatasetMetrics for the given datasetId + */ + @Deprecated(forRemoval = true, since = "2026-02-23") @GET @Path("/dataset/{datasetId}") @Produces("application/json") @@ -30,4 +41,19 @@ public Response getDatasetMetricsData(@PathParam("datasetId") Integer datasetId) return createExceptionResponse(e); } } + + @SuppressWarnings("unused") + @GET + @Path("/dar-summaries/{datasetId}") + @Produces("application/json") + @PermitAll + public Response getDarSummaryData( + @Auth DuosUser user, @PathParam("datasetId") Integer datasetId) { + try { + List summaries = metricsService.generateDarSummaries(datasetId); + return Response.ok().entity(summaries).build(); + } catch (Exception e) { + return createExceptionResponse(e); + } + } } diff --git a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java index f3eb6785b..27b9d9faa 100644 --- a/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java +++ b/src/main/java/org/broadinstitute/consent/http/service/MetricsService.java @@ -1,115 +1,40 @@ package org.broadinstitute.consent.http.service; -import com.fasterxml.jackson.annotation.JsonProperty; import com.google.inject.Inject; import jakarta.ws.rs.NotFoundException; -import java.sql.Timestamp; -import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; -import org.broadinstitute.consent.http.db.DarCollectionDAO; import org.broadinstitute.consent.http.db.DataAccessRequestDAO; import org.broadinstitute.consent.http.db.DatasetDAO; -import org.broadinstitute.consent.http.db.ElectionDAO; -import org.broadinstitute.consent.http.models.DarCollection; +import org.broadinstitute.consent.http.models.DarMetricsSummary; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.Dataset; import org.broadinstitute.consent.http.models.DatasetMetrics; -import org.broadinstitute.consent.http.models.Election; public class MetricsService { private final DatasetDAO dataSetDAO; private final DataAccessRequestDAO darDAO; - private final DarCollectionDAO darCollectionDAO; - private final ElectionDAO electionDAO; @Inject - public MetricsService( - DatasetDAO dataSetDAO, - DataAccessRequestDAO darDAO, - DarCollectionDAO darCollectionDAO, - ElectionDAO electionDAO) { + public MetricsService(DatasetDAO dataSetDAO, DataAccessRequestDAO darDAO) { this.dataSetDAO = dataSetDAO; this.darDAO = darDAO; - this.darCollectionDAO = darCollectionDAO; - this.electionDAO = electionDAO; - } - - public static class DarMetricsSummary { - - final Timestamp updateDate; - @JsonProperty final String projectTitle; - @JsonProperty final String darCode; - @JsonProperty final String nonTechRus; - @JsonProperty final String referenceId; - - public DarMetricsSummary(DataAccessRequest dar, String darCode) { - if (dar != null && dar.data != null) { - this.updateDate = dar.getUpdateDate(); - this.projectTitle = dar.data.getProjectTitle(); - this.darCode = darCode; - this.nonTechRus = dar.data.getNonTechRus(); - this.referenceId = dar.getReferenceId(); - } else { - this.updateDate = null; - this.projectTitle = null; - this.darCode = null; - this.nonTechRus = null; - this.referenceId = null; - } - } } public DatasetMetrics generateDatasetMetrics(Integer datasetId) { - DatasetMetrics metrics = new DatasetMetrics(); + List darMetricsSummaries = generateDarSummaries(datasetId); + metrics.setDars(darMetricsSummaries); + return metrics; + } - // get datasetDTO with properties and data use restrictions + public List generateDarSummaries(Integer datasetId) { Dataset dataset = dataSetDAO.findDatasetById(datasetId); if (dataset == null) { throw new NotFoundException("Dataset with specified ID does not exist."); } - - // find dars with the given datasetId in their list of datasetIds, datasetId is a String so it - // can be converted to jsonb in query - // convert all dars into smaller objects that only contain the information needed - List dars = darDAO.findApprovedDARsByDatasetId(datasetId); - List darCollectionIds = dars.stream().map(DataAccessRequest::getCollectionId).toList(); - List darCollections = - darCollectionIds.isEmpty() - ? List.of() - : darCollectionDAO.findDARCollectionByCollectionIds(darCollectionIds); - Map collectionMap = - darCollections.stream() - .collect(Collectors.toMap(DarCollection::getDarCollectionId, Function.identity())); - - List darInfo = - dars.stream() - .map( - dar -> { - DarCollection collection = collectionMap.get(dar.getCollectionId()); - String darCode = Objects.nonNull(collection) ? collection.getDarCode() : null; - return new DarMetricsSummary(dar, darCode); - }) - .collect(Collectors.toList()); - - // if there are associated dars, find associated access elections so we know how many and which - // dars are approved/denied - List referenceIds = - dars.stream().map(dar -> (dar.referenceId)).collect(Collectors.toList()); - if (!referenceIds.isEmpty()) { - List elections = - electionDAO.findLastElectionsByReferenceIdsAndType(referenceIds, "DataAccess"); - metrics.setElections(elections); - } else { - metrics.setElections(Collections.emptyList()); - } - metrics.setDataset(dataset); - metrics.setDars(darInfo); - return metrics; + List dars = + darDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(datasetId); + return dars.stream().map(DarMetricsSummary::new).toList(); } } diff --git a/src/main/resources/assets/api-docs.yaml b/src/main/resources/assets/api-docs.yaml index 182a0e99c..e5ae22b8d 100644 --- a/src/main/resources/assets/api-docs.yaml +++ b/src/main/resources/assets/api-docs.yaml @@ -715,6 +715,8 @@ paths: description: Server error. /api/match/purpose/batch/: $ref: './paths/getMatchesForLatestDataAccessElectionsByPurposeIds.yaml' + /api/metrics/dar-summaries/{datasetId}: + $ref: './paths/darSummariesByDatasetId.yaml' /api/user: $ref: './paths/user.yaml' /api/user/me: @@ -914,28 +916,7 @@ paths: /api/ontology: $ref: './paths/ontology.yaml' /metrics/dataset/{datasetId}: - get: - summary: Dataset Metrics - description: get dars and elections associated with datasetId - parameters: - - name: datasetId - in: path - required: true - schema: - type: integer - tags: - - Metrics - responses: - 200: - description: Dataset Metrics - content: - application/json: - schema: - $ref: './schemas/DatasetMetrics.yaml' - 404: - description: Dataset with specified ID does not exist - 500: - description: Internal Server Error + $ref: './paths/metricsDatasetById.yaml' /liveness: $ref: './paths/liveness.yaml' /ontology/search: diff --git a/src/main/resources/assets/paths/darSummariesByDatasetId.yaml b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml new file mode 100644 index 000000000..bc73d2ba8 --- /dev/null +++ b/src/main/resources/assets/paths/darSummariesByDatasetId.yaml @@ -0,0 +1,25 @@ +get: + summary: DAR Summary Metrics + operationId: darSummariesByDatasetId + description: get Data Access Request Summaries associated to a datasetId + parameters: + - name: datasetId + in: path + required: true + schema: + type: integer + tags: + - Metrics + responses: + 200: + description: Dataset Metrics + content: + application/json: + schema: + type: array + items: + $ref: '../schemas/DarMetric.yaml' + 404: + description: Dataset with specified ID does not exist + 500: + description: Internal Server Error diff --git a/src/main/resources/assets/paths/metricsDatasetById.yaml b/src/main/resources/assets/paths/metricsDatasetById.yaml new file mode 100644 index 000000000..51afa7ec7 --- /dev/null +++ b/src/main/resources/assets/paths/metricsDatasetById.yaml @@ -0,0 +1,26 @@ +get: + summary: Dataset Metrics + operationId: metricsByDatasetId + deprecated: true + description: | + Get Data Access Requests associated to a datasetId. Scheduled for removal. + Deprecated in favor of /api/metrics/dar-summaries/{datasetId} + parameters: + - name: datasetId + in: path + required: true + schema: + type: integer + tags: + - Metrics + responses: + 200: + description: Dataset Metrics + content: + application/json: + schema: + $ref: '../schemas/DatasetMetrics.yaml' + 404: + description: Dataset with specified ID does not exist + 500: + description: Internal Server Error diff --git a/src/main/resources/assets/schemas/DarMetric.yaml b/src/main/resources/assets/schemas/DarMetric.yaml index 369b33e3f..ddaa6544e 100644 --- a/src/main/resources/assets/schemas/DarMetric.yaml +++ b/src/main/resources/assets/schemas/DarMetric.yaml @@ -12,3 +12,9 @@ properties: nonTechRus: type: string description: The DAR non-technical research use statement + expired: + type: boolean + description: Whether the DAR is expired + referenceId: + type: string + description: The reference identifier for the DAR diff --git a/src/main/resources/assets/schemas/DatasetMetrics.yaml b/src/main/resources/assets/schemas/DatasetMetrics.yaml index 16c21863b..974dfcd34 100644 --- a/src/main/resources/assets/schemas/DatasetMetrics.yaml +++ b/src/main/resources/assets/schemas/DatasetMetrics.yaml @@ -1,12 +1,6 @@ type: object properties: - dataset: - $ref: './Dataset.yaml' dars: type: array items: $ref: './DarMetric.yaml' - elections: - type: array - items: - $ref: './Election.yaml' diff --git a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java index 37cade0b8..1155f90a2 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/DataAccessRequestDAOTest.java @@ -12,6 +12,9 @@ import java.sql.Timestamp; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; @@ -81,9 +84,9 @@ void testFindAllDrafts() { List newDars = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(newDars.isEmpty()); assertEquals(1, newDars.size()); - assertTrue(newDars.get(0).getDraft()); - assertNull(newDars.get(0).getDarCode()); - assertFalse(newDars.get(0).getProgressReport()); + assertTrue(newDars.getFirst().getDraft()); + assertNull(newDars.getFirst().getDarCode()); + assertFalse(newDars.getFirst().getProgressReport()); } @Test @@ -97,7 +100,7 @@ void testFindAllDraftsByUserId() { List newDars = dataAccessRequestDAO.findAllDraftsByUserId(dar.getUserId()); assertFalse(newDars.isEmpty()); assertEquals(1, newDars.size()); - assertNull(newDars.get(0).getDarCode()); + assertNull(newDars.getFirst().getDarCode()); List missingDars = dataAccessRequestDAO.findAllDraftsByUserId(0); assertTrue(missingDars.isEmpty()); @@ -110,7 +113,7 @@ void updateDraftToNonDraft() { List draftDars1 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(draftDars1.isEmpty()); assertEquals(1, draftDars1.size()); - DataAccessRequestData darData = draftDars1.get(0).getData(); + DataAccessRequestData darData = draftDars1.getFirst().getData(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, new Date(), new Date(), darData, randomAlphabetic(10)); List draftDars2 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); @@ -129,13 +132,13 @@ void updateNonDraftToDraft() { List draftDars2 = dataAccessRequestDAO.findAllDraftDataAccessRequests(); assertFalse(draftDars2.isEmpty()); assertEquals(1, draftDars2.size()); - assertEquals(dar.getDarCode(), draftDars2.get(0).getDarCode()); + assertEquals(dar.getDarCode(), draftDars2.getFirst().getDarCode()); } @Test void updateDraftToNonDraftByCollectionId() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, null, new Date(), dar.getData(), randomAlphabetic(10)); @@ -155,7 +158,7 @@ void updateDraftToNonDraftByCollectionId() { @Test void testDataAccessRequestSubmissionDateAbsent() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, null, new Date(), dar.getData(), randomAlphabetic(10)); @@ -169,7 +172,7 @@ void testDataAccessRequestSubmissionDateAbsent() { @Test void testDataAccessRequestSubmissionDatePresent() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dataAccessRequestDAO.updateDataByReferenceId( dar.referenceId, dar.userId, new Date(), new Date(), dar.getData(), randomAlphabetic(10)); @@ -185,7 +188,7 @@ void testDataAccessRequestSubmissionDatePresent() { @Test void updateNonDraftToDraftByCollectionId() { DarCollection darColl = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darColl.getDars().values()).getFirst(); dar = dataAccessRequestDAO.findByReferenceId(dar.getReferenceId()); assertFalse(dar.getDraft()); @@ -467,7 +470,7 @@ void testFindAllFilterArchived() { dataAccessRequestDAO.archiveByReferenceIds(List.of(testDar1.getReferenceId())); List returnedDARs = dataAccessRequestDAO.findAllDataAccessRequests(); assertEquals(1, returnedDARs.size()); - assertNotNull(returnedDARs.get(0).getDarCode()); + assertNotNull(returnedDARs.getFirst().getDarCode()); } // See: https://broadworkbench.atlassian.net/browse/DUOS-2182 @@ -495,14 +498,14 @@ void testEnsureOnlyDataAccessRequestsByDatasetIdReturnsJustForSpecificDatasetId( List dars = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset1.getDatasetId()); assertEquals(1, dars.size()); - assertTrue(dars.get(0).getDatasetIds().contains(dataset1.getDatasetId())); - assertEquals(darCode1, dars.get(0).getDarCode()); + assertTrue(dars.getFirst().getDatasetIds().contains(dataset1.getDatasetId())); + assertEquals(darCode1, dars.getFirst().getDarCode()); List returnedDARs = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset2.getDatasetId()); assertEquals(1, returnedDARs.size()); - assertTrue(returnedDARs.get(0).getDatasetIds().contains(dataset2.getDatasetId())); - assertEquals(darCode2, returnedDARs.get(0).getDarCode()); + assertTrue(returnedDARs.getFirst().getDatasetIds().contains(dataset2.getDatasetId())); + assertEquals(darCode2, returnedDARs.getFirst().getDarCode()); } @Test @@ -544,7 +547,7 @@ void testFindAllApprovedDataAccessRequestsByDatasetId() { testDar1.getUserId(), dataAccessRequestDAO .findApprovedDARsByDatasetId(dataset1.getDatasetId()) - .get(0) + .getFirst() .getUserId()); assertEquals( 1, dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset2.getDatasetId()).size()); @@ -552,7 +555,7 @@ void testFindAllApprovedDataAccessRequestsByDatasetId() { testDar2.getUserId(), dataAccessRequestDAO .findApprovedDARsByDatasetId(dataset2.getDatasetId()) - .get(0) + .getFirst() .getUserId()); Election e3 = createDataAccessElection(testDar3.getReferenceId(), dataset2.getDatasetId()); @@ -791,7 +794,7 @@ void testFindApprovedDARsByDatasetId_ExcludeCloseouts() { List approvedDARs = dataAccessRequestDAO.findApprovedDARsByDatasetId(dataset.getDatasetId()); assertEquals(1, approvedDARs.size()); - assertEquals(parentDAR.getReferenceId(), approvedDARs.get(0).getReferenceId()); + assertEquals(parentDAR.getReferenceId(), approvedDARs.getFirst().getReferenceId()); // Create a closeout DAR from the parent DAR DataAccessRequest closeoutDAR = @@ -814,6 +817,109 @@ void testFindApprovedDARsByDatasetId_ExcludeCloseouts() { assertTrue(noApprovedDARs.isEmpty()); } + @Test + void testFindSummaryMetricApprovedDARsByDatasetIdIncludesExpired() { + // Create a dataset to request access to + Dataset dataset = createDataset(); + + // Create a dar collection + User user = createUserWithInstitution(); + Integer approvedCollectionId = + darCollectionDAO.insertDarCollection( + "DAR-" + randomInt(1, 10), user.getUserId(), new Date()); + + // Create an approved DAR on a dataset + DataAccessRequest approvedDAR = createDataAccessRequest(user.getUserId(), approvedCollectionId); + dataAccessRequestDAO.insertDARDatasetRelation( + approvedDAR.getReferenceId(), dataset.getDatasetId()); + Election election = + createDataAccessElection(approvedDAR.getReferenceId(), dataset.getDatasetId()); + Vote vote = createFinalVote(dataset.getCreateUserId(), election.getElectionId()); + Date now = new Date(); + updateVote(true, "", now, vote.getVoteId(), false, election.getElectionId(), now, false); + + // Create an unsubmitted DAR on a dataset + DataAccessRequest unsubmittedDAR = createDraftDataAccessRequest(); + dataAccessRequestDAO.insertDARDatasetRelation( + unsubmittedDAR.getReferenceId(), dataset.getDatasetId()); + + // Create a Progress Report on the approved DAR + DataAccessRequest prDAR = createDataAccessRequest(user.getUserId(), approvedCollectionId); + dataAccessRequestDAO.insertDARDatasetRelation(prDAR.getReferenceId(), dataset.getDatasetId()); + Election prElection = createDataAccessElection(prDAR.getReferenceId(), dataset.getDatasetId()); + Vote prVote = createFinalVote(dataset.getCreateUserId(), prElection.getElectionId()); + updateVote(true, "", now, prVote.getVoteId(), false, prElection.getElectionId(), now, false); + + // Create a closeout DAR from the PR DAR + DataAccessRequest closeoutDAR = + createProgressReport( + user.getEraCommonsId(), user.getUserId(), approvedCollectionId, prDAR.getId()); + dataAccessRequestDAO.insertDARDatasetRelation( + closeoutDAR.getReferenceId(), dataset.getDatasetId()); + CloseoutSupplement closeout = + new CloseoutSupplement(List.of("Reason"), "Other Reason", user.getUserId()); + closeoutDAR.getData().setCloseoutSupplement(closeout); + dataAccessRequestDAO.updateDataByReferenceId( + closeoutDAR.getReferenceId(), + user.getUserId(), + now, + now, + closeoutDAR.getData(), + randomAlphabetic(10)); + + // Create a very old approved DAR that SHOULD be included in the summary metrics + Integer expiredCollectionId = + darCollectionDAO.insertDarCollection( + "DAR-" + randomInt(11, 20), user.getUserId(), new Date()); + String expiredReferenceId = UUID.randomUUID().toString(); + LocalDateTime twoYearsAgo = LocalDateTime.now().minusYears(2); + ZonedDateTime zonedDateTime = twoYearsAgo.atZone(ZoneId.systemDefault()); + Timestamp submissionDate = Timestamp.from(zonedDateTime.toInstant()); + dataAccessRequestDAO.insertDataAccessRequest( + expiredCollectionId, + expiredReferenceId, + user.getUserId(), + submissionDate, + submissionDate, + submissionDate, + createDataAccessRequestData(), + randomAlphabetic(10)); + dataAccessRequestDAO.insertDARDatasetRelation(expiredReferenceId, dataset.getDatasetId()); + Integer expiredElectionId = + electionDAO.insertElection( + ElectionType.DATA_ACCESS.getValue(), + ElectionStatus.OPEN.getValue(), + submissionDate, + expiredReferenceId, + dataset.getDatasetId()); + + createDataAccessElection(expiredReferenceId, dataset.getDatasetId()); + Vote expiredVote = createFinalVote(dataset.getCreateUserId(), expiredElectionId); + updateVote( + true, "", now, expiredVote.getVoteId(), false, expiredElectionId, submissionDate, false); + + List summaryDARs = + dataAccessRequestDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired( + dataset.getDatasetId()); + assertFalse(summaryDARs.isEmpty()); + // Only DAR that should not be returned + assertTrue( + summaryDARs.stream() + .noneMatch(dar -> dar.getReferenceId().equals(unsubmittedDAR.getReferenceId()))); + // All other DARs should be returned + assertTrue( + summaryDARs.stream() + .anyMatch(dar -> dar.getReferenceId().equals(approvedDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream().anyMatch(dar -> dar.getReferenceId().equals(prDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream() + .anyMatch(dar -> dar.getReferenceId().equals(closeoutDAR.getReferenceId()))); + assertTrue( + summaryDARs.stream().anyMatch(dar -> dar.getReferenceId().equals(expiredReferenceId))); + assertEquals(4, summaryDARs.size()); + } + // findAllDraftDataAccessRequests should exclude archived DARs @Test void testFindAllDraftsArchived() { @@ -877,7 +983,7 @@ void testFindByReferenceIdsArchived() { @Test void createProgressReport() { DarCollection darCollection = createDarCollection(); - DataAccessRequest dar = new ArrayList<>(darCollection.getDars().values()).get(0); + DataAccessRequest dar = new ArrayList<>(darCollection.getDars().values()).getFirst(); DataAccessRequest progressReport = createProgressReport( createUser().getEraCommonsId(), diff --git a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java index bc940dabf..29876e1bd 100644 --- a/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java +++ b/src/test/java/org/broadinstitute/consent/http/db/ElectionDAOTest.java @@ -73,7 +73,7 @@ void testFindElectionByDacId() { List foundElections = electionDAO.findOpenElectionsByDacId(dac.getDacId()); assertNotNull(foundElections); - assertEquals(election.getElectionId(), foundElections.get(0).getElectionId()); + assertEquals(election.getElectionId(), foundElections.getFirst().getElectionId()); } @Test @@ -230,7 +230,7 @@ void testFindElectionByDacIdWithNoAssociation() { List foundElections = electionDAO.findOpenElectionsByDacId(dac.getDacId()); assertNotNull(foundElections); - assertEquals(election.getElectionId(), foundElections.get(0).getElectionId()); + assertEquals(election.getElectionId(), foundElections.getFirst().getElectionId()); } @Test @@ -359,24 +359,6 @@ void testInsertExtendedElection() { assertEquals(e.getElectionId(), election.getElectionId()); } - @Test - void testFindLastElectionsByReferenceIdsAndType() { - DataAccessRequest dar = createDataAccessRequestV3(); - Dataset d = createDataset(); - electionDAO.insertElection( - ElectionType.DATA_ACCESS.getValue(), - ElectionStatus.OPEN.getValue(), - new Date(), - dar.getReferenceId(), - d.getDatasetId()); - List elections = - electionDAO.findLastElectionsByReferenceIdsAndType( - Collections.singletonList(dar.getReferenceId()), ElectionType.DATA_ACCESS.getValue()); - assertNotNull(elections); - assertFalse(elections.isEmpty()); - assertEquals(1, elections.size()); - } - @Test void testFindLastElectionsByReferenceIds() { Dac dac = createDac(); @@ -425,7 +407,7 @@ void testFindElectionsByVoteIdsAndType_DataAccess() { List elections = electionDAO.findElectionsByVoteIdsAndType(voteIds, "dataaccess"); assertEquals(1, elections.size()); - assertEquals(accessElection.getElectionId(), elections.get(0).getElectionId()); + assertEquals(accessElection.getElectionId(), elections.getFirst().getElectionId()); } @Test @@ -444,7 +426,7 @@ void testFindElectionsByVoteIdsAndType_RP() { List elections = electionDAO.findElectionsByVoteIdsAndType(voteIds, "rp"); assertEquals(1, elections.size()); - assertEquals(rpElection.getElectionId(), elections.get(0).getElectionId()); + assertEquals(rpElection.getElectionId(), elections.getFirst().getElectionId()); } @Test @@ -465,7 +447,7 @@ void testFindElectionsWithCardHoldingUsersByElectionIds() { electionDAO.findElectionsWithCardHoldingUsersByElectionIds(electionIds); assertEquals(1, elections.size()); - assertEquals(elections.get(0).getElectionId(), lcElection.getElectionId()); + assertEquals(elections.getFirst().getElectionId(), lcElection.getElectionId()); } @Test diff --git a/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java new file mode 100644 index 000000000..3864dbe98 --- /dev/null +++ b/src/test/java/org/broadinstitute/consent/http/models/DarMetricsSummaryTest.java @@ -0,0 +1,129 @@ +package org.broadinstitute.consent.http.models; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.UUID; +import org.broadinstitute.consent.http.AbstractTestHelper; +import org.junit.jupiter.api.Test; + +class DarMetricsSummaryTest extends AbstractTestHelper { + + @Test + void testConstructor_nullDar() { + DarMetricsSummary summary = new DarMetricsSummary(null); + assertNull(summary.updateDate()); + assertNull(summary.projectTitle()); + assertNull(summary.darCode()); + assertNull(summary.nonTechRus()); + assertNull(summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_nullDarData() { + DataAccessRequest dar = new DataAccessRequest(); + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertNull(summary.updateDate()); + assertNull(summary.projectTitle()); + assertNull(summary.darCode()); + assertNull(summary.nonTechRus()); + assertNull(summary.referenceId()); + assertTrue(summary.expired()); + } + + @Test + void testConstructor_updateDate() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setUpdateDate(Timestamp.from(Instant.now())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + @Test + void testConstructor_projectTitle() { + DataAccessRequest dar = new DataAccessRequest(); + DataAccessRequestData data = new DataAccessRequestData(); + data.setProjectTitle(randomAlphabetic(10)); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + @Test + void testConstructor_darCode() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setDarCode(randomAlphabetic(10)); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + @Test + void testConstructor_nonTechRus() { + DataAccessRequest dar = new DataAccessRequest(); + DataAccessRequestData data = new DataAccessRequestData(); + data.setNonTechRus(randomAlphabetic(10)); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + @Test + void testConstructor_referenceId() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setReferenceId(UUID.randomUUID().toString()); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + @Test + void testConstructor_notExpired() { + DataAccessRequest dar = new DataAccessRequest(); + dar.setSubmissionDate(Timestamp.from(Instant.now())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, false); + } + + @Test + void testConstructor_isExpired() { + DataAccessRequest dar = new DataAccessRequest(); + LocalDateTime oneYearAgo = LocalDateTime.now().minusYears(2); + ZonedDateTime zonedDateTime = oneYearAgo.atZone(ZoneId.systemDefault()); + dar.setSubmissionDate(Timestamp.from(zonedDateTime.toInstant())); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setData(data); + + DarMetricsSummary summary = new DarMetricsSummary(dar); + assertEntityEquivalence(dar, summary, true); + } + + private void assertEntityEquivalence( + DataAccessRequest dar, DarMetricsSummary summary, boolean expectedExpired) { + assertEquals(dar.getUpdateDate(), summary.updateDate()); + assertEquals(dar.getData().getProjectTitle(), summary.projectTitle()); + assertEquals(dar.getDarCode(), summary.darCode()); + assertEquals(dar.getData().getNonTechRus(), summary.nonTechRus()); + assertEquals(dar.getReferenceId(), summary.referenceId()); + assertEquals(expectedExpired, summary.expired()); + } +} diff --git a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java index 2ed7af8a6..cdbe72fb1 100644 --- a/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/resources/MetricsResourceTest.java @@ -5,9 +5,18 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; +import com.google.api.client.http.HttpStatusCodes; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.Response; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import org.broadinstitute.consent.http.AbstractTestHelper; +import org.broadinstitute.consent.http.models.DarMetricsSummary; +import org.broadinstitute.consent.http.models.DataAccessRequest; +import org.broadinstitute.consent.http.models.DataAccessRequestData; import org.broadinstitute.consent.http.models.DatasetMetrics; +import org.broadinstitute.consent.http.models.DuosUser; import org.broadinstitute.consent.http.service.MetricsService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -16,14 +25,15 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class MetricsResourceTest { +class MetricsResourceTest extends AbstractTestHelper { @Mock private MetricsService service; + @Mock private DuosUser duosUser; private MetricsResource resource; @BeforeEach - void initResource() { + void setUp() { resource = new MetricsResource(service); } @@ -32,8 +42,9 @@ void testGetDatasetMetricsData() { DatasetMetrics metrics = new DatasetMetrics(); when(service.generateDatasetMetrics(any())).thenReturn(metrics); + @SuppressWarnings("removal") Response response = resource.getDatasetMetricsData(1); - assertEquals(200, response.getStatus()); + assertEquals(HttpStatusCodes.STATUS_CODE_OK, response.getStatus()); assertFalse(response.getEntity().toString().isEmpty()); } @@ -41,7 +52,40 @@ void testGetDatasetMetricsData() { void testGetDatasetMetricsDataNotFound() { when(service.generateDatasetMetrics(any())).thenThrow(new NotFoundException()); + @SuppressWarnings("removal") Response response = resource.getDatasetMetricsData(1); - assertEquals(404, response.getStatus()); + assertEquals(HttpStatusCodes.STATUS_CODE_NOT_FOUND, response.getStatus()); + } + + @Test + void testGenerateDarSummaries() { + DataAccessRequest dar = generateDar(); + when(service.generateDarSummaries(any())).thenReturn(List.of(new DarMetricsSummary(dar))); + + Response response = resource.getDarSummaryData(duosUser, 1); + assertEquals(HttpStatusCodes.STATUS_CODE_OK, response.getStatus()); + } + + @Test + void testGenerateDarSummariesNotFound() { + when(service.generateDarSummaries(any())).thenThrow(new NotFoundException()); + + Response response = resource.getDarSummaryData(duosUser, 1); + assertEquals(HttpStatusCodes.STATUS_CODE_NOT_FOUND, response.getStatus()); + } + + private DataAccessRequest generateDar() { + String referenceId = UUID.randomUUID().toString(); + List datasetIds = Collections.singletonList(1); + DataAccessRequest dar = new DataAccessRequest(); + dar.setId(1); + dar.setReferenceId(referenceId); + DataAccessRequestData data = new DataAccessRequestData(); + dar.setDatasetIds(datasetIds); + data.setReferenceId(referenceId); + data.setProjectTitle(UUID.randomUUID().toString()); + dar.setDarCode("DAR-" + randomInt(1, 100)); + dar.setData(data); + return dar; } } diff --git a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java index 504987820..0861529e2 100644 --- a/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java +++ b/src/test/java/org/broadinstitute/consent/http/service/MetricsServiceTest.java @@ -3,25 +3,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import jakarta.ws.rs.NotFoundException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import org.broadinstitute.consent.http.AbstractTestHelper; -import org.broadinstitute.consent.http.db.DarCollectionDAO; import org.broadinstitute.consent.http.db.DataAccessRequestDAO; import org.broadinstitute.consent.http.db.DatasetDAO; -import org.broadinstitute.consent.http.db.ElectionDAO; -import org.broadinstitute.consent.http.models.DarCollection; import org.broadinstitute.consent.http.models.DataAccessRequest; import org.broadinstitute.consent.http.models.DataAccessRequestData; import org.broadinstitute.consent.http.models.Dataset; import org.broadinstitute.consent.http.models.DatasetMetrics; -import org.broadinstitute.consent.http.models.Election; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -34,49 +30,35 @@ class MetricsServiceTest extends AbstractTestHelper { @Mock private DataAccessRequestDAO darDAO; - @Mock private DarCollectionDAO darCollectionDAO; - - @Mock private ElectionDAO electionDAO; - private MetricsService service; - private void initService() { - service = new MetricsService(dataSetDAO, darDAO, darCollectionDAO, electionDAO); + @BeforeEach + void initService() { + service = new MetricsService(dataSetDAO, darDAO); } @Test void testGenerateDatasetMetrics() { DataAccessRequest dar = generateDar(); - List election = generateElection(dar.getReferenceId()); Dataset dataset = generateDataset(); - DarCollection collection = new DarCollection(); - collection.setDarCode("DAR-" + randomInt(1, 999999999)); when(dataSetDAO.findDatasetById(dataset.getDatasetId())).thenReturn(dataset); - when(darDAO.findApprovedDARsByDatasetId(any())).thenReturn(List.of(dar)); - when(darCollectionDAO.findDARCollectionByCollectionIds(any())).thenReturn(List.of(collection)); - when(electionDAO.findLastElectionsByReferenceIdsAndType(any(), eq("DataAccess"))) - .thenReturn(election); + when(darDAO.findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(any())) + .thenReturn(List.of(dar)); - initService(); - DatasetMetrics metrics = service.generateDatasetMetrics(1); + DatasetMetrics metrics = service.generateDatasetMetrics(dataset.getDatasetId()); - assertEquals(metrics.getDars().get(0).projectTitle, dar.getData().getProjectTitle()); - assertEquals(metrics.getDars().get(0).darCode, collection.getDarCode()); - assertEquals(metrics.getElections(), election); - assertEquals(metrics.getDataset(), dataset); + assertEquals(dar.getData().getProjectTitle(), metrics.getDars().getFirst().projectTitle()); + assertEquals(dar.getDarCode(), metrics.getDars().getFirst().darCode()); + verify(dataSetDAO).findDatasetById(dataset.getDatasetId()); + verify(darDAO).findSummaryMetricApprovedDARsByDatasetIdIncludesExpired(dataset.getDatasetId()); } @Test void testGenerateDatasetMetricsNotFound() { when(dataSetDAO.findDatasetById(any())).thenReturn(null); - initService(); - assertThrows( - NotFoundException.class, - () -> { - service.generateDatasetMetrics(1); - }); + assertThrows(NotFoundException.class, () -> service.generateDatasetMetrics(1)); } private DataAccessRequest generateDar() { @@ -89,6 +71,7 @@ private DataAccessRequest generateDar() { dar.setDatasetIds(datasetIds); data.setReferenceId(referenceId); data.setProjectTitle(UUID.randomUUID().toString()); + dar.setDarCode("DAR-" + randomInt(1, 100)); dar.setData(data); return dar; } @@ -100,14 +83,4 @@ private Dataset generateDataset() { d.setName(UUID.randomUUID().toString()); return d; } - - private List generateElection(String ref) { - ArrayList list = new ArrayList<>(); - Election e = new Election(); - e.setElectionId(1); - e.setReferenceId(ref); - e.setElectionType("DataAccess"); - list.add(e); - return list; - } }