/* * 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.core; import static org.assertj.core.api.Assertions.*; import static org.junit.Assume.*; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.Before; import org.junit.Test; import org.springframework.cassandra.core.CqlTemplate; import org.springframework.cassandra.test.integration.AbstractKeyspaceCreatingIntegrationTest; import org.springframework.cassandra.test.integration.support.CassandraVersion; import org.springframework.data.cassandra.convert.MappingCassandraConverter; import org.springframework.data.cassandra.core.query.Columns; import org.springframework.data.cassandra.core.query.Criteria; import org.springframework.data.cassandra.core.query.Query; import org.springframework.data.cassandra.core.query.Update; import org.springframework.data.cassandra.domain.Person; import org.springframework.data.cassandra.domain.UserToken; import org.springframework.data.cassandra.repository.support.BasicMapId; import org.springframework.data.cassandra.test.integration.simpletons.BookReference; import org.springframework.data.cassandra.test.integration.support.SchemaTestUtils; import org.springframework.data.domain.Sort; import org.springframework.data.util.Version; import com.datastax.driver.core.utils.UUIDs; /** * Integration tests for {@link CassandraTemplate}. * * @author Mark Paluch */ public class CassandraTemplateIntegrationTests extends AbstractKeyspaceCreatingIntegrationTest { final static Version CASSANDRA_3 = Version.parse("3.0"); Version cassandraVersion; CassandraTemplate template; @Before public void setUp() { MappingCassandraConverter converter = new MappingCassandraConverter(); converter.afterPropertiesSet(); cassandraVersion = CassandraVersion.get(session); template = new CassandraTemplate(new CqlTemplate(session), converter); SchemaTestUtils.potentiallyCreateTableFor(Person.class, template); SchemaTestUtils.potentiallyCreateTableFor(UserToken.class, template); SchemaTestUtils.potentiallyCreateTableFor(BookReference.class, template); SchemaTestUtils.truncate(Person.class, template); SchemaTestUtils.truncate(UserToken.class, template); SchemaTestUtils.truncate(BookReference.class, template); } @Test // DATACASS-343 public void shouldSelectByQueryWithAllowFiltering() { assumeTrue(cassandraVersion.isGreaterThanOrEqualTo(CASSANDRA_3)); UserToken userToken = new UserToken(); userToken.setUserId(UUIDs.endOf(System.currentTimeMillis())); userToken.setToken(UUIDs.startOf(System.currentTimeMillis())); userToken.setUserComment("cook"); template.insert(userToken); Query query = Query.query(Criteria.where("userId").is(userToken.getUserId())) .and(Criteria.where("userComment").is("cook")).withAllowFiltering(); UserToken loaded = template.selectOne(query, UserToken.class); assertThat(loaded).isNotNull(); assertThat(loaded.getUserComment()).isEqualTo("cook"); } @Test // DATACASS-343 public void shouldSelectByQueryWithSorting() { UserToken token1 = new UserToken(); token1.setUserId(UUIDs.endOf(System.currentTimeMillis())); token1.setToken(UUIDs.startOf(System.currentTimeMillis())); token1.setUserComment("foo"); UserToken token2 = new UserToken(); token2.setUserId(token1.getUserId()); token2.setToken(UUIDs.endOf(System.currentTimeMillis() + 100)); token2.setUserComment("bar"); template.insert(token1); template.insert(token2); Query query = Query.query(Criteria.where("userId").is(token1.getUserId())).sort(Sort.by("token")); List<UserToken> loaded = template.select(query, UserToken.class); assertThat(loaded).containsSequence(token1, token2); } @Test // DATACASS-343 public void shouldSelectOneByQuery() { UserToken token1 = new UserToken(); token1.setUserId(UUIDs.endOf(System.currentTimeMillis())); token1.setToken(UUIDs.startOf(System.currentTimeMillis())); token1.setUserComment("foo"); template.insert(token1); Query query = Query.query(Criteria.where("userId").is(token1.getUserId())); UserToken loaded = template.selectOne(query, UserToken.class); assertThat(loaded).isEqualTo(token1); } @Test // DATACASS-292 public void insertShouldInsertEntity() { Person person = new Person("heisenberg", "Walter", "White"); assertThat(template.selectOneById(person.getId(), Person.class)).isNull(); Person inserted = template.insert(person); assertThat(inserted).isEqualTo(person); assertThat(template.selectOneById(person.getId(), Person.class)).isEqualTo(person); } @Test // DATACASS-292 public void shouldInsertAndCountEntities() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); long count = template.count(Person.class); assertThat(count).isEqualTo(1L); } @Test // DATACASS-292 public void updateShouldUpdateEntity() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); person.setFirstname("Walter Hartwell"); Person updated = template.update(person); assertThat(updated).isNotNull(); assertThat(template.selectOneById(person.getId(), Person.class)).isEqualTo(person); } @Test // DATACASS-343 public void updateShouldUpdateEntityByQuery() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Query query = Query.query(Criteria.where("id").is("heisenberg")); boolean result = template.update(query, Update.empty().set("firstname", "Walter Hartwell"), Person.class); assertThat(result).isTrue(); assertThat(template.selectOneById(person.getId(), Person.class).getFirstname()).isEqualTo("Walter Hartwell"); } @Test // DATACASS-343 public void deleteByQueryShouldRemoveEntity() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Query query = Query.query(Criteria.where("id").is("heisenberg")); assertThat(template.delete(query, Person.class)).isTrue(); assertThat(template.selectOneById(person.getId(), Person.class)).isNull(); } @Test // DATACASS-343 public void deleteColumnsByQueryShouldRemoveColumn() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Query query = Query.query(Criteria.where("id").is("heisenberg")).columns(Columns.from("lastname")); assertThat(template.delete(query, Person.class)).isTrue(); Person loaded = template.selectOneById(person.getId(), Person.class); assertThat(loaded.getFirstname()).isEqualTo("Walter"); assertThat(loaded.getLastname()).isNull(); } @Test // DATACASS-292 public void deleteShouldRemoveEntity() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Person deleted = template.delete(person); assertThat(deleted).isNotNull(); assertThat(template.selectOneById(person.getId(), Person.class)).isNull(); } @Test // DATACASS-292 public void deleteByIdShouldRemoveEntity() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Boolean deleted = template.deleteById(person.getId(), Person.class); assertThat(deleted).isTrue(); assertThat(template.selectOneById(person.getId(), Person.class)).isNull(); } @Test // DATACASS-182 public void stream() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Stream<Person> stream = template.stream("SELECT * FROM person", Person.class); assertThat(stream.collect(Collectors.toList())).hasSize(1).contains(person); } @Test // DATACASS-343 public void streamByQuery() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); Query query = Query.query(Criteria.where("id").is("heisenberg")); Stream<Person> stream = template.stream(query, Person.class); assertThat(stream.collect(Collectors.toList())).hasSize(1).contains(person); } @Test // DATACASS-182 public void updateShouldRemoveFields() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); person.setFirstname(null); template.update(person); Person loaded = template.selectOneById(person.getId(), Person.class); assertThat(loaded.getFirstname()).isNull(); assertThat(loaded.getId()).isEqualTo("heisenberg"); } @Test // DATACASS-182, DATACASS-420 public void insertShouldNotRemoveFields() { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person); person.setFirstname(null); template.insert(person); Person loaded = template.selectOneById(person.getId(), Person.class); assertThat(loaded.getFirstname()).isEqualTo("Walter"); assertThat(loaded.getId()).isEqualTo("heisenberg"); } @Test // DATACASS-182 public void insertAndUpdateToEmptyCollection() { BookReference bookReference = new BookReference(); bookReference.setIsbn("isbn"); bookReference.setBookmarks(Arrays.asList(1, 2, 3, 4)); template.insert(bookReference); bookReference.setBookmarks(Collections.emptyList()); template.update(bookReference); BookReference loaded = template.selectOneById(bookReference.getIsbn(), BookReference.class); assertThat(loaded.getTitle()).isNull(); assertThat(loaded.getBookmarks()).isNull(); } @Test // DATACASS-206 public void shouldUseSpecifiedColumnNamesForSingleEntityModifyingOperations() { UserToken userToken = new UserToken(); userToken.setToken(UUIDs.startOf(System.currentTimeMillis())); userToken.setUserId(UUIDs.endOf(System.currentTimeMillis())); template.insert(userToken); userToken.setUserComment("comment"); template.update(userToken); UserToken loaded = template.selectOneById( BasicMapId.id("userId", userToken.getUserId()).with("token", userToken.getToken()), UserToken.class); assertThat(loaded.getUserComment()).isEqualTo("comment"); template.delete(userToken); UserToken loadAfterDelete = template.selectOneById( BasicMapId.id("userId", userToken.getUserId()).with("token", userToken.getToken()), UserToken.class); assertThat(loadAfterDelete).isNull(); } }