/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.module.webservices.rest.web.resource.api; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; /** * Tests {@link SearchQuery}. */ public class SearchQueryTest { @Rule public ExpectedException expectedException = ExpectedException.none(); /** * @verifies fail if required parameters are already set * @see SearchQuery.Builder#withRequiredParameters(String...) */ @Test public void withRequiredParameters_shouldFailIfRequiredParametersAreAlreadySet() throws Exception { SearchQuery.Builder builder = new SearchQuery.Builder("Enables search").withRequiredParameters("patient"); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("withRequiredParameters() must not be called twice"); builder.withRequiredParameters("encounter"); } /** * @verifies fail if optional parameters are already set * @see SearchQuery.Builder#withOptionalParameters(String...) */ @Test public void withOptionalParameters_shouldFailIfOptionalParametersAreAlreadySet() throws Exception { SearchQuery.Builder builder = new SearchQuery.Builder("Enables search").withOptionalParameters("patient"); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("withOptionalParameters() must not be called twice"); builder.withOptionalParameters("encounter"); } /** * @verifies return a search query instance with properties set through the builder * @see SearchQuery.Builder#build() */ @Test public void build_shouldReturnASearchQueryInstanceWithPropertiesSetThroughTheBuilder() throws Exception { SearchQuery searchQuery = new SearchQuery.Builder("Enables search for patient") .withRequiredParameters("patient", "visit").withOptionalParameters("encounter", "date").build(); assertThat(searchQuery.getDescription(), is("Enables search for patient")); assertThat(searchQuery.getRequiredParameters().size(), is(2)); assertThat(searchQuery.getRequiredParameters(), hasItem(new SearchParameter("patient"))); assertThat(searchQuery.getRequiredParameters(), hasItem(new SearchParameter("visit"))); assertThat(searchQuery.getOptionalParameters().size(), is(2)); assertThat(searchQuery.getOptionalParameters(), hasItem(new SearchParameter("encounter"))); assertThat(searchQuery.getOptionalParameters(), hasItem(new SearchParameter("date"))); } /** * @verifies assign an empty set to required parameters if not set by the builder * @see SearchQuery.Builder#build() */ @Test public void build_shouldAssignAnEmptySetToRequiredParametersIfNotSetByTheBuilder() throws Exception { SearchQuery searchQuery = new SearchQuery.Builder("Enables search for patient").withOptionalParameters("encounter", "date").build(); assertThat(searchQuery.getDescription(), is("Enables search for patient")); assertThat(searchQuery.getRequiredParameters(), is(empty())); assertThat(searchQuery.getOptionalParameters().size(), is(2)); assertThat(searchQuery.getOptionalParameters(), hasItem(new SearchParameter("encounter"))); assertThat(searchQuery.getOptionalParameters(), hasItem(new SearchParameter("date"))); } /** * @verifies assign an empty set to optional parameters if not set by the builder * @see SearchQuery.Builder#build() */ @Test public void build_shouldAssignAnEmptySetToOptionalParametersIfNotSetByTheBuilder() throws Exception { SearchQuery searchQuery = new SearchQuery.Builder("Enables search for patient").withRequiredParameters("patient", "visit").build(); assertThat(searchQuery.getDescription(), is("Enables search for patient")); assertThat(searchQuery.getRequiredParameters().size(), is(2)); assertThat(searchQuery.getRequiredParameters(), hasItem(new SearchParameter("patient"))); assertThat(searchQuery.getRequiredParameters(), hasItem(new SearchParameter("visit"))); assertThat(searchQuery.getOptionalParameters(), is(empty())); } /** * @verifies fail if the description is null * @see SearchQuery.Builder#build() */ @Test public void build_shouldFailIfTheDescriptionIsNull() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Description must not be empty"); new SearchQuery.Builder(null).withRequiredParameters("patient", "visit").withOptionalParameters("encounter", "date") .build(); } /** * @verifies fail if the description is empty * @see SearchQuery.Builder#build() */ @Test public void build_shouldFailIfTheDescriptionIsEmpty() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Description must not be empty"); new SearchQuery.Builder("").withRequiredParameters("patient", "visit").withOptionalParameters("encounter", "date") .build(); } /** * @verifies fail if both required and optional parameters are empty * @see SearchQuery.Builder#build() */ @Test public void build_shouldFailIfBothRequiredAndOptionalParametersAreEmpty() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Either required or optional parameters must not be empty"); new SearchQuery.Builder("Enable search").build(); } /** * @verifies return same hashcode for equal search configs * @see SearchQuery#hashCode() */ @Test public void hashCode_shouldReturnSameHashcodeForEqualSearchConfigs() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .build(); assertTrue(searchQuery1.equals(searchQuery2)); assertThat(searchQuery1.hashCode(), is(searchQuery2.hashCode())); } /** * @verifies return true if given this * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnTrueIfGivenThis() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .build(); assertTrue(searchQuery1.equals(searchQuery1)); } /** * @verifies return true if this optional parameters and required parameters are equal to given * search query * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnTrueIfThisOptionalParametersAndRequiredParametersAreEqualToGivenSearchQuery() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); assertTrue(searchQuery1.equals(searchQuery2)); } /** * @verifies be symmetric * @see SearchQuery#equals(Object) */ @Test public void equals_shouldBeSymmetric() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); assertTrue(searchQuery1.equals(searchQuery2)); assertTrue(searchQuery2.equals(searchQuery1)); } /** * @verifies be transitive * @see SearchQuery#equals(Object) */ @Test public void equals_shouldBeTransitive() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery3 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); assertTrue(searchQuery1.equals(searchQuery2)); assertTrue(searchQuery2.equals(searchQuery3)); assertTrue(searchQuery1.equals(searchQuery3)); } /** * @verifies return false if given null * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnFalseIfGivenNull() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); assertFalse(searchQuery1.equals(null)); } /** * @verifies return false if given an object which is not an instanceof this class * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnFalseIfGivenAnObjectWhichIsNotAnInstanceofThisClass() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); assertFalse(searchQuery1.equals("some string")); } /** * @verifies return false if this optional parameters is not equal to the given search queries * optional parameters * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnFalseIfThisOptionalParametersIsNotEqualToTheGivenSearchQueriesOptionalParameters() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("visit").build(); assertFalse(searchQuery1.equals(searchQuery2)); } /** * @verifies return false if this required parameters is not equal to the given search queries * required parameters * @see SearchQuery#equals(Object) */ @Test public void equals_shouldReturnFalseIfThisRequiredParametersIsNotEqualToTheGivenSearchQueriesRequiredParameters() throws Exception { SearchQuery searchQuery1 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("patient") .withOptionalParameters("encounter").build(); SearchQuery searchQuery2 = new SearchQuery.Builder("Enables to search by patient").withRequiredParameters("visit") .withOptionalParameters("encounter").build(); assertFalse(searchQuery1.equals(searchQuery2)); } }