CTLE-433: attempt to get over 80% coverage in javalin

This commit is contained in:
Tim Chamberlain
2023-05-10 17:31:20 -05:00
parent e66b649699
commit 0b996ef008
5 changed files with 115 additions and 2 deletions

View File

@ -0,0 +1,53 @@
/*
* 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.exceptions;
/*******************************************************************************
** User-facing exception for when user provided bad or missing data in their request
**
*******************************************************************************/
public class QBadRequestException extends QUserFacingException
{
/*******************************************************************************
** Constructor of message
**
*******************************************************************************/
public QBadRequestException(String message)
{
super(message);
}
/*******************************************************************************
** Constructor of message & cause
**
*******************************************************************************/
public QBadRequestException(String message, Throwable cause)
{
super(message, cause);
}
}

View File

@ -57,6 +57,7 @@ import com.kingsrook.qqq.backend.core.actions.values.SearchPossibleValueSourceAc
import com.kingsrook.qqq.backend.core.adapters.QInstanceAdapter; import com.kingsrook.qqq.backend.core.adapters.QInstanceAdapter;
import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QAuthenticationException; import com.kingsrook.qqq.backend.core.exceptions.QAuthenticationException;
import com.kingsrook.qqq.backend.core.exceptions.QBadRequestException;
import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException; import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException;
import com.kingsrook.qqq.backend.core.exceptions.QModuleDispatchException; import com.kingsrook.qqq.backend.core.exceptions.QModuleDispatchException;
@ -1419,6 +1420,11 @@ public class QJavalinImplementation
statusCode = Objects.requireNonNullElse(statusCode, HttpStatus.Code.NOT_FOUND); // 404 statusCode = Objects.requireNonNullElse(statusCode, HttpStatus.Code.NOT_FOUND); // 404
respondWithError(context, statusCode, userFacingException.getMessage()); respondWithError(context, statusCode, userFacingException.getMessage());
} }
else if(userFacingException instanceof QBadRequestException)
{
statusCode = Objects.requireNonNullElse(statusCode, HttpStatus.Code.BAD_REQUEST); // 400
respondWithError(context, statusCode, userFacingException.getMessage());
}
else else
{ {
LOG.info("User-facing exception", e); LOG.info("User-facing exception", e);

View File

@ -50,6 +50,7 @@ import com.kingsrook.qqq.backend.core.actions.processes.RunProcessAction;
import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction; import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction;
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter;
import com.kingsrook.qqq.backend.core.exceptions.QBadRequestException;
import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException;
import com.kingsrook.qqq.backend.core.exceptions.QPermissionDeniedException; import com.kingsrook.qqq.backend.core.exceptions.QPermissionDeniedException;
import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException;
@ -280,7 +281,13 @@ public class QJavalinProcessHandler
QJavalinImplementation.setupSession(context, new AbstractActionInput()); QJavalinImplementation.setupSession(context, new AbstractActionInput());
// todo context.contentType(reportFormat.getMimeType()); // todo context.contentType(reportFormat.getMimeType());
context.header("Content-Disposition", "filename=" + context.pathParam("file")); context.header("Content-Disposition", "filename=" + context.pathParam("file"));
context.result(new FileInputStream(context.queryParam("filePath")));
String filePath = context.queryParam("filePath");
if(filePath == null)
{
throw (new QBadRequestException("A filePath was not provided."));
}
context.result(new FileInputStream(filePath));
} }
catch(Exception e) catch(Exception e)
{ {

View File

@ -82,6 +82,25 @@ class QJavalinImplementationTest extends QJavalinTestBase
/*******************************************************************************
** test getting serverInfo
**
*******************************************************************************/
@Test
public void test_serverInfo()
{
HttpResponse<String> response = Unirest.get(BASE_URL + "/serverInfo").asString();
assertEquals(200, response.getStatus());
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
assertTrue(jsonObject.has("startTimeMillis"));
assertTrue(jsonObject.has("startTimeHuman"));
assertTrue(jsonObject.has("uptimeHuman"));
assertTrue(jsonObject.has("uptimeMillis"));
}
/******************************************************************************* /*******************************************************************************
** test the table-level meta-data endpoint ** test the table-level meta-data endpoint
** **

View File

@ -560,6 +560,34 @@ class QJavalinProcessHandlerTest extends QJavalinTestBase
/*******************************************************************************
** test calling download file endpoint
**
*******************************************************************************/
@Test
public void test_downloadFile()
{
HttpResponse<String> response = Unirest.get(BASE_URL + "/download/myTestFile.txt?filePath=/dev/null").asString();
assertEquals(200, response.getStatus());
assertEquals("OK", response.getStatusText());
}
/*******************************************************************************
** test calling download file with missing filePath
**
*******************************************************************************/
@Test
public void test_downloadFileMissingFilePath()
{
HttpResponse<String> response = Unirest.get(BASE_URL + "/download/myTestFile.txt").asString();
assertEquals(400, response.getStatus());
assertTrue(response.getBody().contains("A filePath was not provided"));
}
/******************************************************************************* /*******************************************************************************
** test calling for possibleValue ** test calling for possibleValue
** **