#2174 - Entity beans with @Cache + @DbArray of enums (or UUID or Integer) not converted to enums (come back as String) (#2175)

This commit is contained in:
Rob Bygrave
2021-02-19 22:42:48 +13:00
committed by GitHub
parent 99d7a4e4b4
commit 6aa4337b27
10 changed files with 327 additions and 47 deletions
@@ -1,13 +1,18 @@
package io.ebeaninternal.server.type;
import com.fasterxml.jackson.core.JsonParser;
import io.ebean.DB;
import io.ebean.core.type.DataReader;
import io.ebean.core.type.ScalarType;
import io.ebean.text.json.EJson;
import org.junit.Test;
import org.mockito.Mockito;
import java.io.IOException;
import java.io.StringReader;
import java.sql.SQLException;
import java.util.UUID;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
@@ -63,4 +68,82 @@ public class ScalarTypeArrayListTest extends BasePlatformArrayTypeFactoryTest {
assertBindNullTo_Null(factory.typeFor(UUID.class, true));
}
@Test
@SuppressWarnings("unchecked")
public void parse_withUuidType_expect_uuidTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(UUID.class, true);
List<UUID> input = new ArrayList<>();
input.add(UUID.randomUUID());
input.add(UUID.randomUUID());
String formatToJson = scalarType.format(input);
Object parsed = scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
@SuppressWarnings("unchecked")
public void parse_withIntegerType_expect_longIntegerReturned() {
ScalarType<?> scalarType = factory.typeFor(Integer.class, true);
List<Integer> input = new ArrayList<>();
input.add(2);
input.add(4);
String formatToJson = scalarType.format(input);
Object parsed = scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
@SuppressWarnings("unchecked")
public void parse_withLongType_expect_longTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(Long.class, true);
List<Long> input = new ArrayList<>();
input.add(2L);
input.add(4L);
String formatToJson = scalarType.format(input);
Object parsed = scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
public void parse_withDoubleType_expect_longTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(Double.class, true);
List<Double> input = new ArrayList<>();
input.add(2D);
input.add(4D);
String formatToJson = scalarType.format(input);
Object parsed = scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
public void jsonRead_withUuidType() throws IOException {
ScalarType<?> scalarType = factory.typeFor(UUID.class, true);
List<UUID> input = new ArrayList<>();
input.add(UUID.randomUUID());
input.add(UUID.randomUUID());
String asJson = EJson.write(input);
JsonParser parser = DB.json().createParser(new StringReader(asJson));
Object parsed = scalarType.jsonRead(parser);
assertThat(parsed).isEqualTo(input);
}
}
@@ -1,8 +1,16 @@
package io.ebeaninternal.server.type;
import com.fasterxml.jackson.core.JsonParser;
import io.ebean.DB;
import io.ebean.core.type.ScalarType;
import io.ebean.text.json.EJson;
import org.junit.Test;
import java.io.IOException;
import java.io.StringReader;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
@@ -49,4 +57,82 @@ public class ScalarTypeArraySetH2Test extends BasePlatformArrayTypeFactoryTest {
assertBindNullTo_Null(factory.typeFor(UUID.class, true));
}
@Test
@SuppressWarnings("unchecked")
public void parse_withUuidType_expect_uuidTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(UUID.class, true);
Set<UUID> input = new LinkedHashSet<>();
input.add(UUID.randomUUID());
input.add(UUID.randomUUID());
String formatToJson = scalarType.format(input);
Set<UUID> parsed = (Set<UUID>)scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
@SuppressWarnings("unchecked")
public void parse_withIntegerType_expect_longIntegerReturned() {
ScalarType<?> scalarType = factory.typeFor(Integer.class, true);
Set<Integer> input = new LinkedHashSet<>();
input.add(2);
input.add(4);
String formatToJson = scalarType.format(input);
Set<Integer> parsed = (Set<Integer>)scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
@SuppressWarnings("unchecked")
public void parse_withLongType_expect_longTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(Long.class, true);
Set<Long> input = new LinkedHashSet<>();
input.add(2L);
input.add(4L);
String formatToJson = scalarType.format(input);
Set<Long> parsed = (Set<Long>)scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
public void parse_withDoubleType_expect_longTypeReturned() {
ScalarType<?> scalarType = factory.typeFor(Double.class, true);
Set<Double> input = new LinkedHashSet<>();
input.add(2D);
input.add(4D);
String formatToJson = scalarType.format(input);
Object parsed = scalarType.parse(formatToJson);
assertThat(parsed).isEqualTo(input);
}
@Test
public void jsonRead_withUuidType() throws IOException {
ScalarType<?> scalarType = factory.typeFor(UUID.class, true);
Set<UUID> input = new LinkedHashSet<>();
input.add(UUID.randomUUID());
input.add(UUID.randomUUID());
String asJson = EJson.write(input);
JsonParser parser = DB.json().createParser(new StringReader(asJson));
Object parsed = scalarType.jsonRead(parser);
assertThat(parsed).isEqualTo(input);
}
}
@@ -1,6 +1,7 @@
package org.tests.model.array;
import io.ebean.annotation.Cache;
import io.ebean.annotation.DbArray;
import io.ebean.annotation.NotNull;
@@ -13,6 +14,7 @@ import java.util.Set;
import java.util.UUID;
@Entity
@Cache
public class EArrayBean {
enum Status {
@@ -1,6 +1,7 @@
package org.tests.model.array;
import io.ebean.annotation.Cache;
import io.ebean.annotation.DbArray;
import javax.persistence.Entity;
@@ -11,6 +12,7 @@ import java.util.Set;
import java.util.UUID;
@Entity
@Cache
public class EArraySetBean {
@Id
@@ -30,6 +32,9 @@ public class EArraySetBean {
@DbArray
Set<Double> doubs;
@DbArray
Set<EArrayBean.Status> status;
@Version
Long version;
@@ -81,6 +86,14 @@ public class EArraySetBean {
this.doubs = doubs;
}
public Set<EArrayBean.Status> getStatus() {
return status;
}
public void setStatus(Set<EArrayBean.Status> status) {
this.status = status;
}
public Long getVersion() {
return version;
}
@@ -46,6 +46,11 @@ public class TestDbArray_asSet extends BaseTestCase {
bean.getOtherIds().add(97L);
bean.setDoubs(doubles);
Set<EArrayBean.Status> status = new LinkedHashSet<>();
status.add(EArrayBean.Status.ONE);
status.add(EArrayBean.Status.TWO);
bean.setStatus(status);
Ebean.save(bean);
found = Ebean.find(EArraySetBean.class, bean.getId());
@@ -154,4 +159,31 @@ public class TestDbArray_asSet extends BaseTestCase {
Ebean.saveAll(all);
Ebean.deleteAll(all);
}
@Test
@IgnorePlatform(Platform.HANA)
public void hitCache() {
Set<UUID> uids = new LinkedHashSet<>();
uids.add(UUID.randomUUID());
uids.add(UUID.randomUUID());
Set<EArrayBean.Status> statuses = new LinkedHashSet<>();
statuses.add(EArrayBean.Status.ONE);
statuses.add(EArrayBean.Status.THREE);
EArraySetBean bean = new EArraySetBean();
bean.setName("hitCache");
bean.setUids(uids);
bean.setStatus(statuses);
Ebean.save(bean);
// load cache
Ebean.find(EArraySetBean.class, bean.getId());
// hit cache
EArraySetBean found = Ebean.find(EArraySetBean.class, bean.getId());
assertThat(found.getUids()).isEqualTo(uids);
assertThat(found.getStatus()).isEqualTo(statuses);
}
}
@@ -249,4 +249,31 @@ public class TestDbArray_basic extends BaseTestCase {
assertThat(found.getIntEnums()).containsExactly(null, IntEnum.ZERO, null, IntEnum.TWO);
Ebean.delete(bean);
}
@Test
@IgnorePlatform(Platform.HANA)
public void hitCache() {
List<UUID> uids = new ArrayList<>();
uids.add(UUID.randomUUID());
uids.add(UUID.randomUUID());
List<EArrayBean.Status> statuses = new ArrayList<>();
statuses.add(EArrayBean.Status.ONE);
statuses.add(EArrayBean.Status.THREE);
EArrayBean bean = new EArrayBean();
bean.setName("hitCache");
bean.setUids(uids);
bean.setStatuses(statuses);
Ebean.save(bean);
// load cache
Ebean.find(EArrayBean.class, bean.getId());
// hit cache
EArrayBean found = Ebean.find(EArrayBean.class, bean.getId());
assertThat(found.getUids()).isEqualTo(uids);
assertThat(found.getStatuses()).isEqualTo(statuses);
}
}