blob: 32f71041b19936d9c08f90129142b2556827116f [file]
/*
* Copyright DataStax, Inc.
*
* 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 com.datastax.oss.driver.mapper;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.config.DefaultDriverOption;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
import com.datastax.oss.driver.api.mapper.MapperException;
import com.datastax.oss.driver.api.mapper.annotations.Dao;
import com.datastax.oss.driver.api.mapper.annotations.DaoFactory;
import com.datastax.oss.driver.api.mapper.annotations.DaoKeyspace;
import com.datastax.oss.driver.api.mapper.annotations.DefaultNullSavingStrategy;
import com.datastax.oss.driver.api.mapper.annotations.Entity;
import com.datastax.oss.driver.api.mapper.annotations.Mapper;
import com.datastax.oss.driver.api.mapper.annotations.PartitionKey;
import com.datastax.oss.driver.api.mapper.annotations.Select;
import com.datastax.oss.driver.api.mapper.annotations.Update;
import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
import com.datastax.oss.driver.categories.ParallelizableTests;
import java.util.Objects;
import java.util.UUID;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
@Category(ParallelizableTests.class)
public class NullSavingStrategyIT {
private static final CcmRule CCM_RULE = CcmRule.getInstance();
private static final SessionRule<CqlSession> SESSION_RULE =
SessionRule.builder(CCM_RULE)
.withConfigLoader(
DriverConfigLoader.programmaticBuilder()
.withString(DefaultDriverOption.PROTOCOL_VERSION, "V3")
.build())
.build();
@ClassRule
public static final TestRule CHAIN = RuleChain.outerRule(CCM_RULE).around(SESSION_RULE);
private static InventoryMapper mapper;
@BeforeClass
public static void setup() {
CqlSession session = SESSION_RULE.session();
session.execute(
SimpleStatement.builder(
"CREATE TABLE product_simple(id uuid PRIMARY KEY, description text)")
.setExecutionProfile(SESSION_RULE.slowProfile())
.build());
mapper = new NullSavingStrategyIT_InventoryMapperBuilder(session).build();
}
@Test
public void should_throw_when_try_to_construct_dao_with_DO_NOT_SET_strategy_for_V3_protocol() {
assertThatThrownBy(() -> mapper.productDao(SESSION_RULE.keyspace()))
.isInstanceOf(MapperException.class)
.hasMessage("You cannot use NullSavingStrategy.DO_NOT_SET for protocol version V3.");
}
@Test
public void
should_throw_when_try_to_construct_dao_with_DO_NOT_SET_implicit_strategy_for_V3_protocol() {
assertThatThrownBy(() -> mapper.productDaoImplicit(SESSION_RULE.keyspace()))
.isInstanceOf(MapperException.class)
.hasMessage("You cannot use NullSavingStrategy.DO_NOT_SET for protocol version V3.");
}
@Test
public void
should_throw_when_try_to_construct_dao_with_DO_NOT_SET_strategy_set_globally_for_V3_protocol() {
assertThatThrownBy(() -> mapper.productDaoDefault(SESSION_RULE.keyspace()))
.isInstanceOf(MapperException.class)
.hasMessage("You cannot use NullSavingStrategy.DO_NOT_SET for protocol version V3.");
}
@Test
public void should_do_not_throw_when_construct_dao_with_global_level_SET_TO_NULL() {
assertThatCode(() -> mapper.productDaoGlobalLevelSetToNull(SESSION_RULE.keyspace()))
.doesNotThrowAnyException();
}
@Test
public void should_do_not_throw_when_construct_dao_with_parent_interface_SET_TO_NULL() {
assertThatCode(() -> mapper.productDaoSetToNullFromParentInterface(SESSION_RULE.keyspace()))
.doesNotThrowAnyException();
}
@Test
public void
should_do_not_throw_when_construct_dao_with_global_level_DO_NOT_SET_and_local_override_to_SET_TO_NULL() {
assertThatCode(() -> mapper.productDaoLocalOverride(SESSION_RULE.keyspace()))
.doesNotThrowAnyException();
}
@Mapper
public interface InventoryMapper {
@DaoFactory
ProductSimpleDao productDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoDefault productDaoDefault(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoImplicit productDaoImplicit(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoGlobalLevelSetToNull productDaoGlobalLevelSetToNull(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoSetToNullFromParentInterface productDaoSetToNullFromParentInterface(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoGlobalLevelDoNotSetOverrideSetToNull productDaoLocalOverride(
@DaoKeyspace CqlIdentifier keyspace);
}
@DefaultNullSavingStrategy(NullSavingStrategy.SET_TO_NULL)
public interface SetToNull {}
@Dao
public interface ProductSimpleDao {
@Update(nullSavingStrategy = NullSavingStrategy.DO_NOT_SET)
void update(ProductSimple product);
@Select
ProductSimple findById(UUID productId);
}
@Dao
public interface ProductSimpleDaoImplicit {
@Update
void update(ProductSimple product);
@Select
ProductSimple findById(UUID productId);
}
@Dao
@DefaultNullSavingStrategy(NullSavingStrategy.DO_NOT_SET)
public interface ProductSimpleDaoDefault extends SetToNull {
@Update
void update(ProductSimple product);
@Select
ProductSimple findById(UUID productId);
}
@Dao
@DefaultNullSavingStrategy(NullSavingStrategy.SET_TO_NULL)
public interface ProductSimpleDaoGlobalLevelSetToNull {
@Update
void update(ProductSimple product);
@Select
ProductSimple findById(UUID productId);
}
@Dao
public interface ProductSimpleDaoSetToNullFromParentInterface
extends ProductSimpleDaoImplicit, SetToNull {}
@Dao
@DefaultNullSavingStrategy(NullSavingStrategy.DO_NOT_SET)
public interface ProductSimpleDaoGlobalLevelDoNotSetOverrideSetToNull {
@Update(nullSavingStrategy = NullSavingStrategy.SET_TO_NULL)
void update(ProductSimple product);
@Select
ProductSimple findById(UUID productId);
}
@Entity
public static class ProductSimple {
@PartitionKey private UUID id;
private String description;
public ProductSimple() {}
public ProductSimple(UUID id, String description) {
this.id = id;
this.description = description;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (other instanceof ProductSimple) {
ProductSimple that = (ProductSimple) other;
return Objects.equals(this.id, that.id)
&& Objects.equals(this.description, that.description);
} else {
return false;
}
}
@Override
public int hashCode() {
return Objects.hash(id, description);
}
@Override
public String toString() {
return "ProductSimple{" + "id=" + id + ", description='" + description + '\'' + '}';
}
}
}