/* * Copyright 2014-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.rest.core.config; import static org.assertj.core.api.Assertions.*; import java.util.Map; import org.junit.Test; import org.springframework.data.rest.core.config.ProjectionDefinitionConfiguration.ProjectionDefinition; /** * Unit tests for {@link ProjectionDefinitionConfiguration}. * * @author Oliver Gierke */ public class ProjectionDefinitionConfigurationUnitTests { @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsNullProjectionTypeForAutoConfiguration() { new ProjectionDefinitionConfiguration().addProjection(null); } @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsUnannotatedClassForConfigurationShortcut() { new ProjectionDefinitionConfiguration().addProjection(String.class); } @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsNullProjectionTypeForManualConfiguration() { new ProjectionDefinitionConfiguration().addProjection(null, "name", Object.class); } @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsNullNameForManualConfiguration() { new ProjectionDefinitionConfiguration().addProjection(String.class, (String) null, Object.class); } @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsEmptyNameForManualConfiguration() { new ProjectionDefinitionConfiguration().addProjection(String.class, "", Object.class); } @Test(expected = IllegalArgumentException.class) // DATAREST-221 public void rejectsEmptySourceTypes() { new ProjectionDefinitionConfiguration().addProjection(String.class, "name", new Class<?>[0]); } @Test // DATAREST-221 public void findsRegisteredProjection() { ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); configuration.addProjection(Integer.class, "name", String.class); assertThat(configuration.getProjectionType(String.class, "name")).isEqualTo(Integer.class); } @Test // DATAREST-221 public void registersAnnotatedProjection() { ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); configuration.addProjection(SampleProjection.class); assertThat(configuration.getProjectionType(Integer.class, "name")).isEqualTo(SampleProjection.class); } @Test // DATAREST-221 public void defaultsNameToSimpleClassNameIfNotAnnotated() { ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); configuration.addProjection(Default.class); assertThat(configuration.getProjectionType(Integer.class, "default")).isEqualTo(Default.class); } @Test // DATAREST-221 public void definitionEquals() { ProjectionDefinition objectName = ProjectionDefinition.of(Object.class, Object.class, "name"); ProjectionDefinition sameObjectName = ProjectionDefinition.of(Object.class, Object.class, "name"); ProjectionDefinition stringName = ProjectionDefinition.of(String.class, Object.class, "name"); ProjectionDefinition objectOtherNameKey = ProjectionDefinition.of(Object.class, Object.class, "otherName"); assertThat(objectName).isEqualTo(objectName); assertThat(objectName).isEqualTo(sameObjectName); assertThat(sameObjectName).isEqualTo(objectName); assertThat(objectName).isNotEqualTo(stringName); assertThat(stringName).isNotEqualTo(objectName); assertThat(objectName).isNotEqualTo(objectOtherNameKey); assertThat(objectOtherNameKey).isNotEqualTo(objectName); assertThat(objectName).isNotEqualTo(new Object()); } @Test // DATAREST-385 public void returnsProjectionForParentClass() { ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); configuration.addProjection(ParentProjection.class); assertThat(configuration.hasProjectionFor(Child.class)).isTrue(); assertThat(configuration.getProjectionsFor(Child.class).values()).contains(ParentProjection.class); assertThat(configuration.getProjectionType(Child.class, "summary")).isAssignableFrom(ParentProjection.class); } @Test // DATAREST-221 public void defaultsParamternameToProjection() { assertThat(new ProjectionDefinitionConfiguration().getParameterName()).isEqualTo("projection"); } @Test // DATAREST-747 public void returnsMostConcreteProjectionForSourceType() { ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); configuration.addProjection(ParentProjection.class); configuration.addProjection(ChildProjection.class); Map<String, Class<?>> projections = configuration.getProjectionsFor(Child.class); assertThat(projections.values()).hasSize(1); assertThat(projections.values()).contains(ChildProjection.class); } @Projection(name = "name", types = Integer.class) interface SampleProjection {} @Projection(types = Integer.class) interface Default { } class Parent {} class Child extends Parent {} @Projection(name = "summary", types = Parent.class) interface ParentProjection {} @Projection(name = "summary", types = Child.class) interface ChildProjection {} }