/*
* Copyright (C) 2012-2015 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.driver.mapping;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.CCMTestsSupport;
import com.datastax.driver.core.utils.CassandraVersion;
import com.datastax.driver.mapping.Mapper.Option;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.assertThat;
@SuppressWarnings("unused")
public class MapperSaveNullFieldsTest extends CCMTestsSupport {
Mapper<User> mapper;
@Override
public void onTestContextInitialized() {
execute("CREATE TABLE user (login text primary key, name text, phone text)");
}
@BeforeMethod(groups = "short")
public void setup() {
mapper = new MappingManager(session()).mapper(User.class);
}
@CassandraVersion("2.1.0")
@Test(groups = "short")
void should_save_null_fields_if_requested() {
should_save_null_fields(true, Option.saveNullFields(true));
mapper.setDefaultSaveOptions(Option.saveNullFields(true));
should_save_null_fields(true);
}
@Test(groups = "short")
void should_save_null_fields_by_default() {
should_save_null_fields(true);
}
@Test(groups = "short")
void should_ignore_null_fields_if_requested() {
should_save_null_fields(false, Option.saveNullFields(false));
mapper.setDefaultSaveOptions(Option.saveNullFields(false));
should_save_null_fields(false);
}
private void should_save_null_fields(boolean saveExpected, Option... options) {
// Try different combinations of null fields
should_save_null_fields(true, true, saveExpected, options);
should_save_null_fields(true, false, saveExpected, options);
should_save_null_fields(false, true, saveExpected, options);
should_save_null_fields(false, false, saveExpected, options);
}
private void should_save_null_fields(boolean nullName, boolean nullPhone, boolean saveExpected, Option... options) {
// Start with clean data
session().execute("insert into user(login, name, phone) "
+ "values ('test_login', 'previous_name', 'previous_phone')");
String newName = nullName ? null : "new_name";
String newPhone = nullPhone ? null : "new_phone";
String description = String.format("update with name=%s, phone = %s", newName, newPhone);
User newUser = new User("test_login", newName, newPhone);
// Check if null fields are included in generated statement:
BoundStatement bs = (BoundStatement) mapper.saveQuery(newUser, options);
String queryString = bs.preparedStatement().getQueryString();
if (nullName && !saveExpected)
assertThat(queryString).as(description).doesNotContain("name");
else
assertThat(queryString).as(description).contains("name");
if (nullPhone && !saveExpected)
assertThat(queryString).as(description).doesNotContain("phone");
else
assertThat(queryString).as(description).contains("phone");
// Save entity and check the data
mapper.save(newUser, options);
User savedUser = mapper.get("test_login");
String expectedName = nullName
? (saveExpected ? null : "previous_name")
: "new_name";
String expectedPhone = nullPhone
? (saveExpected ? null : "previous_phone")
: "new_phone";
assertThat(savedUser.getName()).as(description).isEqualTo(expectedName);
assertThat(savedUser.getPhone()).as(description).isEqualTo(expectedPhone);
}
@Table(name = "user")
public static class User {
@PartitionKey
private String login;
private String name;
private String phone;
public User() {
}
public User(String login, String name, String phone) {
this.login = login;
this.name = name;
this.phone = phone;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
}