From 837ce161bfa19c8d569dde106a81348b7041f46b Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 28 May 2021 11:43:00 -0700 Subject: [PATCH] SHIBUI-1798 Ensures that deleting a definition will also delete the filter references --- ...mEntityAttributeFilterValueRepository.java | 6 +- ...EntityAttributesDefinitionServiceImpl.java | 20 +++- .../ui/configuration/TestConfiguration.groovy | 2 + .../repository/FilterRepositoryTests.groovy | 95 ++++++++++++++++++- 4 files changed, 116 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeFilterValueRepository.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeFilterValueRepository.java index 72507d24a..a6a7be164 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeFilterValueRepository.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomEntityAttributeFilterValueRepository.java @@ -1,12 +1,16 @@ package edu.internet2.tier.shibboleth.admin.ui.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition; import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue; import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter; -// Not entirely sure this is needed for the core, but it did make validation/unit testing a whole lot easier public interface CustomEntityAttributeFilterValueRepository extends JpaRepository { + // Not entirely sure this is needed for the core, but it did make validation/unit testing a whole lot easier CustomEntityAttributeFilterValue findByEntityAttributesFilterAndCustomEntityAttributeDefinition(EntityAttributesFilter eaf , CustomEntityAttributeDefinition cead); + + List findAllByCustomEntityAttributeDefinition(CustomEntityAttributeDefinition definition); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java index 506bf4e44..95f654386 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomEntityAttributesDefinitionServiceImpl.java @@ -2,16 +2,26 @@ import java.util.List; +import javax.persistence.EntityManager; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition; +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue; import edu.internet2.tier.shibboleth.admin.ui.repository.CustomEntityAttributeDefinitionRepository; +import edu.internet2.tier.shibboleth.admin.ui.repository.CustomEntityAttributeFilterValueRepository; @Service public class CustomEntityAttributesDefinitionServiceImpl implements CustomEntityAttributesDefinitionService { @Autowired private CustomEntityAttributeDefinitionRepository repository; + + @Autowired + CustomEntityAttributeFilterValueRepository customEntityAttributeFilterValueRepository; + + @Autowired + EntityManager entityManager; @Override public CustomEntityAttributeDefinition createOrUpdateDefinition(CustomEntityAttributeDefinition definition) { @@ -20,7 +30,15 @@ public CustomEntityAttributeDefinition createOrUpdateDefinition(CustomEntityAttr @Override public void deleteDefinition(CustomEntityAttributeDefinition definition) { - repository.delete(definition); + // must remove any CustomEntityAttributeFilterValues first to avoid integrity constraint issues + List customEntityValues = customEntityAttributeFilterValueRepository.findAllByCustomEntityAttributeDefinition(definition); + customEntityValues.forEach(value -> { + value.getEntityAttributesFilter().getCustomEntityAttributes().remove(value); + entityManager.remove(value); + customEntityAttributeFilterValueRepository.delete(value); + }); + CustomEntityAttributeDefinition entityToRemove = repository.findByName(definition.getName()); + repository.delete(entityToRemove); } @Override diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy index 676547ffd..a18a4a7b1 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy @@ -19,6 +19,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration import org.springframework.core.io.ClassPathResource import org.springframework.data.domain.AuditorAware @@ -26,6 +27,7 @@ import org.springframework.mail.javamail.JavaMailSender import org.springframework.mail.javamail.JavaMailSenderImpl @Configuration +@ComponentScan("edu.internet2.tier.shibboleth.admin.ui.service") class TestConfiguration { @Autowired IndexWriterService indexWriterService diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/FilterRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/FilterRepositoryTests.groovy index c8bbe9d74..473f7d3c9 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/FilterRepositoryTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/FilterRepositoryTests.groovy @@ -8,6 +8,7 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter +import edu.internet2.tier.shibboleth.admin.ui.service.CustomEntityAttributesDefinitionService import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan @@ -28,9 +29,9 @@ class FilterRepositoryTests extends Specification { @Autowired FilterRepository repositoryUnderTest - + @Autowired - CustomEntityAttributeDefinitionRepository ceadRepo + CustomEntityAttributesDefinitionService ceadService @Autowired CustomEntityAttributeFilterValueRepository ceafvRepo @@ -102,7 +103,7 @@ class FilterRepositoryTests extends Specification { it.defaultValue = "foo" it } - ceadRepo.save(ca) + ceadService.createOrUpdateDefinition(ca) entityManager.flush() entityManager.clear() @@ -139,7 +140,7 @@ class FilterRepositoryTests extends Specification { entityManager.flush() def savedFilter = repositoryUnderTest.findByResourceId(persistedFilter.resourceId) - def saveEAD = ceadRepo.findByName("ca-name"); + def saveEAD = ceadService.find("ca-name") def ceafv = new CustomEntityAttributeFilterValue().with { it.entityAttributesFilter = savedFilter @@ -176,5 +177,89 @@ class FilterRepositoryTests extends Specification { entityManager.flush() ceafvRepo.findAll().size() == 0 - } + } + + def "Delete custom entity attributes definition removes entries from filter correctly"(){ + given: + def ca = new CustomEntityAttributeDefinition().with { + it.name = "ca-name" + it.attributeType = "STRING" + it.defaultValue = "foo" + it + } + ceadService.createOrUpdateDefinition(ca) + entityManager.flush() + entityManager.clear() + + def entityAttributesFilterJson = '''{ + "name": "EntityAttributes", + "resourceId": "29a5d409-562a-41cd-acee-e9b3d7098d05", + "filterEnabled": false, + "entityAttributesFilterTarget": { + "entityAttributesFilterTargetType": "CONDITION_SCRIPT", + "value": [ + "TwUuSOz5O6" + ] + }, + "attributeRelease": [ + "WbkhLQNI3m" + ], + "relyingPartyOverrides": { + "signAssertion": true, + "dontSignResponse": true, + "turnOffEncryption": true, + "useSha": true, + "ignoreAuthenticationMethod": false, + "omitNotBefore": true, + "responderId": null, + "nameIdFormats": [ + "xLenUFmCLn" + ], + "authenticationMethods": [] + }, + "@type": "EntityAttributes" + }''' + def filter = new ObjectMapper().readValue(entityAttributesFilterJson.bytes, EntityAttributesFilter.class) + def persistedFilter = repositoryUnderTest.save(filter) + entityManager.flush() + + def savedFilter = repositoryUnderTest.findByResourceId(persistedFilter.resourceId) + def saveEAD = ceadService.find("ca-name"); + + def ceafv = new CustomEntityAttributeFilterValue().with { + it.entityAttributesFilter = savedFilter + it.customEntityAttributeDefinition = saveEAD + it.value = "bar" + it + } + + def customEntityAttributes = new HashSet() + + when: + customEntityAttributes.add(ceafv) // nothing to do yet, just here to let us verify nothing in the CEAFV table in 'then' block + + then: + ((Set)ceafvRepo.findAll()).size() == 0 //nothing yet + ((EntityAttributesFilter)savedFilter).setCustomEntityAttributes(customEntityAttributes) + repositoryUnderTest.save(savedFilter) + entityManager.flush() + + then: + def listOfceafv = ceafvRepo.findAll() + listOfceafv.size() == 1 + + def ceafvFromDb = listOfceafv.get(0).asType(CustomEntityAttributeFilterValue) + ceafvFromDb.getEntityAttributesFilter().getResourceId().equals("29a5d409-562a-41cd-acee-e9b3d7098d05") + + def filterFromDb = (EntityAttributesFilter) repositoryUnderTest.findByResourceId("29a5d409-562a-41cd-acee-e9b3d7098d05") + filterFromDb.getCustomEntityAttributes().size() == 1 + + // now remove the definition + ceadService.deleteDefinition(saveEAD) + entityManager.flush() + entityManager.clear() + + def filterFromDb2 = (EntityAttributesFilter)repositoryUnderTest.findByResourceId("29a5d409-562a-41cd-acee-e9b3d7098d05") + filterFromDb2.getCustomEntityAttributes().size() == 0 + } }