/* * 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 java.util.concurrent.Future; import org.junit.Before; import org.junit.Test; import org.springframework.cassandra.core.AsyncCqlTemplate; import org.springframework.cassandra.test.integration.AbstractKeyspaceCreatingIntegrationTest; 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.test.integration.support.SchemaTestUtils; import org.springframework.data.domain.Sort; import org.springframework.util.concurrent.ListenableFuture; import com.datastax.driver.core.utils.UUIDs; /** * Integration tests for {@link AsyncCassandraTemplate}. * * @author Mark Paluch */ public class AsyncCassandraTemplateIntegrationTests extends AbstractKeyspaceCreatingIntegrationTest { private AsyncCassandraTemplate template; @Before public void setUp() throws Exception { MappingCassandraConverter converter = new MappingCassandraConverter(); CassandraTemplate cassandraTemplate = new CassandraTemplate(session, converter); template = new AsyncCassandraTemplate(new AsyncCqlTemplate(session), converter); SchemaTestUtils.potentiallyCreateTableFor(Person.class, cassandraTemplate); SchemaTestUtils.potentiallyCreateTableFor(UserToken.class, cassandraTemplate); SchemaTestUtils.truncate(Person.class, cassandraTemplate); SchemaTestUtils.truncate(UserToken.class, cassandraTemplate); } @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"); getUninterruptibly(template.insert(token1)); getUninterruptibly(template.insert(token2)); Query query = Query.query(Criteria.where("userId").is(token1.getUserId())).sort(Sort.by("token")); assertThat(getUninterruptibly(template.select(query, UserToken.class))).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"); getUninterruptibly(template.insert(token1)); Query query = Query.query(Criteria.where("userId").is(token1.getUserId())); assertThat(getUninterruptibly(template.selectOne(query, UserToken.class))).isEqualTo(token1); } @Test // DATACASS-292 public void insertShouldInsertEntity() { Person person = new Person("heisenberg", "Walter", "White"); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isNull(); ListenableFuture<Person> insert = template.insert(person); assertThat(getUninterruptibly(insert)).isEqualTo(person); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isEqualTo(person); } @Test // DATACASS-292 public void shouldInsertAndCountEntities() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); getUninterruptibly(template.insert(person)); ListenableFuture<Long> count = template.count(Person.class); assertThat(getUninterruptibly(count)).isEqualTo(1L); } @Test // DATACASS-292 public void updateShouldUpdateEntity() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); getUninterruptibly(template.insert(person)); person.setFirstname("Walter Hartwell"); Person updated = getUninterruptibly(template.update(person)); assertThat(updated).isNotNull(); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isEqualTo(person); } @Test // DATACASS-343 public void updateShouldUpdateEntityByQuery() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person).get(); Query query = Query.query(Criteria.where("id").is("heisenberg")); boolean result = getUninterruptibly( template.update(query, Update.empty().set("firstname", "Walter Hartwell"), Person.class)); assertThat(result).isTrue(); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class)).getFirstname()) .isEqualTo("Walter Hartwell"); } @Test // DATACASS-343 public void deleteByQueryShouldRemoveEntity() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person).get(); Query query = Query.query(Criteria.where("id").is("heisenberg")); assertThat(getUninterruptibly(template.delete(query, Person.class))).isTrue(); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isNull(); } @Test // DATACASS-343 public void deleteColumnsByQueryShouldRemoveColumn() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); template.insert(person).get(); Query query = Query.query(Criteria.where("id").is("heisenberg")).columns(Columns.from("lastname")); assertThat(getUninterruptibly(template.delete(query, Person.class))).isTrue(); Person loaded = getUninterruptibly(template.selectOneById(person.getId(), Person.class)); assertThat(loaded.getFirstname()).isEqualTo("Walter"); assertThat(loaded.getLastname()).isNull(); } @Test // DATACASS-292 public void deleteShouldRemoveEntity() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); getUninterruptibly(template.insert(person)); Person deleted = getUninterruptibly(template.delete(person)); assertThat(deleted).isNotNull(); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isNull(); } @Test // DATACASS-292 public void deleteByIdShouldRemoveEntity() throws Exception { Person person = new Person("heisenberg", "Walter", "White"); getUninterruptibly(template.insert(person)); Boolean deleted = getUninterruptibly(template.deleteById(person.getId(), Person.class)); assertThat(deleted).isTrue(); assertThat(getUninterruptibly(template.selectOneById(person.getId(), Person.class))).isNull(); } private static <T> T getUninterruptibly(Future<T> future) { try { return future.get(); } catch (Exception e) { throw new IllegalStateException(e); } } }