From 771da69fca83baa8138053d86556973feb9a38ce Mon Sep 17 00:00:00 2001 From: Dominik Herbst Date: Wed, 12 Oct 2016 14:40:03 +0200 Subject: [PATCH] Fixed SpecificationsBuilder to support immutable Collections and added a test for it Signed-off-by: Dominik Herbst --- .../specifications/SpecificationsBuilder.java | 5 +- .../SpecificationsBuilderTest.java | 106 ++++++++++++++++++ 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilderTest.java diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilder.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilder.java index 005942719..095269622 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilder.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilder.java @@ -28,7 +28,7 @@ public final class SpecificationsBuilder { * where clause. * * @param specList - * all specification wich will combine + * all specification which will combine * @return if the given specification list is empty */ public static Specifications combineWithAnd(final List> specList) { @@ -36,8 +36,7 @@ public final class SpecificationsBuilder { return null; } Specifications specs = Specifications.where(specList.get(0)); - specList.remove(0); - for (final Specification specification : specList) { + for (final Specification specification : specList.subList(1, specList.size())) { specs = specs.and(specification); } return specs; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilderTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilderTest.java new file mode 100644 index 000000000..aeb28fcae --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/specifications/SpecificationsBuilderTest.java @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.repository.jpa.specifications; + +import org.junit.Test; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.Specifications; +import ru.yandex.qatools.allure.annotations.Description; +import ru.yandex.qatools.allure.annotations.Features; +import ru.yandex.qatools.allure.annotations.Stories; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@Features("Unit Tests - Repository") +@Stories("Specifications builder") +public class SpecificationsBuilderTest { + + @Test + @Description("Test the combination of specs on an empty list which returns null") + public void combineWithAndEmptyList() { + List> specList = Collections.emptyList(); + assertThat(SpecificationsBuilder.combineWithAnd(specList)).isNull(); + } + + @Test + @Description("Test the combination of specs on an immutable list with one entry") + public void combineWithAndSingleImmutableList() { + Specification spec = (root, query, cb) -> cb.equal(root.get("field1"), "testValue"); + List> specList = Collections.singletonList(spec); + Specifications specifications = SpecificationsBuilder.combineWithAnd(specList); + assertThat(specifications).as("Specifications").isNotNull(); + + // mocks to call toPredicate on specifications + CriteriaBuilder criteriaBuilder = mock(CriteriaBuilder.class); + final Path field1 = mock(Path.class); + final Predicate equalPredicate = mock(Predicate.class); + final CriteriaQuery query = mock(CriteriaQuery.class); + final Root root = mock(Root.class); + + when(criteriaBuilder.equal(any(Expression.class), anyString())).thenReturn(equalPredicate); + when(root.get("field1")).thenReturn(field1); + + Predicate predicate = specifications.toPredicate(root, query, criteriaBuilder); + + assertThat(predicate).isEqualTo(equalPredicate); + + } + + + @Test + @Description("Test the combination of specs on a list with multiple entries") + public void combineWithAndList() { + Specification spec1 = (root, query, cb) -> cb.equal(root.get("field1"), "testValue1"); + Specification spec2 = (root, query, cb) -> cb.equal(root.get("field2"), "testValue2"); + + List> specList = new ArrayList<>(2); + specList.add(spec1); + specList.add(spec2); + + Specifications specifications = SpecificationsBuilder.combineWithAnd(specList); + assertThat(specifications).as("Specifications").isNotNull(); + + // mocks to call toPredicate on specifications + CriteriaBuilder criteriaBuilder = mock(CriteriaBuilder.class); + final Path field1 = mock(Path.class); + final Path field2 = mock(Path.class); + final Predicate equalPredicate1 = mock(Predicate.class); + final Predicate equalPredicate2 = mock(Predicate.class); + final Predicate combinedPredicate = mock(Predicate.class); + final CriteriaQuery query = mock(CriteriaQuery.class); + final Root root = mock(Root.class); + + when(criteriaBuilder.equal(any(Path.class), eq("testValue1"))).thenReturn(equalPredicate1); + when(criteriaBuilder.equal(any(Path.class), eq("testValue2"))).thenReturn(equalPredicate2); + when(criteriaBuilder.and(eq(equalPredicate1), eq(equalPredicate2))).thenReturn(combinedPredicate); + when(root.get("field1")).thenReturn(field1); + when(root.get("field2")).thenReturn(field2); + + Predicate predicate = specifications.toPredicate(root, query, criteriaBuilder); + + assertThat(predicate).as("Combined predicate").isEqualTo(combinedPredicate); + + } + +} \ No newline at end of file