/*
* Copyright 2011-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.mongodb.core.query;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.springframework.data.mongodb.core.query.Criteria.*;
import static org.springframework.data.mongodb.test.util.IsBsonObject.*;
import org.bson.Document;
import org.junit.Test;
import org.springframework.data.domain.Sort.Direction;
import nl.jqno.equalsverifier.EqualsVerifier;
import nl.jqno.equalsverifier.Warning;
/**
* Unit tests for {@link BasicQuery}.
*
* @author Oliver Gierke
* @author Thomas Darimont
* @author John Willemin
*/
public class BasicQueryUnitTests {
@Test
public void createsQueryFromPlainJson() {
Query q = new BasicQuery("{ \"name\" : \"Thomas\"}");
Document reference = new Document("name", "Thomas");
assertThat(q.getQueryObject(), is(reference));
}
@Test
public void addsCriteriaCorrectly() {
Query q = new BasicQuery("{ \"name\" : \"Thomas\"}").addCriteria(where("age").lt(80));
Document reference = new Document("name", "Thomas");
reference.put("age", new Document("$lt", 80));
assertThat(q.getQueryObject(), is(reference));
}
@Test
public void overridesSortCorrectly() {
BasicQuery query = new BasicQuery("{}");
query.setSortObject(new Document("name", -1));
query.with(new org.springframework.data.domain.Sort(Direction.ASC, "lastname"));
Document sortReference = new Document("name", -1);
sortReference.put("lastname", 1);
assertThat(query.getSortObject(), is(sortReference));
}
@Test // DATAMONGO-1093
public void equalsContract() {
BasicQuery query1 = new BasicQuery("{ \"name\" : \"Thomas\"}", "{\"name\":1, \"age\":1}");
query1.setSortObject(new Document("name", -1));
BasicQuery query2 = new BasicQuery("{ \"name\" : \"Oliver\"}", "{\"name\":1, \"address\":1}");
query2.setSortObject(new Document("name", 1));
EqualsVerifier.forExamples(query1, query2) //
.withRedefinedSuperclass() //
.suppress(Warning.NONFINAL_FIELDS, Warning.NULL_FIELDS, Warning.STRICT_INHERITANCE) //
.verify();
}
@Test // DATAMONGO-1093
public void handlesEqualsAndHashCodeCorrectlyForExactCopies() {
String qry = "{ \"name\" : \"Thomas\"}";
String fields = "{\"name\":1, \"age\":1}";
BasicQuery query1 = new BasicQuery(qry, fields);
query1.setSortObject(new Document("name", -1));
BasicQuery query2 = new BasicQuery(qry, fields);
query2.setSortObject(new Document("name", -1));
assertThat(query1, is(equalTo(query1)));
assertThat(query1, is(equalTo(query2)));
assertThat(query1.hashCode(), is(query2.hashCode()));
}
@Test // DATAMONGO-1093
public void handlesEqualsAndHashCodeCorrectlyWhenBasicQuerySettingsDiffer() {
String qry = "{ \"name\" : \"Thomas\"}";
String fields = "{\"name\":1, \"age\":1}";
BasicQuery query1 = new BasicQuery(qry, fields);
query1.setSortObject(new Document("name", -1));
BasicQuery query2 = new BasicQuery(qry, fields);
query2.setSortObject(new Document("name", 1));
assertThat(query1, is(not(equalTo(query2))));
assertThat(query1.hashCode(), is(not(query2.hashCode())));
}
@Test // DATAMONGO-1093
public void handlesEqualsAndHashCodeCorrectlyWhenQuerySettingsDiffer() {
String qry = "{ \"name\" : \"Thomas\"}";
String fields = "{\"name\":1, \"age\":1}";
BasicQuery query1 = new BasicQuery(qry, fields);
query1.getMeta().setComment("foo");
BasicQuery query2 = new BasicQuery(qry, fields);
query2.getMeta().setComment("bar");
assertThat(query1, is(not(equalTo(query2))));
assertThat(query1.hashCode(), is(not(query2.hashCode())));
}
@Test // DATAMONGO-1387
public void returnsFieldsCorrectly() {
String qry = "{ \"name\" : \"Thomas\"}";
String fields = "{\"name\":1, \"age\":1}";
BasicQuery query1 = new BasicQuery(qry, fields);
assertThat(query1.getFieldsObject(), isBsonObject().containing("name").containing("age"));
}
@Test // DATAMONGO-1387
public void handlesFieldsIncludeCorrectly() {
String qry = "{ \"name\" : \"Thomas\"}";
BasicQuery query1 = new BasicQuery(qry);
query1.fields().include("name");
assertThat(query1.getFieldsObject(), isBsonObject().containing("name"));
}
@Test // DATAMONGO-1387
public void combinesFieldsIncludeCorrectly() {
String qry = "{ \"name\" : \"Thomas\"}";
String fields = "{\"name\":1, \"age\":1}";
BasicQuery query1 = new BasicQuery(qry, fields);
query1.fields().include("gender");
assertThat(query1.getFieldsObject(), isBsonObject().containing("name").containing("age").containing("gender"));
}
}