package io.ebeaninternal.server.querydefn; import io.ebean.BaseTestCase; import io.ebeaninternal.server.deploy.BeanDescriptor; import org.tests.model.basic.Order; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.*; public class OrmQueryDetailTest extends BaseTestCase { OrmQueryDetail parse(String query) { return new OrmQueryDetailParser(query).parse(); } @Test public void isEmpty_when_empty() { OrmQueryDetail detail = new OrmQueryDetail(); assertThat(detail.isEmpty()).isTrue(); } @Test public void isEmpty_when_hasFetch_expect_false() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("customer", null, null); assertThat(detail.isEmpty()).isFalse(); } @Test public void isEmpty_when_hasSelect_expect_false() { OrmQueryDetail detail = new OrmQueryDetail(); detail.select("name"); assertThat(detail.isEmpty()).isFalse(); } @Test public void isAutoTuneEqual_when_fetchOrderIsDifferent_then_stillEqual() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name) fetch details (code)"); OrmQueryDetail detail2 = parse("select (id,name) fetch details (code) fetch customer (name)"); assertTrue(detail1.isAutoTuneEqual(detail2)); } @Test public void isAutoTuneEqual_when_different_select() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name) fetch details (code)"); OrmQueryDetail detail2 = parse("select (id) fetch details (code) fetch customer (name)"); assertFalse(detail1.isAutoTuneEqual(detail2)); } @Test public void isAutoTuneEqual_when_different_selectInFetch() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name) fetch details (code)"); OrmQueryDetail detail2 = parse("select (id,name) fetch customer (id,name) fetch details (code)"); assertFalse(detail1.isAutoTuneEqual(detail2)); } @Test public void isAutoTuneEqual_when_different_additionalFetch() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name) fetch details (code)"); OrmQueryDetail detail2 = parse("select (id,name) fetch customer (name) fetch details (code) fetch customer.contacts"); assertFalse(detail1.isAutoTuneEqual(detail2)); } @Test public void isAutoTuneEqual_when_different_removedFetch() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name) fetch details (code) fetch customer.contacts"); OrmQueryDetail detail2 = parse("select (id,name) fetch customer (name) fetch details (code)"); assertFalse(detail1.isAutoTuneEqual(detail2)); assertFalse(detail2.isAutoTuneEqual(detail1)); } @Test public void isAutoTuneEqual_when_different_removedFetchProperty() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name)"); OrmQueryDetail detail2 = parse("select (id,name) fetch customer "); assertFalse(detail1.isAutoTuneEqual(detail2)); assertFalse(detail2.isAutoTuneEqual(detail1)); } @Test public void isAutoTuneEqual_when_different_path() { OrmQueryDetail detail1 = parse("select (id,name) fetch customer (name)"); OrmQueryDetail detail2 = parse("select (id,name) fetch details (id) "); assertFalse(detail1.isAutoTuneEqual(detail2)); assertFalse(detail2.isAutoTuneEqual(detail1)); } @Test public void select_whenMultiple() throws Exception { OrmQueryDetail other = new OrmQueryDetail(); other.select("id,name"); OrmQueryProperties root = other.getChunk(null, false); assertNull(root.getPath()); assertThat(root.getIncluded()).containsExactly("id", "name"); } @Test public void select_whenOne() throws Exception { OrmQueryDetail other = new OrmQueryDetail(); other.select("name"); OrmQueryProperties root = other.getChunk(null, false); assertNull(root.getPath()); assertThat(root.getIncluded()).containsExactly("name"); } @Test public void getFetchPaths_when_noFetches_then_expect_empty() { assertThat(new OrmQueryDetail().getFetchPaths()).isEmpty(); OrmQueryDetail detail = new OrmQueryDetail(); detail.select("foo"); assertThat(detail.getFetchPaths()).isEmpty(); } @Test public void getFetchPaths_when_oneFetch() { OrmQueryDetail detail = new OrmQueryDetail(); detail.select("foo"); detail.fetch("customer", null, null); assertThat(detail.getFetchPaths()).containsExactly("customer"); } @Test public void getFetchPaths_when_multipleFetch_expect_preserveOrder() { OrmQueryDetail detail = new OrmQueryDetail(); detail.select("foo"); detail.fetch("customer", null, null); detail.fetch("details", null, null); assertThat(detail.getFetchPaths()).containsExactly("customer", "details"); } @Test public void getFetchPaths_when_multipleFetch_expect_preserveOrder_v2() { OrmQueryDetail detail = new OrmQueryDetail(); detail.select("foo"); detail.fetch("details", null, null); detail.fetch("customer", null, null); detail.fetch("details.product", null, null); assertThat(detail.getFetchPaths()).containsExactly("details", "customer", "details.product"); } @Test public void markQueryJoins_when_allowOne_expect_stillFetchJoin() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("details", null, null); detail.markQueryJoins(orderDesc(), null, true, true); assertThat(detail.getChunk("details", false).isQueryFetch()).isFalse(); } @Test public void markQueryJoins_when_allowNone_expect_queryJoin() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("details", null, null); detail.markQueryJoins(orderDesc(), null, false, true); assertThat(detail.getChunk("details", false).isQueryFetch()).isTrue(); } @Test public void markQueryJoins_when_allowOneButSecond_expect_queryJoin() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("details", null, null); detail.fetch("customer.contacts", null, null); detail.markQueryJoins(orderDesc(), null, true, true); assertThat(detail.getChunk("details", false).isQueryFetch()).isFalse(); assertThat(detail.getChunk("customer.contacts", false).isQueryFetch()).isTrue(); } @Test public void markQueryJoins_when_allowNone_expect_bothQueryJoin() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("details", null, null); detail.fetch("customer.contacts", null, null); detail.markQueryJoins(orderDesc(), null, false, true); assertThat(detail.getChunk("details", false).isQueryFetch()).isTrue(); assertThat(detail.getChunk("customer.contacts", false).isQueryFetch()).isTrue(); } @Test public void sortFetchPaths_when_missingParent_expect_addsMissing() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("customer.contacts", null, null); detail.sortFetchPaths(orderDesc()); assertThat(detail.getFetchPaths()).containsExactly("customer", "customer.contacts"); assertThat(detail.getChunk("customer", false).getIncluded()).containsExactly("id"); } @Test public void sortFetchPaths_when_outOfOrder_expect_correctOrder() { OrmQueryDetail detail = new OrmQueryDetail(); detail.fetch("customer.contacts", "email", null); detail.fetch("customer", "name", null); detail.sortFetchPaths(orderDesc()); assertThat(detail.getFetchPaths()).containsExactly("customer", "customer.contacts"); assertThat(detail.getChunk("customer", false).getIncluded()).containsExactly("name"); } @Test public void sortFetchPaths_when_empty_expect_stillEmpty() { OrmQueryDetail detail = new OrmQueryDetail(); detail.sortFetchPaths(orderDesc()); assertThat(detail.getFetchPaths()).isEmpty(); } BeanDescriptor<Order> orderDesc() { return getBeanDescriptor(Order.class); } }