/*
* Copyright 2016-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.cassandra.test.integration.repository.querymethods.declared;
import static org.assertj.core.api.Assertions.*;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.test.integration.repository.querymethods.declared.base.PersonRepository;
import org.springframework.data.cassandra.test.integration.support.AbstractSpringDataEmbeddedCassandraIntegrationTest;
import org.springframework.data.cassandra.test.integration.support.IntegrationTestConfig;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.datastax.driver.core.Session;
/**
* Integration tests for use with {@link PersonRepository}.
*
* @author Matthew T. Adams
* @author Mark Paluch
* @soundtrack Mary Jane Kelly - Volbeat
*/
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class QueryIntegrationTests extends AbstractSpringDataEmbeddedCassandraIntegrationTest {
public static class Config extends IntegrationTestConfig {
@Override
public String[] getEntityBasePackages() {
return new String[] { Person.class.getPackage().getName() };
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.RECREATE_DROP_UNUSED;
}
}
@Autowired PersonRepository personRepository;
@Autowired Session session;
@Before
public void before() {
deleteAllEntities();
}
@Test
public void testListMethodSingleResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved = personRepository.save(saved);
List<Person> results = personRepository.findFolksWithLastnameAsList(saved.getLastname());
assertThat(results).isNotNull();
assertThat(results.size() == 1).isTrue();
Person found = results.iterator().next();
assertThat(found).isNotNull();
assertThat(saved.getLastname()).isEqualTo(found.getLastname());
assertThat(saved.getFirstname()).isEqualTo(found.getFirstname());
}
@Test
public void testListMethodMultipleResults() {
Person saved = new Person();
saved.setFirstname("a");
saved.setLastname(uuid());
saved = personRepository.save(saved);
Person saved2 = new Person();
saved2.setFirstname("b");
saved2.setLastname(saved.getLastname());
saved2 = personRepository.save(saved2);
List<Person> results = personRepository.findFolksWithLastnameAsList(saved.getLastname());
assertThat(results).isNotNull();
assertThat(results.size() == 2).isTrue();
boolean first = true;
for (Person person : results) {
assertThat(person).isNotNull();
assertThat(person.getLastname()).isEqualTo(saved.getLastname());
assertThat(person.getFirstname()).isEqualTo(first ? saved.getFirstname() : saved2.getFirstname());
first = false;
}
}
@Test
public void testListOfMapOfStringToObjectMethodSingleResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved = personRepository.save(saved);
List<Map<String, Object>> results = personRepository
.findFolksWithLastnameAsListOfMapOfStringToObject(saved.getLastname());
assertThat(results).isNotNull();
assertThat(results.size() == 1).isTrue();
Map<String, Object> found = results.iterator().next();
assertThat(found).isNotNull();
assertThat(saved.getLastname()).isEqualTo(found.get("lastname"));
assertThat(saved.getFirstname()).isEqualTo(found.get("firstname"));
}
@Test
public void testEntityMethodResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved = personRepository.save(saved);
Person found = personRepository.findSingle(saved.getLastname(), saved.getFirstname());
assertThat(found).isNotNull();
assertThat(saved.getLastname()).isEqualTo(found.getLastname());
assertThat(saved.getFirstname()).isEqualTo(found.getFirstname());
}
@Test
public void testListOfMapOfStringToObjectMethodMultipleResults() {
Person saved = new Person();
saved.setFirstname("a");
saved.setLastname(uuid());
saved = personRepository.save(saved);
Person saved2 = new Person();
saved2.setFirstname("b");
saved2.setLastname(saved.getLastname());
saved2 = personRepository.save(saved2);
Collection<Person> results = personRepository.findFolksWithLastnameAsList(saved.getLastname());
assertThat(results).isNotNull();
assertThat(results.size() == 2).isTrue();
boolean first = true;
for (Person person : results) {
assertThat(person).isNotNull();
assertThat(person.getLastname()).isEqualTo(saved.getLastname());
assertThat(person.getFirstname()).isEqualTo(first ? saved.getFirstname() : saved2.getFirstname());
first = false;
}
}
@Test
public void testStringMethodResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved.setNickname(uuid());
saved = personRepository.save(saved);
String nickname = personRepository.findSingleNickname(saved.getLastname(), saved.getFirstname());
assertThat(nickname).isNotNull();
assertThat(nickname).isEqualTo(saved.getNickname());
}
@Test
public void testBooleanMethodResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved.setCool(true);
saved = personRepository.save(saved);
boolean value = personRepository.findSingleCool(saved.getLastname(), saved.getFirstname());
assertThat(value).isEqualTo(saved.isCool());
}
@Test
public void testDateMethodResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved.setBirthDate(new Date());
saved = personRepository.save(saved);
Date value = personRepository.findSingleBirthdate(saved.getLastname(), saved.getFirstname());
assertThat(value).isEqualTo(saved.getBirthDate());
}
@Test
public void testIntMethodResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved.setNumberOfChildren(1);
saved = personRepository.save(saved);
int value = personRepository.findSingleNumberOfChildren(saved.getLastname(), saved.getFirstname());
assertThat(value).isEqualTo(saved.getNumberOfChildren());
}
@Test
public void testArrayMethodSingleResult() {
Person saved = new Person();
saved.setFirstname(uuid());
saved.setLastname(uuid());
saved = personRepository.save(saved);
Person[] results = personRepository.findFolksWithLastnameAsArray(saved.getLastname());
assertThat(results).isNotNull();
assertThat(results.length == 1).isTrue();
Person found = results[0];
assertThat(found).isNotNull();
assertThat(saved.getLastname()).isEqualTo(found.getLastname());
assertThat(saved.getFirstname()).isEqualTo(found.getFirstname());
}
@Test
public void testEscapeSingleQuoteInQueryParameterValue() {
Person saved = new Person();
saved.setFirstname("Bri'an" + uuid());
String lastname = "O'Brian" + uuid();
saved.setLastname(lastname);
saved = personRepository.save(saved);
List<Person> results = personRepository.findFolksWithLastnameAsList(lastname);
assertThat(results).isNotNull();
assertThat(results.size() == 1).isTrue();
for (Person person : results) {
assertThat(person).isNotNull();
assertThat(person.getLastname()).isEqualTo(saved.getLastname());
assertThat(person.getFirstname()).isEqualTo(saved.getFirstname());
}
}
@Test
public void findOptionalShouldReturnTargetType() {
Person personToSave = new Person();
personToSave.setFirstname(uuid());
personToSave.setLastname(uuid());
personToSave.setNumberOfChildren(1);
personToSave = personRepository.save(personToSave);
Optional<Person> savedPerson = personRepository.findOptionalWithLastnameAndFirstname(personToSave.getLastname(),
personToSave.getFirstname());
assertThat(savedPerson.isPresent()).isTrue();
}
@Test
public void findOptionalShouldAbsentOptional() {
Optional<Person> optional = personRepository.findOptionalWithLastnameAndFirstname("not", "existent");
assertThat(optional.isPresent()).isFalse();
}
@Test // DATACASS-297
public void streamShouldReturnEntities() {
long before = personRepository.count();
for (int i = 0; i < 100; i++) {
Person person = new Person();
person.setFirstname(uuid());
person.setLastname(uuid());
person.setNumberOfChildren(i);
personRepository.save(person);
}
Stream<Person> allPeople = personRepository.findAllPeople();
long count = allPeople.peek(person -> assertThat(person).isInstanceOf(Person.class)).count();
assertThat(count).isEqualTo(before + 100L);
}
}