ACS-8754 Return 405 status code when calling /entity/id/relationship against a resource that only supports ReadById.

This commit is contained in:
Tom Page
2024-09-11 15:19:53 +01:00
parent 1f708ad712
commit 0363cab870
3 changed files with 66 additions and 12 deletions

View File

@@ -244,6 +244,10 @@ public class ResourceWebScriptGet extends AbstractResourceWebScript implements P
{ {
throw new DeletedResourceException("(GET) "+resource.getMetaData().getUniqueId()); throw new DeletedResourceException("(GET) "+resource.getMetaData().getUniqueId());
} }
if (!RelationshipResourceAction.ReadWithResponse.class.isAssignableFrom(resource.getResource().getClass()))
{
throw new UnsupportedResourceOperationException();
}
RelationshipResourceAction.ReadWithResponse<?> relationGetter = (RelationshipResourceAction.ReadWithResponse<?>) resource.getResource(); RelationshipResourceAction.ReadWithResponse<?> relationGetter = (RelationshipResourceAction.ReadWithResponse<?>) resource.getResource();
CollectionWithPagingInfo<?> relations = relationGetter.readAll(params.getEntityId(),params,withResponse); CollectionWithPagingInfo<?> relations = relationGetter.readAll(params.getEntityId(),params,withResponse);
return relations; return relations;

View File

