diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java index aa5b063a4..3702bba3d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java @@ -29,7 +29,8 @@ @ToString @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@type", visible = true) @JsonSubTypes({@JsonSubTypes.Type(value=EntityRoleWhiteListFilter.class, name="EntityRoleWhiteList"), - @JsonSubTypes.Type(value=EntityAttributesFilter.class, name="EntityAttributes")}) + @JsonSubTypes.Type(value=EntityAttributesFilter.class, name="EntityAttributes"), + @JsonSubTypes.Type(value=RequiredValidUntilFilter.class, name="RequiredValidUntil")}) public class MetadataFilter extends AbstractAuditable { @JsonProperty("@type") diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy index c9cef2cb3..4e5899f49 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.SerializationFeature import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator import edu.internet2.tier.shibboleth.admin.util.AttributeUtility @@ -74,28 +75,54 @@ class PolymorphicFiltersJacksonHandlingTests extends Specification { simulatedPrePersistentFilter.relyingPartyOverrides = simulatedPersistentFilter.relyingPartyOverrides simulatedPrePersistentFilter.fromTransientRepresentation() + expect: + simulatedPersistentFilter.attributes.size() == simulatedPrePersistentFilter.attributes.size() + } + + def "Correct polymorphic serialization of RequiredValidUntilFilter"() { + given: + def givenFilterJson = """ + { + "@type" : "RequiredValidUntil", + "createdDate" : null, + "modifiedDate" : null, + "createdBy" : null, + "modifiedBy" : null, + "name" : null, + "resourceId" : "9667ae04-8c36-4741-be62-dd325e7d6790", + "filterEnabled" : true, + "version" : 0, + "maxValidityInterval" : "P14D" + + } + """ + when: - def jsonFromPersistentFilter = mapper.writeValueAsString(simulatedPersistentFilter) - def jsonFromPrePersistentFilter = mapper.writeValueAsString(simulatedPrePersistentFilter) - println("JSON from persistent filter -> $jsonFromPersistentFilter") - println("JSON from PRE persistent filter -> $jsonFromPrePersistentFilter") - println("Attributes from persistent filter -> $simulatedPersistentFilter.attributes") - println("Attributes from PRE persistent filter -> $simulatedPrePersistentFilter.attributes") + def deSerializedFilter = mapper.readValue(givenFilterJson, MetadataFilter) + def json = mapper.writeValueAsString(deSerializedFilter) + println(json) + def roundTripFilter = mapper.readValue(json, MetadataFilter) then: - simulatedPersistentFilter.attributes.size() == simulatedPrePersistentFilter.attributes.size() + roundTripFilter == deSerializedFilter + + and: + deSerializedFilter instanceof RequiredValidUntilFilter + roundTripFilter instanceof RequiredValidUntilFilter } def "List of filters with correct types"() { given: - def filters = testObjectGenerator.buildAllTypesOfFilterList(); + def filters = testObjectGenerator.buildAllTypesOfFilterList() when: def json = mapper.writeValueAsString(filters) println(json) then: - json + json.contains('EntityAttributes') + json.contains('RequiredValidUntil') + json.contains('EntityAttributes') } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index 1b020c499..84414f774 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -11,6 +11,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.OrganizationName import edu.internet2.tier.shibboleth.admin.ui.domain.OrganizationURL import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.FilterRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.FilterTargetRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.RelyingPartyOverridesRepresentation @@ -19,6 +20,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.HttpMetadataResol import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ReloadableMetadataResolverAttributes import edu.internet2.tier.shibboleth.admin.util.AttributeUtility import edu.internet2.tier.shibboleth.admin.util.MDDCConstants + import org.opensaml.saml.saml2.metadata.Organization import java.util.function.Supplier @@ -64,6 +66,7 @@ class TestObjectGenerator { (1..generator.randomInt(4, 10)).each { filterList.add(buildFilter { entityAttributesFilter() }) filterList.add(buildFilter { entityRoleWhitelistFilter() }) + filterList.add(buildFilter { requiredValidUntilFilter() }) } return filterList } @@ -87,6 +90,13 @@ class TestObjectGenerator { } } + RequiredValidUntilFilter requiredValidUntilFilter() { + return new RequiredValidUntilFilter().with { + it.maxValidityInterval = 'P14D' + it + } + } + EntityAttributesFilter copyOf(EntityAttributesFilter entityAttributesFilter) { new EntityAttributesFilter().with { it.name = entityAttributesFilter.name