From 39a4035f3bc3268172ddf656cb25124e62a8adfb Mon Sep 17 00:00:00 2001 From: Michal Wysocki Date: Tue, 2 Nov 2021 13:25:42 +0100 Subject: [PATCH] Extra assertions for DBArray in `asDTO` and `sqlUpdate` --- .../tests/model/array/TestDbArray_basic.java | 124 +++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java index 69328ce15..4afc1d098 100644 --- a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java +++ b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java @@ -1,9 +1,6 @@ package org.tests.model.array; -import io.ebean.BaseTestCase; -import io.ebean.DB; -import io.ebean.Query; -import io.ebean.SqlRow; +import io.ebean.*; import io.ebean.annotation.ForPlatform; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; @@ -272,4 +269,123 @@ public class TestDbArray_basic extends BaseTestCase { assertThat(found.getUids()).hasSameElementsAs(uids); assertThat(found.getStatuses()).hasSameElementsAs(statuses); } + + @Test + @ForPlatform(Platform.POSTGRES) + public void asDto_withArray() { + DB.find(EArrayBean.class).delete(); + bean.setName("array in dto test"); + + List phNumbers = bean.getPhoneNumbers(); + phNumbers.add("4321"); + phNumbers.add("9823"); + List doubs = bean.getDoubs(); + doubs.add(1.23); + doubs.add(4.56); + DB.save(bean); + // Data is saved correctly + + LoggedSql.start(); + DtoQuery query = DB.find(EArrayBean.class) + // Interestingly writing `select("id,name,phone_numbers,doubs")` + // generates `select t0.id, t0.name, t0.id, t0.doubs` + // surprisingly changing unknown property to id + .select("id,name,phoneNumbers,doubs") + .asDto(EArrayBeanDto.class) + // Shouldn't be necessary + // But without it I see error + // Unable to map DB column phone_numbers to a property with a setter method on class org.tests.model.array.TestDbArray_basic$EArrayBeanDto + .setRelaxedMode(); + + List dtos = query.findList(); + + List sql = LoggedSql.stop(); + assertSql(sql.get(0)).contains("select t0.id, t0.name, t0.phone_numbers, t0.doubs"); + + for (EArrayBeanDto dto : dtos) { + assertThat(dto.id).isNotNull(); + assertThat(dto.name).isNotNull(); + // Failure: null + assertThat(dto.phoneNumbers).isNotNull(); + // Failure: null + assertThat(dto.doubs).isNotNull(); + } + } + + @Test + @ForPlatform(Platform.POSTGRES) + public void sqlUpdate_withArray() { + DB.find(EArrayBean.class).delete(); + bean.setName("array in sql update test"); + DB.save(bean); + // Data is saved correctly + List phNumbers = new ArrayList<>(); + phNumbers.add("4321"); + phNumbers.add("9823"); + + LoggedSql.start(); + + // Positional param works + SqlUpdate update1 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = ?") + .setParameter(1, phNumbers); + update1.execute(); + System.out.println("done"); + + // Named param fails with + // javax.persistence.PersistenceException: + // ERROR: syntax error at or near "$2" + SqlUpdate update2 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = :pns") + .setParameter("pns", phNumbers); + update2.execute(); + + found = DB.find(EArrayBean.class, bean.getId()); + System.out.println(found); + assertEquals("array in sql update test", found.getName()); + assertThat(found.getPhoneNumbers()).containsExactly("4321", "9823"); + } + + public static class EArrayBeanDto { + + Integer id; + List phoneNumbers; + List doubs; + String name; + + @Override + public String toString() { + return "id:" + id + " name:" + name + " phoneNumbers:" + phoneNumbers + " doubs:" + doubs; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + + public List getDoubs() { + return doubs; + } + + public void setDoubs(List doubs) { + this.doubs = doubs; + } + } }