From 12df79e62bbcd7d521dada53d94733d74de97bf4 Mon Sep 17 00:00:00 2001 From: stevegal Date: Mon, 2 Sep 2019 23:31:48 +0100 Subject: [PATCH 1/5] WIP: conversion of existing PR into new structure. --- docker/properties-builder.sh | 2 + pom.xml | 2 +- .../dashboard/model/ActiveWidget.java | 78 +++++++++++++++++ .../dashboard/request/DashboardRequest.java | 19 ++++- .../request/DashboardRequestWidget.java | 27 ++++++ .../dashboard/request/WidgetRequest.java | 2 + .../dashboard/rest/DashboardController.java | 14 ++-- .../dashboard/service/DashboardService.java | 13 +-- .../service/DashboardServiceImpl.java | 84 ++++++------------- 9 files changed, 162 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/capitalone/dashboard/model/ActiveWidget.java create mode 100644 src/main/java/com/capitalone/dashboard/request/DashboardRequestWidget.java diff --git a/docker/properties-builder.sh b/docker/properties-builder.sh index a76b7f6c..c2c36dd5 100755 --- a/docker/properties-builder.sh +++ b/docker/properties-builder.sh @@ -37,6 +37,8 @@ dbpassword=${SPRING_DATA_MONGODB_PASSWORD:-dbpassword} #This is ensure if you are keeping DB outside docker compose. dbhostport=${SPRING_DATA_MONGODB_HOST}:${SPRING_DATA_MONGODB_PORT} +# api port +server.port=${API_PORT:-8081} #API encryption key. Optional. See https://hygieia.github.io/Hygieia/setup.html#encryption-for-private-repos key=${KEY:-} diff --git a/pom.xml b/pom.xml index 5fd2b7dc..fe984f1a 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ - 3.1.4 + 3.1.5-SNAPSHOT 0.13 4.3.0 18.0 diff --git a/src/main/java/com/capitalone/dashboard/model/ActiveWidget.java b/src/main/java/com/capitalone/dashboard/model/ActiveWidget.java new file mode 100644 index 00000000..6a36d86f --- /dev/null +++ b/src/main/java/com/capitalone/dashboard/model/ActiveWidget.java @@ -0,0 +1,78 @@ +package com.capitalone.dashboard.model; + +import java.util.Objects; + +/** + * Created by stevegal on 20/10/2018. + */ +public class ActiveWidget { + + private String type; + + private String title; + + public ActiveWidget(Builder builder) { + this.type = builder.type; + this.title = builder.title; + } + + public ActiveWidget() { + + } + + public static Builder newActiveWidget() { + return new Builder(); + } + + public String getTitle() { + return title; + } + + public String getType() { + return type; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ActiveWidget that = (ActiveWidget) o; + return Objects.equals(type, that.type) && + Objects.equals(title, that.title); + } + + @Override + public int hashCode() { + return Objects.hash(type, title); + } + + public static final class Builder { + private String type; + private String title; + + public Builder() { + } + + public ActiveWidget build() { + return new ActiveWidget(this); + } + + public Builder type(String type) { + this.type = type; + return this; + } + + public Builder title(String title) { + this.title = title; + return this; + } + } +} diff --git a/src/main/java/com/capitalone/dashboard/request/DashboardRequest.java b/src/main/java/com/capitalone/dashboard/request/DashboardRequest.java index a4f483c3..146819c6 100644 --- a/src/main/java/com/capitalone/dashboard/request/DashboardRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/DashboardRequest.java @@ -5,6 +5,7 @@ import javax.validation.constraints.Size; import com.capitalone.dashboard.auth.AuthenticationUtil; +import com.capitalone.dashboard.model.ActiveWidget; import com.capitalone.dashboard.model.Application; import com.capitalone.dashboard.model.Component; import com.capitalone.dashboard.model.Dashboard; @@ -15,6 +16,7 @@ import com.google.common.collect.Lists; import java.util.List; +import java.util.stream.Collectors; public class DashboardRequest { @NotNull @@ -44,7 +46,7 @@ public class DashboardRequest { @Size(min=1, message="Please select a type") private String type; - private List activeWidgets; + private List activeWidgets; public String getTemplate() { return template; @@ -104,11 +106,11 @@ public void setConfigurationItemBusAppName(String configurationItemBusAppName) { this.configurationItemBusAppName = configurationItemBusAppName; } - public List getActiveWidgets() { + public List getActiveWidgets() { return activeWidgets; } - public void setActiveWidgets(List activeWidgets) { + public void setActiveWidgets(List activeWidgets) { this.activeWidgets = activeWidgets; } @@ -142,7 +144,7 @@ public Dashboard toDashboard() { type , configurationItemBusServName, configurationItemBusAppName, - activeWidgets, + convert(activeWidgets), scoreEnabled, ScoreDisplayType.fromString(scoreDisplay) ); @@ -150,6 +152,15 @@ public Dashboard toDashboard() { } + private List convert(List widget) { + return null==widget?null:widget.stream().map(DashboardRequest::convert).collect(Collectors.toList()); + } + + private static ActiveWidget convert(DashboardRequestWidget request) { + return ActiveWidget.newActiveWidget().title(request.getTitle()).type(request.getType()).build(); + } + + public Dashboard copyTo(Dashboard dashboard) { Dashboard updated = toDashboard(); updated.setId(dashboard.getId()); diff --git a/src/main/java/com/capitalone/dashboard/request/DashboardRequestWidget.java b/src/main/java/com/capitalone/dashboard/request/DashboardRequestWidget.java new file mode 100644 index 00000000..c7d49cda --- /dev/null +++ b/src/main/java/com/capitalone/dashboard/request/DashboardRequestWidget.java @@ -0,0 +1,27 @@ +package com.capitalone.dashboard.request; + +/** + * Created by stevegal on 20/10/2018. + */ +public class DashboardRequestWidget { + + private String title; + + private String type; + + public String getType() { + return type; + } + + public String getTitle() { + return title; + } + + public void setType(String type) { + this.type = type; + } + + public void setTitle(String title) { + this.title = title; + } +} \ No newline at end of file diff --git a/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java b/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java index ffd085e8..1744c810 100644 --- a/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java @@ -57,6 +57,7 @@ public Widget widget() { widget.getOptions().putAll(options); } } + widget.setCollectorItemIds(this.collectorItemIds); return widget; } @@ -67,6 +68,7 @@ public Widget updateWidget(Widget widget) { if ((options != null) && !options.isEmpty()) { widget.getOptions().putAll(options); } + widget.setCollectorItemIds(this.collectorItemIds); return widget; } } diff --git a/src/main/java/com/capitalone/dashboard/rest/DashboardController.java b/src/main/java/com/capitalone/dashboard/rest/DashboardController.java index 9ace84c6..32ebfdc0 100644 --- a/src/main/java/com/capitalone/dashboard/rest/DashboardController.java +++ b/src/main/java/com/capitalone/dashboard/rest/DashboardController.java @@ -159,7 +159,7 @@ public ResponseEntity addWidget(@PathVariable ObjectId id, @Requ Dashboard dashboard = dashboardService.get(id); Component component = dashboardService.associateCollectorToComponent( - request.getComponentId(), request.getCollectorItemIds()); + request.getComponentId(), request.getCollectorItemIds(), null); Widget widget = dashboardService.addWidget(dashboard, request.widget()); @@ -172,11 +172,13 @@ public ResponseEntity addWidget(@PathVariable ObjectId id, @Requ public ResponseEntity updateWidget(@PathVariable ObjectId id, @PathVariable ObjectId widgetId, @RequestBody WidgetRequest request) { - Component component = dashboardService.associateCollectorToComponent( - request.getComponentId(), request.getCollectorItemIds()); - Dashboard dashboard = dashboardService.get(id); - Widget widget = request.updateWidget(dashboardService.getWidget(dashboard, widgetId)); + Widget originalWidget = dashboardService.getWidget(dashboard,widgetId); + List originalObjectItemsForWidget = originalWidget.getCollectorItemIds(); + // re-sort + Component component = dashboardService.associateCollectorToComponent( + request.getComponentId(), request.getCollectorItemIds(), originalObjectItemsForWidget); + Widget widget = request.updateWidget(originalWidget); widget = dashboardService.updateWidget(dashboard, widget); return ResponseEntity.ok().body(new WidgetResponse(component, widget)); @@ -308,7 +310,7 @@ public ResponseEntity deleteWidget(@PathVariable ObjectId id, @PathVariable ObjectId widgetId, @RequestBody WidgetRequest request) { Component component = dashboardService.associateCollectorToComponent( - request.getComponentId(), request.getCollectorItemIds()); + request.getComponentId(), null,request.getCollectorItemIds()); Dashboard dashboard = dashboardService.get(id); Widget widget =dashboardService.getWidget(dashboard, widgetId); diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardService.java b/src/main/java/com/capitalone/dashboard/service/DashboardService.java index 847e5802..c493293a 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardService.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardService.java @@ -70,19 +70,12 @@ public interface DashboardService { * Associate a CollectorItem to a Component * * @param componentId unique identifier of the Component - * @param collectorItemIds List of unique identifier of the CollectorItem + * @param collectorItemIdsToAdd List of unique identifier of the CollectorItem to add + * @param collectorItemIdsToRemove List of unique identifier of the CollectorItem to remove * @return Component */ - Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds); + Component associateCollectorToComponent(ObjectId componentId, List collectorItemIdsToAdd, List collectorItemIdsToRemove); - /** - * Associate a CollectorItem to a Component - * - * @param componentId unique identifier of the Component - * @param collectorItemIds List of unique identifier of the CollectorItem - * @return Component - */ - Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds,Component component); /** * Creates a new Widget and adds it to the Dashboard indicated by the dashboardId parameter. diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java index 91e31157..903a62e4 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java @@ -3,6 +3,7 @@ import com.capitalone.dashboard.auth.AuthenticationUtil; import com.capitalone.dashboard.auth.exceptions.UserNotFoundException; import com.capitalone.dashboard.misc.HygieiaException; +import com.capitalone.dashboard.model.ActiveWidget; import com.capitalone.dashboard.model.AuthType; import com.capitalone.dashboard.model.BaseModel; import com.capitalone.dashboard.model.Cmdb; @@ -282,40 +283,25 @@ private boolean isSafeTeamDashboardDelete(Dashboard dashboard) { } @Override - public Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds) { + public Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds, List oldCollectorItems) { + final String METHOD_NAME = "DashboardServiceImpl.associateCollectorToComponent :"; if (componentId == null || collectorItemIds == null) { // Not all widgets gather data from collectors return null; } - com.capitalone.dashboard.model.Component component = componentRepository.findOne(componentId); //NOPMD - using fully qualified name for clarity - associateCollectorItemsToComponent(collectorItemIds, true, component); - return component; - } - @Override - public Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds,Component component) { - if (componentId == null || collectorItemIds == null) { - // Not all widgets gather data from collectors - return null; - } - associateCollectorItemsToComponent(collectorItemIds, false, component); - return component; - } + com.capitalone.dashboard.model.Component component = componentRepository.findOne(componentId); //NOPMD - using fully qualified name for clarity + //we can not assume what collector item is added, what is removed etc so, we will + //refresh the association. First disable all collector items, then remove all and re-add - private void associateCollectorItemsToComponent(List collectorItemIds, boolean save, Component component) { - final String METHOD_NAME = "DashboardServiceImpl.associateCollectorToComponent :"; //First: disable all collectorItems of the Collector TYPEs that came in with the request. //Second: remove all the collectorItem association of the Collector Type that came in HashSet incomingTypes = new HashSet<>(); HashMap toSaveCollectorItems = new HashMap<>(); - for (ObjectId collectorItemId : collectorItemIds) { - CollectorItem collectorItem = collectorItemRepository.findOne(collectorItemId); - if(collectorItem == null) { - LOG.warn(METHOD_NAME + " Bad CollectorItemId passed in the request : " + collectorItemId); - continue; - } - Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); - if (!incomingTypes.contains(collector.getCollectorType())) { + if (null!=oldCollectorItems) { + for (ObjectId collectorItemId : oldCollectorItems) { + CollectorItem collectorItem = collectorItemRepository.findOne(collectorItemId); + Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); incomingTypes.add(collector.getCollectorType()); List cItems = component.getCollectorItems(collector.getCollectorType()); // Save all collector items as disabled for now @@ -326,24 +312,12 @@ private void associateCollectorItemsToComponent(List collectorItemIds, toSaveCollectorItems.put(ci.getId(), ci); } } - // remove all collector items of a type - component.getCollectorItems().remove(collector.getCollectorType()); - } - } - - // If a collector type is within the code analysis widget, check to see if any of the remaining fields were passed values - if(incomingTypes.stream().anyMatch(QualityWidget::contains)){ - if(!incomingTypes.contains(CollectorType.Test)){ - component.getCollectorItems().remove(CollectorType.Test); - } - if(!incomingTypes.contains(CollectorType.StaticSecurityScan)){ - component.getCollectorItems().remove(CollectorType.StaticSecurityScan); - } - if(!incomingTypes.contains(CollectorType.CodeQuality)){ - component.getCollectorItems().remove(CollectorType.CodeQuality); - } - if(!incomingTypes.contains(CollectorType.LibraryPolicy)){ - component.getCollectorItems().remove(CollectorType.LibraryPolicy); + // remove the old collector item + List allOfType = component.getCollectorItems().get(collector.getCollectorType()); + allOfType.remove(collectorItem); + if (allOfType.isEmpty()) { + component.getCollectorItems().remove(collector.getCollectorType()); + } } } @@ -356,11 +330,6 @@ private void associateCollectorItemsToComponent(List collectorItemIds, } //the new collector items must be set to true collectorItem.setEnabled(true); - CollectorItem existingCollectorItem = toSaveCollectorItems.get(collectorItem.getId()); - if ( (existingCollectorItem == null) - || compareMaps(collectorItem.getOptions(), existingCollectorItem.getOptions()) ) { - collectorItem.setLastUpdated(System.currentTimeMillis()); - } Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); component.addCollectorItem(collector.getCollectorType(), collectorItem); toSaveCollectorItems.put(collectorItemId, collectorItem); @@ -373,9 +342,8 @@ private void associateCollectorItemsToComponent(List collectorItemIds, deleteSet.add(toSaveCollectorItems.get(id)); } collectorItemRepository.save(deleteSet); - if(save){ - componentRepository.save(component); - } + componentRepository.save(component); + return component; } protected boolean compareMaps (Map map1, Map map2) { @@ -586,22 +554,22 @@ public List getByTitle(String title) { @Override public Dashboard updateDashboardWidgets(ObjectId dashboardId, Dashboard request) throws HygieiaException { Dashboard dashboard = get(dashboardId); - List existingActiveWidgets = dashboard.getActiveWidgets(); + List existingActiveWidgets = dashboard.getActiveWidgets(); List components = dashboard.getApplication().getComponents(); - List widgetToDelete = findUpdateCollectorItems(existingActiveWidgets,request.getActiveWidgets()); + List widgetToDelete = findDeletedWidgets(existingActiveWidgets,request.getActiveWidgets()); List widgets = dashboard.getWidgets(); ObjectId componentId = components.get(0)!=null?components.get(0).getId():null; List indexList = new ArrayList<>(); List collectorTypesToDelete = new ArrayList<>(); List updatedWidgets = new ArrayList<>(); - for (String widgetName: widgetToDelete) { + for (ActiveWidget activeWidget: widgetToDelete) { for (Widget widget:widgets) { - if(widgetName.equalsIgnoreCase(widget.getName())){ + if(activeWidget.getTitle().equalsIgnoreCase(widget.getName())){ int widgetIndex = widgets.indexOf(widget); indexList.add(widgetIndex); - collectorTypesToDelete.add(findCollectorType(widgetName)); - if(widgetName.equalsIgnoreCase("codeanalysis")){ + collectorTypesToDelete.add(findCollectorType(activeWidget.getType())); + if(activeWidget.getTitle().equalsIgnoreCase("codeanalysis")){ collectorTypesToDelete.add(CollectorType.CodeQuality); collectorTypesToDelete.add(CollectorType.StaticSecurityScan); collectorTypesToDelete.add(CollectorType.LibraryPolicy); @@ -676,8 +644,8 @@ public void deleteWidget(Dashboard dashboard, CollectorType collectorType){ } } - private List findUpdateCollectorItems(List existingWidgets,List currentWidgets){ - List result = existingWidgets.stream().filter(elem -> !currentWidgets.contains(elem)).collect(Collectors.toList()); + private List findDeletedWidgets(List existingWidgets, List newWidgets){ + List result = existingWidgets.stream().filter(elem -> !newWidgets.contains(elem)).collect(Collectors.toList()); return result; } From e2fb06688cb7076945c395930dfe4dcffe450154 Mon Sep 17 00:00:00 2001 From: stevegal Date: Tue, 3 Sep 2019 23:30:05 +0100 Subject: [PATCH 2/5] WIP: correct remote dashboard creation in progress --- .../service/DashboardRemoteServiceImpl.java | 51 +++---------------- .../service/DashboardServiceImpl.java | 2 - .../MethodLevelSecurityHandlerTest.java | 6 +-- .../dashboard/fixture/DashboardFixture.java | 2 +- .../rest/DashboardControllerTest.java | 2 +- .../service/DashboardServiceTest.java | 23 +++++---- .../DynamicPipelineServiceImplTest.java | 3 +- .../service/PipelineServiceTest.java | 2 +- .../dashboard/service/ServiceServiceTest.java | 2 +- src/test/resources/dashboard/dashboard.json | 2 +- 10 files changed, 30 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java index 9de6c195..0b5c0907 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java @@ -1,6 +1,7 @@ package com.capitalone.dashboard.service; import com.capitalone.dashboard.misc.HygieiaException; +import com.capitalone.dashboard.model.ActiveWidget; import com.capitalone.dashboard.model.Application; import com.capitalone.dashboard.model.Cmdb; import com.capitalone.dashboard.model.Collector; @@ -138,68 +139,32 @@ public Dashboard remoteCreate(DashboardRemoteRequest request, boolean isUpdate) List entries = request.getAllEntries(); Map allWidgetRequests = generateRequestWidgetList( entries, dashboard); - Set existingTypes = new HashSet<>(); - Set incomingTypes = new HashSet<>(); - Component component = componentRepository.findOne(dashboard.getApplication().getComponents().get(0).getId()); - component.getCollectorItems().forEach((item,val)->{ - existingTypes.add(item); - }); //adds widgets for (String key : allWidgetRequests.keySet()) { WidgetRequest widgetRequest = allWidgetRequests.get(key); - - widgetRequest.getCollectorItemIds().forEach(id->{ - CollectorItem c = collectorItemRepository.findOne(id); - if(c!=null) { - Collector collector = collectorRepository.findOne(c.getCollectorId()); - incomingTypes.add(collector.getCollectorType()); - } - }); - - component = dashboardService.associateCollectorToComponent(dashboard.getApplication().getComponents().get(0).getId(), widgetRequest.getCollectorItemIds(),component); Widget newWidget = widgetRequest.widget(); + List originalWigetCollectoItemIds=null; if (isUpdate) { Widget oldWidget = existingWidgets.get(newWidget.getName()); if (oldWidget == null) { dashboardService.addWidget(dashboard, newWidget); } else { - Widget widget = widgetRequest.updateWidget(dashboardService.getWidget(dashboard, oldWidget.getId())); + Widget originalWidget = dashboardService.getWidget(dashboard, oldWidget.getId()); + originalWigetCollectoItemIds = originalWidget.getCollectorItemIds(); + Widget widget = widgetRequest.updateWidget(originalWidget); dashboardService.updateWidget(dashboard, widget); } } else { dashboardService.addWidget(dashboard, newWidget); } + dashboardService.associateCollectorToComponent( + dashboard.getApplication().getComponents().get(0).getId(), widgetRequest.getCollectorItemIds(),originalWigetCollectoItemIds); } - - Set deleteSet = existingTypes.stream().filter(type->!incomingTypes.contains(type)).collect(Collectors.toSet()); - for (CollectorType type: deleteSet) { - if(!type.equals(CollectorType.Artifact)){ - component.getCollectorItems().remove(type); - } - if(!codeAnalysisWidget(type)){ - dashboardService.deleteWidget(dashboard,type); - } - } - // delete code analysis widget - if(isQualityWidget(deleteSet)){ - dashboardService.deleteWidget(dashboard,CollectorType.CodeQuality); - } - - componentRepository.save(component); return (dashboard != null) ? dashboardService.get(dashboard.getId()) : null; } - private boolean isQualityWidget(Set deleteSet) { - return DashboardServiceImpl.QualityWidget.stream().allMatch(deleteSet::contains); - - } - - private boolean codeAnalysisWidget(CollectorType collectorType){ - return DashboardServiceImpl.QualityWidget.stream().filter(collectorType::equals).findAny().isPresent(); - } - /** * Generates a Widget Request list of Widgets to be created from the request * @param entries @@ -299,7 +264,7 @@ private Dashboard requestToDashboard(DashboardRemoteRequest request) throws Hygi if (service == null) throw new HygieiaException("Invalid Business Service Name.", HygieiaException.BAD_DATA); serviceName = service.getConfigurationItem(); } - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); return new Dashboard(true, metaData.getTemplate(), metaData.getTitle(), application, metaData.getOwners(), DashboardType.fromString(metaData.getType()), serviceName, appName,activeWidgets, false, ScoreDisplayType.HEADER); } } diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java index 903a62e4..176691dc 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java @@ -296,13 +296,11 @@ public Component associateCollectorToComponent(ObjectId componentId, List incomingTypes = new HashSet<>(); HashMap toSaveCollectorItems = new HashMap<>(); if (null!=oldCollectorItems) { for (ObjectId collectorItemId : oldCollectorItems) { CollectorItem collectorItem = collectorItemRepository.findOne(collectorItemId); Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); - incomingTypes.add(collector.getCollectorType()); List cItems = component.getCollectorItems(collector.getCollectorType()); // Save all collector items as disabled for now if (!CollectionUtils.isEmpty(cItems)) { diff --git a/src/test/java/com/capitalone/dashboard/auth/access/MethodLevelSecurityHandlerTest.java b/src/test/java/com/capitalone/dashboard/auth/access/MethodLevelSecurityHandlerTest.java index 65208691..36e6ecd4 100644 --- a/src/test/java/com/capitalone/dashboard/auth/access/MethodLevelSecurityHandlerTest.java +++ b/src/test/java/com/capitalone/dashboard/auth/access/MethodLevelSecurityHandlerTest.java @@ -51,7 +51,7 @@ public void testIsOwnerOfDashboard_noDashFound() { @Test public void testIsOwnerOfDashboard_legacyDashFound() { initiateSecurityContext(); - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); Dashboard dashboard = new Dashboard("team", "title", null, null, DashboardType.Team, configItemAppName,configItemComponentName,activeWidgets, false, ScoreDisplayType.HEADER); dashboard.setOwner(USERNAME); when(dashboardRepository.findOne(any(ObjectId.class))).thenReturn(dashboard); @@ -62,7 +62,7 @@ public void testIsOwnerOfDashboard_legacyDashFound() { @Test public void testIsOwnerOfDashboard_newDashFound() { initiateSecurityContext(); - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner(USERNAME, AuthType.STANDARD)); Dashboard dashboard = new Dashboard("team", "title", null, owners, DashboardType.Team, configItemAppName,configItemComponentName,activeWidgets, false, ScoreDisplayType.HEADER); @@ -74,7 +74,7 @@ public void testIsOwnerOfDashboard_newDashFound() { @Test public void testIsNotOwnerOfDashboard() { initiateSecurityContext(); - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); Dashboard dashboard = new Dashboard("team", "title", null, null, DashboardType.Team,configItemAppName,configItemComponentName,activeWidgets, false, ScoreDisplayType.HEADER); dashboard.setOwner(SOME_OTHER_USER); when(dashboardRepository.findOne(any(ObjectId.class))).thenReturn(dashboard); diff --git a/src/test/java/com/capitalone/dashboard/fixture/DashboardFixture.java b/src/test/java/com/capitalone/dashboard/fixture/DashboardFixture.java index af9e030e..b05d9689 100644 --- a/src/test/java/com/capitalone/dashboard/fixture/DashboardFixture.java +++ b/src/test/java/com/capitalone/dashboard/fixture/DashboardFixture.java @@ -54,7 +54,7 @@ public static Dashboard makeDashboard(String template, String title, String appN component.setName(compName); application = new Application(appName, component); } - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner(owner, AuthType.STANDARD)); return new Dashboard(template, title, application, owners, type,configItemAppName, configItemComponentName,activeWidgets, false, ScoreDisplayType.HEADER); diff --git a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java index 3568d73a..d251b78e 100644 --- a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java +++ b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java @@ -331,7 +331,7 @@ public void addWidget() throws Exception { widgetWithId.setId(ObjectId.get()); Component component = makeComponent(compId, "Component", CollectorType.Build, collId); when(dashboardService.get(dashId)).thenReturn(d1); - when(dashboardService.associateCollectorToComponent(compId, collIds)).thenReturn(component); + when(dashboardService.associateCollectorToComponent(compId, collIds, null)).thenReturn(component); when(dashboardService.addWidget(Matchers.any(Dashboard.class), Matchers.any(Widget.class))).thenReturn(widgetWithId); mockMvc.perform(post("/dashboard/" + dashId.toString() + "/widget") .contentType(TestUtil.APPLICATION_JSON_UTF8) diff --git a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java index c280283b..8eabfb74 100644 --- a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.capitalone.dashboard.model.ActiveWidget; import com.capitalone.dashboard.model.CollectorItem; import com.capitalone.dashboard.model.Component; import com.capitalone.dashboard.model.Dashboard; @@ -213,7 +214,7 @@ public void associateCollectorToComponent() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item)); @@ -241,7 +242,7 @@ public void associateCollectorToComponentWithDisabledCollectorItem() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item)); @@ -273,7 +274,7 @@ public void associateCollectorToComponent_Item_with_two_components() { when(componentRepository.findOne(compId)).thenReturn(component1); when(customRepositoryQuery.findComponents(collector, item)).thenReturn(Arrays.asList(component1, component2)); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component1.getCollectorItems().get(CollectorType.Build), contains(item)); assertThat(item.isEnabled(), is(true)); @@ -301,7 +302,7 @@ public void associateCollectorToComponent_collectorItemDisabled_willBecomeEnable when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item)); assertThat(item.isEnabled(), is(true)); @@ -345,7 +346,7 @@ public void associateCollectorToComponent_switch_Item1_with_Item2() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item2)); assertThat(item1.isEnabled(), is(false)); @@ -393,7 +394,7 @@ public void associateCollectorToComponent_switch_Item1_with_Item2_Multiple_Compo when(componentRepository.findOne(compId)).thenReturn(component1); when(customRepositoryQuery.findComponents(collector, item1)).thenReturn(Arrays.asList(component1, component2)); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component1.getCollectorItems().get(CollectorType.Build), contains(item2)); assertThat(item1.isEnabled(), is(true)); @@ -443,7 +444,7 @@ public void associateCollectorToComponent_replace_Item1_with_Item2_and_3() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item2, item3)); assertThat(item1.isEnabled(), is(false)); @@ -497,7 +498,7 @@ public void associateCollectorToComponent_replace_Item1_and_2_with_Item3() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds); + dashboardService.associateCollectorToComponent(compId, collItemIds,null); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item3)); assertThat(item1.isEnabled(), is(false)); @@ -712,7 +713,7 @@ public void deleteWidget() { @Test public void updateOwners_empty_owner_set() { Iterable owners = Lists.newArrayList(); - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); Dashboard dashboard = new Dashboard("template", "title", new Application("Application"), null, DashboardType.Team, configItemBusServName, configItemBusAppName, activeWidgets, false, ScoreDisplayType.HEADER); when(dashboardRepository.findOne(dashboard.getId())).thenReturn(dashboard); @@ -745,7 +746,7 @@ public void updateOwners() { UserInfo existingInfo = new UserInfo(); existingInfo.setUsername("existing"); existingInfo.setAuthType(AuthType.LDAP); - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List existingOwners = new ArrayList<>(); existingOwners.add(existingOwner); Dashboard dashboard = new Dashboard("template", "title", new Application("Application"), existingOwners, DashboardType.Team,configItemBusServName,configItemBusAppName, activeWidgets, false, ScoreDisplayType.HEADER); @@ -888,7 +889,7 @@ private Dashboard makeTeamDashboard(String template, String title, String appNam for (String compName : compNames) { app.addComponent(new Component(compName)); } - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner(owner, AuthType.STANDARD)); return new Dashboard(template, title, app, owners, DashboardType.Team, configItemBusServName, configItemBusAppName, activeWidgets, false, ScoreDisplayType.HEADER); diff --git a/src/test/java/com/capitalone/dashboard/service/DynamicPipelineServiceImplTest.java b/src/test/java/com/capitalone/dashboard/service/DynamicPipelineServiceImplTest.java index 58f6db40..ca532e5f 100644 --- a/src/test/java/com/capitalone/dashboard/service/DynamicPipelineServiceImplTest.java +++ b/src/test/java/com/capitalone/dashboard/service/DynamicPipelineServiceImplTest.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.Set; +import com.capitalone.dashboard.model.ActiveWidget; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Test; @@ -619,7 +620,7 @@ private CollectorItem setupScmCollectorItem() { } private Dashboard setupDashboard(Component component) { - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner("MarkRx", AuthType.STANDARD)); Dashboard rt = new Dashboard("foo", "bar", new Application("helloworld", component), owners, DashboardType.Product,"ASVTEST","BAPTEST", activeWidgets, false, null); diff --git a/src/test/java/com/capitalone/dashboard/service/PipelineServiceTest.java b/src/test/java/com/capitalone/dashboard/service/PipelineServiceTest.java index edcad35d..d1aca60c 100644 --- a/src/test/java/com/capitalone/dashboard/service/PipelineServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/PipelineServiceTest.java @@ -146,7 +146,7 @@ private Dashboard makeTeamDashboard(String template, String title, String appNam for (String compName : compNames) { app.addComponent(new Component(compName)); } - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner(owner, AuthType.STANDARD)); Dashboard dashboard = new Dashboard(template, title, app, owners, DashboardType.Team, configItemAppName, configItemComponentName, activeWidgets, false, ScoreDisplayType.HEADER); diff --git a/src/test/java/com/capitalone/dashboard/service/ServiceServiceTest.java b/src/test/java/com/capitalone/dashboard/service/ServiceServiceTest.java index e684fdc9..15ef45d0 100644 --- a/src/test/java/com/capitalone/dashboard/service/ServiceServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/ServiceServiceTest.java @@ -68,7 +68,7 @@ public void create() { final ObjectId id = ObjectId.get(); final String name = "service"; final String url = "https://abc123456.com"; - List activeWidgets = new ArrayList<>(); + List activeWidgets = new ArrayList<>(); List owners = new ArrayList<>(); owners.add(new Owner("amit", AuthType.STANDARD)); final Dashboard dashboard = new Dashboard("template", "title", new Application("app"), owners, DashboardType.Team, "ASVTEST","BAPTEST",activeWidgets, false, ScoreDisplayType.HEADER); diff --git a/src/test/resources/dashboard/dashboard.json b/src/test/resources/dashboard/dashboard.json index f139cf25..56fbacd2 100644 --- a/src/test/resources/dashboard/dashboard.json +++ b/src/test/resources/dashboard/dashboard.json @@ -75,7 +75,7 @@ "configurationItemBusServName": "TestBusServ", "configurationItemBusAppName": "confItem", "activeWidgets": [ - "repo" + { "title":"repo", "type":"repo"} ], "errorCode": 0, "id": { From 36a163d390cd9273df9c34e28370c9e22c376872 Mon Sep 17 00:00:00 2001 From: stevegal Date: Wed, 4 Sep 2019 22:50:05 +0100 Subject: [PATCH 3/5] WIP: started work on remote dashboard fixes --- .../service/DashboardRemoteServiceImpl.java | 28 ++++- .../dashboard/service/DashboardService.java | 3 +- .../service/DashboardServiceImpl.java | 113 +++++++----------- .../service/DashboardServiceTest.java | 8 +- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java index 0b5c0907..0527e629 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java @@ -139,29 +139,49 @@ public Dashboard remoteCreate(DashboardRemoteRequest request, boolean isUpdate) List entries = request.getAllEntries(); Map allWidgetRequests = generateRequestWidgetList( entries, dashboard); + Set orphanedTypes = new HashSet<>(); + Component component = componentRepository.findOne(dashboard.getApplication().getComponents().get(0).getId()); + component.getCollectorItems().forEach((item,val)->{ + orphanedTypes.addAll(val.stream().map(collectorItem -> collectorItem.getCollectorId()).collect(Collectors.toList())); + }); + Set newCollectorItems = new HashSet<>(); + + // start by assuming all widgets should be removed + List widgetsToRemove = new ArrayList<>(dashboard.getWidgets()); + //adds widgets for (String key : allWidgetRequests.keySet()) { WidgetRequest widgetRequest = allWidgetRequests.get(key); Widget newWidget = widgetRequest.widget(); - List originalWigetCollectoItemIds=null; if (isUpdate) { Widget oldWidget = existingWidgets.get(newWidget.getName()); if (oldWidget == null) { dashboardService.addWidget(dashboard, newWidget); + newCollectorItems.addAll(newWidget.getCollectorItemIds()); } else { Widget originalWidget = dashboardService.getWidget(dashboard, oldWidget.getId()); - originalWigetCollectoItemIds = originalWidget.getCollectorItemIds(); + List objectIdsToKeep = originalWidget.getCollectorItemIds(); + orphanedTypes.remove(objectIdsToKeep); Widget widget = widgetRequest.updateWidget(originalWidget); dashboardService.updateWidget(dashboard, widget); + // save this updated widget + widgetsToRemove.remove(widget); } } else { dashboardService.addWidget(dashboard, newWidget); } - dashboardService.associateCollectorToComponent( - dashboard.getApplication().getComponents().get(0).getId(), widgetRequest.getCollectorItemIds(),originalWigetCollectoItemIds); + } + // remove any widgets that haven;t been saved.. + for(Widget widgetToRemove: widgetsToRemove) { + dashboardService.deleteWidget(dashboard, widgetToRemove, component.getId()); + } + + dashboardService.associateCollectorToComponent( + component.getId(), newCollectorItems, orphanedTypes); + return (dashboard != null) ? dashboardService.get(dashboard.getId()) : null; } diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardService.java b/src/main/java/com/capitalone/dashboard/service/DashboardService.java index c493293a..bed1d14a 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardService.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardService.java @@ -1,5 +1,6 @@ package com.capitalone.dashboard.service; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -74,7 +75,7 @@ public interface DashboardService { * @param collectorItemIdsToRemove List of unique identifier of the CollectorItem to remove * @return Component */ - Component associateCollectorToComponent(ObjectId componentId, List collectorItemIdsToAdd, List collectorItemIdsToRemove); + Component associateCollectorToComponent(ObjectId componentId, Collection collectorItemIdsToAdd, Collection collectorItemIdsToRemove); /** diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java index 176691dc..5af4486f 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java @@ -41,6 +41,7 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -283,7 +284,7 @@ private boolean isSafeTeamDashboardDelete(Dashboard dashboard) { } @Override - public Component associateCollectorToComponent(ObjectId componentId, List collectorItemIds, List oldCollectorItems) { + public Component associateCollectorToComponent(ObjectId componentId, Collection collectorItemIds, Collection oldCollectorItems) { final String METHOD_NAME = "DashboardServiceImpl.associateCollectorToComponent :"; if (componentId == null || collectorItemIds == null) { // Not all widgets gather data from collectors @@ -294,27 +295,32 @@ public Component associateCollectorToComponent(ObjectId componentId, List toSaveCollectorItems = new HashMap<>(); if (null!=oldCollectorItems) { for (ObjectId collectorItemId : oldCollectorItems) { CollectorItem collectorItem = collectorItemRepository.findOne(collectorItemId); - Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); - List cItems = component.getCollectorItems(collector.getCollectorType()); - // Save all collector items as disabled for now - if (!CollectionUtils.isEmpty(cItems)) { - for (CollectorItem ci : cItems) { - //if item is orphaned, disable it. Otherwise keep it enabled. - ci.setEnabled(!isLonely(ci, collector, component)); - toSaveCollectorItems.put(ci.getId(), ci); + if (null != collectorItem) { + Collector collector = collectorRepository.findOne(collectorItem.getCollectorId()); + List cItems = component.getCollectorItems(collector.getCollectorType()); + // Save all collector items as disabled for now + if (!CollectionUtils.isEmpty(cItems)) { + for (CollectorItem ci : cItems) { + //if item is orphaned, disable it. Otherwise keep it enabled. + ci.setEnabled(!isLonely(ci, collector, component)); + toSaveCollectorItems.put(ci.getId(), ci); + } + } + + // remove the old collector item + List allOfType = component.getCollectorItems().get(collector.getCollectorType()); + if (null != allOfType) { + allOfType.remove(collectorItem); + if (allOfType.isEmpty()) { + component.getCollectorItems().remove(collector.getCollectorType()); + } } - } - // remove the old collector item - List allOfType = component.getCollectorItems().get(collector.getCollectorType()); - allOfType.remove(collectorItem); - if (allOfType.isEmpty()) { - component.getCollectorItems().remove(collector.getCollectorType()); } } } @@ -557,68 +563,41 @@ public Dashboard updateDashboardWidgets(ObjectId dashboardId, Dashboard request) List widgetToDelete = findDeletedWidgets(existingActiveWidgets,request.getActiveWidgets()); List widgets = dashboard.getWidgets(); ObjectId componentId = components.get(0)!=null?components.get(0).getId():null; - List indexList = new ArrayList<>(); - List collectorTypesToDelete = new ArrayList<>(); - List updatedWidgets = new ArrayList<>(); - - for (ActiveWidget activeWidget: widgetToDelete) { - for (Widget widget:widgets) { - if(activeWidget.getTitle().equalsIgnoreCase(widget.getName())){ - int widgetIndex = widgets.indexOf(widget); - indexList.add(widgetIndex); - collectorTypesToDelete.add(findCollectorType(activeWidget.getType())); - if(activeWidget.getTitle().equalsIgnoreCase("codeanalysis")){ - collectorTypesToDelete.add(CollectorType.CodeQuality); - collectorTypesToDelete.add(CollectorType.StaticSecurityScan); - collectorTypesToDelete.add(CollectorType.LibraryPolicy); - collectorTypesToDelete.add(CollectorType.Test); - } - } - } - } - //iterate through index and remove widgets - for (Integer i:indexList) { - widgets.set(i,null); - } - for (Widget w:widgets) { - if(w!=null) - updatedWidgets.add(w); - } - dashboard.setWidgets(updatedWidgets); + + widgets.removeAll(widgetToDelete); + dashboard.setWidgets(widgets); dashboard.setActiveWidgets(request.getActiveWidgets()); dashboard = update(dashboard); if(componentId!=null){ - com.capitalone.dashboard.model.Component component = componentRepository.findOne(componentId); - for (CollectorType cType :collectorTypesToDelete) { - component.getCollectorItems().remove(cType); - } - componentRepository.save(component); + removeOrphanedCollectorItems(dashboard, componentId); } return dashboard; } + private void removeOrphanedCollectorItems(Dashboard dashboard, ObjectId componentId) { + List allActiveCollectorItems = new ArrayList<>(); + for(Widget widget : dashboard.getWidgets()) { + allActiveCollectorItems.addAll(widget.getCollectorItemIds()); + } + com.capitalone.dashboard.model.Component component = componentRepository.findOne(componentId); + Map> activeEntries = component.getCollectorItems().entrySet().stream() + .filter( + entry -> entry.getValue().stream() + .filter(collectorItem -> allActiveCollectorItems.contains(collectorItem.getCollectorId())) + .findFirst().isPresent()).collect( + Collectors.toMap(item->item.getKey(), item->item.getValue())); + component.setAllCollectorItems(activeEntries); + componentRepository.save(component); + } + @Override public void deleteWidget(Dashboard dashboard, Widget widget,ObjectId componentId) { - int index = dashboard.getWidgets().indexOf(widget); - dashboardUpdate(dashboard, index); - String widgetName = widget.getName(); - List collectorTypesToDelete = new ArrayList<>(); - CollectorType cType = findCollectorType(widgetName); - collectorTypesToDelete.add(cType); - if(widgetName.equalsIgnoreCase("codeanalysis")){ - collectorTypesToDelete.add(CollectorType.CodeQuality); - collectorTypesToDelete.add(CollectorType.StaticSecurityScan); - collectorTypesToDelete.add(CollectorType.LibraryPolicy); - collectorTypesToDelete.add(CollectorType.Test); - } - if(componentId!=null){ - Component component = componentRepository.findOne(componentId); - for (CollectorType c:collectorTypesToDelete) { - component.getCollectorItems().remove(c); - } + dashboard.getWidgets().remove(widget); + dashboardRepository.save(dashboard); - componentRepository.save(component); + if(componentId!=null){ + removeOrphanedCollectorItems(dashboard,componentId); } } diff --git a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java index 8eabfb74..8658022c 100644 --- a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java @@ -346,7 +346,7 @@ public void associateCollectorToComponent_switch_Item1_with_Item2() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds,null); + dashboardService.associateCollectorToComponent(compId, collItemIds,Arrays.asList(collItemId1)); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item2)); assertThat(item1.isEnabled(), is(false)); @@ -394,7 +394,7 @@ public void associateCollectorToComponent_switch_Item1_with_Item2_Multiple_Compo when(componentRepository.findOne(compId)).thenReturn(component1); when(customRepositoryQuery.findComponents(collector, item1)).thenReturn(Arrays.asList(component1, component2)); - dashboardService.associateCollectorToComponent(compId, collItemIds,null); + dashboardService.associateCollectorToComponent(compId, collItemIds, Arrays.asList(collItemId1)); assertThat(component1.getCollectorItems().get(CollectorType.Build), contains(item2)); assertThat(item1.isEnabled(), is(true)); @@ -444,7 +444,7 @@ public void associateCollectorToComponent_replace_Item1_with_Item2_and_3() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds,null); + dashboardService.associateCollectorToComponent(compId, collItemIds, Arrays.asList(collItemId1)); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item2, item3)); assertThat(item1.isEnabled(), is(false)); @@ -498,7 +498,7 @@ public void associateCollectorToComponent_replace_Item1_and_2_with_Item3() { when(collectorRepository.findOne(collId)).thenReturn(collector); when(componentRepository.findOne(compId)).thenReturn(component); - dashboardService.associateCollectorToComponent(compId, collItemIds,null); + dashboardService.associateCollectorToComponent(compId, collItemIds, Arrays.asList(collItemId1, collItemId2)); assertThat(component.getCollectorItems().get(CollectorType.Build), contains(item3)); assertThat(item1.isEnabled(), is(false)); From d50da5dc19c38c131e3215398ebcd6af94c23e30 Mon Sep 17 00:00:00 2001 From: stevegal Date: Thu, 5 Sep 2019 21:15:16 +0100 Subject: [PATCH 4/5] fixes to ensure remote dashboard works --- .../dashboard/service/DashboardRemoteServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java index 0527e629..500a2b75 100644 --- a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java @@ -6,7 +6,6 @@ import com.capitalone.dashboard.model.Cmdb; import com.capitalone.dashboard.model.Collector; import com.capitalone.dashboard.model.CollectorItem; -import com.capitalone.dashboard.model.CollectorType; import com.capitalone.dashboard.model.Component; import com.capitalone.dashboard.model.Dashboard; import com.capitalone.dashboard.model.DashboardType; @@ -162,14 +161,16 @@ public Dashboard remoteCreate(DashboardRemoteRequest request, boolean isUpdate) } else { Widget originalWidget = dashboardService.getWidget(dashboard, oldWidget.getId()); List objectIdsToKeep = originalWidget.getCollectorItemIds(); - orphanedTypes.remove(objectIdsToKeep); + orphanedTypes.removeAll(objectIdsToKeep); Widget widget = widgetRequest.updateWidget(originalWidget); dashboardService.updateWidget(dashboard, widget); // save this updated widget - widgetsToRemove.remove(widget); + widgetsToRemove.remove(originalWidget); + newCollectorItems.addAll(widget.getCollectorItemIds()); } } else { dashboardService.addWidget(dashboard, newWidget); + newCollectorItems.addAll(newWidget.getCollectorItemIds()); } } From c6ea657b6ee69c57ab36a0c3c44bda0123bcf5b1 Mon Sep 17 00:00:00 2001 From: stevegal Date: Thu, 19 Sep 2019 21:41:21 +0100 Subject: [PATCH 5/5] add in missing types for widgets as well as names. Add collector Items into the widgets --- .../dashboard/request/CodeQualityRequest.java | 11 +++++++++++ .../dashboard/request/CommitRequest.java | 9 +++++++++ .../dashboard/request/GitRequestRequest.java | 9 +++++++++ .../request/LibraryPolicyRequest.java | 10 ++++++++++ .../request/PerformanceSearchRequest.java | 9 +++++++++ .../dashboard/request/TestResultRequest.java | 10 ++++++++++ .../dashboard/request/WidgetRequest.java | 15 +++++++++++++-- .../service/CodeQualityServiceImpl.java | 17 +++++++++++------ .../dashboard/service/CommitServiceImpl.java | 3 ++- .../service/GitRequestServiceImpl.java | 3 ++- .../service/LibraryPolicyServiceImpl.java | 11 ++++++++++- .../service/MetadataServiceImpl.java | 3 ++- .../service/PerformanceServiceImpl.java | 8 ++------ .../service/RallyFeatureServiceImpl.java | 3 +++ .../service/TestResultServiceImpl.java | 7 ++++--- .../dashboard/request/WidgetRequestTest.java | 2 ++ .../rest/CodeQualityControllerTest.java | 15 +++++++++++++-- .../rest/DashboardControllerTest.java | 19 +++++++++++-------- .../rest/TestResultControllerTest.java | 9 ++++++++- .../dashboard/rest/ZCommitControllerTest.java | 12 +++++++++++- .../dashboard/service/CommitServiceTest.java | 1 + .../service/GitRequestServiceTest.java | 1 + 22 files changed, 154 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/capitalone/dashboard/request/CodeQualityRequest.java b/src/main/java/com/capitalone/dashboard/request/CodeQualityRequest.java index 86f026bc..e719dbf3 100644 --- a/src/main/java/com/capitalone/dashboard/request/CodeQualityRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/CodeQualityRequest.java @@ -4,10 +4,13 @@ import org.bson.types.ObjectId; import javax.validation.constraints.NotNull; +import java.util.List; public class CodeQualityRequest { @NotNull private ObjectId componentId; + @NotNull + private List collectorItemIds; private Integer max; private Integer numberOfDays; private Long dateBegins; @@ -65,4 +68,12 @@ public void setType(CodeQualityType type) { public boolean validDateRange() { return dateBegins != null || dateEnds != null; } + + public List getCollectorItemIds() { + return collectorItemIds; + } + + public void setCollectorItemIds(List collectorItemIds) { + this.collectorItemIds = collectorItemIds; + } } diff --git a/src/main/java/com/capitalone/dashboard/request/CommitRequest.java b/src/main/java/com/capitalone/dashboard/request/CommitRequest.java index 1a89e896..2fb63b18 100644 --- a/src/main/java/com/capitalone/dashboard/request/CommitRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/CommitRequest.java @@ -9,6 +9,7 @@ public class CommitRequest { @NotNull private ObjectId componentId; + private ObjectId collectorItemId; private Integer numberOfDays; private Long commitDateBegins; private Long commitDateEnds; @@ -97,4 +98,12 @@ public boolean validCommitDateRange() { public boolean validChangesRange() { return changesGreaterThan != null || changesLessThan != null; } + + public ObjectId getCollectorItemId() { + return collectorItemId; + } + + public void setCollectorItemId(ObjectId collectorItemId) { + this.collectorItemId = collectorItemId; + } } diff --git a/src/main/java/com/capitalone/dashboard/request/GitRequestRequest.java b/src/main/java/com/capitalone/dashboard/request/GitRequestRequest.java index a043d086..8ddf06a7 100644 --- a/src/main/java/com/capitalone/dashboard/request/GitRequestRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/GitRequestRequest.java @@ -7,6 +7,7 @@ public class GitRequestRequest { @NotNull private ObjectId componentId; + private ObjectId collectorItemId; private Integer numberOfDays; public ObjectId getComponentId() { @@ -25,4 +26,12 @@ public void setNumberOfDays(Integer numberOfDays) { this.numberOfDays = numberOfDays; } + public ObjectId getCollectorItemId() { + return collectorItemId; + } + + public void setCollectorItemId(ObjectId collectorItemId) { + this.collectorItemId = collectorItemId; + } + } diff --git a/src/main/java/com/capitalone/dashboard/request/LibraryPolicyRequest.java b/src/main/java/com/capitalone/dashboard/request/LibraryPolicyRequest.java index c3d0fc52..3affb861 100644 --- a/src/main/java/com/capitalone/dashboard/request/LibraryPolicyRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/LibraryPolicyRequest.java @@ -3,10 +3,12 @@ import org.bson.types.ObjectId; import javax.validation.constraints.NotNull; +import java.util.List; public class LibraryPolicyRequest { @NotNull private ObjectId componentId; + private List collectorItemIds; private Integer max; private Integer numberOfDays; private Long dateBegins; @@ -55,4 +57,12 @@ public void setDateEnds(Long dateEnds) { public boolean validDateRange() { return dateBegins != null || dateEnds != null; } + + public List getCollectorItemIds() { + return collectorItemIds; + } + + public void setCollectorItemIds(List collectorItemIds) { + this.collectorItemIds = collectorItemIds; + } } diff --git a/src/main/java/com/capitalone/dashboard/request/PerformanceSearchRequest.java b/src/main/java/com/capitalone/dashboard/request/PerformanceSearchRequest.java index 073b8600..b0fce5d2 100644 --- a/src/main/java/com/capitalone/dashboard/request/PerformanceSearchRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/PerformanceSearchRequest.java @@ -8,6 +8,7 @@ public class PerformanceSearchRequest { @NotNull private ObjectId componentId; + private ObjectId collectorItemId; private Integer max; private Integer numberOfDays; private Long dateBegins; @@ -65,4 +66,12 @@ public void setType(PerformanceType type) { public boolean validDateRange() { return dateBegins != null || dateEnds != null; } + + public ObjectId getCollectorItemId() { + return collectorItemId; + } + + public void setCollectorItemId(ObjectId collectorItemId) { + this.collectorItemId = collectorItemId; + } } diff --git a/src/main/java/com/capitalone/dashboard/request/TestResultRequest.java b/src/main/java/com/capitalone/dashboard/request/TestResultRequest.java index ad71aa75..0131313e 100644 --- a/src/main/java/com/capitalone/dashboard/request/TestResultRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/TestResultRequest.java @@ -11,6 +11,8 @@ public class TestResultRequest { @NotNull private ObjectId componentId; + @NotNull + private List collectorItemIds; private Integer max; private Long startDateBegins; private Long startDateEnds; @@ -113,4 +115,12 @@ public boolean validEndDateRange() { public boolean validDurationRange() { return durationGreaterThan != null || durationLessThan != null; } + + public List getCollectorItemIds() { + return collectorItemIds; + } + + public void setCollectorItemIds(List collectorItemIds) { + this.collectorItemIds = collectorItemIds; + } } diff --git a/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java b/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java index 1744c810..88fcf1b1 100644 --- a/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java +++ b/src/main/java/com/capitalone/dashboard/request/WidgetRequest.java @@ -11,6 +11,7 @@ public class WidgetRequest { private ObjectId componentId; private List collectorItemIds; private Map options; + private String type; public String getName() { return name; @@ -44,16 +45,25 @@ public void setOptions(Map options) { this.options = options; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public Widget widget() { Widget widget = new Widget(); widget.setName(name); + widget.setType(type); widget.setComponentId(componentId); if ((options != null) && !options.isEmpty()) { widget.getOptions().put("id",options.get("id")); - if("build".equalsIgnoreCase(name)){ + if("build".equalsIgnoreCase(type)){ widget.getOptions().put("buildDurationThreshold",3); widget.getOptions().put("consecutiveFailureThreshold",5); - } else if ("AgileTool".equalsIgnoreCase(name) || "feature".equalsIgnoreCase(name)) { + } else if ("AgileTool".equalsIgnoreCase(type) || "feature".equalsIgnoreCase(type)) { widget.getOptions().putAll(options); } } @@ -64,6 +74,7 @@ public Widget widget() { public Widget updateWidget(Widget widget) { widget.setComponentId(componentId); widget.setName(name); + widget.setType(type); widget.getOptions().clear(); if ((options != null) && !options.isEmpty()) { widget.getOptions().putAll(options); diff --git a/src/main/java/com/capitalone/dashboard/service/CodeQualityServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/CodeQualityServiceImpl.java index c9612832..feb48edc 100644 --- a/src/main/java/com/capitalone/dashboard/service/CodeQualityServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/CodeQualityServiceImpl.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; @Service public class CodeQualityServiceImpl implements CodeQualityService { @@ -100,12 +101,12 @@ private DataResponse> searchType(CodeQualityRequest reques new PageRequest(0, request.getMax(), Sort.Direction.DESC, "timestamp"); result = codeQualityRepository.findAll(builder.getValue(), pageRequest).getContent(); } - String instanceUrl = (String)item.getOptions().get("instanceUrl"); + String instanceUrl = (String) item.getOptions().get("instanceUrl"); String projectId = (String) item.getOptions().get("projectId"); - String reportUrl = getReportURL(instanceUrl,"dashboard/index/",projectId); + String reportUrl = getReportURL(instanceUrl, "dashboard/index/", projectId); Collector collector = collectorRepository.findOne(item.getCollectorId()); long lastExecuted = (collector == null) ? 0 : collector.getLastExecuted(); - return new DataResponse<>(result, lastExecuted,reportUrl); + return new DataResponse<>(result, lastExecuted, reportUrl); } @@ -116,8 +117,12 @@ protected CollectorItem getCollectorItem(CodeQualityRequest request) { } CodeQualityType qualityType = Objects.firstNonNull(request.getType(), CodeQualityType.StaticAnalysis); + CollectorItem item = null; + List allInComponent = component.getCollectorItems(qualityType.collectorType()); + Optional allInWidget = null!=allInComponent? allInComponent.stream().filter( + collectorItem -> request.getCollectorItemIds().contains(collectorItem.getId())).findFirst(): Optional.empty(); - return component.getLastUpdatedCollectorItemForType(qualityType.collectorType()); + return allInWidget.isPresent() ? allInWidget.get() : null; } protected CodeQuality createCodeQuality(CodeQualityCreateRequest request) throws HygieiaException { @@ -211,9 +216,9 @@ private CodeQuality createCodeQuality(CollectorItem collectorItem, CodeQualityCr } // get projectUrl and projectId from collectorItem and form reportUrl - private String getReportURL(String projectUrl,String path,String projectId) { + private String getReportURL(String projectUrl, String path, String projectId) { StringBuilder sb = new StringBuilder(projectUrl); - if(!projectUrl.endsWith("/")) { + if (!projectUrl.endsWith("/")) { sb.append("/"); } sb.append(path) diff --git a/src/main/java/com/capitalone/dashboard/service/CommitServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/CommitServiceImpl.java index 9daad812..874a0709 100644 --- a/src/main/java/com/capitalone/dashboard/service/CommitServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/CommitServiceImpl.java @@ -59,7 +59,8 @@ public DataResponse> search(CommitRequest request) { Component component = componentRepository.findOne(request.getComponentId()); if ( (component == null) - || ((item = component.getLastUpdatedCollectorItemForType(CollectorType.SCM)) == null) ) { + || ((item = component.getCollectorItemMatchingTypeAndCollectorItemId(CollectorType.SCM, + request.getCollectorItemId())) == null) ) { Iterable results = new ArrayList<>(); return new DataResponse<>(results, new Date().getTime()); } diff --git a/src/main/java/com/capitalone/dashboard/service/GitRequestServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/GitRequestServiceImpl.java index 275b5574..75342a06 100644 --- a/src/main/java/com/capitalone/dashboard/service/GitRequestServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/GitRequestServiceImpl.java @@ -55,7 +55,8 @@ public DataResponse> search(GitRequestRequest request, CollectorItem item = null; Component component = componentRepository.findOne(request.getComponentId()); if ( (component == null) - || ((item = component.getLastUpdatedCollectorItemForType(CollectorType.SCM)) == null) ) { + || ((item = component.getCollectorItemMatchingTypeAndCollectorItemId(CollectorType.SCM, + request.getCollectorItemId())) == null) ) { Iterable results = new ArrayList<>(); return new DataResponse<>(results, new Date().getTime()); } diff --git a/src/main/java/com/capitalone/dashboard/service/LibraryPolicyServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/LibraryPolicyServiceImpl.java index 5c7f070b..f2ce9aa6 100644 --- a/src/main/java/com/capitalone/dashboard/service/LibraryPolicyServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/LibraryPolicyServiceImpl.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; @Service public class LibraryPolicyServiceImpl implements LibraryPolicyService { @@ -92,6 +93,14 @@ public DataResponse> search(LibraryPolicyRequest reque protected List getCollectorItems(LibraryPolicyRequest request) { Component component = componentRepository.findOne(request.getComponentId()); - return (component != null) ? component.getCollectorItems(CollectorType.LibraryPolicy) : null; + if (component != null) { + List allInComponent= component.getCollectorItems(CollectorType.LibraryPolicy); + List allInWidget = allInComponent.stream().filter( + collectorItem -> request.getCollectorItemIds().contains(collectorItem.getId()) + ).collect(Collectors.toList()); + return allInWidget; + } + return null; + } } diff --git a/src/main/java/com/capitalone/dashboard/service/MetadataServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/MetadataServiceImpl.java index 171c2fea..02d5491f 100644 --- a/src/main/java/com/capitalone/dashboard/service/MetadataServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/MetadataServiceImpl.java @@ -14,7 +14,8 @@ import org.springframework.stereotype.Service; @Service -public class MetadataServiceImpl implements MetadataService { +public class +MetadataServiceImpl implements MetadataService { private static final Logger LOGGER = LoggerFactory.getLogger(MetadataServiceImpl.class); diff --git a/src/main/java/com/capitalone/dashboard/service/PerformanceServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/PerformanceServiceImpl.java index 422591d5..ad8674d3 100644 --- a/src/main/java/com/capitalone/dashboard/service/PerformanceServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/PerformanceServiceImpl.java @@ -103,14 +103,10 @@ protected CollectorItem getCollectorItem(PerformanceSearchRequest request) { return null; } - CollectorItem item = null; PerformanceType qualityType = Objects.firstNonNull(request.getType(), PerformanceType.ApplicationPerformance); - List items = component.getCollectorItems().get(qualityType.collectorType()); - if (items != null) { - item = Iterables.getFirst(items, null); - } - return item; + return component.getCollectorItemMatchingTypeAndCollectorItemId(qualityType.collectorType(), + request.getCollectorItemId()); } diff --git a/src/main/java/com/capitalone/dashboard/service/RallyFeatureServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/RallyFeatureServiceImpl.java index 2bf4a69d..aed0c8da 100644 --- a/src/main/java/com/capitalone/dashboard/service/RallyFeatureServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/RallyFeatureServiceImpl.java @@ -79,6 +79,9 @@ public CollectorItem getCollectorItem(RallyFeatureRequest request) { Optional collector = collectorRepository.findByCollectorTypeAndName(CollectorType.AgileTool, "Rally") .stream() .findFirst(); + if (!collector.isPresent()) { + return null; + } collectorId = collector.get().getId(); for(CollectorItem collectorItem : collectorItems){ diff --git a/src/main/java/com/capitalone/dashboard/service/TestResultServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/TestResultServiceImpl.java index fdc66f56..9adb9db9 100644 --- a/src/main/java/com/capitalone/dashboard/service/TestResultServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/TestResultServiceImpl.java @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; @Service public class TestResultServiceImpl implements TestResultService { @@ -58,9 +59,9 @@ public DataResponse> search(TestResultRequest request) { } List result = new ArrayList<>(); validateAllCollectorItems(request, component, result); - //One collector per Type. get(0) is hardcoded. - if (!CollectionUtils.isEmpty(component.getCollectorItems().get(CollectorType.Test)) && (component.getCollectorItems().get(CollectorType.Test).get(0) != null)) { - Collector collector = collectorRepository.findOne(component.getCollectorItems().get(CollectorType.Test).get(0).getCollectorId()); + Optional item = component.getCollectorItems().get(CollectorType.Test).stream().filter(collectorItem -> request.getCollectorItemIds().contains(collectorItem.getId())).findFirst(); + if (item.isPresent()) { + Collector collector = collectorRepository.findOne(item.get().getCollectorId()); if (collector != null) { return new DataResponse<>(pruneToDepth(result, request.getDepth()), collector.getLastExecuted()); } diff --git a/src/test/java/com/capitalone/dashboard/request/WidgetRequestTest.java b/src/test/java/com/capitalone/dashboard/request/WidgetRequestTest.java index 4f4b63cc..33afce78 100644 --- a/src/test/java/com/capitalone/dashboard/request/WidgetRequestTest.java +++ b/src/test/java/com/capitalone/dashboard/request/WidgetRequestTest.java @@ -23,6 +23,7 @@ public void widgetTest() { WidgetRequest widgetRequest = new WidgetRequest(); widgetRequest.setName("AgileTool"); + widgetRequest.setType("AgileTool"); widgetRequest.setOptions(allOptions); Widget widget = widgetRequest.widget(); @@ -48,6 +49,7 @@ public void widgetTest2() { WidgetRequest widgetRequest = new WidgetRequest(); widgetRequest.setName("feature"); + widgetRequest.setType("feature"); widgetRequest.setOptions(allOptions); Widget widget = widgetRequest.widget(); diff --git a/src/test/java/com/capitalone/dashboard/rest/CodeQualityControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/CodeQualityControllerTest.java index 4f0a819e..fefe2096 100644 --- a/src/test/java/com/capitalone/dashboard/rest/CodeQualityControllerTest.java +++ b/src/test/java/com/capitalone/dashboard/rest/CodeQualityControllerTest.java @@ -1,8 +1,10 @@ package com.capitalone.dashboard.rest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -18,6 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; +import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -59,6 +62,7 @@ public class CodeQualityControllerTest { @Before public void before() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); + Mockito.reset(codeQualityService); } @Test @@ -72,7 +76,7 @@ public void staticQualities() throws Exception { when(codeQualityService.search(Mockito.any(CodeQualityRequest.class))) .thenReturn(response); mockMvc.perform( - get("/quality/static-analysis?componentId=" + ObjectId.get() + "&max=1")) + get("/quality/static-analysis?componentId=" + ObjectId.get() + "&max=1"+ "&collectorItemIds="+ObjectId.get())) .andExpect(status().isOk()) .andExpect(jsonPath("$.result", hasSize(1))) .andExpect( @@ -98,6 +102,9 @@ public void staticQualities() throws Exception { .andExpect( jsonPath("$.result[0].metrics[0].status", is(metric.getStatus().toString()))); + ArgumentCaptor codeQualityRequestArgumentCaptor = ArgumentCaptor.forClass(CodeQualityRequest.class); + verify(codeQualityService).search(codeQualityRequestArgumentCaptor.capture()); + assertThat(codeQualityRequestArgumentCaptor.getValue().getCollectorItemIds(), hasSize(1)); } @Test @@ -110,7 +117,7 @@ public void securityQualities() throws Exception { when(codeQualityService.search(Mockito.any(CodeQualityRequest.class))) .thenReturn(response); mockMvc.perform( - get("/quality/security-analysis?componentId=" + ObjectId.get() + "&max=1")) + get("/quality/security-analysis?componentId=" + ObjectId.get() + "&max=1&collectorItemIds="+ObjectId.get())) .andExpect(status().isOk()) .andExpect(jsonPath("$.result", hasSize(1))) .andExpect( @@ -136,6 +143,10 @@ public void securityQualities() throws Exception { .andExpect( jsonPath("$.result[0].metrics[0].status", is(metric.getStatus().toString()))); + + ArgumentCaptor codeQualityRequestArgumentCaptor = ArgumentCaptor.forClass(CodeQualityRequest.class); + verify(codeQualityService).search(codeQualityRequestArgumentCaptor.capture()); + assertThat(codeQualityRequestArgumentCaptor.getValue().getCollectorItemIds(), hasSize(1)); } @Test diff --git a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java index d251b78e..8d1c654e 100644 --- a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java +++ b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java @@ -325,7 +325,7 @@ public void addWidget() throws Exception { ObjectId collId = ObjectId.get(); List collIds = Collections.singletonList(collId); Map options = new WidgetOptionsBuilder().put("option1", 1).put("option2", "2").get(); - WidgetRequest request = makeWidgetRequest("build", compId, collIds, options); + WidgetRequest request = makeWidgetRequest( "build01", "build", compId, collIds, options); Dashboard d1 = makeDashboard("t1", "title", "app", "comp","amit", DashboardType.Team, configItemAppName, configItemComponentName); Widget widgetWithId = request.widget(); widgetWithId.setId(ObjectId.get()); @@ -338,7 +338,8 @@ public void addWidget() throws Exception { .content(TestUtil.convertObjectToJsonBytes(request))) .andExpect(status().isCreated()) .andExpect(jsonPath("$.widget.id", is(widgetWithId.getId().toString()))) - .andExpect(jsonPath("$.widget.name", is("build"))) + .andExpect(jsonPath("$.widget.name", is("build01"))) + .andExpect(jsonPath("$.widget.type", is("build"))) .andExpect(jsonPath("$.widget.componentId", is(compId.toString()))) .andExpect(jsonPath("$.component.id", is(component.getId().toString()))) .andExpect(jsonPath("$.component.name", is(component.getName()))) @@ -353,9 +354,9 @@ public void updateWidget() throws Exception { ObjectId collId = ObjectId.get(); List collIds = Collections.singletonList(collId); Map options = new WidgetOptionsBuilder().put("option1", 2).put("option2", "3").get(); - WidgetRequest request = makeWidgetRequest("build", compId, collIds, options); + WidgetRequest request = makeWidgetRequest("build01", "build", compId, collIds, options); Dashboard d1 = makeDashboard("t1", "title", "app", "comp","amit", DashboardType.Team, configItemAppName, configItemComponentName); - Widget widget = makeWidget(widgetId, "build", compId, options); + Widget widget = makeWidget(widgetId, "build01", "build", compId, options); when(dashboardService.get(dashId)).thenReturn(d1); when(dashboardService.getWidget(d1, widgetId)).thenReturn(widget); when(dashboardService.updateWidget(Matchers.any(Dashboard.class), Matchers.any(Widget.class))).thenReturn(widget); @@ -373,9 +374,9 @@ public void deleteWidget() throws Exception { ObjectId collId = ObjectId.get(); List collIds = Collections.singletonList(collId); Map options = new WidgetOptionsBuilder().put("option1", 2).put("option2", "3").get(); - WidgetRequest request = makeWidgetRequest("build", compId, collIds, options); + WidgetRequest request = makeWidgetRequest("build01","build", compId, collIds, options); Dashboard d1 = makeDashboard("t1", "title", "app", "comp","amit", DashboardType.Team, configItemAppName, configItemComponentName); - Widget widget = makeWidget(widgetId, "build", compId, options); + Widget widget = makeWidget(widgetId, "build01", "build", compId, options); when(dashboardService.get(dashId)).thenReturn(d1); when(dashboardService.getWidget(d1, widgetId)).thenReturn(widget); dashboardService.deleteWidget(Matchers.any(Dashboard.class), Matchers.any(Widget.class),Matchers.any(ObjectId.class)); @@ -424,18 +425,20 @@ private DashboardRequestTitle makeDashboardRequestTitle(String title) { return request; } - private Widget makeWidget(ObjectId widgetId, String name, ObjectId compId, Map options) { + private Widget makeWidget(ObjectId widgetId, String name, String type, ObjectId compId, Map options) { Widget widget = new Widget(); widget.setId(widgetId); widget.setName(name); + widget.setType(type); widget.setComponentId(compId); widget.getOptions().putAll(options); return widget; } - private WidgetRequest makeWidgetRequest(String name, ObjectId componentId, + private WidgetRequest makeWidgetRequest(String name, String type, ObjectId componentId, List collIds, Map options) { WidgetRequest request = new WidgetRequest(); request.setName(name); + request.setType(type); request.setComponentId(componentId); request.setCollectorItemIds(collIds); request.setOptions(options); diff --git a/src/test/java/com/capitalone/dashboard/rest/TestResultControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/TestResultControllerTest.java index c2dcd031..771610b6 100644 --- a/src/test/java/com/capitalone/dashboard/rest/TestResultControllerTest.java +++ b/src/test/java/com/capitalone/dashboard/rest/TestResultControllerTest.java @@ -1,7 +1,9 @@ package com.capitalone.dashboard.rest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -13,6 +15,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; @@ -61,7 +64,7 @@ public void testSuites() throws Exception { when(testResultService.search(Mockito.any(TestResultRequest.class))).thenReturn(response); - mockMvc.perform(get("/quality/test?componentId=" + ObjectId.get())) + mockMvc.perform(get("/quality/test?componentId=" + ObjectId.get()+"&collectorItemIds="+ObjectId.get())) .andExpect(status().isOk()) .andExpect(jsonPath("$.result", hasSize(1))) .andExpect(jsonPath("$.result[0].id", is(testResult.getId().toString()))) @@ -98,6 +101,10 @@ public void testSuites() throws Exception { .andExpect(jsonPath("$.result[0].testCapabilities[0].testSuites[0].testCases[0].description", is(testCase.getDescription()))) .andExpect(jsonPath("$.result[0].testCapabilities[0].testSuites[0].testCases[0].duration", is(intVal(testCase.getDuration())))) .andExpect(jsonPath("$.result[0].testCapabilities[0].testSuites[0].testCases[0].status", is(testCase.getStatus().toString()))); + + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(TestResultRequest.class); + verify(testResultService).search(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue().getCollectorItemIds(),hasSize(1)); } private TestResult makeTestResult() { diff --git a/src/test/java/com/capitalone/dashboard/rest/ZCommitControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/ZCommitControllerTest.java index 79546d27..4d44e7cc 100644 --- a/src/test/java/com/capitalone/dashboard/rest/ZCommitControllerTest.java +++ b/src/test/java/com/capitalone/dashboard/rest/ZCommitControllerTest.java @@ -1,7 +1,10 @@ package com.capitalone.dashboard.rest; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -16,6 +19,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -59,7 +63,7 @@ public void commit_search() throws Exception { when(commitService.search(Mockito.any(CommitRequest.class))).thenReturn(response); - mockMvc.perform(get("/commit?componentId=" + ObjectId.get())) + mockMvc.perform(get("/commit?componentId=" + ObjectId.get() + "&collectorItemId="+ObjectId.get())) .andExpect(status().isOk()) .andExpect(jsonPath("$.result", hasSize(1))) .andExpect(jsonPath("$.result[0].scmUrl", is(commit.getScmUrl()))) @@ -68,6 +72,12 @@ public void commit_search() throws Exception { .andExpect(jsonPath("$.result[0].scmCommitTimestamp", is(Ints.saturatedCast(commit.getScmCommitTimestamp())))) .andExpect(jsonPath("$.result[0].scmCommitLog", is(commit.getScmCommitLog()))) .andExpect(jsonPath("$.result[0].scmAuthor", is(commit.getScmAuthor()))); + + ArgumentCaptor commitRequestArgumentCaptor = ArgumentCaptor.forClass(CommitRequest.class); + verify(commitService).search(commitRequestArgumentCaptor.capture()); + CommitRequest commitRequest = commitRequestArgumentCaptor.getValue(); + assertThat(commitRequest.getCollectorItemId(),is(notNullValue())); + assertThat(commitRequest.getComponentId(),is(notNullValue())); } @Test diff --git a/src/test/java/com/capitalone/dashboard/service/CommitServiceTest.java b/src/test/java/com/capitalone/dashboard/service/CommitServiceTest.java index 081310b7..24fa3e0b 100644 --- a/src/test/java/com/capitalone/dashboard/service/CommitServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/CommitServiceTest.java @@ -49,6 +49,7 @@ public void searchTest() { CommitRequest request = new CommitRequest(); request.setComponentId(componentId); + request.setCollectorItemId(collectorItemId); when(componentRepository.findOne(request.getComponentId())).thenReturn(makeComponent(collectorItemId, collectorId, true)); when(collectorRepository.findOne(collectorId)).thenReturn(collector); diff --git a/src/test/java/com/capitalone/dashboard/service/GitRequestServiceTest.java b/src/test/java/com/capitalone/dashboard/service/GitRequestServiceTest.java index eb8b7777..52fe9781 100644 --- a/src/test/java/com/capitalone/dashboard/service/GitRequestServiceTest.java +++ b/src/test/java/com/capitalone/dashboard/service/GitRequestServiceTest.java @@ -49,6 +49,7 @@ public void searchTest() { GitRequestRequest request = new GitRequestRequest(); request.setComponentId(componentId); + request.setCollectorItemId(collectorItemId); when(componentRepository.findOne(request.getComponentId())).thenReturn(makeComponent(collectorItemId, collectorId, true)); when(collectorRepository.findOne(collectorId)).thenReturn(collector);