mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 21:20:45 +00:00
Initial passable version of possible values
This commit is contained in:
@ -47,18 +47,33 @@ class QueryActionTest
|
||||
@Test
|
||||
public void test() throws QException
|
||||
{
|
||||
QueryInput request = new QueryInput(TestUtils.defineInstance());
|
||||
request.setSession(TestUtils.getMockSession());
|
||||
request.setTableName("person");
|
||||
QueryOutput result = new QueryAction().execute(request);
|
||||
assertNotNull(result);
|
||||
QueryInput queryInput = new QueryInput(TestUtils.defineInstance());
|
||||
queryInput.setSession(TestUtils.getMockSession());
|
||||
queryInput.setTableName("person");
|
||||
QueryOutput queryOutput = new QueryAction().execute(queryInput);
|
||||
assertNotNull(queryOutput);
|
||||
|
||||
assertThat(result.getRecords()).isNotEmpty();
|
||||
for(QRecord record : result.getRecords())
|
||||
assertThat(queryOutput.getRecords()).isNotEmpty();
|
||||
for(QRecord record : queryOutput.getRecords())
|
||||
{
|
||||
assertThat(record.getValues()).isNotEmpty();
|
||||
assertThat(record.getDisplayValues()).isNotEmpty();
|
||||
assertThat(record.getErrors()).isEmpty();
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// this SHOULD be empty, based on the default for the should //
|
||||
///////////////////////////////////////////////////////////////
|
||||
assertThat(record.getDisplayValues()).isEmpty();
|
||||
}
|
||||
|
||||
////////////////////////////////////
|
||||
// now flip that field and re-run //
|
||||
////////////////////////////////////
|
||||
queryInput.setShouldGenerateDisplayValues(true);
|
||||
assertThat(queryOutput.getRecords()).isNotEmpty();
|
||||
queryOutput = new QueryAction().execute(queryInput);
|
||||
for(QRecord record : queryOutput.getRecords())
|
||||
{
|
||||
assertThat(record.getDisplayValues()).isNotEmpty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,241 @@
|
||||
/*
|
||||
* QQQ - Low-code Application Framework for Engineers.
|
||||
* Copyright (C) 2021-2022. Kingsrook, LLC
|
||||
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
|
||||
* contact@kingsrook.com
|
||||
* https://github.com/Kingsrook/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.kingsrook.qqq.backend.core.actions.values;
|
||||
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
|
||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.session.QSession;
|
||||
import com.kingsrook.qqq.backend.core.modules.backend.implementations.memory.MemoryRecordStore;
|
||||
import com.kingsrook.qqq.backend.core.utils.TestUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public class QPossibleValueTranslatorTest
|
||||
{
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueEnum()
|
||||
{
|
||||
QInstance qInstance = TestUtils.defineInstance();
|
||||
QPossibleValueTranslator possibleValueTranslator = new QPossibleValueTranslator(qInstance, new QSession());
|
||||
QFieldMetaData stateField = qInstance.getTable("person").getField("homeStateId");
|
||||
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(stateField.getPossibleValueSourceName());
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// assert the default formatting for a not-found value is a null string //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
assertNull(possibleValueTranslator.translatePossibleValue(stateField, null));
|
||||
assertNull(possibleValueTranslator.translatePossibleValue(stateField, -1));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// let the not-found value be a simple string (no formatted values) //
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
possibleValueSource.setValueFormatIfNotFound("?");
|
||||
assertEquals("?", possibleValueTranslator.translatePossibleValue(stateField, null));
|
||||
assertEquals("?", possibleValueTranslator.translatePossibleValue(stateField, -1));
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
// let the not-found value be a string w/ formatted values //
|
||||
/////////////////////////////////////////////////////////////
|
||||
possibleValueSource.setValueFormatIfNotFound("? (%s)");
|
||||
possibleValueSource.setValueFieldsIfNotFound(List.of("id"));
|
||||
assertEquals("? ()", possibleValueTranslator.translatePossibleValue(stateField, null));
|
||||
assertEquals("? (-1)", possibleValueTranslator.translatePossibleValue(stateField, -1));
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// assert the default formatting is just the label //
|
||||
/////////////////////////////////////////////////////
|
||||
assertEquals("MO", possibleValueTranslator.translatePossibleValue(stateField, 2));
|
||||
assertEquals("IL", possibleValueTranslator.translatePossibleValue(stateField, 1));
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// assert the LABEL_ONLY format (when called out specifically) //
|
||||
/////////////////////////////////////////////////////////////////
|
||||
possibleValueSource.setValueFormat(QPossibleValueSource.ValueFormat.LABEL_ONLY);
|
||||
possibleValueSource.setValueFields(QPossibleValueSource.ValueFields.LABEL_ONLY);
|
||||
assertEquals("IL", possibleValueTranslator.translatePossibleValue(stateField, 1));
|
||||
|
||||
///////////////////////////////////////
|
||||
// assert the LABEL_PARAMS_ID format //
|
||||
///////////////////////////////////////
|
||||
possibleValueSource.setValueFormat(QPossibleValueSource.ValueFormat.LABEL_PARENS_ID);
|
||||
possibleValueSource.setValueFields(QPossibleValueSource.ValueFields.LABEL_PARENS_ID);
|
||||
assertEquals("IL (1)", possibleValueTranslator.translatePossibleValue(stateField, 1));
|
||||
|
||||
//////////////////////////////////////
|
||||
// assert the ID_COLON_LABEL format //
|
||||
//////////////////////////////////////
|
||||
possibleValueSource.setValueFormat(QPossibleValueSource.ValueFormat.ID_COLON_LABEL);
|
||||
possibleValueSource.setValueFields(QPossibleValueSource.ValueFields.ID_COLON_LABEL);
|
||||
assertEquals("1: IL", possibleValueTranslator.translatePossibleValue(stateField, 1));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueTable() throws QException
|
||||
{
|
||||
QInstance qInstance = TestUtils.defineInstance();
|
||||
QPossibleValueTranslator possibleValueTranslator = new QPossibleValueTranslator(qInstance, new QSession());
|
||||
QTableMetaData shapeTable = qInstance.getTable(TestUtils.TABLE_NAME_SHAPE);
|
||||
QFieldMetaData shapeField = qInstance.getTable(TestUtils.TABLE_NAME_PERSON).getField("favoriteShapeId");
|
||||
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(shapeField.getPossibleValueSourceName());
|
||||
|
||||
List<QRecord> shapeRecords = List.of(
|
||||
new QRecord().withTableName(shapeTable.getName()).withValue("id", 1).withValue("name", "Triangle"),
|
||||
new QRecord().withTableName(shapeTable.getName()).withValue("id", 2).withValue("name", "Square"),
|
||||
new QRecord().withTableName(shapeTable.getName()).withValue("id", 3).withValue("name", "Circle"));
|
||||
|
||||
InsertInput insertInput = new InsertInput(qInstance);
|
||||
insertInput.setSession(new QSession());
|
||||
insertInput.setTableName(shapeTable.getName());
|
||||
insertInput.setRecords(shapeRecords);
|
||||
new InsertAction().execute(insertInput);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// assert the default formatting for a not-found value is a null string //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
assertNull(possibleValueTranslator.translatePossibleValue(shapeField, null));
|
||||
assertNull(possibleValueTranslator.translatePossibleValue(shapeField, -1));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// let the not-found value be a simple string (no formatted values) //
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
possibleValueSource.setValueFormatIfNotFound("?");
|
||||
assertEquals("?", possibleValueTranslator.translatePossibleValue(shapeField, null));
|
||||
assertEquals("?", possibleValueTranslator.translatePossibleValue(shapeField, -1));
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// assert the default formatting is just the label //
|
||||
/////////////////////////////////////////////////////
|
||||
assertEquals("Square", possibleValueTranslator.translatePossibleValue(shapeField, 2));
|
||||
assertEquals("Triangle", possibleValueTranslator.translatePossibleValue(shapeField, 1));
|
||||
|
||||
///////////////////////////////////////
|
||||
// assert the LABEL_PARAMS_ID format //
|
||||
///////////////////////////////////////
|
||||
possibleValueSource.setValueFormat(QPossibleValueSource.ValueFormat.LABEL_PARENS_ID);
|
||||
possibleValueSource.setValueFields(QPossibleValueSource.ValueFields.LABEL_PARENS_ID);
|
||||
assertEquals("Circle (3)", possibleValueTranslator.translatePossibleValue(shapeField, 3));
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// assert that we don't re-run queries for cached values //
|
||||
///////////////////////////////////////////////////////////
|
||||
possibleValueTranslator = new QPossibleValueTranslator(qInstance, new QSession());
|
||||
MemoryRecordStore.setCollectStatistics(true);
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 1);
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 2);
|
||||
assertEquals(2, MemoryRecordStore.getStatistics().get(MemoryRecordStore.STAT_QUERIES_RAN), "Should have ran 2 queries so far");
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 2);
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 3);
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 3);
|
||||
assertEquals(3, MemoryRecordStore.getStatistics().get(MemoryRecordStore.STAT_QUERIES_RAN), "Should have ran 3 queries in total");
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// assert that if we prime the cache, we can do just 1 query //
|
||||
///////////////////////////////////////////////////////////////
|
||||
possibleValueTranslator = new QPossibleValueTranslator(qInstance, new QSession());
|
||||
List<QRecord> personRecords = List.of(
|
||||
new QRecord().withTableName(TestUtils.TABLE_NAME_PERSON).withValue("favoriteShapeId", 1),
|
||||
new QRecord().withTableName(TestUtils.TABLE_NAME_PERSON).withValue("favoriteShapeId", 1),
|
||||
new QRecord().withTableName(TestUtils.TABLE_NAME_PERSON).withValue("favoriteShapeId", 2),
|
||||
new QRecord().withTableName(TestUtils.TABLE_NAME_PERSON).withValue("favoriteShapeId", 2),
|
||||
new QRecord().withTableName(TestUtils.TABLE_NAME_PERSON).withValue("favoriteShapeId", 3)
|
||||
);
|
||||
QTableMetaData personTable = qInstance.getTable(TestUtils.TABLE_NAME_PERSON);
|
||||
MemoryRecordStore.resetStatistics();
|
||||
possibleValueTranslator.primePvsCache(personTable, personRecords);
|
||||
assertEquals(1, MemoryRecordStore.getStatistics().get(MemoryRecordStore.STAT_QUERIES_RAN), "Should only run 1 query");
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 1);
|
||||
possibleValueTranslator.translatePossibleValue(shapeField, 2);
|
||||
assertEquals(1, MemoryRecordStore.getStatistics().get(MemoryRecordStore.STAT_QUERIES_RAN), "Should only run 1 query");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testSetDisplayValuesInRecords()
|
||||
{
|
||||
QTableMetaData table = new QTableMetaData()
|
||||
.withRecordLabelFormat("%s %s")
|
||||
.withRecordLabelFields("firstName", "lastName")
|
||||
.withField(new QFieldMetaData("firstName", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("lastName", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("price", QFieldType.DECIMAL).withDisplayFormat(DisplayFormat.CURRENCY))
|
||||
.withField(new QFieldMetaData("homeStateId", QFieldType.INTEGER).withPossibleValueSourceName(TestUtils.POSSIBLE_VALUE_SOURCE_STATE));
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// first, make sure it doesn't crash with null or empty inputs //
|
||||
/////////////////////////////////////////////////////////////////
|
||||
QPossibleValueTranslator possibleValueTranslator = new QPossibleValueTranslator(TestUtils.defineInstance(), new QSession());
|
||||
possibleValueTranslator.translatePossibleValuesInRecords(table, null);
|
||||
possibleValueTranslator.translatePossibleValuesInRecords(table, Collections.emptyList());
|
||||
|
||||
List<QRecord> records = List.of(
|
||||
new QRecord()
|
||||
.withValue("firstName", "Tim")
|
||||
.withValue("lastName", "Chamberlain")
|
||||
.withValue("price", new BigDecimal("3.50"))
|
||||
.withValue("homeStateId", 1),
|
||||
new QRecord()
|
||||
.withValue("firstName", "Tyler")
|
||||
.withValue("lastName", "Samples")
|
||||
.withValue("price", new BigDecimal("174999.99"))
|
||||
.withValue("homeStateId", 2)
|
||||
);
|
||||
|
||||
possibleValueTranslator.translatePossibleValuesInRecords(table, records);
|
||||
|
||||
assertNull(records.get(0).getRecordLabel()); // regular display stuff NOT done by PVS translator
|
||||
assertNull(records.get(0).getDisplayValue("price"));
|
||||
|
||||
assertEquals("IL", records.get(0).getDisplayValue("homeStateId"));
|
||||
assertEquals("MO", records.get(1).getDisplayValue("homeStateId"));
|
||||
}
|
||||
|
||||
}
|
@ -30,6 +30,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||
import com.kingsrook.qqq.backend.core.utils.TestUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
@ -47,24 +48,26 @@ class QValueFormatterTest
|
||||
@Test
|
||||
void testFormatValue()
|
||||
{
|
||||
assertNull(QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), null));
|
||||
QValueFormatter qValueFormatter = new QValueFormatter();
|
||||
|
||||
assertEquals("1", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), 1));
|
||||
assertEquals("1,000", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), 1000));
|
||||
assertEquals("1000", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(null), 1000));
|
||||
assertEquals("$1,000.00", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.CURRENCY), 1000));
|
||||
assertEquals("1,000.00", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.DECIMAL2_COMMAS), 1000));
|
||||
assertEquals("1000.00", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.DECIMAL2), 1000));
|
||||
assertNull(qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), null));
|
||||
|
||||
assertEquals("1", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1")));
|
||||
assertEquals("1,000", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1000")));
|
||||
assertEquals("1000", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.STRING), new BigDecimal("1000")));
|
||||
assertEquals("1000", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.STRING), 1000));
|
||||
assertEquals("1", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), 1));
|
||||
assertEquals("1,000", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), 1000));
|
||||
assertEquals("1000", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(null), 1000));
|
||||
assertEquals("$1,000.00", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.CURRENCY), 1000));
|
||||
assertEquals("1,000.00", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.DECIMAL2_COMMAS), 1000));
|
||||
assertEquals("1000.00", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.DECIMAL2), 1000));
|
||||
|
||||
assertEquals("1", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1")));
|
||||
assertEquals("1,000", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1000")));
|
||||
assertEquals("1000", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.STRING), new BigDecimal("1000")));
|
||||
assertEquals("1000", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.STRING), 1000));
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// this one flows through the exceptional cases //
|
||||
//////////////////////////////////////////////////
|
||||
assertEquals("1000.01", QValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1000.01")));
|
||||
assertEquals("1000.01", qValueFormatter.formatValue(new QFieldMetaData().withDisplayFormat(DisplayFormat.COMMAS), new BigDecimal("1000.01")));
|
||||
}
|
||||
|
||||
|
||||
@ -75,40 +78,42 @@ class QValueFormatterTest
|
||||
@Test
|
||||
void testFormatRecordLabel()
|
||||
{
|
||||
QTableMetaData table = new QTableMetaData().withRecordLabelFormat("%s %s").withRecordLabelFields(List.of("firstName", "lastName"));
|
||||
assertEquals("Darin Kelkhoff", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("lastName", "Kelkhoff")));
|
||||
assertEquals("Darin ", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin")));
|
||||
assertEquals("Darin ", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("lastName", null)));
|
||||
QValueFormatter qValueFormatter = new QValueFormatter();
|
||||
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s " + DisplayFormat.CURRENCY).withRecordLabelFields(List.of("firstName", "price"));
|
||||
assertEquals("Darin $10,000.00", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("price", new BigDecimal(10000))));
|
||||
QTableMetaData table = new QTableMetaData().withRecordLabelFormat("%s %s").withRecordLabelFields(List.of("firstName", "lastName"));
|
||||
assertEquals("Darin Kelkhoff", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("lastName", "Kelkhoff")));
|
||||
assertEquals("Darin ", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin")));
|
||||
assertEquals("Darin ", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("lastName", null)));
|
||||
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s " + DisplayFormat.CURRENCY).withRecordLabelFields("firstName", "price");
|
||||
assertEquals("Darin $10,000.00", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("firstName", "Darin").withValue("price", new BigDecimal(10000))));
|
||||
|
||||
table = new QTableMetaData().withRecordLabelFormat(DisplayFormat.DEFAULT).withRecordLabelFields(List.of("id"));
|
||||
assertEquals("123456", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", "123456")));
|
||||
assertEquals("123456", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", "123456")));
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// exceptional flow: no recordLabelFormat specified //
|
||||
///////////////////////////////////////////////////////
|
||||
table = new QTableMetaData().withPrimaryKeyField("id");
|
||||
assertEquals("42", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", 42)));
|
||||
assertEquals("42", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", 42)));
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// exceptional flow: no fields for the format //
|
||||
/////////////////////////////////////////////////
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s %s").withPrimaryKeyField("id");
|
||||
assertEquals("128", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", 128)));
|
||||
assertEquals("128", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("id", 128)));
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
// exceptional flow: not enough fields for the format //
|
||||
/////////////////////////////////////////////////////////
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s %s").withRecordLabelFields(List.of("a")).withPrimaryKeyField("id");
|
||||
assertEquals("256", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("a", 47).withValue("id", 256)));
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s %s").withRecordLabelFields("a").withPrimaryKeyField("id");
|
||||
assertEquals("256", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("a", 47).withValue("id", 256)));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// exceptional flow (kinda): too many fields for the format (just get the ones that are in the format) //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
table = new QTableMetaData().withRecordLabelFormat("%s %s").withRecordLabelFields(List.of("a", "b", "c")).withPrimaryKeyField("id");
|
||||
assertEquals("47 48", QValueFormatter.formatRecordLabel(table, new QRecord().withValue("a", 47).withValue("b", 48).withValue("c", 49).withValue("id", 256)));
|
||||
assertEquals("47 48", qValueFormatter.formatRecordLabel(table, new QRecord().withValue("a", 47).withValue("b", 48).withValue("c", 49).withValue("id", 256)));
|
||||
}
|
||||
|
||||
|
||||
@ -121,40 +126,46 @@ class QValueFormatterTest
|
||||
{
|
||||
QTableMetaData table = new QTableMetaData()
|
||||
.withRecordLabelFormat("%s %s")
|
||||
.withRecordLabelFields(List.of("firstName", "lastName"))
|
||||
.withRecordLabelFields("firstName", "lastName")
|
||||
.withField(new QFieldMetaData("firstName", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("lastName", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("price", QFieldType.DECIMAL).withDisplayFormat(DisplayFormat.CURRENCY))
|
||||
.withField(new QFieldMetaData("quantity", QFieldType.INTEGER).withDisplayFormat(DisplayFormat.COMMAS));
|
||||
.withField(new QFieldMetaData("quantity", QFieldType.INTEGER).withDisplayFormat(DisplayFormat.COMMAS))
|
||||
.withField(new QFieldMetaData("homeStateId", QFieldType.INTEGER).withPossibleValueSourceName(TestUtils.POSSIBLE_VALUE_SOURCE_STATE));
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// first, make sure it doesn't crash with null or empty inputs //
|
||||
/////////////////////////////////////////////////////////////////
|
||||
QValueFormatter.setDisplayValuesInRecords(table, null);
|
||||
QValueFormatter.setDisplayValuesInRecords(table, Collections.emptyList());
|
||||
QValueFormatter qValueFormatter = new QValueFormatter();
|
||||
qValueFormatter.setDisplayValuesInRecords(table, null);
|
||||
qValueFormatter.setDisplayValuesInRecords(table, Collections.emptyList());
|
||||
|
||||
List<QRecord> records = List.of(
|
||||
new QRecord()
|
||||
.withValue("firstName", "Tim")
|
||||
.withValue("lastName", "Chamberlain")
|
||||
.withValue("price", new BigDecimal("3.50"))
|
||||
.withValue("quantity", 1701),
|
||||
.withValue("quantity", 1701)
|
||||
.withValue("homeStateId", 1),
|
||||
new QRecord()
|
||||
.withValue("firstName", "Tyler")
|
||||
.withValue("lastName", "Samples")
|
||||
.withValue("price", new BigDecimal("174999.99"))
|
||||
.withValue("quantity", 47)
|
||||
.withValue("homeStateId", 2)
|
||||
);
|
||||
|
||||
QValueFormatter.setDisplayValuesInRecords(table, records);
|
||||
qValueFormatter.setDisplayValuesInRecords(table, records);
|
||||
|
||||
assertEquals("Tim Chamberlain", records.get(0).getRecordLabel());
|
||||
assertEquals("$3.50", records.get(0).getDisplayValue("price"));
|
||||
assertEquals("1,701", records.get(0).getDisplayValue("quantity"));
|
||||
assertEquals("1", records.get(0).getDisplayValue("homeStateId")); // PVS NOT translated by this class.
|
||||
|
||||
assertEquals("Tyler Samples", records.get(1).getRecordLabel());
|
||||
assertEquals("$174,999.99", records.get(1).getDisplayValue("price"));
|
||||
assertEquals("47", records.get(1).getDisplayValue("quantity"));
|
||||
assertEquals("2", records.get(1).getDisplayValue("homeStateId")); // PVS NOT translated by this class.
|
||||
}
|
||||
|
||||
}
|
@ -31,6 +31,7 @@ import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
@ -281,4 +282,60 @@ class CsvToQRecordAdapterTest
|
||||
// todo - this is what the method header comment means when it says we don't handle all cases well...
|
||||
// Assertions.assertEquals(List.of("A", "B", "C", "C 2", "C 3"), csvToQRecordAdapter.makeHeadersUnique(List.of("A", "B", "C 2", "C", "C 3")));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testByteOrderMarker()
|
||||
{
|
||||
CsvToQRecordAdapter csvToQRecordAdapter = new CsvToQRecordAdapter();
|
||||
List<QRecord> records = csvToQRecordAdapter.buildRecordsFromCsv("""
|
||||
id,firstName
|
||||
1,John""", TestUtils.defineTablePerson(), null);
|
||||
|
||||
assertEquals(1, records.get(0).getValueInteger("id"));
|
||||
assertEquals("John", records.get(0).getValueString("firstName"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Fix an IndexOutOfBounds that we used to throw.
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testTooFewBodyColumns()
|
||||
{
|
||||
CsvToQRecordAdapter csvToQRecordAdapter = new CsvToQRecordAdapter();
|
||||
List<QRecord> records = csvToQRecordAdapter.buildRecordsFromCsv("""
|
||||
id,firstName,lastName
|
||||
1,John""", TestUtils.defineTablePerson(), null);
|
||||
|
||||
assertEquals(1, records.get(0).getValueInteger("id"));
|
||||
assertEquals("John", records.get(0).getValueString("firstName"));
|
||||
assertNull(records.get(0).getValueString("lastName"));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
public void testTooFewColumnsIndexMapping()
|
||||
{
|
||||
int index = 1;
|
||||
QIndexBasedFieldMapping mapping = new QIndexBasedFieldMapping()
|
||||
.withMapping("id", index++)
|
||||
.withMapping("firstName", index++)
|
||||
.withMapping("lastName", index++);
|
||||
|
||||
CsvToQRecordAdapter csvToQRecordAdapter = new CsvToQRecordAdapter();
|
||||
List<QRecord> records = csvToQRecordAdapter.buildRecordsFromCsv("1,John", TestUtils.defineTablePerson(), mapping);
|
||||
|
||||
assertEquals(1, records.get(0).getValueInteger("id"));
|
||||
assertEquals("John", records.get(0).getValueString("firstName"));
|
||||
assertNull(records.get(0).getValueString("lastName"));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,10 +22,10 @@
|
||||
package com.kingsrook.qqq.backend.core.instances;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||
import com.kingsrook.qqq.backend.core.utils.TestUtils;
|
||||
@ -130,6 +130,20 @@ class QInstanceEnricherTest
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testNameToLabel()
|
||||
{
|
||||
assertEquals("Address 2", QInstanceEnricher.nameToLabel("address2"));
|
||||
assertEquals("Field 20", QInstanceEnricher.nameToLabel("field20"));
|
||||
assertEquals("Something USA", QInstanceEnricher.nameToLabel("somethingUSA"));
|
||||
assertEquals("Number 1 Dad", QInstanceEnricher.nameToLabel("number1Dad"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -146,4 +160,28 @@ class QInstanceEnricherTest
|
||||
assertEquals("tla_and_another_tla", QInstanceEnricher.inferBackendName("TLAAndAnotherTLA"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testInferredRecordLabelFormat()
|
||||
{
|
||||
QInstance qInstance = TestUtils.defineInstance();
|
||||
QTableMetaData table = qInstance.getTable("person").withRecordLabelFormat(null).withRecordLabelFields(new ArrayList<>());
|
||||
new QInstanceEnricher().enrich(qInstance);
|
||||
assertNull(table.getRecordLabelFormat());
|
||||
|
||||
qInstance = TestUtils.defineInstance();
|
||||
table = qInstance.getTable("person").withRecordLabelFormat(null).withRecordLabelFields("firstName");
|
||||
new QInstanceEnricher().enrich(qInstance);
|
||||
assertEquals("%s", table.getRecordLabelFormat());
|
||||
|
||||
qInstance = TestUtils.defineInstance();
|
||||
table = qInstance.getTable("person").withRecordLabelFormat(null).withRecordLabelFields("firstName", "lastName");
|
||||
new QInstanceEnricher().enrich(qInstance);
|
||||
assertEquals("%s %s", table.getRecordLabelFormat());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,16 +22,20 @@
|
||||
package com.kingsrook.qqq.backend.core.instances;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.layout.QAppMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValue;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
||||
@ -110,7 +114,7 @@ class QInstanceValidatorTest
|
||||
@Test
|
||||
public void test_validateNullTables()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) ->
|
||||
assertValidationFailureReasonsAllowingExtraReasons((qInstance) ->
|
||||
{
|
||||
qInstance.setTables(null);
|
||||
qInstance.setProcesses(null);
|
||||
@ -127,7 +131,7 @@ class QInstanceValidatorTest
|
||||
@Test
|
||||
public void test_validateEmptyTables()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) ->
|
||||
assertValidationFailureReasonsAllowingExtraReasons((qInstance) ->
|
||||
{
|
||||
qInstance.setTables(new HashMap<>());
|
||||
qInstance.setProcesses(new HashMap<>());
|
||||
@ -150,10 +154,13 @@ class QInstanceValidatorTest
|
||||
qInstance.getTable("person").setName("notPerson");
|
||||
qInstance.getBackend("default").setName("notDefault");
|
||||
qInstance.getProcess(TestUtils.PROCESS_NAME_GREET_PEOPLE).setName("notGreetPeople");
|
||||
qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE).setName("notStates");
|
||||
},
|
||||
"Inconsistent naming for table",
|
||||
"Inconsistent naming for backend",
|
||||
"Inconsistent naming for process");
|
||||
"Inconsistent naming for process",
|
||||
"Inconsistent naming for possibleValueSource"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -184,6 +191,19 @@ class QInstanceValidatorTest
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
public void test_validateTableBadRecordFormatField()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getTable("person").withRecordLabelFields("notAField"),
|
||||
"not a field");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Test that if a process specifies a table that doesn't exist, that it fails.
|
||||
**
|
||||
@ -252,7 +272,7 @@ class QInstanceValidatorTest
|
||||
@Test
|
||||
public void test_validateFieldWithMissingPossibleValueSource()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getTable("person").getField("homeState").setPossibleValueSourceName("not a real possible value source"),
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getTable("person").getField("homeStateId").setPossibleValueSourceName("not a real possible value source"),
|
||||
"Unrecognized possibleValueSourceName");
|
||||
}
|
||||
|
||||
@ -319,6 +339,7 @@ class QInstanceValidatorTest
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -376,6 +397,7 @@ class QInstanceValidatorTest
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -391,6 +413,7 @@ class QInstanceValidatorTest
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -408,6 +431,96 @@ class QInstanceValidatorTest
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueSourceMissingType()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE).setType(null),
|
||||
"Missing type for possibleValueSource");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueSourceMissingIdType()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE).setIdType(null),
|
||||
"Missing an idType for possibleValueSource");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueSourceMisConfiguredEnum()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> {
|
||||
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE);
|
||||
possibleValueSource.setTableName("person");
|
||||
possibleValueSource.setCustomCodeReference(new QCodeReference());
|
||||
possibleValueSource.setEnumValues(null);
|
||||
},
|
||||
"should not have a tableName",
|
||||
"should not have a customCodeReference",
|
||||
"is missing enum values");
|
||||
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE).setEnumValues(new ArrayList<>()),
|
||||
"is missing enum values");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueSourceMisConfiguredTable()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> {
|
||||
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_SHAPE);
|
||||
possibleValueSource.setTableName(null);
|
||||
possibleValueSource.setCustomCodeReference(new QCodeReference());
|
||||
possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test")));
|
||||
},
|
||||
"should not have enum values",
|
||||
"should not have a customCodeReference",
|
||||
"is missing a tableName");
|
||||
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_SHAPE).setTableName("Not a table"),
|
||||
"Unrecognized table");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testPossibleValueSourceMisConfiguredCustom()
|
||||
{
|
||||
assertValidationFailureReasons((qInstance) -> {
|
||||
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_CUSTOM);
|
||||
possibleValueSource.setTableName("person");
|
||||
possibleValueSource.setCustomCodeReference(null);
|
||||
possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test")));
|
||||
},
|
||||
"should not have enum values",
|
||||
"should not have a tableName",
|
||||
"is missing a customCodeReference");
|
||||
|
||||
assertValidationFailureReasons((qInstance) -> qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_CUSTOM).setCustomCodeReference(new QCodeReference()),
|
||||
"not a possibleValueProvider");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Run a little setup code on a qInstance; then validate it, and assert that it
|
||||
** failed validation with reasons that match the supplied vararg-reasons (but allow
|
||||
|
@ -48,6 +48,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.session.QSession;
|
||||
import com.kingsrook.qqq.backend.core.utils.TestUtils;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
@ -62,8 +63,9 @@ class MemoryBackendModuleTest
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
void afterEach()
|
||||
void beforeAndAfter()
|
||||
{
|
||||
MemoryRecordStore.getInstance().reset();
|
||||
}
|
||||
@ -120,6 +122,8 @@ class MemoryBackendModuleTest
|
||||
|
||||
assertEquals(3, new CountAction().execute(countInput).getCount());
|
||||
|
||||
// todo - filters in query
|
||||
|
||||
//////////////////
|
||||
// do an update //
|
||||
//////////////////
|
||||
|
@ -22,10 +22,12 @@
|
||||
package com.kingsrook.qqq.backend.core.utils;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import com.kingsrook.qqq.backend.core.actions.processes.person.addtopeoplesage.AddAge;
|
||||
import com.kingsrook.qqq.backend.core.actions.processes.person.addtopeoplesage.GetAgeStatistics;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.QueryAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.values.QCustomPossibleValueProvider;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput;
|
||||
@ -39,6 +41,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.layout.QAppMetaData;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValue;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSourceType;
|
||||
import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData;
|
||||
@ -80,6 +83,10 @@ public class TestUtils
|
||||
public static final String TABLE_NAME_PERSON_FILE = "personFile";
|
||||
public static final String TABLE_NAME_ID_AND_NAME_ONLY = "idAndNameOnly";
|
||||
|
||||
public static final String POSSIBLE_VALUE_SOURCE_STATE = "state"; // enum-type
|
||||
public static final String POSSIBLE_VALUE_SOURCE_SHAPE = "shape"; // table-type
|
||||
public static final String POSSIBLE_VALUE_SOURCE_CUSTOM = "custom"; // custom-type
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
@ -99,6 +106,8 @@ public class TestUtils
|
||||
qInstance.addTable(defineTableShape());
|
||||
|
||||
qInstance.addPossibleValueSource(defineStatesPossibleValueSource());
|
||||
qInstance.addPossibleValueSource(defineShapePossibleValueSource());
|
||||
qInstance.addPossibleValueSource(defineCustomPossibleValueSource());
|
||||
|
||||
qInstance.addProcess(defineProcessGreetPeople());
|
||||
qInstance.addProcess(defineProcessGreetPeopleInteractive());
|
||||
@ -141,12 +150,40 @@ public class TestUtils
|
||||
** Define the "states" possible value source used in standard tests
|
||||
**
|
||||
*******************************************************************************/
|
||||
private static QPossibleValueSource<String> defineStatesPossibleValueSource()
|
||||
private static QPossibleValueSource defineStatesPossibleValueSource()
|
||||
{
|
||||
return new QPossibleValueSource<String>()
|
||||
.withName("state")
|
||||
return new QPossibleValueSource()
|
||||
.withName(POSSIBLE_VALUE_SOURCE_STATE)
|
||||
.withType(QPossibleValueSourceType.ENUM)
|
||||
.withEnumValues(List.of("IL", "MO"));
|
||||
.withEnumValues(List.of(new QPossibleValue<>(1, "IL"), new QPossibleValue<>(2, "MO")));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Define the "shape" possible value source used in standard tests
|
||||
**
|
||||
*******************************************************************************/
|
||||
private static QPossibleValueSource defineShapePossibleValueSource()
|
||||
{
|
||||
return new QPossibleValueSource()
|
||||
.withName(POSSIBLE_VALUE_SOURCE_SHAPE)
|
||||
.withType(QPossibleValueSourceType.TABLE)
|
||||
.withTableName(TABLE_NAME_SHAPE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Define the "custom" possible value source used in standard tests
|
||||
**
|
||||
*******************************************************************************/
|
||||
private static QPossibleValueSource defineCustomPossibleValueSource()
|
||||
{
|
||||
return new QPossibleValueSource()
|
||||
.withName(POSSIBLE_VALUE_SOURCE_CUSTOM)
|
||||
.withType(QPossibleValueSourceType.CUSTOM)
|
||||
.withCustomCodeReference(new QCodeReference(CustomPossibleValueSource.class));
|
||||
}
|
||||
|
||||
|
||||
@ -205,7 +242,10 @@ public class TestUtils
|
||||
.withField(new QFieldMetaData("lastName", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("birthDate", QFieldType.DATE))
|
||||
.withField(new QFieldMetaData("email", QFieldType.STRING))
|
||||
.withField(new QFieldMetaData("homeState", QFieldType.STRING).withPossibleValueSourceName("state"));
|
||||
.withField(new QFieldMetaData("homeStateId", QFieldType.INTEGER).withPossibleValueSourceName(POSSIBLE_VALUE_SOURCE_STATE))
|
||||
.withField(new QFieldMetaData("favoriteShapeId", QFieldType.INTEGER).withPossibleValueSourceName(POSSIBLE_VALUE_SOURCE_SHAPE))
|
||||
.withField(new QFieldMetaData("customValue", QFieldType.INTEGER).withPossibleValueSourceName(POSSIBLE_VALUE_SOURCE_CUSTOM))
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@ -219,6 +259,7 @@ public class TestUtils
|
||||
.withName(TABLE_NAME_SHAPE)
|
||||
.withBackendName(MEMORY_BACKEND_NAME)
|
||||
.withPrimaryKeyField("id")
|
||||
.withRecordLabelFields("name")
|
||||
.withField(new QFieldMetaData("id", QFieldType.INTEGER).withIsEditable(false))
|
||||
.withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withIsEditable(false))
|
||||
.withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withIsEditable(false))
|
||||
@ -452,4 +493,21 @@ public class TestUtils
|
||||
""");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public static class CustomPossibleValueSource implements QCustomPossibleValueProvider
|
||||
{
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Override
|
||||
public QPossibleValue<?> getPossibleValue(Serializable idValue)
|
||||
{
|
||||
return (new QPossibleValue<>(idValue, "Custom[" + idValue + "]"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,8 +60,8 @@
|
||||
"type": "STRING",
|
||||
"possibleValueSourceName": null
|
||||
},
|
||||
"homeState": {
|
||||
"name": "homeState",
|
||||
"homeStateId": {
|
||||
"name": "homeStateId",
|
||||
"label": null,
|
||||
"backendName": null,
|
||||
"type": "STRING",
|
||||
|
@ -27,8 +27,8 @@
|
||||
"type": "DATE_TIME",
|
||||
"possibleValueSourceName": null
|
||||
},
|
||||
"homeState": {
|
||||
"name": "homeState",
|
||||
"homeStateId": {
|
||||
"name": "homeStateId",
|
||||
"backendName": null,
|
||||
"label": null,
|
||||
"type": "STRING",
|
||||
|
Reference in New Issue
Block a user