@@ -26,34 +26,47 @@
package org.alfresco.rest.framework.tests.core; package org.alfresco.rest.framework.tests.core;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any; import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.anyInt; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.alfresco.rest.framework.core.ResourceMetadata.RESOURCE_TYPE.RELATIONSHIP;
import org.alfresco.rest.framework.Api; import org.alfresco.rest.framework.Api;
import org.alfresco.rest.framework.core.ResourceLocator; import org.alfresco.rest.framework.core.ResourceLocator;
import org.alfresco.rest.framework.core.ResourceLookupDictionary; import org.alfresco.rest.framework.core.ResourceLookupDictionary;
import org.alfresco.rest.framework.core.ResourceMetadata;
import org.alfresco.rest.framework.core.ResourceWithMetadata; import org.alfresco.rest.framework.core.ResourceWithMetadata;
import org.alfresco.rest.framework.core.exceptions.*; import org.alfresco.rest.framework.core.exceptions.ApiException;
import org.alfresco.rest.framework.core.exceptions.DefaultExceptionResolver;
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
import org.alfresco.rest.framework.core.exceptions.ErrorResponse;
import org.alfresco.rest.framework.core.exceptions.SimpleMappingExceptionResolver;
import org.alfresco.rest.framework.core.exceptions.UnsupportedResourceOperationException;
import org.alfresco.rest.framework.jacksonextensions.ExecutionResult; import org.alfresco.rest.framework.jacksonextensions.ExecutionResult;
import org.alfresco.rest.framework.resource.actions.ActionExecutor; import org.alfresco.rest.framework.resource.actions.ActionExecutor;
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.ContentInfo;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Params; import org.alfresco.rest.framework.resource.parameters.Params;
import org.alfresco.rest.framework.tests.api.mocks.CowEntityResource; import org.alfresco.rest.framework.tests.api.mocks.CowEntityResource;
import org.alfresco.rest.framework.tests.api.mocks.Goat; import org.alfresco.rest.framework.tests.api.mocks.Goat;
import org.alfresco.rest.framework.tests.api.mocks.Grass; import org.alfresco.rest.framework.tests.api.mocks.Grass;
import org.alfresco.rest.framework.tests.api.mocks.GrassEntityResource;
import org.alfresco.rest.framework.tests.api.mocks.Sheep; import org.alfresco.rest.framework.tests.api.mocks.Sheep;
import org.alfresco.rest.framework.tests.api.mocks3.FlockEntityResource; import org.alfresco.rest.framework.tests.api.mocks3.FlockEntityResource;
import org.alfresco.rest.framework.tools.ApiAssistant; import org.alfresco.rest.framework.tools.ApiAssistant;
import org.alfresco.rest.framework.tools.ResponseWriter; import org.alfresco.rest.framework.tools.ResponseWriter;
import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript; import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript;
import org.alfresco.rest.framework.webscripts.ApiWebScript; import org.alfresco.rest.framework.webscripts.ApiWebScript;
import org.alfresco.rest.framework.webscripts.ResourceWebScriptGet;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock; import org.mockito.invocation.InvocationOnMock;
@@ -337,6 +350,46 @@ public class ExecutionTests extends AbstractContextTest implements ResponseWrite
assertFalse("Only 500 errors should have a logId", errorMessage.contains("\"logId\":\" \"")); assertFalse("Only 500 errors should have a logId", errorMessage.contains("\"logId\":\" \""));
} }
@Test
public void testSuccessfulReadByIdRequest() throws Throwable
{
ResourceWebScriptGet extractor = new ResourceWebScriptGet();
ResourceWithMetadata resource = mock(ResourceWithMetadata.class);
RelationshipResourceAction.ReadById<GrassEntityResource> readByIdEntity = mock(RelationshipResourceAction.ReadById.class);
when(resource.getResource()).thenReturn(readByIdEntity);
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
when(resourceMetadata.getType()).thenReturn(RELATIONSHIP);
when(resource.getMetaData()).thenReturn(resourceMetadata);
Params params = mock(Params.class);
when(params.getEntityId()).thenReturn("farms/1234/fields");
when(params.getRelationshipId()).thenReturn("5678");
GrassEntityResource entity = new GrassEntityResource();
when(readByIdEntity.readById("farms/1234/fields", "5678", params)).thenReturn(entity);
Object response = extractor.executeAction(resource, params, null);
assertEquals("Unexpected entity returned", entity, response);
}
@Test(expected = UnsupportedResourceOperationException.class)
public void testReadAllAgainstResourceSupportingReadById() throws Throwable
{
ResourceWebScriptGet extractor = new ResourceWebScriptGet();
ResourceWithMetadata resource = mock(ResourceWithMetadata.class);
RelationshipResourceAction.ReadById<GrassEntityResource> readByIdEntity = mock(RelationshipResourceAction.ReadById.class);
when(resource.getResource()).thenReturn(readByIdEntity);
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
when(resourceMetadata.getType()).thenReturn(RELATIONSHIP);
when(resource.getMetaData()).thenReturn(resourceMetadata);
Params params = mock(Params.class);
when(params.getRelationshipId()).thenReturn(null);
extractor.executeAction(resource, params, null);
}
private WebScriptResponse mockResponse() throws IOException private WebScriptResponse mockResponse() throws IOException
{ {
return mockResponse(new ByteArrayOutputStream()); return mockResponse(new ByteArrayOutputStream());

View File

@@ -36,6 +36,8 @@ import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.alfresco.rest.framework.core.ResourceMetadata.RESOURCE_TYPE.RELATIONSHIP;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -461,12 +463,6 @@ public class ParamsExtractorTests
testExtractAddressedParams(templateVars, request, extractor); testExtractAddressedParams(templateVars, request, extractor);
} }
@Test
public void testHeaderParsing() throws IOException
{
}
@Test @Test
public void testSpecialChars() throws IOException public void testSpecialChars() throws IOException
{ {
@@ -510,6 +506,7 @@ public class ParamsExtractorTests
assertTrue(pVal.equals("香 香蕉")); assertTrue(pVal.equals("香 香蕉"));
} }
/** /**
* Mocks a Entity Resource * Mocks a Entity Resource
* @return ResourceMetadata a Entity * @return ResourceMetadata a Entity
@@ -557,7 +554,7 @@ public class ParamsExtractorTests
ResourceMetadata resourceMock = mock(ResourceMetadata.class); ResourceMetadata resourceMock = mock(ResourceMetadata.class);
ResourceOperation resourceOperation = mock(ResourceOperation.class); ResourceOperation resourceOperation = mock(ResourceOperation.class);
when(resourceMock.getOperation(notNull())).thenReturn(resourceOperation); when(resourceMock.getOperation(notNull())).thenReturn(resourceOperation);
when(resourceMock.getType()).thenReturn(ResourceMetadata.RESOURCE_TYPE.RELATIONSHIP); when(resourceMock.getType()).thenReturn(RELATIONSHIP);
when(resourceMock.getObjectType(notNull())).thenReturn(Farmer.class); when(resourceMock.getObjectType(notNull())).thenReturn(Farmer.class);
return resourceMock; return resourceMock;
} }