diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java index 3c16e183d..26039b81b 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationService.java @@ -16,15 +16,15 @@ */ public class MetadataResolverValidationService { - private List validators; + private List> validators; - public MetadataResolverValidationService(List validators) { + public MetadataResolverValidationService(List> validators) { this.validators = validators != null ? validators : new ArrayList<>(); } @SuppressWarnings("Uncheked") public ValidationResult validateIfNecessary(T metadataResolver) { - Optional validator = + Optional> validator = this.validators .stream() .filter(v -> v.supports(metadataResolver)) @@ -32,4 +32,9 @@ public ValidationResult validateIfNecessary(T metadataResolver) { return validator.isPresent() ? validator.get().validate(metadataResolver) : new ValidationResult(null); } + + //Package-private - used for unit tests + boolean noValidatorsConfigured() { + return this.validators.size() == 0; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidator.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidator.java index f64ab96d6..e6afc7782 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidator.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidator.java @@ -11,7 +11,7 @@ */ public interface MetadataResolverValidator { - boolean supports(T resolver); + boolean supports(MetadataResolver resolver); ValidationResult validate(T resolver); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java index 422e46d57..bbb41d357 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java @@ -29,18 +29,14 @@ public class ResourceBackedMetadataResolver extends MetadataResolver { @Embedded private SvnMetadataResource svnMetadataResource; - @Transient - @JsonIgnore - private ResourceType resourceType; - - public void validateAndDetermineResourceType() throws InvalidResourceTypeException { + public ResourceType validateAndDetermineResourceType() throws InvalidResourceTypeException { if (classpathMetadataResource == null && svnMetadataResource == null) { throw new InvalidResourceTypeException("No metadata resource is provided. Exactly one is required"); } if (classpathMetadataResource != null && svnMetadataResource != null) { throw new InvalidResourceTypeException("Too many metadata resources are provided. Exactly one is required"); } - resourceType = classpathMetadataResource != null ? CLASSPATH : SVN; + return classpathMetadataResource != null ? CLASSPATH : SVN; } public class InvalidResourceTypeException extends IllegalStateException { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolverValidator.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolverValidator.java new file mode 100644 index 000000000..0a828fbed --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolverValidator.java @@ -0,0 +1,20 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; + +public class ResourceBackedMetadataResolverValidator implements MetadataResolverValidator { + + @Override + public boolean supports(MetadataResolver resolver) { + return resolver instanceof ResourceBackedMetadataResolver; + } + + @Override + public ValidationResult validate(ResourceBackedMetadataResolver resolver) { + try { + resolver.validateAndDetermineResourceType(); + } + catch (ResourceBackedMetadataResolver.InvalidResourceTypeException e) { + return new ValidationResult(e.getMessage()); + } + return new ValidationResult(null); + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy new file mode 100644 index 000000000..d3493a06f --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.configuration + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolverValidator + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + + +@Configuration +class TestMetadataResolverValidationServiceConfiguration { + + @Bean + ResourceBackedMetadataResolverValidator resourceBackedMetadataResolverValidator() { + new ResourceBackedMetadataResolverValidator() + } + + @Bean + MetadataResolverValidationService metadataResolverValidationServiceEmpty() { + new MetadataResolverValidationService(null) + } + + @Bean + MetadataResolverValidationService metadataResolverValidationServiceOneValidator(List metadataResolverValidators) { + new MetadataResolverValidationService(metadataResolverValidators) + } + +} 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 256285f94..81408eafd 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 @@ -15,7 +15,6 @@ import org.springframework.context.annotation.Bean import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import spock.lang.Specification diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy new file mode 100644 index 000000000..6ca9c4182 --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers + +import edu.internet2.tier.shibboleth.admin.ui.configuration.TestMetadataResolverValidationServiceConfiguration +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification + +@ContextConfiguration(classes=[TestMetadataResolverValidationServiceConfiguration]) +class MetadataResolverValidationServiceConfigurationTests extends Specification { + + @Autowired + @Qualifier("metadataResolverValidationServiceEmpty") + MetadataResolverValidationService metadataResolverValidationServiceNoValidators + + @Autowired + @Qualifier("metadataResolverValidationServiceOneValidator") + MetadataResolverValidationService metadataResolverValidationServiceOneValidator + + def "Validation service with no validators"() { + expect: + metadataResolverValidationServiceNoValidators.noValidatorsConfigured() + } + + def "Validation service with one validator"() { + expect: + !metadataResolverValidationServiceOneValidator.noValidatorsConfigured() + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataValidatorTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataValidatorTests.groovy new file mode 100644 index 000000000..6447a7f1a --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataValidatorTests.groovy @@ -0,0 +1,52 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers + +import spock.lang.Specification + +class ResourceBackedMetadataValidatorTests extends Specification { + + def "Does not support foreign resolver type"() { + given: + MetadataResolverValidator validator = new ResourceBackedMetadataResolverValidator() + FileBackedHttpMetadataResolver resolver = new FileBackedHttpMetadataResolver() + + expect: + !validator.supports(resolver) + } + + def "Passes validation"() { + given: + MetadataResolverValidator validator = new ResourceBackedMetadataResolverValidator() + ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver().with { + it.classpathMetadataResource = new ClasspathMetadataResource() + it + } + + expect: + validator.supports(resolver) + validator.validate(resolver).valid + } + + def "Does not pass validation with both resource types missing"() { + given: + MetadataResolverValidator validator = new ResourceBackedMetadataResolverValidator() + ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver() + + expect: + validator.supports(resolver) + !validator.validate(resolver).valid + } + + def "Does not pass validation with both resource types present"() { + given: + MetadataResolverValidator validator = new ResourceBackedMetadataResolverValidator() + ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver().with { + it.classpathMetadataResource = new ClasspathMetadataResource() + it.svnMetadataResource = new SvnMetadataResource() + it + } + + expect: + validator.supports(resolver) + !validator.validate(resolver).valid + } +}