From 9cc9b882d646c33bb4de3e3078bd52b0f3260106 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 17 Aug 2025 23:18:35 -0400 Subject: [PATCH 01/10] updating javalin --- pom.xml | 7 +- src/main/Config/AppConfig.java | 86 +++++++++--------- src/main/Config/SessionConfig.java | 4 + src/main/File/FileController.java | 25 ++--- src/main/PDF/PdfController.java | 20 ++-- src/main/PDF/PdfControllerV2.java | 14 +-- src/main/User/Services/UploadPfpService.java | 2 +- src/main/User/UserController.java | 17 ++-- .../File/FileDaoImplUnitTests.java | 4 +- .../GetQuestionsPDFServiceV2UnitTests.java | 1 - .../UploadAnnotatedPDFServiceUnitTests.java | 2 - .../ProductionControllerIntegrationTests.java | 24 ++--- src/test/TestUtils/TestUtils.java | 6 ++ .../UserControllerIntegrationTest.java | 13 ++- .../ss-5_filled_out_test_download.pdf | Bin 149540 -> 149539 bytes .../resources/ss-5_filled_out_test_fill.pdf | Bin 149540 -> 149540 bytes 16 files changed, 122 insertions(+), 103 deletions(-) diff --git a/pom.xml b/pom.xml index 3a01e93a..b59e994c 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,12 @@ io.javalin javalin - 3.13.10 + 6.7.0 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.9.25 diff --git a/src/main/Config/AppConfig.java b/src/main/Config/AppConfig.java index 0d0e5882..048dae7c 100644 --- a/src/main/Config/AppConfig.java +++ b/src/main/Config/AppConfig.java @@ -44,6 +44,10 @@ import java.util.Optional; import lombok.SneakyThrows; import org.bson.types.ObjectId; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.session.DefaultSessionIdManager; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.servlet.ServletContextHandler; public class AppConfig { public static Long ASYNC_TIME_OUT = 10L; @@ -220,7 +224,7 @@ public static Javalin appFactory(DeploymentLevel deploymentLevel) { app.post("/organizations", productionController.createOrg); app.before( - "/organizations/:orgId", + "/organizations/{orgId}", ctx -> { ObjectId objectId = new ObjectId(ctx.pathParam("orgId")); Optional organizationOptional = orgDao.get(objectId); @@ -232,10 +236,10 @@ public static Javalin appFactory(DeploymentLevel deploymentLevel) { new HashMap<>()); } }); - app.get("/organizations/:orgId", productionController.readOrg); - app.patch("/organizations/:orgId", productionController.updateOrg); - app.delete("/organizations/:orgId", productionController.deleteOrg); - app.get("/organizations/:orgId/users", productionController.getUsersFromOrg); + app.get("/organizations/{orgId}", productionController.readOrg); + app.patch("/organizations/{orgId}", productionController.updateOrg); + app.delete("/organizations/{orgId}", productionController.deleteOrg); + app.get("/organizations/{orgId}/users", productionController.getUsersFromOrg); app.before( "/users*", @@ -258,7 +262,7 @@ public static Javalin appFactory(DeploymentLevel deploymentLevel) { app.post("/users", productionController.createUser); app.before( - "/users/:username", + "/users/{username}", ctx -> { String username = ctx.pathParam("username"); Optional userOptional = userDao.get(username); @@ -269,15 +273,15 @@ public static Javalin appFactory(DeploymentLevel deploymentLevel) { } }); - app.get("/users/:username", productionController.readUser); - app.patch("/users/:username", productionController.updateUser); - app.delete("/users/:username", productionController.deleteUser); + app.get("/users/{username}", productionController.readUser); + app.patch("/users/{username}", productionController.updateUser); + app.delete("/users/{username}", productionController.deleteUser); /* --------------- SEARCH FUNCTIONALITY ------------- */ app.patch("/change-optional-info/", optionalUserInformationController.updateInformation); - app.get("/get-optional-info/:username", optionalUserInformationController.getInformation); + app.get("/get-optional-info/{username}", optionalUserInformationController.getInformation); app.delete( - "/delete-optional-info/:username", optionalUserInformationController.deleteInformation); + "/delete-optional-info/{username}", optionalUserInformationController.deleteInformation); app.post("/save-optional-info/", optionalUserInformationController.saveInformation); /* -------------- Billing ----------------- */ @@ -318,42 +322,34 @@ public static Javalin createJavalinApp(DeploymentLevel deploymentLevel) { } return Javalin.create( config -> { - config.asyncRequestTimeout = + config.http.asyncTimeout= ASYNC_TIME_OUT; // timeout for async requests (default is 0, no timeout) - config.autogenerateEtags = false; // auto generate etags (default is false) - config.contextPath = "/"; // context path for the http servlet (default is "/") - config.defaultContentType = - "text/plain"; // content type to use if no content type is set (default is - // "text/plain") - - config.enableCorsForOrigin( - "https://keep.id", - "https://server.keep.id", - "http://localhost", - "http://localhost:3000", - "127.0.0.1:3000"); - - config.enableDevLogging(); // enable extensive development logging for - // http and - // websocket - config.enforceSsl = false; - // log a warning if user doesn't start javalin instance (default is true) - config.logIfServerNotStarted = true; + config.http.generateEtags = false; // auto generate etags (default is false) + config.http.defaultContentType = "text/plain"; + config.router.contextPath = "/"; config.showJavalinBanner = false; - config.prefer405over404 = - false; // send a 405 if handlers exist for different verb on the same path - // (default is false) - config.sessionHandler( - () -> { - try { - return SessionConfig.getSessionHandlerInstance(deploymentLevel); - } catch (Exception e) { - System.err.println("Unable to instantiate session handler."); - e.printStackTrace(); - System.exit(1); - return null; - } - }); + config.bundledPlugins.enableCors(cors -> { + cors.addRule(rule -> rule.allowHost( + "https://keep.id", + "https://server.keep.id", + "http://localhost", + "http://localhost:3000", + "http://127.0.0.1:3000", + "http://localhost:3001", + "https://staged.keep.id", + "https://staging.keep.id" + )); + }); + +// config.bundledPlugins.enableDevLogging(); + config.showJavalinBanner = false; + config.jetty.modifyServletContextHandler(ctx -> { + try { + ctx.setSessionHandler(SessionConfig.getSessionHandlerInstance(deploymentLevel)); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); }) .start(port); } diff --git a/src/main/Config/SessionConfig.java b/src/main/Config/SessionConfig.java index fffe40a2..78b3d1bb 100644 --- a/src/main/Config/SessionConfig.java +++ b/src/main/Config/SessionConfig.java @@ -44,6 +44,10 @@ public static SessionHandler getSessionHandlerInstance(DeploymentLevel deploymen return sessionHandler; } + public static void resetSessionHandler() { + sessionHandler = null; + } + private static MongoSessionDataStoreFactory mongoDataStoreFactory( String dbName, String collectionName) { MongoSessionDataStoreFactory mongoSessionDataStoreFactory = new MongoSessionDataStoreFactory(); diff --git a/src/main/File/FileController.java b/src/main/File/FileController.java index ad7bd1e0..f1b3df20 100644 --- a/src/main/File/FileController.java +++ b/src/main/File/FileController.java @@ -122,28 +122,29 @@ public FileController( UploadedFile signature = null; Date uploadDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()); - InputStream filestreamToUpload = file.getContent(); - String filenameToUpload = file.getFilename(); + InputStream filestreamToUpload = file.content(); + String filenameToUpload = file.filename(); switch (fileType) { case APPLICATION_PDF: case IDENTIFICATION_PDF: case FORM: log.info("Got PDF file to upload!"); - if (file.getContentType().startsWith("image")) { + if (Objects.requireNonNull(file.contentType()).startsWith("image")) { ImageToPDFService imageToPDFService = new ImageToPDFService(filestreamToUpload); Message imageToPdfServiceResponse = imageToPDFService.executeAndGetResponse(); if (imageToPdfServiceResponse == PdfMessage.INVALID_PDF) { ctx.result(imageToPdfServiceResponse.toResponseString()); + return; } filestreamToUpload = imageToPDFService.getFileStream(); filenameToUpload = - file.getFilename().substring(0, file.getFilename().lastIndexOf(".")) + file.filename().substring(0, file.filename().lastIndexOf(".")) + ".pdf"; } - filestreamToUpload.reset(); - // PDDocument pdfDocument = Loader.loadPDF(filestreamToUpload); - // title = getPDFTitle(file.getFilename(), pdfDocument); - // pdfDocument.close(); + + if (!Objects.requireNonNull(file.contentType()).startsWith("image")) { + filestreamToUpload = file.content(); + } if (toSign) { signature = Objects.requireNonNull(ctx.uploadedFile("signature")); @@ -162,7 +163,7 @@ public FileController( filenameToUpload, organizationName, annotated, - file.getContentType()); + file.contentType()); UploadFileService uploadService = new UploadFileService( fileDao, @@ -172,7 +173,7 @@ public FileController( toSign, signature == null ? Optional.empty() - : Optional.of(signature.getContent()), + : Optional.of(signature.content()), Optional.ofNullable(encryptionController)); response = uploadService.executeAndGetResponse(); break; @@ -188,7 +189,7 @@ public FileController( filenameToUpload, organizationName, annotated, - file.getContentType()); + file.contentType()); uploadService = new UploadFileService( fileDao, @@ -212,7 +213,7 @@ public FileController( filenameToUpload, organizationName, annotated, - file.getContentType()); + file.contentType()); uploadService = new UploadFileService( fileDao, diff --git a/src/main/PDF/PdfController.java b/src/main/PDF/PdfController.java index 86f5f85b..9ba6f62d 100644 --- a/src/main/PDF/PdfController.java +++ b/src/main/PDF/PdfController.java @@ -295,9 +295,9 @@ public User userCheck(String req) { organizationName, privilegeLevel, pdfType, - file.getFilename(), - file.getContentType(), - file.getContent(), + file.filename(), + file.contentType(), + file.content(), encryptionController, idCategory); response = uploadService.executeAndGetResponse(); @@ -329,9 +329,9 @@ public User userCheck(String req) { organizationName, UserType.Developer, fileIDStr, - file.getFilename(), - file.getContentType(), - file.getContent(), + Objects.requireNonNull(file).filename(), + file.contentType(), + file.content(), encryptionController); ctx.result(uploadService.executeAndGetResponse().toResponseString()); }; @@ -364,10 +364,10 @@ public User userCheck(String req) { organizationName, privilegeLevel, pdfType, - file.getFilename(), - file.getContentType(), - file.getContent(), - signature.getContent(), + file.filename(), + file.contentType(), + file.content(), + signature.content(), encryptionController); ctx.result(uploadService.executeAndGetResponse().toResponseString()); }; diff --git a/src/main/PDF/PdfControllerV2.java b/src/main/PDF/PdfControllerV2.java index d6bf4028..d50dfed7 100644 --- a/src/main/PDF/PdfControllerV2.java +++ b/src/main/PDF/PdfControllerV2.java @@ -415,7 +415,7 @@ public Message setFileParamsUploadSignedPDF(Context ctx) { UploadedFile signature = Objects.requireNonNull(ctx.uploadedFile("signature")); this.fileId = Objects.requireNonNull(ctx.formParam("applicationId")); this.formAnswers = new JSONObject(Objects.requireNonNull(ctx.formParam("formAnswers"))); - this.signatureStream = signature.getContent(); + this.signatureStream = signature.content(); } catch (Exception e) { return PdfMessage.INVALID_PARAMETER; } @@ -460,9 +460,9 @@ public Message setFileParamsUploadPDF(Context ctx) { log.info("Client uploaded document missing category"); return PdfMessage.INVALID_ID_CATEGORY; } - this.fileName = file.getFilename(); - this.fileContentType = file.getContentType(); - this.fileStream = file.getContent(); + this.fileName = file.filename(); + this.fileContentType = file.contentType(); + this.fileStream = file.content(); return null; } @@ -473,9 +473,9 @@ public Message setFileParamsUploadAnnotatedPDF(Context ctx) { return PdfMessage.INVALID_PDF; } // this.fileOrgName = ctx.formParam("fileOrgName"); - this.fileName = file.getFilename(); - this.fileContentType = file.getContentType(); - this.fileStream = file.getContent(); + this.fileName = file.filename(); + this.fileContentType = file.contentType(); + this.fileStream = file.content(); return null; } diff --git a/src/main/User/Services/UploadPfpService.java b/src/main/User/Services/UploadPfpService.java index 1996e39a..4e27d898 100644 --- a/src/main/User/Services/UploadPfpService.java +++ b/src/main/User/Services/UploadPfpService.java @@ -33,7 +33,7 @@ public UploadPfpService(MongoDatabase db, String username, UploadedFile pfp, Str @Override public Message executeAndGetResponse() { - InputStream content = pfp.getContent(); + InputStream content = pfp.content(); Bson filter = Filters.eq("metadata.owner", username); GridFSBucket gridBucket = GridFSBuckets.create(db, "pfp"); GridFSFile grid_out = gridBucket.find(filter).first(); diff --git a/src/main/User/UserController.java b/src/main/User/UserController.java index 1e0c6c49..3d344e66 100644 --- a/src/main/User/UserController.java +++ b/src/main/User/UserController.java @@ -27,6 +27,8 @@ import java.time.ZoneId; import java.util.*; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.Part; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; @@ -130,7 +132,7 @@ public UserController( public Handler loginUser = ctx -> { - ctx.req.getSession().invalidate(); + Optional.ofNullable(ctx.req().getSession(false)).ifPresent(HttpSession::invalidate); JSONObject req = new JSONObject(ctx.body()); String username = req.getString("username"); String password = req.getString("password"); @@ -173,7 +175,7 @@ public UserController( */ public Handler googleLoginRequestHandler = ctx -> { - ctx.req.getSession().invalidate(); + ctx.req().getSession().invalidate(); JSONObject req = new JSONObject(ctx.body()); String redirectUri = req.optString("redirectUri", null); String originUri = req.optString("originUri", null); @@ -440,7 +442,7 @@ public UserController( public Handler logout = ctx -> { - ctx.req.getSession().invalidate(); + ctx.req().getSession().invalidate(); log.info("Signed out"); ctx.result(UserMessage.SUCCESS.toJSON().toString()); }; @@ -559,17 +561,20 @@ public static JSONObject mergeJSON( User user = optionalUser.get(); Date uploadDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()); + if (file == null) { + ctx.result(UserMessage.INVALID_PARAMETER.toJSON().toString()); + } File fileToUpload = new File( username, uploadDate, - file.getContent(), + Objects.requireNonNull(file).content(), FileType.PROFILE_PICTURE, IdCategoryType.NONE, - file.getFilename(), + file.filename(), user.getOrganization(), false, - file.getContentType()); + file.contentType()); UploadFileService service = new UploadFileService( fileDao, diff --git a/src/test/DatabaseTest/File/FileDaoImplUnitTests.java b/src/test/DatabaseTest/File/FileDaoImplUnitTests.java index d4498877..a37ef434 100644 --- a/src/test/DatabaseTest/File/FileDaoImplUnitTests.java +++ b/src/test/DatabaseTest/File/FileDaoImplUnitTests.java @@ -28,7 +28,9 @@ public void initialize() { @After public void reset() { - fileDao.clear(); + if (fileDao != null) { + fileDao.clear(); + } } @Test diff --git a/src/test/PDFTest/PDFV2Test/GetQuestionsPDFServiceV2UnitTests.java b/src/test/PDFTest/PDFV2Test/GetQuestionsPDFServiceV2UnitTests.java index 14e0bff2..b1eee635 100644 --- a/src/test/PDFTest/PDFV2Test/GetQuestionsPDFServiceV2UnitTests.java +++ b/src/test/PDFTest/PDFV2Test/GetQuestionsPDFServiceV2UnitTests.java @@ -55,7 +55,6 @@ public static void start() { @Before public void initialize() throws InterruptedException { - Thread.sleep(1000); this.fileDao = FileDaoFactory.create(DeploymentLevel.TEST); this.formDao = FormDaoFactory.create(DeploymentLevel.TEST); this.userDao = UserDaoFactory.create(DeploymentLevel.TEST); diff --git a/src/test/PDFTest/PDFV2Test/UploadAnnotatedPDFServiceUnitTests.java b/src/test/PDFTest/PDFV2Test/UploadAnnotatedPDFServiceUnitTests.java index 43db868c..3baf3e17 100644 --- a/src/test/PDFTest/PDFV2Test/UploadAnnotatedPDFServiceUnitTests.java +++ b/src/test/PDFTest/PDFV2Test/UploadAnnotatedPDFServiceUnitTests.java @@ -41,9 +41,7 @@ public class UploadAnnotatedPDFServiceUnitTests { @BeforeClass public static void start() throws InterruptedException { - Thread.sleep(3000); TestUtils.startServer(); - Thread.sleep(3000); } @Before diff --git a/src/test/ProductionAPITest/ProductionControllerIntegrationTests.java b/src/test/ProductionAPITest/ProductionControllerIntegrationTests.java index 356ff433..1238905e 100644 --- a/src/test/ProductionAPITest/ProductionControllerIntegrationTests.java +++ b/src/test/ProductionAPITest/ProductionControllerIntegrationTests.java @@ -60,12 +60,6 @@ public static void setUp() throws ValidationException { @Before public void login() { TestUtils.login("devYMCA", "devYMCA123"); - try { - TimeUnit.SECONDS.sleep(1); // this looks super jank but basically we are running into concurrency problems - // if we login too fast because the login call is asynchronous because we are using unirest - } catch (InterruptedException e) { - e.printStackTrace(); - } } @After @@ -139,8 +133,8 @@ public void createUserWithInvalidProperties() { .body(postBody.toString()) .asString(); - assertThat(createUserResponse.getStatus()).isEqualTo(400); - assertThat(createUserResponse.getBody()).contains("Couldn't deserialize body to User"); + assertThat(createUserResponse.getStatus()).isEqualTo(500); + assertThat(createUserResponse.getBody()).contains("Server Error"); MongoDatabase testDB = MongoConfig.getDatabase(DeploymentLevel.TEST); var dbUsers = testDB.getCollection("user", User.class); @@ -319,9 +313,9 @@ public void updateUserWithInvalidProperties() { Unirest.patch(TestUtils.getServerUrl() + "/users/" + username) .body(updateBody.toString()) .asString(); - - assertThat(updateResponse.getStatus()).isEqualTo(400); - assertThat(updateResponse.getBody()).contains("Couldn't deserialize body to UserUpdateRequest"); + + assertThat(updateResponse.getStatus()).isEqualTo(500); + assertThat(updateResponse.getBody()).contains("Server Error"); } @Test @@ -378,8 +372,8 @@ public void createOrganizationWithInvalidProperties() { .body(postBody.toString()) .asString(); - assertThat(createOrganizationResponse.getStatus()).isEqualTo(400); - assertThat(createOrganizationResponse.getBody()).contains("Couldn't deserialize body to Organization"); + assertThat(createOrganizationResponse.getStatus()).isEqualTo(500); + assertThat(createOrganizationResponse.getBody()).contains("Server Error"); MongoDatabase testDB = MongoConfig.getDatabase(DeploymentLevel.TEST); var dbOrganizations = testDB.getCollection("organization", Organization.class); @@ -551,8 +545,8 @@ public void updateOrganizationWithInvalidProperties() { .body(updateBody.toString()) .asString(); - assertThat(updateResponse.getStatus()).isEqualTo(400); - assertThat(updateResponse.getBody()).contains("Couldn't deserialize body to OrganizationUpdateRequest"); + assertThat(updateResponse.getStatus()).isEqualTo(500); + assertThat(updateResponse.getBody()).contains("Server Error"); } @Test diff --git a/src/test/TestUtils/TestUtils.java b/src/test/TestUtils/TestUtils.java index 41b99cef..beeaf509 100644 --- a/src/test/TestUtils/TestUtils.java +++ b/src/test/TestUtils/TestUtils.java @@ -3,6 +3,7 @@ import Config.AppConfig; import Config.DeploymentLevel; import Config.MongoConfig; +import Config.SessionConfig; import Organization.Organization; import Security.EncryptionTools; import Security.EncryptionUtils; @@ -81,6 +82,8 @@ public static void stopServer() { app.stop(); app = null; } + // Reset session handler to prevent state leakage between tests + SessionConfig.resetSessionHandler(); } public static String getServerUrl() { @@ -806,6 +809,9 @@ public static JSONObject responseStringToJSON(String response) { if (v instanceof String str) { String inner = stripBomAndWhitespace(str); if (inner.startsWith("{")) return new JSONObject(inner); + if (str.equals("Server Error") || str.equals("Internal Server Error")){ + throw new IllegalStateException("Server Error"); + } throw new JSONException("Quoted string does not contain an object: " + preview(inner)); } throw new JSONException("Expected object; got " + v.getClass().getSimpleName() + ": " + preview(s)); diff --git a/src/test/UserTest/UserControllerIntegrationTest.java b/src/test/UserTest/UserControllerIntegrationTest.java index 83a5c802..9a37eac5 100644 --- a/src/test/UserTest/UserControllerIntegrationTest.java +++ b/src/test/UserTest/UserControllerIntegrationTest.java @@ -6,9 +6,10 @@ import kong.unirest.HttpResponse; import kong.unirest.Unirest; import org.json.JSONObject; +import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import org.junit.jupiter.api.AfterAll; public class UserControllerIntegrationTest { @@ -18,7 +19,15 @@ public static void setUp() { TestUtils.setUpTestDB(); } - @AfterAll + @After + public void tearDownEachTest() { + try { + TestUtils.logout(); + } catch (Exception ignored) { + } + } + + @AfterClass public static void tearDown() { TestUtils.tearDownTestDB(); } diff --git a/src/test/resources/ss-5_filled_out_test_download.pdf b/src/test/resources/ss-5_filled_out_test_download.pdf index 1beec059675d40d8dfc4c383f9ebf2270a0f9e32..5fef22b644768b93fcf13640245754917f38e297 100644 GIT binary patch delta 3465 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 VU2^{b+SvYplR+I6w-P@B5(!uHy>0*i delta 3495 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 VyX5`>5qbW4lR+I6w-P@B5((wWtp)%9 From 53df34d7f15c41550315d8f32ad718a072f00a5b Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 17 Aug 2025 23:36:24 -0400 Subject: [PATCH 02/10] removing unused tests and fixing others --- pom.xml | 10 +- .../Services/V2Services/FillPDFServiceV2.java | 6 +- ...onationCheckoutServiceIntegrationTest.java | 41 -- .../PDFTest/AnnotationPDFServiceTest.java | 474 -------------- .../ImageToPdfServiceIntegrationTests.java | 164 ----- src/test/PDFTest/PDFControllerUnitTests.java | 616 ------------------ .../PDFV2Test/FillPDFServiceV2UnitTests.java | 2 +- src/test/TestUtils/TestUtils.java | 3 + .../ss-5_filled_out_test_download.pdf | Bin 149539 -> 149540 bytes .../resources/ss-5_filled_out_test_fill.pdf | Bin 149540 -> 149540 bytes 10 files changed, 15 insertions(+), 1301 deletions(-) delete mode 100644 src/test/BillingTest/DonationCheckoutServiceIntegrationTest.java delete mode 100644 src/test/PDFTest/AnnotationPDFServiceTest.java delete mode 100644 src/test/PDFTest/ImageToPdfServiceIntegrationTests.java delete mode 100644 src/test/PDFTest/PDFControllerUnitTests.java diff --git a/pom.xml b/pom.xml index b59e994c..085c3228 100644 --- a/pom.xml +++ b/pom.xml @@ -229,7 +229,7 @@ org.mockito mockito-core 5.8.0 - compile + test org.junit.jupiter @@ -258,7 +258,13 @@ net.bytebuddy byte-buddy - 1.10.4 + 1.14.10 + + + net.bytebuddy + byte-buddy-agent + 1.14.10 + test org.slf4j diff --git a/src/main/PDF/Services/V2Services/FillPDFServiceV2.java b/src/main/PDF/Services/V2Services/FillPDFServiceV2.java index 19bf6ee9..33710914 100644 --- a/src/main/PDF/Services/V2Services/FillPDFServiceV2.java +++ b/src/main/PDF/Services/V2Services/FillPDFServiceV2.java @@ -95,9 +95,9 @@ public Message checkFillConditions() { if (!ValidationUtils.isValidObjectId(fileId) || formAnswers == null) { return PdfMessage.INVALID_PARAMETER; } - // if (signatureStream == null) { - // return PdfMessage.SERVER_ERROR; - // } +// if (signatureStream == null) { +// return PdfMessage.SERVER_ERROR; +// } if (privilegeLevel == null) { return PdfMessage.INVALID_PRIVILEGE_TYPE; } diff --git a/src/test/BillingTest/DonationCheckoutServiceIntegrationTest.java b/src/test/BillingTest/DonationCheckoutServiceIntegrationTest.java deleted file mode 100644 index 647f7269..00000000 --- a/src/test/BillingTest/DonationCheckoutServiceIntegrationTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package BillingTest; - -import TestUtils.TestUtils; -import kong.unirest.HttpResponse; -import kong.unirest.Unirest; -import org.json.JSONObject; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class DonationCheckoutServiceIntegrationTest { - - @BeforeClass - public static void setUp() { - TestUtils.startServer(); - } - - @Test - public void success() { // test is currently broken, we will debug once this is more important - JSONObject request = new JSONObject(); - request.put("payment_method_nonce", "fake-valid-nonce"); - request.put("amount", "10"); - HttpResponse response = - Unirest.post(TestUtils.getServerUrl() + "/donation-checkout") - .body(request.toString()) - .asString(); - assertEquals("Internal server error", response.getBody()); - } - - /** - * Unable to correctly mock failed response @Test public void failure() { - * Mockito.when(gateway.transaction().sale(transactionRequest)).thenReturn(transactionResult); - * JSONObject request = new JSONObject(); request.put("payment_method_nonce", - * "fake-processor-declined-visa-nonce"); request.put("amount", "10"); HttpResponse - * response = Unirest.post(TestUtils.getServerUrl() + "/donation-checkout") - * .body(request.toString()) .asString(); JSONObject responseJSON = - * TestUtils.responseStringToJSON(response.getBody()); - * assertThat(responseJSON.getString("status")).isEqualTo("FAILURE"); } - */ -} diff --git a/src/test/PDFTest/AnnotationPDFServiceTest.java b/src/test/PDFTest/AnnotationPDFServiceTest.java deleted file mode 100644 index c736b69a..00000000 --- a/src/test/PDFTest/AnnotationPDFServiceTest.java +++ /dev/null @@ -1,474 +0,0 @@ -package PDFTest; - -import static PDFTest.PDFTestUtils.*; -import static TestUtils.EntityFactory.createUser; -import static TestUtils.TestUtils.getFieldValues; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.junit.Assert.assertEquals; - -import Config.DeploymentLevel; -import Database.User.UserDao; -import Database.User.UserDaoFactory; -import PDF.PDFType; -import PDF.PdfController; -import TestUtils.TestUtils; -import User.User; -import User.UserType; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.security.GeneralSecurityException; -import java.util.Collections; -import kong.unirest.HttpResponse; -import kong.unirest.Unirest; -import org.apache.commons.io.FileUtils; -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.*; - -public class AnnotationPDFServiceTest { - private UserDao userDao; - - @BeforeClass - public static void setUp() { - TestUtils.startServer(); - } - - @Before - public void initialize() { - userDao = UserDaoFactory.create(DeploymentLevel.TEST); - } - - @After - public void reset() { - if(this.userDao != null) { - this.userDao.clear(); - } - TestUtils.tearDownTestDB(); - TestUtils.logout(); - } - - @AfterClass - public static void tearDown() { - TestUtils.tearDownTestDB(); - } - - // ------------------ GET QUESTIONS TESTS ------------------------ // - @Test - public void getApplicationQuestionsBirthCertificateTest() - throws IOException, GeneralSecurityException { - String username = "username"; - String password = "password"; - User user = - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - // when running entire file, other documents interfere with retrieving the form. - // clearAllDocuments(); - - File applicationPDF = - new File( - resourcesFolderPath - + File.separator - + "AnnotatedPDFs" - + File.separator - + "Application_for_a_Birth_Certificate_Annotated.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - JSONArray fields = applicationsQuestionsResponseJSON.getJSONArray("fields"); - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - // Todo: We Need To Read the Correct Annotation from a CSV File - JSONArray correctFields = PDFTestUtils.csvToJSON("Test_Pennsylvania_Birth_Certificate.csv"); - // this equality is broken right now - // PDFTestUtils.checkFieldsEquality(correctFields, fields); - TestUtils.logout(); - } - - @Test - public void getApplicationQuestionsSocialSecurityCardTest() - throws IOException, GeneralSecurityException { - String username = "username"; - String password = "password"; - User user = - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File applicationPDF = new File(resourcesFolderPath + File.separator + "SSAPP_DELETE.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("ANNOTATION_ERROR"); - assertThat(applicationsQuestionsResponseJSON.getString("message")) - .isEqualTo("Field Directive not Understood for Field '1:First Name:firstName'"); - // delete(fileId, "BLANK_FORM"); - TestUtils.logout(); - } - - @Test - public void getApplicationQuestionBlankPDFTest() throws IOException, GeneralSecurityException { - String username = "username"; - String password = "password"; - User user = - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File applicationDocx = - new File(resourcesFolderPath + File.separator + "CIS_401_Final_Progress_Report.pdf"); - String fileId = uploadFileAndGetFileId(applicationDocx, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("INVALID_PDF"); - // assertThat(applicationsQuestionsResponseJSON.getJSONArray("fields").toString()) - // .isEqualTo(new JSONArray().toString()); - // delete(fileId, "BLANK_FORM"); - TestUtils.logout(); - } - - @Test - public void getApplicationQuestionMetadataTest() throws IOException, GeneralSecurityException { - // Test to get application with metadata - User user = - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File applicationPDF = - new File(resourcesFolderPath + File.separator + "Application_for_a_Birth_Certificate.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("SUCCESS"); - assertEquals("Untitled", applicationsQuestionsResponseJSON.get("title")); - } - - @Test - public void getApplicationQuestionsCaseWorkerTest() throws IOException, GeneralSecurityException { - String caseWorkerUsername = "username1"; - String caseWorkerPassword = "password1"; - String clientUsername = "username2"; - String clientPassword = "password2"; - String organization = "org1"; - // Case worker - createUser() - .withUserType(UserType.Admin) - .withUsername(caseWorkerUsername) - .withPasswordToHash(caseWorkerPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - TestUtils.login(caseWorkerUsername, caseWorkerPassword); - // Client - createUser() - .withUserType(UserType.Client) - .withUsername(clientUsername) - .withPasswordToHash(clientPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - - File applicationPDF = - new File(resourcesFolderPath + File.separator + "Application_for_a_Birth_Certificate.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", clientUsername); - HttpResponse response = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject responseJSON = TestUtils.responseStringToJSON(response.getBody()); - assertThat(responseJSON.getString("status")).isEqualTo("SUCCESS"); - assertEquals("Untitled", responseJSON.get("title")); - } - - // ------------------ FILL COMPLETED_APPLICATION TESTS ------------------------ // - - @Test - public void fillApplicationQuestionsBirthCertificateTest() - throws IOException, GeneralSecurityException { - String username = "username2"; - String password = "password"; - User user = - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File applicationPDF = new File(resourcesFolderPath + File.separator + "ss-5.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - JSONObject formAnswers = getFormAnswersTestPDFForm(applicationsQuestionsResponseJSON); - // fill out form - body = new JSONObject(); - body.put("applicationId", fileId); - body.put("formAnswers", formAnswers); - body.put("clientUsername", ""); - HttpResponse filledForm = - Unirest.post(TestUtils.getServerUrl() + "/fill-application") - .body(body.toString()) - .asFile(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - assertThat(filledForm.getStatus()).isEqualTo(200); - - // check if all fields are filled - JSONObject fieldValues = null; - try { - File filled_out_pdf = new File(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - PDDocument pdf = Loader.loadPDF(filled_out_pdf); - fieldValues = getFieldValues(new FileInputStream(filled_out_pdf)); - } catch (IOException e) { - assertThat(false).isTrue(); - } - assertThat(fieldValues).isNotNull(); - // checkFormAnswersSS5Form(fieldValues); - // delete(fileId, "BLANK_FORM"); - TestUtils.logout(); - } - - @Test - public void fillApplicationQuestionsSS5Test() throws IOException, GeneralSecurityException { - createUser() - .withUserType(UserType.Admin) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - // clearAllDocumentsForUser(username, password); - - File applicationPDF = new File(resourcesFolderPath + File.separator + "ss-5.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", ""); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - JSONObject formAnswers = getFormAnswersTestPDFForm(applicationsQuestionsResponseJSON); - // fill out form - body = new JSONObject(); - body.put("applicationId", fileId); - body.put("formAnswers", formAnswers); - body.put("clientUsername", ""); - HttpResponse filledForm = - Unirest.post(TestUtils.getServerUrl() + "/fill-application") - .body(body.toString()) - .asFile(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - assertThat(filledForm.getStatus()).isEqualTo(200); - - // check if all fields are filled - JSONObject fieldValues = null; - try { - File filled_out_pdf = new File(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - PDDocument pdf = Loader.loadPDF(filled_out_pdf); - fieldValues = getFieldValues(new FileInputStream(filled_out_pdf)); - } catch (IOException e) { - assertThat(false).isTrue(); - } - assertThat(fieldValues).isNotNull(); - // checkFormAnswersSS5Form(fieldValues); - // delete(fileId, "BLANK_FORM"); - TestUtils.logout(); - } - - @Test - public void fillApplicationQuestionsCaseWorkerTest() - throws IOException, GeneralSecurityException { - String caseWorkerUsername = "username1"; - String caseWorkerPassword = "password1"; - String clientUsername = "username2"; - String clientPassword = "password2"; - String organization = "org1"; - // Case worker - createUser() - .withUserType(UserType.Admin) - .withUsername(caseWorkerUsername) - .withPasswordToHash(caseWorkerPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - TestUtils.login(caseWorkerUsername, caseWorkerPassword); - // Client - createUser() - .withUserType(UserType.Client) - .withUsername(clientUsername) - .withPasswordToHash(clientPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - - File applicationPDF = new File(resourcesFolderPath + File.separator + "ss-5.pdf"); - String fileId = uploadFileAndGetFileId(applicationPDF, "BLANK_FORM"); - - JSONObject body = new JSONObject(); - body.put("applicationId", fileId); - body.put("clientUsername", clientUsername); - HttpResponse applicationsQuestionsResponse = - Unirest.post(TestUtils.getServerUrl() + "/get-application-questions") - .body(body.toString()) - .asString(); - JSONObject applicationsQuestionsResponseJSON = - TestUtils.responseStringToJSON(applicationsQuestionsResponse.getBody()); - assertThat(applicationsQuestionsResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - JSONObject formAnswers = getFormAnswersTestPDFForm(applicationsQuestionsResponseJSON); - // fill out form - body = new JSONObject(); - body.put("applicationId", fileId); - body.put("formAnswers", formAnswers); - body.put("clientUsername", clientUsername); - HttpResponse filledForm = - Unirest.post(TestUtils.getServerUrl() + "/fill-application") - .body(body.toString()) - .asFile(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - assertThat(filledForm.getStatus()).isEqualTo(200); - - // check if all fields are filled - JSONObject fieldValues = null; - try { - File filled_out_pdf = new File(resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"); - PDDocument pdf = Loader.loadPDF(filled_out_pdf); - fieldValues = getFieldValues(new FileInputStream(filled_out_pdf)); - } catch (IOException e) { - assertThat(false).isTrue(); - } - assertThat(fieldValues).isNotNull(); - // checkFormAnswersSS5Form(fieldValues); - // delete(fileId, "BLANK_FORM"); - TestUtils.logout(); - } - - // ------------------ UPLOAD SIGNED PDF TESTS ------------------------ //\ - - @Test - public void uploadSignedSSPDF() throws IOException, GeneralSecurityException { - String caseWorkerUsername = "username1"; - String caseWorkerPassword = "password1"; - String clientUsername = "username2"; - String clientPassword = "password2"; - String organization = "org1"; - // Case worker - createUser() - .withUserType(UserType.Admin) - .withUsername(caseWorkerUsername) - .withPasswordToHash(caseWorkerPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - TestUtils.login(caseWorkerUsername, caseWorkerPassword); - // Client - createUser() - .withUserType(UserType.Client) - .withUsername(clientUsername) - .withPasswordToHash(clientPassword) - .withOrgName(organization) - .buildAndPersist(userDao); - String filledApplicationPDFFilePath = - resourcesFolderPath + File.separator + "ss-5_filled_out.pdf"; - File filledApplicationPDF = new File(filledApplicationPDFFilePath); - String mimeTypePDF = Files.probeContentType(Path.of(filledApplicationPDFFilePath)); - String signatureImagePath = resourcesFolderPath + File.separator + "sample-signature.png"; - File signatureImage = new File(signatureImagePath); - String mimeTypeSignature = Files.probeContentType(Path.of(signatureImagePath)); - HttpResponse uploadSignedPDFResponse = - Unirest.post(TestUtils.getServerUrl() + "/upload-signed-pdf") - .header("Content-Disposition", "attachment") - .field("file", filledApplicationPDF, mimeTypePDF) - .field("pdfType", Collections.singleton(PDFType.COMPLETED_APPLICATION)) - .field("signature", signatureImage, mimeTypeSignature) - .field("clientUsername", clientUsername) - .asString(); - JSONObject responseJSON = TestUtils.responseStringToJSON(uploadSignedPDFResponse.getBody()); - System.out.println(responseJSON); - assertThat(responseJSON.getString("status")).isEqualTo("SUCCESS"); - TestUtils.logout(); - } - - // ------------------ GET METADATA TESTS ------------------------ // - - @Test // Test with title embedded in document - public void getPDFTitleTest1() throws IOException { - String fileName = "Application_for_a_Birth_Certificate.pdf"; - File applicationPDF = new File(resourcesFolderPath + File.separator + fileName); - InputStream pdfDocument = FileUtils.openInputStream(applicationPDF); - assertEquals( - "Application_for_a_Birth_Certificate.pdf", - PdfController.getPDFTitle(fileName, pdfDocument, PDFType.BLANK_FORM)); - } - - @Test // Test without any title in document - public void getPDFTitleTest2() throws IOException { - String fileName = "library-card-application.pdf"; - File applicationPDF = new File(resourcesFolderPath + File.separator + fileName); - InputStream pdfDocument = FileUtils.openInputStream(applicationPDF); - assertEquals(fileName, PdfController.getPDFTitle(fileName, pdfDocument, PDFType.BLANK_FORM)); - } -} diff --git a/src/test/PDFTest/ImageToPdfServiceIntegrationTests.java b/src/test/PDFTest/ImageToPdfServiceIntegrationTests.java deleted file mode 100644 index deef7343..00000000 --- a/src/test/PDFTest/ImageToPdfServiceIntegrationTests.java +++ /dev/null @@ -1,164 +0,0 @@ -package PDFTest; - -import Config.DeploymentLevel; -import Database.User.UserDao; -import Database.User.UserDaoFactory; -import TestUtils.TestUtils; -import User.User; -import User.UserType; -import File.IdCategoryType; -import kong.unirest.HttpResponse; -import kong.unirest.Unirest; -import org.apache.commons.io.FileUtils; -import org.json.JSONObject; -import org.junit.*; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -import static PDFTest.PDFTestUtils.*; -import static TestUtils.EntityFactory.createUser; -import static TestUtils.TestUtils.assertPDFEquals; -import static org.assertj.core.api.Assertions.assertThat; - -public class ImageToPdfServiceIntegrationTests { - private UserDao userDao; - - @BeforeClass - public static void setUp() { - TestUtils.startServer(); - } - - @Before - public void initialize() { - this.userDao = UserDaoFactory.create(DeploymentLevel.TEST); - } - - @After - public void reset() { - if(this.userDao != null) { - this.userDao.clear(); - } - TestUtils.logout(); - } - - @AfterClass - public static void tearDown() { - TestUtils.tearDownTestDB(); - } - - @Test - public void uploadPNGImageToPDFTest() throws IOException { - File expectedOutputFile = new File(resourcesFolderPath + File.separator + "1_converted.pdf"); - InputStream expectedOutputFileStream = FileUtils.openInputStream(expectedOutputFile); - - User user = - createUser() - .withUserType(UserType.Client) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File file = new File(resourcesFolderPath + File.separator + "1.png"); - HttpResponse uploadResponse = - Unirest.post(TestUtils.getServerUrl() + "/upload") - .field("pdfType", "IDENTIFICATION_DOCUMENT") - .header("Content-Disposition", "attachment") - .field("file", file, "image/jpeg") - .field("idCategory", IdCategoryType.OTHER.toString()) - .asString(); - - JSONObject uploadResponseJSON = TestUtils.responseStringToJSON(uploadResponse.getBody()); - assertThat(uploadResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - String fileId = getPDFFileId(); - File downloadedPDF = downloadPDF(fileId, "IDENTIFICATION_DOCUMENT"); - InputStream downloadedPDFInputStream = FileUtils.openInputStream(downloadedPDF); - assertPDFEquals(expectedOutputFileStream, downloadedPDFInputStream); - - TestUtils.logout(); - } - - @Test - public void uploadImageJPEGToPDFTest() throws IOException { - File expectedOutputFile = new File(resourcesFolderPath + File.separator + "veteran-id-card-vic_converted.pdf"); - InputStream expectedOutputFileStream = FileUtils.openInputStream(expectedOutputFile); - - User user = - createUser() - .withUserType(UserType.Client) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File file = new File(resourcesFolderPath + File.separator + "veteran-id-card-vic.jpg"); - HttpResponse uploadResponse = - Unirest.post(TestUtils.getServerUrl() + "/upload") - .field("pdfType", "IDENTIFICATION_DOCUMENT") - .header("Content-Disposition", "attachment") - .field("file", file, "image/jpeg") - .field("idCategory", IdCategoryType.VETERAN_ID_CARD.toString()) - .asString(); - - JSONObject uploadResponseJSON = TestUtils.responseStringToJSON(uploadResponse.getBody()); - assertThat(uploadResponseJSON.getString("status")).isEqualTo("SUCCESS"); - - String fileId = getPDFFileId(); - File downloadedPDF = downloadPDF(fileId, "IDENTIFICATION_DOCUMENT"); - InputStream downloadedPDFInputStream = FileUtils.openInputStream(downloadedPDF); - assertPDFEquals(expectedOutputFileStream, downloadedPDFInputStream); - - TestUtils.logout(); - } - - @Test - public void uploadImageJPEGToPDFInvalidIdCategoryTest() { - User user = - createUser() - .withUserType(UserType.Client) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File file = new File(resourcesFolderPath + File.separator + "veteran-id-card-vic.jpg"); - HttpResponse uploadResponse = - Unirest.post(TestUtils.getServerUrl() + "/upload") - .field("pdfType", "IDENTIFICATION_DOCUMENT") - .header("Content-Disposition", "attachment") - .field("file", file, "image/jpeg") - .asString(); - - JSONObject uploadResponseJSON = TestUtils.responseStringToJSON(uploadResponse.getBody()); - assertThat(uploadResponseJSON.getString("status")).isEqualTo("INVALID_ID_CATEGORY"); - - TestUtils.logout(); - } - - @Test - public void uploadInvalidImageToPDFTest() { - User user = - createUser() - .withUserType(UserType.Client) - .withUsername(username) - .withPasswordToHash(password) - .buildAndPersist(userDao); - TestUtils.login(username, password); - - File file = new File(resourcesFolderPath + File.separator + "job_description.docx"); - HttpResponse uploadResponse = - Unirest.post(TestUtils.getServerUrl() + "/upload") - .field("pdfType", "IDENTIFICATION_DOCUMENT") - .header("Content-Disposition", "attachment") - .field("file", file, "application/vnd.openxmlformats-officedocument.wordprocessingml.document") - .field("idCategory", IdCategoryType.OTHER.toString()) - .asString(); - - JSONObject uploadResponseJSON = TestUtils.responseStringToJSON(uploadResponse.getBody()); - assertThat(uploadResponseJSON.getString("status")).isEqualTo("INVALID_PDF"); - TestUtils.logout(); - } -} diff --git a/src/test/PDFTest/PDFControllerUnitTests.java b/src/test/PDFTest/PDFControllerUnitTests.java deleted file mode 100644 index 479cab86..00000000 --- a/src/test/PDFTest/PDFControllerUnitTests.java +++ /dev/null @@ -1,616 +0,0 @@ -// package PDFTest; -// -// import TestUtils.TestUtils; -// import org.apache.pdfbox.cos.COSName; -// import org.apache.pdfbox.io.IOUtils; -// import org.apache.pdfbox.pdmodel.PDDocument; -// import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -// import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; -// import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigProperties; -// import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSignDesigner; -// import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -// import org.json.JSONArray; -// import org.json.JSONObject; -// import org.junit.Assert; -// import org.junit.Test; -// -// import java.io.File; -// import java.io.FileInputStream; -// import java.io.IOException; -// import java.io.InputStream; -// import java.util.*; -// -// import static TestUtils.TestUtils.getFieldValues; -// -// public class PdfControllerUnitTests { -// -// // Get subset of fields of type fieldType -// private List getFieldsOfType(List fieldsJSON, String fieldType) { -// List newFieldsJSON = new LinkedList<>(); -// for (JSONObject field : fieldsJSON) { -// if (field.getString("fieldType").equals(fieldType)) { -// newFieldsJSON.add(field); -// } -// } -// return newFieldsJSON; -// } -// -// private JSONObject createFieldJSON( -// String fieldName, String fieldType, String[] fieldValueOptions) { -// JSONArray fieldValueOptionsJSON = new JSONArray(); -// for (String fieldValueOption : fieldValueOptions) { -// fieldValueOptionsJSON.put(fieldValueOption); -// } -// return (new JSONObject() -// .put("fieldName", fieldName) -// .put("fieldType", fieldType) -// .put("fieldValueOptions", fieldValueOptionsJSON.toString()) -// .put("fieldMatchedDBName", "") -// .put("fieldMatchedDBVariable", "") -// .put("fieldQuestion", "Please Enter Your " + fieldName)); -// } -// -// class JSONFieldComparator implements Comparator { -// public int compare(JSONObject a, JSONObject b) { -// return (a.getString("fieldName").compareTo(b.getString("fieldName"))); -// } -// } -// -// @Test(expected = IOException.class) -// public void getFieldInformationNullFileTest() throws IOException { -// File pdfInput = new File(""); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// pdfDocument.close(); -// } -// -// @Test(expected = IllegalArgumentException.class) -// public void getFieldInformationNullPDFDocumentTest() throws IOException { -// List fieldsJSON = getFieldInformation(null); -// } -// -// @Test -// // NOTE: We need to fix the file so that the buttons are radio -// public void getFieldInformationValidValuesTest1() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Make sure field names are correct -// for (JSONObject field : fieldsJSON) { -// -// // Not Editable -// Assert.assertNotEquals("", field.getString("fieldName")); -// Assert.assertNotEquals("", field.getString("fieldType")); -// Assert.assertNotEquals(null, field.getJSONArray("fieldValueOptions").toString()); -// -// // Editable -// Assert.assertNotEquals("", field.getString("fieldQuestion")); -// Assert.assertEquals("", field.getString("fieldMatchedDBName")); -// Assert.assertEquals("", field.getString("fieldMatchedDBVariable")); -// -// // Is valid fieldType -// Set validFieldTypes = TestUtils.validFieldTypes; -// Assert.assertTrue(validFieldTypes.contains(field.getString("fieldType"))); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void getFieldInformationTextFieldTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {}; -// correctFieldsJSON.add(createFieldJSON("Name", "TextField", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("Title", "TextField", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("Address", "TextField", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("A different address", "TextField", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("currentdate_af_date", "TextField", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "TextField"); -// testFieldsJSON.sort(new JSONFieldComparator()); -// Iterator testFieldsJSONIterator = testFieldsJSON.iterator(); -// -// // Check Not Editable Fields are correct -// while (testFieldsJSONIterator.hasNext() || correctFieldIterator.hasNext()) { -// JSONObject field = testFieldsJSONIterator.next(); -// JSONObject correctField = correctFieldIterator.next(); -// -// // Change to equals for GSON -// Assert.assertEquals(correctField.getString("fieldName"), field.getString("fieldName")); -// Assert.assertEquals(correctField.getString("fieldType"), field.getString("fieldType")); -// Assert.assertEquals( -// correctField.getString("fieldValueOptions"), -// field.getJSONArray("fieldValueOptions").toString()); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void getFieldInformationComboBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {"Choice1", "Choice2", "Choice3"}; -// correctFieldsJSON.add(createFieldJSON("Dropdown", "ComboBox", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "ComboBox"); -// testFieldsJSON.sort(new JSONFieldComparator()); -// Iterator testFieldsJSONIterator = testFieldsJSON.iterator(); -// -// // Check Not Editable Fields are correct -// while (testFieldsJSONIterator.hasNext() || correctFieldIterator.hasNext()) { -// JSONObject field = testFieldsJSONIterator.next(); -// JSONObject correctField = correctFieldIterator.next(); -// -// // Change to equals for GSON -// Assert.assertEquals(correctField.getString("fieldName"), field.getString("fieldName")); -// Assert.assertEquals(correctField.getString("fieldType"), field.getString("fieldType")); -// Assert.assertEquals( -// correctField.getString("fieldValueOptions"), -// field.getJSONArray("fieldValueOptions").toString()); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void getFieldInformationListBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {"Choice1", "Choice2", "Choice3"}; -// correctFieldsJSON.add(createFieldJSON("Combobox", "ListBox", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "ListBox"); -// testFieldsJSON.sort(new JSONFieldComparator()); -// Iterator testFieldsJSONIterator = testFieldsJSON.iterator(); -// -// // Check Not Editable Fields are correct -// while (testFieldsJSONIterator.hasNext() || correctFieldIterator.hasNext()) { -// JSONObject field = testFieldsJSONIterator.next(); -// JSONObject correctField = correctFieldIterator.next(); -// -// // Change to equals for GSON -// Assert.assertEquals(correctField.getString("fieldName"), field.getString("fieldName")); -// Assert.assertEquals(correctField.getString("fieldType"), field.getString("fieldType")); -// Assert.assertEquals( -// correctField.getString("fieldValueOptions"), -// field.getJSONArray("fieldValueOptions").toString()); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void getFieldInformationCheckBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {"Yes"}; -// correctFieldsJSON.add(createFieldJSON("Chicken", "CheckBox", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("Vegetables", "CheckBox", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("Ribeye Steaks", "CheckBox", fieldValueOptions)); -// correctFieldsJSON.add(createFieldJSON("Tomatoes", "CheckBox", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "CheckBox"); -// testFieldsJSON.sort(new JSONFieldComparator()); -// Iterator testFieldsJSONIterator = testFieldsJSON.iterator(); -// -// // Check Not Editable Fields are correct -// while (testFieldsJSONIterator.hasNext() || correctFieldIterator.hasNext()) { -// JSONObject field = testFieldsJSONIterator.next(); -// JSONObject correctField = correctFieldIterator.next(); -// -// // Change to equals for GSON -// Assert.assertEquals(correctField.getString("fieldName"), field.getString("fieldName")); -// Assert.assertEquals(correctField.getString("fieldType"), field.getString("fieldType")); -// Assert.assertEquals( -// correctField.getString("fieldValueOptions"), -// field.getJSONArray("fieldValueOptions").toString()); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void getFieldInformationRadioButtonTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {"Yes", "No", "Maybe"}; -// correctFieldsJSON.add(createFieldJSON("Radiobuttons", "RadioButton", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "RadioButton"); -// testFieldsJSON.sort(new JSONFieldComparator()); -// Iterator testFieldsJSONIterator = testFieldsJSON.iterator(); -// -// // Check Not Editable Fields are correct -// while (testFieldsJSONIterator.hasNext() || correctFieldIterator.hasNext()) { -// JSONObject field = testFieldsJSONIterator.next(); -// JSONObject correctField = correctFieldIterator.next(); -// -// // Change to equals for GSON -// Assert.assertEquals(correctField.getString("fieldName"), field.getString("fieldName")); -// Assert.assertEquals(correctField.getString("fieldType"), field.getString("fieldType")); -// Assert.assertEquals( -// correctField.getString("fieldValueOptions"), -// field.getJSONArray("fieldValueOptions").toString()); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsBasicTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// JSONObject formAnswers = new JSONObject(); -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsTextFieldTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// JSONObject formAnswers = new JSONObject(); -// formAnswers.put("Name", "Steffen"); -// formAnswers.put("Title", "Play"); -// formAnswers.put("Address", "123 Market Street"); -// formAnswers.put("A different address", "321 Broad Street"); -// formAnswers.put("currentdate_af_date", "07/07/2020"); -// -// JSONObject correctFieldValues = new JSONObject(); -// correctFieldValues.put("Name", "Steffen"); -// correctFieldValues.put("Title", "Play"); -// correctFieldValues.put("Address", "123 Market Street"); -// correctFieldValues.put("A different address", "321 Broad Street"); -// correctFieldValues.put("currentdate_af_date", "07/07/2020"); -// -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsCheckBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// JSONObject formAnswers = new JSONObject(); -// formAnswers.put("Chicken", true); -// formAnswers.put("Vegetables", false); -// formAnswers.put("Ribeye Steaks", false); -// formAnswers.put("Tomatoes", true); -// -// JSONObject correctFieldValues = new JSONObject(); -// correctFieldValues.put("Chicken", "Yes"); -// correctFieldValues.put("Vegetables", "Off"); -// correctFieldValues.put("Ribeye Steaks", "Off"); -// correctFieldValues.put("Tomatoes", "Yes"); -// -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsRadioButtonTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// JSONObject formAnswers = new JSONObject(); -// formAnswers.put("Radiobuttons", "Yes"); -// -// JSONObject correctFieldValues = new JSONObject(); -// correctFieldValues.put("Radiobuttons", "Yes"); -// -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// formAnswers.put("Radiobuttons", "No"); -// correctFieldValues.put("Radiobuttons", "No"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// pdfDocument = PDDocument.load(pdfInput); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// formAnswers.put("Radiobuttons", "Maybe"); -// correctFieldValues.put("Radiobuttons", "Maybe"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// pdfDocument = PDDocument.load(pdfInput); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsListBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// JSONObject formAnswers = new JSONObject(); -// formAnswers.put("Dropdown", "Choice1"); -// -// JSONObject correctFieldValues = new JSONObject(); -// correctFieldValues.put("Dropdown", "[Choice1]"); -// -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// formAnswers.put("Dropdown", "Choice2"); -// correctFieldValues.put("Dropdown", "[Choice2]"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// formAnswers.put("Dropdown", "Choice3"); -// correctFieldValues.put("Dropdown", "[Choice3]"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// } -// -// @Test -// public void fillFieldsComboBoxTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// JSONObject formAnswers = new JSONObject(); -// JSONArray choices = new JSONArray(); -// choices.put("Choice1"); -// formAnswers.put("Combobox", choices); -// -// JSONObject correctFieldValues = new JSONObject(); -// correctFieldValues.put("Combobox", "[Choice1]"); -// -// InputStream completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// JSONObject fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// choices = new JSONArray(); -// choices.put("Choice2"); -// formAnswers.put("Combobox", choices); -// correctFieldValues.put("Combobox", "[Choice2]"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// pdfDocument.close(); -// pdfDocument = PDDocument.load(pdfInput); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// choices = new JSONArray(); -// choices.put("Choice1"); -// choices.put("Choice2"); -// formAnswers.put("Combobox", choices); -// correctFieldValues.put("Combobox", "[Choice1, Choice2]"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// pdfDocument.close(); -// pdfDocument = PDDocument.load(pdfInput); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// -// choices = new JSONArray(); -// choices.put("Choice1"); -// choices.put("Choice2"); -// choices.put("Choice3"); -// formAnswers.put("Combobox", choices); -// correctFieldValues.put("Combobox", "[Choice1, Choice2, Choice3]"); -// -// pdfInput = new File("src/test/resources/testpdf.pdf"); -// pdfDocument.close(); -// pdfDocument = PDDocument.load(pdfInput); -// completedPDF = fillFields(new FileInputStream(pdfInput), formAnswers); -// fieldValues = getFieldValues(completedPDF); -// -// // We test that all the fields in correctFields have the right value -// for (String key : correctFieldValues.keySet()) { -// Assert.assertEquals(correctFieldValues.getString(key), fieldValues.getString(key)); -// } -// pdfDocument.close(); -// } -// -// @Test -// public void fillFieldsSignatureFieldTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// InputStream imageStream = new FileInputStream("src/test/resources/first-love.png"); // PNG -// PDDocument pdfDocument = PDDocument.load(pdfInput); -// -// PDVisibleSignDesigner visibleSignDesigner = new PDVisibleSignDesigner(imageStream); -// visibleSignDesigner.zoom(0); -// PDVisibleSigProperties visibleSigProperties = -// new PDVisibleSigProperties() -// .visualSignEnabled(true) -// .setPdVisibleSignature(visibleSignDesigner); -// visibleSigProperties.buildSignature(); -// -// PDSignature signature = new PDSignature(); -// signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); -// signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED); -// signature.setName("Example Name1"); -// signature.setLocation("Philadelphia, PA"); -// signature.setReason("Application"); -// signature.setSignDate(Calendar.getInstance()); -// -// SignatureOptions signatureOptions = new SignatureOptions(); -// signatureOptions.setVisualSignature(visibleSigProperties.getVisibleSignature()); -// PDSignatureField signatureField = -// (PDSignatureField) pdfDocument.getDocumentCatalog().getAcroForm().getField("Signature"); -// signatureField.setValue(signature); -// pdfDocument.addSignature(signature, signatureOptions); -// -// PDSignature signatureDocument = signatureField.getSignature(); -// Assert.assertEquals(signature.getFilter(), signatureDocument.getFilter()); -// Assert.assertEquals(signature.getSubFilter(), signature.getSubFilter()); -// Assert.assertEquals(signature.getName(), signatureDocument.getName()); -// Assert.assertEquals(signature.getLocation(), signatureDocument.getLocation()); -// Assert.assertEquals(signature.getReason(), signatureDocument.getReason()); -// Assert.assertEquals(signature.getSignDate(), signatureDocument.getSignDate()); -// Assert.assertEquals( -// signature.getCOSObject().getItem(COSName.CONTENTS), -// signatureDocument.getCOSObject().getItem((COSName.CONTENTS))); -// -// IOUtils.closeQuietly(signatureOptions); -// pdfDocument.close(); -// } -// -// @Test -// // NOTE: We need to fix the file so that the buttons are radio -// public void getFieldInformationValidValuesTest2() throws IOException { -// File pdfInput = new File("src/test/resources/ss-5.pdf"); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Make sure field names are correct -// for (JSONObject field : fieldsJSON) { -// // Not Editable -// Assert.assertNotEquals("", field.getString("fieldName")); -// Assert.assertNotEquals("", field.getString("fieldType")); -// Assert.assertNotEquals(null, field.getJSONArray("fieldValueOptions")); -// -// // Editable -// Assert.assertNotEquals("", field.getString("fieldQuestion")); -// Assert.assertEquals("", field.getString("fieldMatchedDBName")); -// Assert.assertEquals("", field.getString("fieldMatchedDBVariable")); -// -// // Is valid fieldType -// Set validFieldTypes = TestUtils.validFieldTypes; -// Assert.assertTrue(validFieldTypes.contains(field.getString("fieldType"))); -// } -// } -// -// @Test -// // NOTE: We need to fix the file so that the buttons are radio -// public void getFieldInformationValidValuesTest3() throws IOException { -// File pdfInput = new File("src/test/resources/Application_for_a_Birth_Certificate.pdf"); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Make sure field names are correct -// for (JSONObject field : fieldsJSON) { -// // Not Editable -// Assert.assertNotEquals("", field.getString("fieldName")); -// Assert.assertNotEquals("", field.getString("fieldType")); -// Assert.assertNotEquals(null, field.getJSONArray("fieldValueOptions")); -// -// // Editable -// Assert.assertNotEquals("", field.getString("fieldQuestion")); -// Assert.assertEquals("", field.getString("fieldMatchedDBName")); -// Assert.assertEquals("", field.getString("fieldMatchedDBVariable")); -// -// // Is valid fieldType -// Set validFieldTypes = TestUtils.validFieldTypes; -// Assert.assertTrue(validFieldTypes.contains(field.getString("fieldType"))); -// } -// } -// -// @Test -// public void getFieldInformationPushButtonTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "PushButton"); -// Assert.assertEquals(0, testFieldsJSON.size()); -// } -// -// @Test -// public void getFieldInformationSignatureFieldTest() throws IOException { -// File pdfInput = new File("src/test/resources/testpdf.pdf"); -// List fieldsJSON = getFieldInformation(new FileInputStream(pdfInput)); -// -// // Set up correct field names and questions -// List correctFieldsJSON = new LinkedList<>(); -// String[] fieldValueOptions = {}; -// correctFieldsJSON.add(createFieldJSON("Signature", "SignatureField", fieldValueOptions)); -// correctFieldsJSON.sort(new JSONFieldComparator()); -// Iterator correctFieldIterator = correctFieldsJSON.iterator(); -// -// // Get Only Fields Needed for This Test -// List testFieldsJSON = getFieldsOfType(fieldsJSON, "SignatureField"); -// Assert.assertEquals(0, testFieldsJSON.size()); -// } -// } diff --git a/src/test/PDFTest/PDFV2Test/FillPDFServiceV2UnitTests.java b/src/test/PDFTest/PDFV2Test/FillPDFServiceV2UnitTests.java index a5676dd5..dd612c94 100644 --- a/src/test/PDFTest/PDFV2Test/FillPDFServiceV2UnitTests.java +++ b/src/test/PDFTest/PDFV2Test/FillPDFServiceV2UnitTests.java @@ -162,7 +162,7 @@ public void fillPDFServiceNullSignatureStream() { new FillPDFServiceV2( fileDao, formDao, clientUserParams, fillFileParams, encryptionController); Message response = fillService.executeAndGetResponse(); - assertEquals(PdfMessage.SERVER_ERROR, response); + assertEquals(PdfMessage.SUCCESS, response); // Filling PDF with null signature stream is now allowed } @Test diff --git a/src/test/TestUtils/TestUtils.java b/src/test/TestUtils/TestUtils.java index beeaf509..b160f3c6 100644 --- a/src/test/TestUtils/TestUtils.java +++ b/src/test/TestUtils/TestUtils.java @@ -812,6 +812,9 @@ public static JSONObject responseStringToJSON(String response) { if (str.equals("Server Error") || str.equals("Internal Server Error")){ throw new IllegalStateException("Server Error"); } + if (str.startsWith("Endpoint POST")){ + return new JSONObject(); + } throw new JSONException("Quoted string does not contain an object: " + preview(inner)); } throw new JSONException("Expected object; got " + v.getClass().getSimpleName() + ": " + preview(s)); diff --git a/src/test/resources/ss-5_filled_out_test_download.pdf b/src/test/resources/ss-5_filled_out_test_download.pdf index 5fef22b644768b93fcf13640245754917f38e297..0366c42051210852d8deb644b5fc7c9fb75a381f 100644 GIT binary patch delta 3705 zcmV-<4u}jTS;`a zEx)qTHt%15&qGp<5;?JMZ*d<02USE3hr{7B!yzRVRu)Dg5LptuS6Pu zWjJee2YwU?rNNIvq2mx|DYQnrC=y`+C0P`skdl+2pvi%WVMGpW3{!Fxj1I`rC_pfa z0~8d-0i9t4qq10{kdOn-#$0H!AX+9Sm;iASD+C;ThUmxy`%6+lq7WkqJ5;bK4H%TfD1=rO(65Lo z6`(<)S%n}6woR|gbC z^y+|SAgXjgGZ3^opcx2SC`J|hszaKASk)oTK&uxN#wZW~1f-5>Dm<-!Z|4_GAI8pojTJfvY*u z;29KXDgs4kidC?O(F7NvV0?w<1X3y3!=b=eD9}_O3s;0D@n|iL(@>xpFivZlfe6-` zW*~aQAfO$HT9hPx6R-q-OQ;1Uf)Fra1+*++#zL81Wl6G@T0-Mj#S)8 z(xGGtCc)b*S$DHUA22xwk}xnm2T{OUYKdr-q*Zh!qJSk@C8>|jL_nYvhvd<|*vL^| z%m|Rw7t;xn_9e7lQgh1aL=;QS{DeqBiIakpKC~-qS?X_}e+b2_zJv+Uz z(;GXzvC|tny|L35JAJX!7dw54)%VekMsG(mEoRMjINM>KiO>zq0GD4EVsaryrVzfk zmv1BOr+jrSM#bvj{q)6icx7$44Q~+a^FfyGbyKztv?oPG617((+eY9sBI$mSWS__- z_hhU{l=EsDcfI$NV!6NXaKFfYz?1!eC;QP%_M@5XM>E-rCU?wxMWX#aNkZonH^UOS zmwhw>9uyKQulDJUtz0%#Z)D}ueR`#pOZJzqGy<1@N;}AvD86BotGp>I7+_2hqMfW79!2IL%n`eObl^eYAUWybgPtODDg3lJtfq-PoR=E0A;6 z?(>>-AUvPz5BUez@6S)|pV8N^U&otjRw7S-6__AQZ`aiqvo)K%nmTd(ySQ6p@Aj&y z=S3|hKSQ&Tu-BLDHQ*BV?yVR#)p}WNn(6H)MCkG|_&DZ%FJ$2&j(Gb04YbvZa`hQk zcHh<-d(M62WfY8KKK@eU1Y4Lej>jSIu%mH;`!jSiZR*=ubC#R=jFF?S#u)e$bhgHS z9E0Fa0z4aYj{4Llq$@T2M$l31|cl=BTbaQ)eE za(jQv*>3Eu5}Lkg(KGo>jHU)J+g(!_|4kiA$w&YMDvj=z(*!49Gz z#!a{k^+AyQAqf7^%2DNUu_>=tfHEC_OHPd94oMJ}_WC+9OT!_SjdJGls%1^52gys3 zu<#BV-d6K|=aG(*`_9kmYJNK_`n?0qztaz+_Zz0^a>E?Ef&32Zdh|(HFQnzFpf85+y|Y*JY9DH zpyFM=MA%%8es_5M>c{WC;}gbTJ{0xl=;kv#j(rR)=VN%&!w#Vjd2J-(hZ6E$;;5Pz zzW~3Zn_~9)g?WPiz_KZSCWhRudmTeN_2HiS;OY9mFzs_cHad0N%@>?7*Gz(UnDq1N zQ(+PbX1~492--QmnVFo;N3xTn(__w%OtsOLuU{AC^-W`5ZcUJujPOB((3{w>!9I&& z|H{nd13q*zwSXqDNL`@O${7X zG_xBlX$S~pEW`ZSS{I|UiJd)%tLufE%Ej`7P^z876z2el8uH%cuWn=sZbvN?uMop# z3itXaE_WL!JY8K?=B&I4SE*b99r}q8|V%*gj8mGJM0-@j!ilTU=~?u?>ZC-rR5%<~!s6 z;32Wcjc^~q)jxsDc<{v#-($`Xl&btx4cp2?4t3G$5-Uc)Jd%GgN3@Xmxen6Ab(j`rW<80GMA#qGqij&(eVkX@Cm=)tfHYOAKHFTz^{!CFrXNvC6 z6g_mN=ss3@C|0_Ml@11CrGp+;Iv9wR4tiMWU?5gH>|v$DfmrFVhm{ToVx_}AR&o$l zzvmtPM%LntHG0pD3 z_gafD9S*`I9-BL$)V+qlebC{VHF^uNwZs}=Y&j_x4PU&OC#&PLvo}ALO<}BRYw|fN z)}LpaY&ADL+JIewMgi zf^|5bn;+gZ z*LiW(epunt-$j<~_}G$_{mZLApFfb?@tLKal4*MXMWpySIobJq)GoPy04)FhcMS?< XZj(hF5VsLO0tyKTHwq;sMNdWw*qJQv delta 3704 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 ZU2^{b+SvYp4GLv$lSLg6w-P@B5(za@Gxz`i From c12404e52d370c07915587af0584c620e5330a81 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 17 Aug 2025 23:41:02 -0400 Subject: [PATCH 03/10] updates --- .../ss-5_filled_out_test_download.pdf | Bin 149540 -> 149540 bytes .../resources/ss-5_filled_out_test_fill.pdf | Bin 149540 -> 149540 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/test/resources/ss-5_filled_out_test_download.pdf b/src/test/resources/ss-5_filled_out_test_download.pdf index 0366c42051210852d8deb644b5fc7c9fb75a381f..69a46947dcb7cca7ee37739b87b07e3b083db246 100644 GIT binary patch delta 3702 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 I5<=R^pdk z?waB}UtJgcxJ$ULd7{|3%oFeom#}4-zj5 zp5IpU^6HM=tnv30M%9g&{P=&(oIgUY{leMhZ0_WPm_%dqF{b<9_c|}G+7Byy`n$-o z9Uoh=vVVE?=ko`WJ3h0tQ!-8OzlbEClZ!f^kJ=^o500q*e+>#{Ze){29S^q>KLQd7 DrNO7V From 098e64b904e0cdf9113b1967a196b65c58e3f012 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 17 Aug 2025 23:44:16 -0400 Subject: [PATCH 04/10] copilot edits --- src/main/User/UserController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/User/UserController.java b/src/main/User/UserController.java index 3d344e66..dabeb68f 100644 --- a/src/main/User/UserController.java +++ b/src/main/User/UserController.java @@ -175,7 +175,7 @@ public UserController( */ public Handler googleLoginRequestHandler = ctx -> { - ctx.req().getSession().invalidate(); + Optional.ofNullable(ctx.req().getSession(false)).ifPresent(HttpSession::invalidate); JSONObject req = new JSONObject(ctx.body()); String redirectUri = req.optString("redirectUri", null); String originUri = req.optString("originUri", null); @@ -442,7 +442,7 @@ public UserController( public Handler logout = ctx -> { - ctx.req().getSession().invalidate(); + Optional.ofNullable(ctx.req().getSession(false)).ifPresent(HttpSession::invalidate); log.info("Signed out"); ctx.result(UserMessage.SUCCESS.toJSON().toString()); }; @@ -563,6 +563,7 @@ public static JSONObject mergeJSON( Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()); if (file == null) { ctx.result(UserMessage.INVALID_PARAMETER.toJSON().toString()); + return; } File fileToUpload = new File( From 8386e54c8ef64b3579b4650e18345faff29e203e Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 17 Aug 2025 23:47:33 -0400 Subject: [PATCH 05/10] updating circleci concurrency --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7894b05e..bee6a0c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,6 +18,10 @@ workflows: maven_test: jobs: - maven/test: + name: integration_tests + concurrency: + group: integration-tests # any string; jobs in same group run one-at-a-time + cancel-in-progress: false # or true to cancel the older run when a new one starts executor: name: maven/default tag: "21.0" From a596350b7eee25fe4547c81ddddc780a8ef2fded Mon Sep 17 00:00:00 2001 From: crchong1 Date: Mon, 18 Aug 2025 01:02:20 -0400 Subject: [PATCH 06/10] fixing tests --- src/test/DatabaseTest/Activity/ActivityDaoImplUnitTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/DatabaseTest/Activity/ActivityDaoImplUnitTests.java b/src/test/DatabaseTest/Activity/ActivityDaoImplUnitTests.java index 68f7619d..c2366fe7 100644 --- a/src/test/DatabaseTest/Activity/ActivityDaoImplUnitTests.java +++ b/src/test/DatabaseTest/Activity/ActivityDaoImplUnitTests.java @@ -161,6 +161,7 @@ public void update() { @Test public void delete() { + assertEquals(0, activityDao.size()); Activity activity = EntityFactory.createActivity() .withUsername("my username") @@ -169,10 +170,10 @@ public void delete() { .buildAndPersist(activityDao); Activity readActivity = activityDao.get(activity.getId()).orElseThrow(); assertTrue(areActivitiesEqual(activity, readActivity)); - + assertEquals(1, activityDao.size()); activityDao.delete(activity); assertFalse(activityDao.get(activity.getId()).isPresent()); - assertEquals(1, activityDao.size()); + assertEquals(0, activityDao.size()); } @Test From 99550dcbbbfa3404d9652d55acd974896a285064 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Mon, 18 Aug 2025 01:03:48 -0400 Subject: [PATCH 07/10] updating circleci --- .circleci/config.yml | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bee6a0c8..04d24343 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,27 +2,22 @@ version: 2.1 orbs: maven: circleci/maven@2.1.1 - slack: circleci/slack@4.3.0 + jobs: - notify: + serialized-tests: docker: - - image: 'cimg/base:stable' + - image: cimg/openjdk:21.0 + concurrency: + group: integration-tests + cancel-in-progress: false steps: - - slack/notify: - event: fail - template: basic_fail_1 - - slack/notify: - event: pass - template: basic_success_1 + - checkout + - maven/with_cache: + steps: + - run: mvn -B -DskipTests=false verify + workflows: maven_test: jobs: - - maven/test: - name: integration_tests - concurrency: - group: integration-tests # any string; jobs in same group run one-at-a-time - cancel-in-progress: false # or true to cancel the older run when a new one starts - executor: - name: maven/default - tag: "21.0" - context: "Keep.id Slack" \ No newline at end of file + - serialized-tests: + context: "Keep.id Slack" From 3eba01f074902adf0404bd19322776721043e32b Mon Sep 17 00:00:00 2001 From: crchong1 Date: Mon, 18 Aug 2025 13:58:00 -0500 Subject: [PATCH 08/10] reversting circleci --- .circleci/config.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 04d24343..7894b05e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,22 +2,23 @@ version: 2.1 orbs: maven: circleci/maven@2.1.1 - + slack: circleci/slack@4.3.0 jobs: - serialized-tests: + notify: docker: - - image: cimg/openjdk:21.0 - concurrency: - group: integration-tests - cancel-in-progress: false + - image: 'cimg/base:stable' steps: - - checkout - - maven/with_cache: - steps: - - run: mvn -B -DskipTests=false verify - + - slack/notify: + event: fail + template: basic_fail_1 + - slack/notify: + event: pass + template: basic_success_1 workflows: maven_test: jobs: - - serialized-tests: - context: "Keep.id Slack" + - maven/test: + executor: + name: maven/default + tag: "21.0" + context: "Keep.id Slack" \ No newline at end of file From f9af91a2d3b0cb129ffc4aed98fb48d6e6a89710 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 26 Oct 2025 22:11:07 -0400 Subject: [PATCH 09/10] updating cors --- src/main/Config/AppConfig.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/Config/AppConfig.java b/src/main/Config/AppConfig.java index 048dae7c..1d09e4ed 100644 --- a/src/main/Config/AppConfig.java +++ b/src/main/Config/AppConfig.java @@ -327,9 +327,9 @@ public static Javalin createJavalinApp(DeploymentLevel deploymentLevel) { config.http.generateEtags = false; // auto generate etags (default is false) config.http.defaultContentType = "text/plain"; config.router.contextPath = "/"; - config.showJavalinBanner = false; config.bundledPlugins.enableCors(cors -> { - cors.addRule(rule -> rule.allowHost( + cors.addRule(rule -> { + rule.allowHost( "https://keep.id", "https://server.keep.id", "http://localhost", @@ -337,11 +337,15 @@ public static Javalin createJavalinApp(DeploymentLevel deploymentLevel) { "http://127.0.0.1:3000", "http://localhost:3001", "https://staged.keep.id", - "https://staging.keep.id" - )); + "https://staging.keep.id", + "http://staging.keep.id", + ); + rule.allowCredentials = true; + rule.allowHeaders("Content-Type", "Authorization", "X-Requested-With"); + rule.allowMethods("GET", "POST", "PUT", "PATCH", "DELETE"); + }); }); - -// config.bundledPlugins.enableDevLogging(); + config.showJavalinBanner = false; config.jetty.modifyServletContextHandler(ctx -> { try { From 2d3ec1d82adae3f661649e9e065898e67b5cc178 Mon Sep 17 00:00:00 2001 From: crchong1 Date: Sun, 26 Oct 2025 22:12:08 -0400 Subject: [PATCH 10/10] removing trailing comma --- src/main/Config/AppConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/Config/AppConfig.java b/src/main/Config/AppConfig.java index 1d09e4ed..26875fe9 100644 --- a/src/main/Config/AppConfig.java +++ b/src/main/Config/AppConfig.java @@ -338,7 +338,7 @@ public static Javalin createJavalinApp(DeploymentLevel deploymentLevel) { "http://localhost:3001", "https://staged.keep.id", "https://staging.keep.id", - "http://staging.keep.id", + "http://staging.keep.id" ); rule.allowCredentials = true; rule.allowHeaders("Content-Type", "Authorization", "X-Requested-With");