/*
* 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.extras.codecs.date;
import com.datastax.driver.core.*;
import com.datastax.driver.core.utils.CassandraVersion;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.google.common.collect.ImmutableMap;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
@CassandraVersion("2.2.0")
public class SimpleDateCodecsTest extends CCMTestsSupport {
@Override
public void onTestContextInitialized() {
execute(
"CREATE TABLE IF NOT EXISTS foo ("
+ "c1 text PRIMARY KEY, "
+ "cdate date, "
+ "ctimestamp timestamp, "
+ "cdates frozen<list<date>>, "
+ "ctimestamps frozen<map<text,timestamp>> "
+ ")");
}
@BeforeClass(groups = "short")
public void registerCodecs() throws Exception {
CodecRegistry codecRegistry = cluster().getConfiguration().getCodecRegistry();
codecRegistry
.register(SimpleDateCodec.instance)
.register(SimpleTimestampCodec.instance);
}
/**
* <p>
* Validates that a <code>date</code> column can be mapped to an int by using
* {@link SimpleDateCodec}.
* </p>
*
* @test_category data_types:serialization
* @expected_result properly maps.
* @since 2.2.0
*/
@Test(groups = "short")
public void should_map_date_to_days_since_epoch() {
// given
int days = 12345;
LocalDate localDate = LocalDate.fromDaysSinceEpoch(days);
// when
// note: these codecs cannot work with simple statements!
BoundStatement bs = session().prepare("insert into foo (c1, cdate) values (?, ?)").bind("should_map_date_to_days_since_epoch", days);
session().execute(bs);
ResultSet result = session().execute("select cdate from foo where c1=?", "should_map_date_to_days_since_epoch");
// then
assertThat(result.getAvailableWithoutFetching()).isEqualTo(1);
Row row = result.one();
assertThat(row.getInt("cdate")).isEqualTo(days);
assertThat(row.get("cdate", Integer.class)).isEqualTo(days);
assertThat(row.getDate("cdate")).isEqualTo(localDate);
assertThat(row.get("cdate", LocalDate.class)).isEqualTo(localDate);
}
/**
* <p>
* Validates that a <code>timestamp</code> column can be mapped to a long by using
* {@link SimpleTimestampCodec}.
* </p>
*
* @test_category data_types:serialization
* @expected_result properly maps.
* @since 2.2.0
*/
@Test(groups = "short")
public void should_map_timestamp_to_millis_since_epoch() {
// given
long millis = new Date().getTime();
Date date = new Date(millis);
// when
// note: these codecs cannot work with simple statements!
BoundStatement bs = session().prepare("insert into foo (c1, ctimestamp) values (?, ?)").bind("should_map_timestamp_to_millis_since_epoch", millis);
session().execute(bs);
ResultSet result = session().execute("select ctimestamp from foo where c1=?", "should_map_timestamp_to_millis_since_epoch");
// then
assertThat(result.getAvailableWithoutFetching()).isEqualTo(1);
Row row = result.one();
assertThat(row.getLong("ctimestamp")).isEqualTo(millis);
assertThat(row.get("ctimestamp", Long.class)).isEqualTo(millis);
assertThat(row.getTimestamp("ctimestamp")).isEqualTo(date);
assertThat(row.get("ctimestamp", Date.class)).isEqualTo(date);
}
@Test(groups = "short")
public void should_use_mapper_to_store_and_retrieve_values_with_simple_date_codecs() {
// given
MappingManager manager = new MappingManager(session());
Mapper<Mapped> mapper = manager.mapper(Mapped.class);
// when
Mapped pojo = new Mapped();
mapper.save(pojo);
Mapped actual = mapper.get("mapper");
// then
assertThat(actual).isEqualToComparingFieldByField(pojo);
}
@SuppressWarnings("unused")
@Table(name = "foo")
public static class Mapped {
@PartitionKey
private String c1;
@Column(name = "ctimestamp")
private long millis;
@Column(name = "cdate")
private int days;
@Column(name = "ctimestamps")
private Map<String, Long> mapOfMillis;
@Column(name = "cdates")
private List<Integer> listOfDays;
public Mapped() {
c1 = "mapper";
millis = 123456;
days = 123;
mapOfMillis = ImmutableMap.of("foo", 123456L);
listOfDays = newArrayList(123, 456);
}
public String getC1() {
return c1;
}
public void setC1(String c1) {
this.c1 = c1;
}
public long getMillis() {
return millis;
}
public void setMillis(long millis) {
this.millis = millis;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public Map<String, Long> getMapOfMillis() {
return mapOfMillis;
}
public void setMapOfMillis(Map<String, Long> mapOfMillis) {
this.mapOfMillis = mapOfMillis;
}
public List<Integer> getListOfDays() {
return listOfDays;
}
public void setListOfDays(List<Integer> listOfDays) {
this.listOfDays = listOfDays;
}
}
}