From daacfa684955dbd9453ce2d50deacf7783beac4d Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 23 Jun 2022 16:49:17 -0500 Subject: [PATCH] QQQ-16 increasing test coverage --- pom.xml | 2 +- .../local/actions/FilesystemDeleteAction.java | 5 +- .../local/actions/FilesystemInsertAction.java | 9 +- .../local/actions/FilesystemUpdateAction.java | 8 +- .../BasicETLCleanupSourceFilesFunction.java | 18 ++- .../filesystem/s3/actions/S3DeleteAction.java | 5 +- .../filesystem/s3/actions/S3InsertAction.java | 8 +- .../filesystem/s3/actions/S3UpdateAction.java | 9 +- .../backend/module/filesystem/TestUtils.java | 39 ++++- .../local/FilesystemBackendModuleTest.java | 8 +- ...asicETLCleanupSourceFilesFunctionTest.java | 143 ++++++++++++++++++ 11 files changed, 213 insertions(+), 41 deletions(-) create mode 100644 src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunctionTest.java diff --git a/pom.xml b/pom.xml index 018c2f86..2d069357 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ com.kingsrook.qqq qqq-backend-core - 0.0.0-20220623.193535-9 + 0.0.0-20220623.214704-10 diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemDeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemDeleteAction.java index 4d6d9f92..9843bb4e 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemDeleteAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemDeleteAction.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.module.filesystem.local.actions; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; import org.apache.commons.lang.NotImplementedException; @@ -41,12 +40,13 @@ public class FilesystemDeleteAction implements DeleteInterface *******************************************************************************/ public DeleteResult execute(DeleteRequest deleteRequest) throws QException { + throw new NotImplementedException("Filesystem delete not implemented"); + /* try { DeleteResult rs = new DeleteResult(); QTableMetaData table = deleteRequest.getTable(); - throw new NotImplementedException("Filesystem delete not implemented"); // return rs; } @@ -54,6 +54,7 @@ public class FilesystemDeleteAction implements DeleteInterface { throw new QException("Error executing delete: " + e.getMessage(), e); } + */ } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertAction.java index c9130de2..9a8ca832 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertAction.java @@ -22,13 +22,9 @@ package com.kingsrook.qqq.backend.module.filesystem.local.actions; -import java.util.ArrayList; -import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertRequest; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult; -import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; import org.apache.commons.lang.NotImplementedException; @@ -44,6 +40,8 @@ public class FilesystemInsertAction implements InsertInterface *******************************************************************************/ public InsertResult execute(InsertRequest insertRequest) throws QException { + throw new NotImplementedException("Filesystem insert not implemented"); + /* try { InsertResult rs = new InsertResult(); @@ -52,14 +50,13 @@ public class FilesystemInsertAction implements InsertInterface List recordsWithStatus = new ArrayList<>(); rs.setRecords(recordsWithStatus); - throw new NotImplementedException("Filesystem insert not implemented"); - // return rs; } catch(Exception e) { throw new QException("Error executing insert: " + e.getMessage(), e); } + */ } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemUpdateAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemUpdateAction.java index a81c96d8..1f762164 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemUpdateAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemUpdateAction.java @@ -22,13 +22,9 @@ package com.kingsrook.qqq.backend.module.filesystem.local.actions; -import java.util.ArrayList; -import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateRequest; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult; -import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface; import org.apache.commons.lang.NotImplementedException; @@ -44,6 +40,8 @@ public class FilesystemUpdateAction implements UpdateInterface *******************************************************************************/ public UpdateResult execute(UpdateRequest updateRequest) throws QException { + throw new NotImplementedException("Filesystem update not implemented"); + /* try { UpdateResult rs = new UpdateResult(); @@ -52,7 +50,6 @@ public class FilesystemUpdateAction implements UpdateInterface List records = new ArrayList<>(); rs.setRecords(records); - throw new NotImplementedException("Filesystem update not implemented"); // return rs; } @@ -60,6 +57,7 @@ public class FilesystemUpdateAction implements UpdateInterface { throw new QException("Error executing update: " + e.getMessage(), e); } + */ } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunction.java index f9a6a26f..e35ad59b 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunction.java @@ -29,6 +29,7 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.interfaces.FunctionBody; import com.kingsrook.qqq.backend.core.model.actions.processes.RunFunctionRequest; import com.kingsrook.qqq.backend.core.model.actions.processes.RunFunctionResult; +import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.QCodeUsage; @@ -51,12 +52,19 @@ import com.kingsrook.qqq.backend.module.filesystem.base.FilesystemRecordBackendD *******************************************************************************/ public class BasicETLCleanupSourceFilesFunction implements FunctionBody { + public static final String FIELD_MOVE_OR_DELETE = "moveOrDelete"; + public static final String FIELD_DESTINATION_FOR_MOVES = "destinationForMoves"; + + + @Override public void run(RunFunctionRequest runFunctionRequest, RunFunctionResult runFunctionResult) throws QException { String sourceTableName = runFunctionRequest.getValueString(BasicETLProcess.FIELD_SOURCE_TABLE); QTableMetaData table = runFunctionRequest.getInstance().getTable(sourceTableName); - QBackendModuleInterface module = new QBackendModuleDispatcher().getQBackendModule(table.getBackendName()); + QBackendMetaData backend = runFunctionRequest.getInstance().getBackendForTable(sourceTableName); + QBackendModuleInterface module = new QBackendModuleDispatcher().getQBackendModule(backend); + if(!(module instanceof FilesystemBackendModuleInterface filesystemModule)) { throw (new QException("Backend " + table.getBackendName() + " for table " + sourceTableName + " does not support this function.")); @@ -67,17 +75,17 @@ public class BasicETLCleanupSourceFilesFunction implements FunctionBody .collect(Collectors.toSet()); for(String sourceFile : sourceFiles) { - String moveOrDelete = runFunctionRequest.getValueString("moveOrDelete"); + String moveOrDelete = runFunctionRequest.getValueString(FIELD_MOVE_OR_DELETE); if("delete".equals(moveOrDelete)) { filesystemModule.deleteFile(runFunctionRequest.getInstance(), table, sourceFile); } else if("move".equals(moveOrDelete)) { - String destinationForMoves = runFunctionRequest.getValueString("destinationForMoves"); + String destinationForMoves = runFunctionRequest.getValueString(FIELD_DESTINATION_FOR_MOVES); if(!StringUtils.hasContent(destinationForMoves)) { - throw (new QException("Field [destinationForMoves] is missing a value.")); + throw (new QException("Field [" + FIELD_DESTINATION_FOR_MOVES + "] is missing a value.")); } File file = new File(sourceFile); String destinationPath = destinationForMoves + File.separator + file.getName(); @@ -85,7 +93,7 @@ public class BasicETLCleanupSourceFilesFunction implements FunctionBody } else { - throw (new QException("Unexpected value [" + moveOrDelete + "] for field [moveOrDelete]. Must be either [move] or [delete].")); + throw (new QException("Unexpected value [" + moveOrDelete + "] for field [" + FIELD_MOVE_OR_DELETE + "]. Must be either [move] or [delete].")); } } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3DeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3DeleteAction.java index 8598c10e..2a4a8448 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3DeleteAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3DeleteAction.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.module.filesystem.s3.actions; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; import org.apache.commons.lang.NotImplementedException; @@ -41,12 +40,13 @@ public class S3DeleteAction implements DeleteInterface *******************************************************************************/ public DeleteResult execute(DeleteRequest deleteRequest) throws QException { + throw new NotImplementedException("S3 delete not implemented"); + /* try { DeleteResult rs = new DeleteResult(); QTableMetaData table = deleteRequest.getTable(); - throw new NotImplementedException("S3 delete not implemented"); // return rs; } @@ -54,6 +54,7 @@ public class S3DeleteAction implements DeleteInterface { throw new QException("Error executing delete: " + e.getMessage(), e); } + */ } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertAction.java index b06ddc29..caeed82b 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertAction.java @@ -22,13 +22,9 @@ package com.kingsrook.qqq.backend.module.filesystem.s3.actions; -import java.util.ArrayList; -import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertRequest; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult; -import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; import org.apache.commons.lang.NotImplementedException; @@ -44,6 +40,8 @@ public class S3InsertAction implements InsertInterface *******************************************************************************/ public InsertResult execute(InsertRequest insertRequest) throws QException { + throw new NotImplementedException("S3 insert not implemented"); + /* try { InsertResult rs = new InsertResult(); @@ -52,7 +50,6 @@ public class S3InsertAction implements InsertInterface List recordsWithStatus = new ArrayList<>(); rs.setRecords(recordsWithStatus); - throw new NotImplementedException("S3 insert not implemented"); // return rs; } @@ -60,6 +57,7 @@ public class S3InsertAction implements InsertInterface { throw new QException("Error executing insert: " + e.getMessage(), e); } + */ } } diff --git a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3UpdateAction.java b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3UpdateAction.java index 9dd5364b..4955ffb2 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3UpdateAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3UpdateAction.java @@ -22,13 +22,9 @@ package com.kingsrook.qqq.backend.module.filesystem.s3.actions; -import java.util.ArrayList; -import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateRequest; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult; -import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface; import org.apache.commons.lang.NotImplementedException; @@ -44,6 +40,8 @@ public class S3UpdateAction implements UpdateInterface *******************************************************************************/ public UpdateResult execute(UpdateRequest updateRequest) throws QException { + throw new NotImplementedException("S3 update not implemented"); + /* try { UpdateResult rs = new UpdateResult(); @@ -52,14 +50,13 @@ public class S3UpdateAction implements UpdateInterface List records = new ArrayList<>(); rs.setRecords(records); - throw new NotImplementedException("S3 update not implemented"); - // return rs; } catch(Exception e) { throw new QException("Error executing update: " + e.getMessage(), e); } + */ } } diff --git a/src/test/java/com/kingsrook/qqq/backend/module/filesystem/TestUtils.java b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/TestUtils.java index 17e7f266..d94da070 100644 --- a/src/test/java/com/kingsrook/qqq/backend/module/filesystem/TestUtils.java +++ b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/TestUtils.java @@ -26,10 +26,13 @@ import java.io.File; import java.io.IOException; import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException; import com.kingsrook.qqq.backend.core.instances.QInstanceValidator; +import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.core.modules.mock.MockAuthenticationModule; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; import com.kingsrook.qqq.backend.module.filesystem.s3.BaseS3Test; @@ -43,8 +46,10 @@ import org.apache.commons.io.FileUtils; *******************************************************************************/ public class TestUtils { - public static final String TABLE_NAME_PERSON = "person"; - public static final String TABLE_NAME_PERSON_S3 = "person-s3"; + public static final String BACKEND_NAME_LOCAL_FS = "local-filesystem"; + public static final String BACKEND_NAME_S3 = "s3"; + public static final String TABLE_NAME_PERSON_LOCAL_FS = "person"; + public static final String TABLE_NAME_PERSON_S3 = "person-s3"; /////////////////////////////////////////////////////////////////// // shouldn't be accessed directly, as we append a counter to it. // @@ -103,6 +108,7 @@ public class TestUtils public static QInstance defineInstance() throws QInstanceValidationException { QInstance qInstance = new QInstance(); + qInstance.setAuthentication(defineAuthentication()); qInstance.addBackend(defineLocalFilesystemBackend()); qInstance.addTable(defineLocalFilesystemCSVPersonTable()); qInstance.addBackend(defineS3Backend()); @@ -115,6 +121,19 @@ public class TestUtils + /******************************************************************************* + ** Define the authentication used in standard tests - using 'mock' type. + ** + *******************************************************************************/ + public static QAuthenticationMetaData defineAuthentication() + { + return new QAuthenticationMetaData() + .withName("mock") + .withType("mock"); + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -122,7 +141,7 @@ public class TestUtils { return (new FilesystemBackendMetaData() .withBasePath(BASE_PATH + File.separator + testInstanceCounter) - .withName("local-filesystem")); + .withName(BACKEND_NAME_LOCAL_FS)); } @@ -133,7 +152,7 @@ public class TestUtils public static QTableMetaData defineLocalFilesystemCSVPersonTable() { return new QTableMetaData() - .withName(TABLE_NAME_PERSON) + .withName(TABLE_NAME_PERSON_LOCAL_FS) .withLabel("Person") .withBackendName(defineLocalFilesystemBackend().getName()) .withPrimaryKeyField("id") @@ -161,7 +180,7 @@ public class TestUtils return (new S3BackendMetaData() .withBucketName(BaseS3Test.BUCKET_NAME) .withBasePath(BaseS3Test.TEST_FOLDER) - .withName("s3")); + .withName(BACKEND_NAME_S3)); } @@ -189,4 +208,14 @@ public class TestUtils ); } + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QSession getMockSession() + { + MockAuthenticationModule mockAuthenticationModule = new MockAuthenticationModule(); + return (mockAuthenticationModule.createSession(null)); + } } diff --git a/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java index d6e1e681..d0d43329 100644 --- a/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java @@ -70,7 +70,7 @@ public class FilesystemBackendModuleTest public void testDeleteFile() throws Exception { QInstance qInstance = TestUtils.defineInstance(); - QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_LOCAL_FS); ///////////////////////////////////////////////////////////////////////////////////////////// // first list the files - then delete one, then re-list, and assert that we have one fewer // @@ -94,7 +94,7 @@ public class FilesystemBackendModuleTest public void testDeleteFileDoesNotExist() throws Exception { QInstance qInstance = TestUtils.defineInstance(); - QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_LOCAL_FS); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // first list the files - then try to delete a fake path, then re-list, and assert that we have the same count // @@ -119,7 +119,7 @@ public class FilesystemBackendModuleTest public void testMoveFile() throws Exception { QInstance qInstance = TestUtils.defineInstance(); - QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_LOCAL_FS); String basePath = ((FilesystemBackendMetaData) qInstance.getBackendForTable(table.getName())).getBasePath(); String subPath = basePath + File.separator + "subdir"; @@ -156,7 +156,7 @@ public class FilesystemBackendModuleTest public void testMoveFileDoesNotExit() throws Exception { QInstance qInstance = TestUtils.defineInstance(); - QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_LOCAL_FS); String basePath = ((FilesystemBackendMetaData) qInstance.getBackendForTable(table.getName())).getBasePath(); String subPath = basePath + File.separator + "subdir"; List filesBeforeMove = new AbstractFilesystemAction().listFiles(table, qInstance.getBackendForTable(table.getName())); diff --git a/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunctionTest.java b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunctionTest.java new file mode 100644 index 00000000..183bd1d1 --- /dev/null +++ b/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesFunctionTest.java @@ -0,0 +1,143 @@ +/* + * 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 . + */ + +package com.kingsrook.qqq.backend.module.filesystem.processes.implementations.etl.basic; + + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import com.kingsrook.qqq.backend.core.actions.RunFunctionAction; +import com.kingsrook.qqq.backend.core.callbacks.NoopCallback; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunFunctionRequest; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunFunctionResult; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; +import com.kingsrook.qqq.backend.core.processes.implementations.etl.basic.BasicETLProcess; +import com.kingsrook.qqq.backend.module.filesystem.TestUtils; +import com.kingsrook.qqq.backend.module.filesystem.base.FilesystemRecordBackendDetailFields; +import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; +import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +/******************************************************************************* + ** Unit test for BasicETLCleanupSourceFilesFunction + *******************************************************************************/ +public class BasicETLCleanupSourceFilesFunctionTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + public void testDelete() throws Exception + { + QInstance qInstance = TestUtils.defineInstance(); + String filePath = getRandomFilePathPersonTable(qInstance); + + RunFunctionResult runFunctionResult = runFunction(qInstance, filePath, Map.of( + BasicETLCleanupSourceFilesFunction.FIELD_MOVE_OR_DELETE, "delete", + BasicETLCleanupSourceFilesFunction.FIELD_DESTINATION_FOR_MOVES, "/tmp/trash")); + + assertNull(runFunctionResult.getError()); + assertFalse(new File(filePath).exists(), "File should have been deleted."); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + public void testMove() throws Exception + { + QInstance qInstance = TestUtils.defineInstance(); + String filePath = getRandomFilePathPersonTable(qInstance); + + String trashDir = File.separator + "tmp" + File.separator + "trash"; + RunFunctionResult runFunctionResult = runFunction(qInstance, filePath, Map.of( + BasicETLCleanupSourceFilesFunction.FIELD_MOVE_OR_DELETE, "move", + BasicETLCleanupSourceFilesFunction.FIELD_DESTINATION_FOR_MOVES, trashDir)); + + assertNull(runFunctionResult.getError()); + assertFalse(new File(filePath).exists(), "File should have been moved."); + + String movedPath = trashDir + File.separator + (new File(filePath).getName()); + assertTrue(new File(movedPath).exists(), "File should have been moved."); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private RunFunctionResult runFunction(QInstance qInstance, String filePath, Map values) throws Exception + { + QFunctionMetaData qFunctionMetaData = new BasicETLCleanupSourceFilesFunction().defineFunctionMetaData(); + QProcessMetaData qProcessMetaData = new QProcessMetaData().withName("testScaffold").addFunction(qFunctionMetaData); + qInstance.addProcess(qProcessMetaData); + + File file = new File(filePath); + FileUtils.writeStringToFile(file, "content"); + + List records = List.of(new QRecord().withBackendDetail(FilesystemRecordBackendDetailFields.FULL_PATH, filePath)); + + RunFunctionRequest runFunctionRequest = new RunFunctionRequest(qInstance); + runFunctionRequest.setFunctionName(qFunctionMetaData.getName()); + runFunctionRequest.setProcessName(qProcessMetaData.getName()); + runFunctionRequest.setCallback(new NoopCallback()); + runFunctionRequest.setRecords(records); + runFunctionRequest.setSession(TestUtils.getMockSession()); + runFunctionRequest.addValue(BasicETLProcess.FIELD_SOURCE_TABLE, TestUtils.TABLE_NAME_PERSON_LOCAL_FS); + runFunctionRequest.addValue(BasicETLProcess.FIELD_DESTINATION_TABLE, TestUtils.TABLE_NAME_PERSON_S3); + + for(Map.Entry entry : values.entrySet()) + { + runFunctionRequest.addValue(entry.getKey(), entry.getValue()); + } + + RunFunctionAction runFunctionAction = new RunFunctionAction(); + return (runFunctionAction.execute(runFunctionRequest)); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private String getRandomFilePathPersonTable(QInstance qInstance) + { + FilesystemBackendMetaData backend = (FilesystemBackendMetaData) qInstance.getBackend(TestUtils.BACKEND_NAME_LOCAL_FS); + FilesystemTableBackendDetails backendDetails = (FilesystemTableBackendDetails) qInstance.getTable(TestUtils.TABLE_NAME_PERSON_LOCAL_FS).getBackendDetails(); + String tablePath = backend.getBasePath() + File.separator + backendDetails.getPath(); + String filePath = tablePath + File.separator + UUID.randomUUID(); + return filePath; + } + +} \ No newline at end of file