diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java index 722cba48..77af26c3 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java @@ -22,6 +22,8 @@ package com.kingsrook.qqq.backend.javalin; +import java.io.IOException; +import java.io.InputStream; import java.io.Serializable; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -185,6 +187,63 @@ class QJavalinImplementationTest extends QJavalinTestBase JSONObject values = jsonObject.getJSONObject("values"); assertTrue(values.has("firstName")); assertTrue(values.has("id")); + assertTrue(values.has("photo")); + + JSONObject displayValues = jsonObject.getJSONObject("displayValues"); + assertEquals("darin-photo.png", displayValues.getString("photo")); + + //////////////////////////////////////////////////// + // make sure person 2 doesn't have the blob value // + //////////////////////////////////////////////////// + response = Unirest.get(BASE_URL + "/data/person/2").asString(); + assertEquals(200, response.getStatus()); + jsonObject = JsonUtils.toJSONObject(response.getBody()); + values = jsonObject.getJSONObject("values"); + assertFalse(values.has("photo")); + } + + + + /******************************************************************************* + ** test downloading a blob file + ** + *******************************************************************************/ + @Test + public void test_dataDownloadRecordField() + { + HttpResponse response = Unirest.get(BASE_URL + "/data/person/1/photo/darin-photo.png").asString(); + assertEquals(200, response.getStatus()); + assertThat(response.getHeaders().get("content-type").get(0)).contains("image"); + + response = Unirest.get(BASE_URL + "/data/person/1/photo/darin-photo.png?download=1").asString(); + assertEquals(200, response.getStatus()); + assertThat(response.getHeaders().get("content-disposition").get(0)) + .contains("attachment") + .contains("darin-photo.png"); + + ///////////////////////// + // bad record id = 404 // + ///////////////////////// + response = Unirest.get(BASE_URL + "/data/person/-1/photo/darin-photo.png").asString(); + assertEquals(404, response.getStatus()); + + ////////////////////////// + // bad field name = 404 // + ////////////////////////// + response = Unirest.get(BASE_URL + "/data/person/1/notPhoto/darin-photo.png").asString(); + assertEquals(404, response.getStatus()); + + ///////////////////////////// + // missing file name = 404 // + ///////////////////////////// + response = Unirest.get(BASE_URL + "/data/person/1/photo").asString(); + assertEquals(404, response.getStatus()); + + ////////////////////////// + // bad table name = 404 // + ////////////////////////// + response = Unirest.get(BASE_URL + "/data/notPerson/1/photo/darin-photo.png").asString(); + assertEquals(404, response.getStatus()); } @@ -431,29 +490,34 @@ class QJavalinImplementationTest extends QJavalinTestBase ** *******************************************************************************/ @Test - public void test_dataInsertMultipartForm() + public void test_dataInsertMultipartForm() throws IOException { - HttpResponse response = Unirest.post(BASE_URL + "/data/person") - .header("Content-Type", "application/json") - .multiPartContent() - .field("firstName", "Bobby") - .field("lastName", "Hull") - .field("email", "bobby@hull.com") - .asString(); + try(InputStream photoInputStream = getClass().getResourceAsStream("/photo.png")) + { + HttpResponse response = Unirest.post(BASE_URL + "/data/person") + .header("Content-Type", "application/json") + .multiPartContent() + .field("firstName", "Bobby") + .field("lastName", "Hull") + .field("email", "bobby@hull.com") + .field("photo", photoInputStream.readAllBytes(), "image") + .asString(); - assertEquals(200, response.getStatus()); - JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); - assertTrue(jsonObject.has("records")); - JSONArray records = jsonObject.getJSONArray("records"); - assertEquals(1, records.length()); - JSONObject record0 = records.getJSONObject(0); - assertTrue(record0.has("values")); - assertEquals("person", record0.getString("tableName")); - JSONObject values0 = record0.getJSONObject("values"); - assertTrue(values0.has("firstName")); - assertEquals("Bobby", values0.getString("firstName")); - assertTrue(values0.has("id")); - assertEquals(7, values0.getInt("id")); + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertTrue(jsonObject.has("records")); + JSONArray records = jsonObject.getJSONArray("records"); + assertEquals(1, records.length()); + JSONObject record0 = records.getJSONObject(0); + assertTrue(record0.has("values")); + assertEquals("person", record0.getString("tableName")); + JSONObject values0 = record0.getJSONObject("values"); + assertTrue(values0.has("firstName")); + assertEquals("Bobby", values0.getString("firstName")); + assertTrue(values0.has("id")); + assertEquals(7, values0.getInt("id")); + assertTrue(values0.has("photo")); + } } @@ -718,4 +782,35 @@ class QJavalinImplementationTest extends QJavalinTestBase assertEquals(5, jsonObject.getJSONArray("options").getJSONObject(1).getInt("id")); } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testServerInfo() + { + HttpResponse response = Unirest.get(BASE_URL + "/serverInfo").asString(); + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertNotNull(jsonObject); + assertTrue(jsonObject.has("startTimeMillis")); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testAuthenticationMetaData() + { + HttpResponse response = Unirest.get(BASE_URL + "/metaData/authentication").asString(); + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertNotNull(jsonObject); + assertTrue(jsonObject.has("name")); + assertTrue(jsonObject.has("type")); + } + } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java index bbd5b48c..c828f602 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java @@ -44,6 +44,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType; +import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment; 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.joins.JoinOn; @@ -229,7 +231,7 @@ public class TestUtils *******************************************************************************/ public static QTableMetaData defineTablePerson() { - return new QTableMetaData() + QTableMetaData qTableMetaData = new QTableMetaData() .withName(TABLE_NAME_PERSON) .withLabel("Person") .withRecordLabelFormat("%s %s") @@ -245,10 +247,20 @@ public class TestUtils .withField(new QFieldMetaData("partnerPersonId", QFieldType.INTEGER).withBackendName("partner_person_id").withPossibleValueSourceName(TABLE_NAME_PERSON)) .withField(new QFieldMetaData("email", QFieldType.STRING)) .withField(new QFieldMetaData("testScriptId", QFieldType.INTEGER).withBackendName("test_script_id")) + .withField(new QFieldMetaData("photo", QFieldType.BLOB).withBackendName("photo")) + .withField(new QFieldMetaData("photoFileName", QFieldType.STRING).withBackendName("photo_file_name")) .withAssociatedScript(new AssociatedScript() .withFieldName("testScriptId") .withScriptTypeId(1) .withScriptTester(new QCodeReference(TestScriptAction.class, QCodeUsage.SCRIPT_TESTER))); + + qTableMetaData.getField("photo") + .withIsHeavy(true) + .withFieldAdornment(new FieldAdornment(AdornmentType.FILE_DOWNLOAD) + .withValue(AdornmentType.FileDownloadValues.DEFAULT_MIME_TYPE, "image") + .withValue(AdornmentType.FileDownloadValues.FILE_NAME_FIELD, "photoFileName")); + + return (qTableMetaData); } diff --git a/qqq-middleware-javalin/src/test/resources/photo.png b/qqq-middleware-javalin/src/test/resources/photo.png new file mode 100644 index 00000000..9ffe3ad2 Binary files /dev/null and b/qqq-middleware-javalin/src/test/resources/photo.png differ diff --git a/qqq-middleware-javalin/src/test/resources/prime-test-database.sql b/qqq-middleware-javalin/src/test/resources/prime-test-database.sql index a94c185b..bd233046 100644 --- a/qqq-middleware-javalin/src/test/resources/prime-test-database.sql +++ b/qqq-middleware-javalin/src/test/resources/prime-test-database.sql @@ -31,10 +31,12 @@ CREATE TABLE person birth_date DATE, email VARCHAR(250) NOT NULL, partner_person_id INT, - test_script_id INT + test_script_id INT, + photo BLOB, + photo_file_name VARCHAR(50) ); -INSERT INTO person (id, first_name, last_name, birth_date, email, partner_person_id) VALUES (1, 'Darin', 'Kelkhoff', '1980-05-31', 'darin.kelkhoff@gmail.com', 6); +INSERT INTO person (id, first_name, last_name, birth_date, email, partner_person_id, photo, photo_file_name) VALUES (1, 'Darin', 'Kelkhoff', '1980-05-31', 'darin.kelkhoff@gmail.com', 6, '12345', 'darin-photo.png'); INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (2, 'James', 'Maes', '1980-05-15', 'jmaes@mmltholdings.com'); INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (3, 'Tim', 'Chamberlain', '1976-05-28', 'tchamberlain@mmltholdings.com'); INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (4, 'Tyler', 'Samples', '1990-01-01', 'tsamples@mmltholdings.com');