package jnpf.onlinedev.util; import org.junit.jupiter.api.Test; import org.mybatis.dynamic.sql.SqlBuilder; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.render.RenderingStrategies; import java.util.function.Predicate; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class WorkflowListSortUtilsTest { @Test public void mapsAscendingStateAliasToPhysicalColumn() { assertOrder("flowState", true, "f_flow_state", field -> true, "records.f_flow_state"); } @Test public void descendingStateHasNoLeadingAscendingState() { assertOrder("-flowState", true, "f_flow_state", field -> true, "records.f_flow_state DESC"); } @Test public void acceptsPhysicalStateFieldFromDefaultSortConfiguration() { assertOrder("-f_flow_state", true, "f_flow_state", field -> true, "records.f_flow_state DESC"); } @Test public void preservesRequestedMultiColumnPriority() { assertOrder("title,-flowState", true, "f_flow_state", field -> true, "records.title, records.f_flow_state DESC"); } @Test public void retainsDefaultStatePriorityWhenOnlyBusinessFieldsAreSorted() { assertOrder("-title", true, "f_flow_state", field -> true, "records.f_flow_state, records.title DESC"); } @Test public void restoresStateAndPrimaryKeyOrderWhenSortingIsCleared() { assertOrder("", true, "f_flow_state", field -> true, "records.f_flow_state, records.f_id DESC"); } @Test public void usesDatabaseSpecificUppercaseColumnForOracleAndDm() { assertOrder("-flowState", true, "F_FLOW_STATE", field -> true, "records.F_FLOW_STATE DESC"); } @Test public void allowsSystemStateEvenWhenDisplayOnlyFieldsAreFiltered() { assertOrder("virtual,-flowState,child-name", true, "f_flow_state", field -> false, "records.f_flow_state DESC"); } @Test public void leavesNonWorkflowListsUnchanged() { assertOrder("-title", false, "f_flow_state", field -> true, "records.title DESC"); assertOrder(null, false, "f_flow_state", field -> true, "records.f_id DESC"); assertOrder("flowState", false, "f_flow_state", field -> true, "records.flowState"); } private void assertOrder(String sidx, boolean enableFlow, String stateField, Predicate allowed, String expected) { SqlTable table = SqlTable.of("records"); String sql = SqlBuilder.select(table.column("f_id"), table.column(stateField).as("flowState")) .from(table) .orderBy(WorkflowListSortUtils.orderBy("records", stateField, "f_id", enableFlow, sidx, allowed)) .build().render(RenderingStrategies.MYBATIS3).getSelectStatement(); assertTrue(sql.contains(" order by "), sql); assertEquals(expected, sql.substring(sql.indexOf(" order by ") + " order by ".length())); } }