Skip to content

Commit

Permalink
1263(1321)
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 26, 2019
1 parent 6e2d8a2 commit 8321859
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package edu.internet2.tier.shibboleth.admin.ui.controller

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.web.client.TestRestTemplate
import org.springframework.test.context.ActiveProfiles
import spock.lang.Specification

/**
* @author Dmitriy Kopylenko
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(['no-auth', 'dev'])
class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specification {

@Autowired
private TestRestTemplate restTemplate

@Autowired
MetadataResolverRepository repository

static BASE_URI = '/api/MetadataResolvers'

static ALL_VERSIONS_URI = "$BASE_URI/%s/Versions"

static SPECIFIC_VERSION_URI = "$BASE_URI/%s/Versions/%s"

def "GET /api/MetadataResolvers/{resourceId}/Versions with non-existent resolver"() {
when:
def result = getAllMetadataResolverVersions('non-existent-resolver-id', String)

then:
result.statusCodeValue == 404
}

def "GET /api/MetadataResolvers/{resourceId}/Versions with 1 resolver version"() {
given:
MetadataResolver mr = new LocalDynamicMetadataResolver(name: 'resolver')
repository.save(mr)

when:
def result = getAllMetadataResolverVersions(mr.resourceId, List)

then:
result.statusCodeValue == 200
result.body.size == 1
result.body[0].id && result.body[0].creator && result.body[0].date
}

def "GET /api/MetadataResolvers/{resourceId}/Versions with 2 resolver versions"() {
given:
MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'resolver')
mr = repository.save(mr)
//Will create a second version for UPDATE revision
mr.name = 'resolverUPDATED'
repository.save(mr)

when:
def result = getAllMetadataResolverVersions(mr.resourceId, List)

then:
result.statusCodeValue == 200
result.body.size == 2
result.body[0].id < result.body[1].id
result.body[0].date < result.body[1].date
}

def "GET /api/MetadataResolvers/{resourceId}/Versions/{version} for non existent version"() {
given:
MetadataResolver mr = new DynamicHttpMetadataResolver(name: 'resolver')
mr = repository.save(mr)

when:
def result = getMetadataResolverForVersion(mr.resourceId, '1000', MetadataResolver)

then:
result.statusCodeValue == 404
}

def "GET /api/MetadataResolvers/{resourceId}/Versions/{version} with 2 resolver versions returns correct resolver for specific version"() {
given:
MetadataResolver mr = new FilesystemMetadataResolver(name: 'resolver')
mr = repository.save(mr)
//Will create a second version for UPDATE revision
mr.name = 'resolverUPDATED'
repository.save(mr)

when:
def allVersions = getAllMetadataResolverVersions(mr.resourceId, List)
def mrv1 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[0].id, MetadataResolver)
def mrv2 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[1].id, MetadataResolver)

then:
mrv1.statusCodeValue == 200
mrv1.body.name == 'resolver'
mrv2.statusCodeValue == 200
mrv2.body.name == 'resolverUPDATED'
}

private getAllMetadataResolverVersions(String resourceId, responseType) {
this.restTemplate.getForEntity(resourceUriFor(ALL_VERSIONS_URI, resourceId), responseType)
}

private getMetadataResolverForVersion(String resourceId, String version, responseType) {
this.restTemplate.getForEntity(resourceUriFor(SPECIFIC_VERSION_URI, resourceId, version), responseType)
}

private static resourceUriFor(String uriTemplate, String resourceId, String version) {
String.format(uriTemplate, resourceId, version)
}

private static resourceUriFor(String uriTemplate, String resourceId) {
String.format(uriTemplate, resourceId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetada
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository
Expand All @@ -22,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.domain.EntityScan
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.test.annotation.DirtiesContext
import org.springframework.test.context.ContextConfiguration
import org.springframework.transaction.PlatformTransactionManager
import spock.lang.Specification
Expand Down Expand Up @@ -99,7 +99,6 @@ class MetadataFilterEnversVersioningTests extends Specification {
mrv3.metadataFilters[0].removeEmptyEntitiesDescriptors == false
}

//@DirtiesContext
def "test versioning of MetadataResolver with EntityAttributesFilter"() {
when: 'Add initial filter'
def mr = new FileBackedHttpMetadataResolver(name: 'resolver')
Expand Down Expand Up @@ -145,7 +144,6 @@ class MetadataFilterEnversVersioningTests extends Specification {
mrv3.metadataFilters[0].attributes[0].attributeValues[0].xsStringvalue == 'attr1, attr2'
}

//@DirtiesContext
def "test versioning of MetadataResolver with SignatureValidationFilter"() {
when: 'Add initial filter'
def mr = new DynamicHttpMetadataResolver(name: 'resolver')
Expand Down Expand Up @@ -238,7 +236,6 @@ class MetadataFilterEnversVersioningTests extends Specification {
mrv3.metadataFilters[0].maxValidityInterval == 'PT30S'
}

@DirtiesContext
def "test versioning of MetadataResolver with NameIdFormatFilter"() {
when: 'Add initial filter'
def mr = new ResourceBackedMetadataResolver(name: 'resolver')
Expand Down Expand Up @@ -289,7 +286,7 @@ class MetadataFilterEnversVersioningTests extends Specification {

def "test versioning of deleting a filter"() {
when: 'Add initial filter'
def mr = new LocalDynamicMetadataResolver(name: 'resolver')
def mr = new MetadataResolver(name: 'resolver')
def filter = new EntityRoleWhiteListFilter()

mr.metadataFilters.add(filter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService;
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version;
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository;
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;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolversPositionOrderContainerService;
import edu.internet2.tier.shibboleth.admin.util.OpenSamlChainingMetadataResolverUtil;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -69,6 +71,9 @@ public class MetadataResolversController {
@Autowired
MetadataResolverConverterService metadataResolverConverterService;

@Autowired
MetadataResolverVersionService versionService;

@ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class})
public ResponseEntity<?> unableToParseJson(Exception ex) {
return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage(), ex.getCause().getMessage()));
Expand Down Expand Up @@ -149,6 +154,30 @@ public ResponseEntity<?> update(@PathVariable String resourceId, @RequestBody Me
return ResponseEntity.ok(persistedResolver);
}

//Versioning endpoints

@GetMapping("/MetadataResolvers/{resourceId}/Versions")
public ResponseEntity<?> getAllVersions(@PathVariable String resourceId) {
MetadataResolver resolver = resolverRepository.findByResourceId(resourceId);
if (resolver == null) {
return ResponseEntity.notFound().build();
}
List<Version> versions = versionService.findVersionsForMetadataResolver(resourceId);
if (versions.isEmpty()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(versions);
}

@GetMapping("/MetadataResolvers/{resourceId}/Versions/{versionId}")
public ResponseEntity<?> getSpecificVersion(@PathVariable String resourceId, @PathVariable String versionId) {
MetadataResolver resolver = versionService.findSpecificVersionOfMetadataResolver(resourceId, versionId);
if (resolver == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(resolver);
}

@SuppressWarnings("Unchecked")
private ResponseEntity<?> validate(MetadataResolver metadataResolver) {
ValidationResult validationResult = metadataResolverValidationService.validateIfNecessary(metadataResolver);
Expand All @@ -159,6 +188,8 @@ private ResponseEntity<?> validate(MetadataResolver metadataResolver) {
return null;
}

//Private methods

private static URI getResourceUriFor(MetadataResolver resolver) {
return ServletUriComponentsBuilder
.fromCurrentServletMapping().path("/api/MetadataResolvers/")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ public EnversVersionServiceSupport(EntityManager entityManager) {
this.entityManager = entityManager;
}

public List<Version> findVersionsForPersistentEntity(String resourceId, Class<?> enityClass) {
public List<Version> findVersionsForPersistentEntity(String resourceId, Class<?> entityClass) {
List revs = AuditReaderFactory.get(entityManager).createQuery()
.forRevisionsOfEntity(enityClass, false, false)
.forRevisionsOfEntity(entityClass, false, false)
.add(AuditEntity.property("resourceId").eq(resourceId))
.getResultList();

Expand Down

0 comments on commit 8321859

Please sign in to comment.