From dce04a0b7e1aa90e300133ff48b4aa041bd732eb Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 30 Jun 2023 13:05:35 -0700 Subject: [PATCH] SHIBUI-2584 Added beacon data collection unit testing --- .../MetadataResolversController.java | 1 + .../ui/service/BeaconDataServiceImpl.java | 4 +- .../admin/ui/service/IBeaconDataService.java | 4 ++ .../controller/ActivateControllerTests.groovy | 24 +++++++++- .../EntityDescriptorControllerTests.groovy | 37 ++++++++++++++++ ...taFiltersControllerIntegrationTests.groovy | 44 ++++++++++++------- .../MetadataFiltersControllerTests.groovy | 6 ++- ...ResolversControllerIntegrationTests.groovy | 18 ++++++++ 8 files changed, 115 insertions(+), 23 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index 05ce3eb55..ca065e7b2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -162,6 +162,7 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) throw positionOrderContainerService.appendPositionOrderForNew(persistedResolver); doResolverInitialization(persistedResolver); beaconDataService.addBeaconEvent(new BeaconEvent(BeaconEventType.METADATA_PROVIDER_CREATED)); + newResolver.getMetadataFilters().forEach(f -> beaconDataService.addBeaconEvent(new BeaconEvent(BeaconEventType.METADATA_FILTER_CREATED))); return ResponseEntity.created(getResourceUriFor(persistedResolver)).body(persistedResolver); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/BeaconDataServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/BeaconDataServiceImpl.java index 45b6ff2ff..13657aae6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/BeaconDataServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/BeaconDataServiceImpl.java @@ -23,7 +23,6 @@ import java.util.Arrays; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -74,7 +73,8 @@ public String getBeaconData() { return mapper.writeValueAsString(detail); } - private Map getBeaconEvents() { + @Override + public Map getBeaconEvents() { List results = beaconEventRepository.getEventsSince(DateUtils.addDays(new Date(), -1)); Map counts = results.stream().collect(Collectors.groupingBy(e -> e.getEventName(), Collectors.counting())); return counts; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/IBeaconDataService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/IBeaconDataService.java index ccbd4563e..1b0615945 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/IBeaconDataService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/IBeaconDataService.java @@ -3,9 +3,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEvent; +import java.util.Map; + public interface IBeaconDataService { String getBeaconData() throws JsonProcessingException; + Map getBeaconEvents(); + void addBeaconEvent(BeaconEvent event); void addEntityDescEnabledEvent(); diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/ActivateControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/ActivateControllerTests.groovy index 895d2c10c..a5fefdc2c 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/ActivateControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/ActivateControllerTests.groovy @@ -3,6 +3,7 @@ package edu.internet2.tier.shibboleth.admin.ui.controller import com.fasterxml.jackson.databind.ObjectMapper import edu.internet2.tier.shibboleth.admin.ui.AbstractBaseDataJpaTest import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEventType import edu.internet2.tier.shibboleth.admin.ui.domain.oidc.DynamicRegistrationInfo import edu.internet2.tier.shibboleth.admin.ui.domain.oidc.GrantType import edu.internet2.tier.shibboleth.admin.ui.exception.ForbiddenException @@ -16,6 +17,7 @@ import edu.internet2.tier.shibboleth.admin.ui.security.repository.DynamicRegistr import edu.internet2.tier.shibboleth.admin.ui.service.DynamicRegistrationService import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService import edu.internet2.tier.shibboleth.admin.ui.service.EntityService +import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService import edu.internet2.tier.shibboleth.admin.ui.util.WithMockAdmin import edu.internet2.tier.shibboleth.admin.util.EntityDescriptorConversionUtils import org.springframework.beans.factory.annotation.Autowired @@ -34,6 +36,9 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { @Subject def controller + @Autowired + private IBeaconDataService service + @Autowired ObjectMapper mapper @@ -114,9 +119,9 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { entityManager.clear() EntityDescriptor entityDescriptor = new EntityDescriptor(resourceId: 'uuid-1', entityID: 'eid1', serviceProviderName: 'sp1', serviceEnabled: false, idOfOwner: 'AAA') - entityDescriptor = entityDescriptorRepository.save(entityDescriptor) + def edRep = entDescriptorService.createNew(entityDescriptor) - defaultEntityDescriptorResourceId = entityDescriptor.getResourceId() + defaultEntityDescriptorResourceId = edRep.id def dynReg = new DynamicRegistrationInfo(resourceId: 'uuid-1', enabled: false, idOfOwner: "AAA", applicationType: 'apptype', approved: true, contacts: 'contacts', jwks: 'jwks', logoUri: 'logouri', policyUri: 'policyuri', @@ -145,6 +150,8 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()) == null } @WithMockUser(value = "DUser", roles = ["USER"]) @@ -156,10 +163,17 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()) == null } @WithMockUser(value = "DUser", roles = ["USER"]) def 'non-owner group cannot activate entity descriptor'() { + given: + EntityDescriptor ed = entityDescriptorRepository.findByResourceId(defaultEntityDescriptorResourceId) + ed.setIdOfOwner('AAA') + entityDescriptorRepository.saveAndFlush(ed) + expect: try { mockMvc.perform(patch("/api/activate/entityDescriptor/" + defaultEntityDescriptorResourceId + "/enable")) @@ -167,6 +181,8 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()) == null } // @WithMockAdmin @@ -196,6 +212,8 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { result.andExpect(status().isOk()) .andExpect(jsonPath("\$.id").value(defaultEntityDescriptorResourceId)) .andExpect(jsonPath("\$.serviceEnabled").value(true)) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()).longValue() == 1 } // @WithMockUser(value = "AUser", roles = ["USER"]) @@ -231,5 +249,7 @@ class ActivateControllerTests extends AbstractBaseDataJpaTest { result.andExpect(status().isOk()) .andExpect(jsonPath("\$.id").value('uuid-2')) .andExpect(jsonPath("\$.serviceEnabled").value(true)) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()).longValue() == 1 } } \ No newline at end of file diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy index 834ad180e..12e659538 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import edu.internet2.tier.shibboleth.admin.ui.AbstractBaseDataJpaTest import edu.internet2.tier.shibboleth.admin.ui.configuration.JsonSchemaComponentsConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEventType import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.AssertionConsumerServiceRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityDescriptorRepresentation import edu.internet2.tier.shibboleth.admin.ui.exception.ForbiddenException @@ -21,6 +22,7 @@ import edu.internet2.tier.shibboleth.admin.ui.security.model.Role import edu.internet2.tier.shibboleth.admin.ui.security.model.User import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService import edu.internet2.tier.shibboleth.admin.ui.service.EntityService +import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator import edu.internet2.tier.shibboleth.admin.ui.util.TestHelpers @@ -40,6 +42,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultHandlers import org.springframework.test.web.servlet.setup.MockMvcBuilders import org.springframework.transaction.annotation.Transactional import org.springframework.web.client.RestTemplate +import org.springframework.web.util.NestedServletException import spock.lang.Subject import java.nio.charset.StandardCharsets @@ -58,6 +61,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @Import([JsonSchemaComponentsConfiguration.class, EDCConfig.class]) class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { + @Autowired + private IBeaconDataService service + @Autowired EntityDescriptorSchemaValidatingControllerAdvice controllerAdvice @@ -281,6 +287,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { } catch (ServletException expected) { expected.getCause() instanceof InvalidPatternMatchException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()) == null } @WithMockUser(value = "someUser", roles = ["USER"]) @@ -311,6 +319,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.serviceEnabled").value(false)) .andExpect(jsonPath("\$.idOfOwner").value("testingGroupBBB")) + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 + when: "ACS url is bad" expectedEntityId = 'https://shib.org/blah/blah/again' edRep = new EntityDescriptorRepresentation() @@ -333,6 +343,9 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { } catch (ServletException expected) { expected.getCause() instanceof InvalidPatternMatchException } + + // Still just the one + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -364,6 +377,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.entityId").value("https://shib")) .andExpect(jsonPath("\$.serviceEnabled").value(true)) .andExpect(jsonPath("\$.idOfOwner").value("admingroup")) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 } @WithMockUser(value = "someUser", roles = ["USER"]) @@ -384,6 +399,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_ENABLED.name()) == null } @WithMockAdmin @@ -424,6 +441,9 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ObjectIdExistsException } + + // because we created the test objects directly in the repository, there should be no beacon records + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()) == null } @WithMockAdmin @@ -614,12 +634,15 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.assertionConsumerServices[0].makeDefault").value(false)) .andExpect(jsonPath("\$.assertionConsumerServices[0].locationUrl").value("https://test.scaldingspoon.org/test1/acs")) + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 + try { mockMvc.perform(post("/api/EntityDescriptor").contentType(APPLICATION_XML).content(postedBody).param("spName", spName)) } catch (Exception e) { e instanceof ObjectIdExistsException } + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -659,6 +682,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ObjectIdExistsException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()) == null } @WithMockAdmin @@ -685,6 +710,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.serviceEnabled").value(false)) .andExpect(jsonPath("\$.idOfOwner").value("admingroup")) .andExpect(jsonPath("\$.serviceProviderName").value("newName")) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_MODIFIED.name()).longValue() == 1 } @WithMockUser(value = "someUser", roles = ["USER"]) @@ -710,6 +737,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_MODIFIED.name()) == null } @WithMockUser(value = "someUser", roles = ["USER"]) @@ -735,6 +764,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ForbiddenException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_MODIFIED.name()) == null } @WithMockAdmin @@ -758,6 +789,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { catch (Exception e) { e instanceof ConcurrentModificationException } + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_MODIFIED.name()) == null } @WithMockAdmin @@ -796,6 +829,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath(shortNameToOAuth + "defaultAcrValues").isArray()) .andExpect(jsonPath(shortNameToOAuth + "attributes.requireAuthTime").value(Boolean.FALSE)) .andExpect(jsonPath(shortNameToOAuth + "attributes.defaultMaxAge").value(Integer.valueOf(0))) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -852,6 +887,8 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath(shortNameToOAuth + "defaultAcrValues").isArray()) .andExpect(jsonPath(shortNameToOAuth + "attributes.requireAuthTime").value(Boolean.FALSE)) .andExpect(jsonPath(shortNameToOAuth + "attributes.defaultMaxAge").value(Integer.valueOf(0))) + + service.getBeaconEvents().get(BeaconEventType.METADATA_SOURCE_CREATED.name()).longValue() == 1 } @SneakyThrows diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy index 2e46238d4..8567362b0 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy @@ -5,17 +5,16 @@ import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import edu.internet2.tier.shibboleth.admin.ui.AbstractBaseDataJpaTest import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.EntitiesVersioningConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverValidationConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.PlaceholderResolverComponentsConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestMetadataResolverControllerConfiguration +import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEventType import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.repository.BeaconEventRepository import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.security.service.IGroupService import edu.internet2.tier.shibboleth.admin.ui.security.service.UserService +import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverConverterService import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator @@ -31,26 +30,13 @@ import org.springframework.boot.test.context.TestConfiguration import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Import import org.springframework.context.annotation.Profile -import org.springframework.http.HttpEntity -import org.springframework.http.HttpHeaders -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter import org.springframework.test.context.ActiveProfiles -import org.springframework.test.web.servlet.setup.MockMvcBuilders import org.springframework.transaction.annotation.EnableTransactionManagement import spock.lang.Subject -import spock.util.matcher.HamcrestMatchers -import javax.script.ScriptException import java.lang.reflect.UndeclaredThrowableException import static edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget.EntityAttributesFilterTargetType.CONDITION_SCRIPT -import static org.springframework.http.MediaType.APPLICATION_JSON -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @Import([PlaceholderResolverComponentsConfiguration.class, EntitiesVersioningConfiguration.class, TestMetadataResolverControllerConfiguration.class, MetadataResolverValidationConfiguration.class, MFCILocalConfig.class]) @@ -81,6 +67,12 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest @Autowired MetadataResolverRepository metadataResolverRepository + @Autowired + private IBeaconDataService beaconDataService + + @Autowired + private BeaconEventRepository beaconEventRepository + @Autowired ObjectMapper mapper @@ -93,6 +85,15 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest def setup() { mockMvcMetaResolverFilterController = MockMvcBuilders.standaloneSetup(controller).build() mockMvcMetadataResolverController = MockMvcBuilders.standaloneSetup(metadataResolverController).setMessageConverters(new MappingJackson2HttpMessageConverter(mapper)).build() + generator = new TestObjectGenerator(attributeUtility, customPropertiesConfiguration) + mapper = new ObjectMapper() + mapper.enable(SerializationFeature.INDENT_OUTPUT) + mapper.registerModule(new JavaTimeModule()) + } + + def cleanup() { + metadataResolverRepository.deleteAll() + beaconEventRepository.deleteAll() } @WithMockAdmin @@ -115,6 +116,8 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest then: updatedResultFromPUT.andExpect(status().isOk()) + + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_MODIFIED.name()).longValue() == 1 } @WithMockAdmin @@ -154,6 +157,8 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest then: updatedResultFromPUT.andExpect(status().isOk()) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_MODIFIED.name()).longValue() == 1 + when: 'Update the script filter with bad script does not persist' def filterToUpdate = jsonSlurper.parseText(getResultBody(updatedResultFromPUT)) filterToUpdate.singleValue = """ @@ -288,6 +293,9 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest it } + expect: + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_CREATED.name()) == null + when: def jsonBody = mapper.writeValueAsString(filter) @@ -308,6 +316,8 @@ class MetadataFiltersControllerIntegrationTests extends AbstractBaseDataJpaTest then: resolverResult.andExpect(status().isOk()) resolverResult.andExpect(jsonPath("\$.metadataFilters").isEmpty()) + + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_CREATED.name()) == null } @TestConfiguration diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy index a666f102b..48ecfc602 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import edu.internet2.tier.shibboleth.admin.ui.AbstractBaseDataJpaTest import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration +import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEventType import edu.internet2.tier.shibboleth.admin.ui.domain.exceptions.MetadataFileNotFoundException import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver @@ -244,8 +245,8 @@ class MetadataFiltersControllerTests extends AbstractBaseDataJpaTest { then: def expectedJson = new JsonSlurper().parseText(updatedFilterJson) expectedJson << [version: updatedFilter.getVersion()] - result.andExpect(status().isOk()) - .andExpect(content().json(JsonOutput.toJson(expectedJson), true)) + result.andExpect(status().isOk()).andExpect(content().json(JsonOutput.toJson(expectedJson), true)) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_MODIFIED.name()).longValue() == 1 where: filterType | _ @@ -281,6 +282,7 @@ class MetadataFiltersControllerTests extends AbstractBaseDataJpaTest { then: result.andExpect(status().is(409)) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_MODIFIED.name()) == null } @TestConfiguration diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy index 77a6f2b7c..b3b5d29b3 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy @@ -8,6 +8,7 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConf import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConverterConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverValidationConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.PlaceholderResolverComponentsConfiguration +import edu.internet2.tier.shibboleth.admin.ui.domain.beacon.BeaconEventType import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver @@ -20,6 +21,7 @@ import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolversPositi import edu.internet2.tier.shibboleth.admin.ui.service.DefaultMetadataResolversPositionOrderContainerService import edu.internet2.tier.shibboleth.admin.ui.service.DirectoryService import edu.internet2.tier.shibboleth.admin.ui.service.DirectoryServiceImpl +import edu.internet2.tier.shibboleth.admin.ui.service.IBeaconDataService import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverConverterService import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService @@ -54,6 +56,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration, PlaceholderResolverComponentsConfiguration, MRCILocalConfig]) class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTest { + @Autowired + IBeaconDataService beaconDataService + @Autowired AttributeUtility attributeUtility @@ -112,6 +117,7 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: result.andExpect(status().isCreated()).andExpect(content().contentType(APPLICATION_JSON)) .andExpect(jsonPath("\$.name").value("HTTPMetadata")) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -213,6 +219,7 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: result.andExpect(status().isCreated()).andExpect(content().contentType(APPLICATION_JSON)) .andExpect(jsonPath("\$.name").value(expectedName)) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -232,6 +239,8 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes result.andExpect(status().isCreated()).andExpect(content().contentType(APPLICATION_JSON)) .andExpect(jsonPath("\$.['@type']").value(resolver.getType())) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_CREATED.name()).longValue() == 1 + cleanup: if (sourceDirectory != null) { def tmpDirectory = new File(sourceDirectory) @@ -266,6 +275,7 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: result.andExpect(status().isCreated()) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -293,6 +303,8 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes updatedResult.andExpect(status().isOk()).andExpect(content().contentType(APPLICATION_JSON)) .andExpect(jsonPath("\$.name").value('Updated Resolver Name')) + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_MODIFIED.name()).longValue() == 1 + cleanup: if (sourceDirectory != null) { def tmpDirectory = new File(sourceDirectory) @@ -339,6 +351,8 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: updatedResult.andExpect(status().isConflict()) + + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_MODIFIED.name()) == null } @WithMockAdmin @@ -362,6 +376,9 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: createdResolver.metadataFilters.size() == 1 createdResolver.metadataFilters[0] instanceof EntityAttributesFilter + + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_CREATED.name()).longValue() == 1 + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_FILTER_CREATED.name()).longValue() == 1 } @WithMockAdmin @@ -386,6 +403,7 @@ class MetadataResolversControllerIntegrationTests extends AbstractBaseDataJpaTes then: updatedResultFromPUT == updatedResultFromGET + beaconDataService.getBeaconEvents().get(BeaconEventType.METADATA_PROVIDER_MODIFIED.name()).longValue() == 1 } @TestConfiguration