From 1747f47424a9d471d84319dc7cc1b70e3696de13 Mon Sep 17 00:00:00 2001 From: Santiago Calle Gomez Date: Mon, 20 Jan 2025 16:34:09 -0500 Subject: [PATCH 1/4] fix: homologate api paths in entry point webflux with type router false or true --- src/main/resources/entry-point/rest-webflux/api.java.mustache | 2 +- .../entry-point/rest-webflux/api.unit.test.java.mustache | 2 +- .../entry-point/rest-webflux/config.unit.test.java.mustache | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/entry-point/rest-webflux/api.java.mustache b/src/main/resources/entry-point/rest-webflux/api.java.mustache index 91123426..df3742a4 100644 --- a/src/main/resources/entry-point/rest-webflux/api.java.mustache +++ b/src/main/resources/entry-point/rest-webflux/api.java.mustache @@ -28,7 +28,7 @@ public class ApiRest { {{#task-param-authorize}} @PreAuthorize("hasRole('permission')") {{/task-param-authorize}} - @GetMapping(path = "/path") + @GetMapping(path = "/usecase/path") public Mono commandName() { // return useCase.doAction(); return Mono.just(""); diff --git a/src/main/resources/entry-point/rest-webflux/api.unit.test.java.mustache b/src/main/resources/entry-point/rest-webflux/api.unit.test.java.mustache index ffbd9dc4..32ea2ccf 100644 --- a/src/main/resources/entry-point/rest-webflux/api.unit.test.java.mustache +++ b/src/main/resources/entry-point/rest-webflux/api.unit.test.java.mustache @@ -18,7 +18,7 @@ class ApiRestTest { @Test void testCommandName() { webTestClient.get() - .uri("/api/path") + .uri("/api/usecase/path") .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() diff --git a/src/main/resources/entry-point/rest-webflux/config.unit.test.java.mustache b/src/main/resources/entry-point/rest-webflux/config.unit.test.java.mustache index 50223cdb..04378791 100644 --- a/src/main/resources/entry-point/rest-webflux/config.unit.test.java.mustache +++ b/src/main/resources/entry-point/rest-webflux/config.unit.test.java.mustache @@ -19,7 +19,7 @@ class ConfigTest { @Test void corsConfigurationShouldAllowOrigins() { webTestClient.get() - .uri("/api/path") + .uri("/api/usecase/path") .exchange() .expectStatus().isOk() .expectHeader().valueEquals("Content-Security-Policy", From 6f00e7345cd002b0d924105d578d73b41208da90 Mon Sep 17 00:00:00 2001 From: Santiago Calle Gomez Date: Tue, 21 Jan 2025 08:57:21 -0500 Subject: [PATCH 2/4] fix: acceptance test to basic web entry point --- .../acceptance/AcceptanceTestKarate.java | 9 +++- .../task/GenerateAcceptanceTestTask.java | 18 +++++++ .../entry-point/definition.json | 15 ++++++ .../entry-point/readme.md.mustache | 48 +++++++++++++++++++ .../resources/karate-config.js.mustache | 19 ++++++++ .../resources/myapp.feature.mustache | 20 ++++++++ .../task/GenerateTestTaskTest.java | 20 ++++++++ 7 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/test/acceptance-test/entry-point/definition.json create mode 100644 src/main/resources/test/acceptance-test/entry-point/readme.md.mustache create mode 100644 src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache create mode 100644 src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache diff --git a/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java b/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java index 87b5193e..44f2f9ac 100644 --- a/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java +++ b/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java @@ -9,6 +9,13 @@ public class AcceptanceTestKarate implements ModuleFactory { @Override public void buildModule(ModuleBuilder builder) throws IOException, CleanException { - builder.setupFromTemplate("test/acceptance-test"); + String templatePath = "test/acceptance-test"; + + if (Boolean.TRUE.equals(builder.getBooleanParam("task-param-to-entry-point"))) { + templatePath += "/entry-point"; + } + + builder.setupFromTemplate(templatePath); + } } diff --git a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java index 12d1f35e..ad16ce4f 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java @@ -1,6 +1,11 @@ package co.com.bancolombia.task; import co.com.bancolombia.task.annotations.CATask; +import org.gradle.api.tasks.options.Option; +import org.gradle.api.tasks.options.OptionValues; + +import java.util.Arrays; +import java.util.List; @CATask( name = "generateAcceptanceTest", @@ -8,8 +13,21 @@ description = "Generate subproject by karate framework in deployment layer") public class GenerateAcceptanceTestTask extends AbstractResolvableTypeTask { + private BooleanOption toEntryPoint = BooleanOption.FALSE; + + @Option(option = "to-entry-point", description = "Set acceptance test to entry point") + public void setToEntryPoint(BooleanOption toEntryPoint) { + this.toEntryPoint = toEntryPoint; + } + + @OptionValues("to-entry-point") + public List getToEntryPointOptions() { + return Arrays.asList(BooleanOption.values()); + } + @Override protected void prepareParams() { + builder.addParam("task-param-to-entry-point", toEntryPoint == BooleanOption.TRUE); builder.addParam("acceptanceTestPath", name); } diff --git a/src/main/resources/test/acceptance-test/entry-point/definition.json b/src/main/resources/test/acceptance-test/entry-point/definition.json new file mode 100644 index 00000000..c95456fc --- /dev/null +++ b/src/main/resources/test/acceptance-test/entry-point/definition.json @@ -0,0 +1,15 @@ +{ + "folders": [ + "deployment/{{acceptanceTestPath}}/src/test/java/{{packagePath}}/utils" + ], + "files": { + "test/acceptance-test/resources/logback-test.xml.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/logback-test.xml", + "test/acceptance-test/entry-point/resources/karate-config.js.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/karate-config.js", + "test/acceptance-test/entry-point/resources/myapp.feature.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/{{packagePath}}/myapp.feature", + "test/acceptance-test/entry-point/readme.md.mustache": "deployment/{{acceptanceTestPath}}/README.md", + "test/acceptance-test/TestParallel.java.mustache": "deployment/{{acceptanceTestPath}}/src/test/java/{{packagePath}}/TestParallel.java", + "test/acceptance-test/utils/validator.test.utils.java.mustache": "deployment/{{acceptanceTestPath}}/src/test/java/{{packagePath}}/utils/ValidatorTestUtils.java", + "test/acceptance-test/build.gradle.mustache": "deployment/{{acceptanceTestPath}}/build.gradle", + "test/acceptance-test/settings.gradle.mustache": "deployment/{{acceptanceTestPath}}/settings.gradle" + } +} diff --git a/src/main/resources/test/acceptance-test/entry-point/readme.md.mustache b/src/main/resources/test/acceptance-test/entry-point/readme.md.mustache new file mode 100644 index 00000000..c879b74e --- /dev/null +++ b/src/main/resources/test/acceptance-test/entry-point/readme.md.mustache @@ -0,0 +1,48 @@ +# Proyecto Base de Karate para pruebas de integración en AcceptanceTest - REST, GraphQL, SOAP +_Karate es una herramienta de código abierto que combina la automatización de pruebas de API, simulacros , pruebas de rendimiento e incluso la automatización de la interfaz de usuario en un marco único y unificado . La sintaxis BDD popularizada por Cucumber es un lenguaje neutro y fácil incluso para los no programadores. Las afirmaciones y los informes HTML están integrados y puede ejecutar pruebas en paralelo para aumentar la velocidad._ + +_Si está familiarizado con Cucumber / Gherkin, la gran diferencia aquí es que no necesita escribir código extra de "pegamento" o "definiciones de pasos" de Java._ + +**RECOMENDACION !!!**: Visitar la documentación oficial para obtener todas las ventajas de este potencial framework: https://github.com/intuit/karate +## Comenzando + +### Instalación 🔧 + +**IMPORTANTE**: Este proyecto es una demo, proyecto base, para estructurar las pruebas de integración (AcceptanceTest) que se realizarán. Este proyecto es funcional yo consume la pet-store API en su versión 3 (https://petstore3.swagger.io/api/v3), sin embargo, a continuación te contamos que debes modificar y configurar para comenzar en tu contexto de aplicación con las pruebas: +- Ir al karate-config.js y modificar la `urlBase` por la url o endpoint de tu aplicación. +- Ir al karate-config.js y modificar la `oasUrl` por el path y nombre de la deficnicón open Api de la API a testear. +- Ir a los archivos .feature (src>test>resources>{{package}}) agregar tus escenarios, métodos de prueba, aserciones, y todo lo necesario para tus pruebas en particular. + +Aquí se detalla la estructura que debe guiar las pruebas con Karate, es un ejemplo: + +``` +src +└── test + ├── java + │ └── {{package}} + │ ├── TestParallel.java + │ └── utils + │ └── ValidatorTestUtils.java + └── resources + ├── {{package}} + │ └── myapp.feature + ├── karate-config.js + └── logback-test.xml +``` + +- TestParallel -> Clase general en java que ejecuta los TESTS de karate en Paralelo y tambien genera el reporte de dichos TESTS en formato json que luego se convierte en reporte cucumber + +## Ejecutando las pruebas ⚙️ +Este proyecto soporta ejecución por features tageados de manera independiente, como es el caso del feature demo.feature el cual tiene el tag @acceptanceTest. + +```gradle +gradlew clean test "-Dkarate.options=--tags @acceptanceTest" -i +``` + +De esta manera se ejecutaran todos los features con el tag @acceptanceTest. + +Por otra parte, si lo que se quiere es ejecutar todos los features almacenados en el proyecto bastará con ejecura el comando + +```gradle +gradlew clean test -i +``` \ No newline at end of file diff --git a/src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache b/src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache new file mode 100644 index 00000000..57f6fccd --- /dev/null +++ b/src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache @@ -0,0 +1,19 @@ +function fn() { + var env = karate.env || "dev"; + var connectTimeout = karate.properties["connectTimeout"] || 45000; + + var baseUrl = + karate.properties["baseUrl"] || + "http://localhost:8080"; + + var config = { + baseUrl + }; + + karate.log("karate.env system property was: ", env); + + karate.configure('connectTimeout', 2000); + karate.configure('readTimeout', 2000); + karate.configure('ssl', true); + return config; +} \ No newline at end of file diff --git a/src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache b/src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache new file mode 100644 index 00000000..0e90d021 --- /dev/null +++ b/src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache @@ -0,0 +1,20 @@ +# We suggest to consulting the Karate Framework documentation: https://github.com/intuit/karate +@acceptanceTest +Feature: Here is the full description of the test suite to be run DEMO + + How ... + Required ... + To ... + + + Background: + # This property is taken from the karate-config.js file + * url baseUrl + + # Reference + # https://github.com/karatelabs/karate#request + # https://github.com/karatelabs/karate#reading-files + Scenario: This is the description of this scenario to be tested and its objective + Given path '/api/usecase/path' + When method get + Then status 200 \ No newline at end of file diff --git a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java index 425478a4..8214dd0c 100644 --- a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java @@ -65,4 +65,24 @@ void generateAcceptanceTest() throws IOException, CleanException { "build.gradle", "README.md"); } + + @Test + void generateEntryPointAcceptanceTest() throws IOException, CleanException { + // Arrange + task.setName("acceptance-test"); + task.setToEntryPoint(AbstractCleanArchitectureDefaultTask.BooleanOption.TRUE); + // Act + task.execute(); + // Assert + assertFilesExistsInDir( + TEST_DIR + "/deployment/acceptance-test/", + "src/test/java/co/com/bancolombia/TestParallel.java", + "src/test/java/co/com/bancolombia/utils/ValidatorTestUtils.java", + "src/test/resources/logback-test.xml", + "src/test/resources/karate-config.js", + "src/test/resources/co/com/bancolombia/myapp.feature", + "settings.gradle", + "build.gradle", + "README.md"); + } } From 5df63cf9110c53277c46049cb9802a09293ebf99 Mon Sep 17 00:00:00 2001 From: Santiago Calle Gomez Date: Tue, 21 Jan 2025 17:17:40 -0500 Subject: [PATCH 3/4] fix: update GetMapping value to /usecase/path --- src/main/resources/entry-point/rest-mvc/api.java.mustache | 4 ++-- .../entry-point/rest-mvc/api.unit.test.java.mustache | 2 +- .../acceptance-test/{entry-point => api-rest}/definition.json | 0 .../{entry-point => api-rest}/readme.md.mustache | 0 .../resources/karate-config.js.mustache | 0 .../resources/myapp.feature.mustache | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename src/main/resources/test/acceptance-test/{entry-point => api-rest}/definition.json (100%) rename src/main/resources/test/acceptance-test/{entry-point => api-rest}/readme.md.mustache (100%) rename src/main/resources/test/acceptance-test/{entry-point => api-rest}/resources/karate-config.js.mustache (100%) rename src/main/resources/test/acceptance-test/{entry-point => api-rest}/resources/myapp.feature.mustache (100%) diff --git a/src/main/resources/entry-point/rest-mvc/api.java.mustache b/src/main/resources/entry-point/rest-mvc/api.java.mustache index 1fc7bdc8..e41d1c53 100644 --- a/src/main/resources/entry-point/rest-mvc/api.java.mustache +++ b/src/main/resources/entry-point/rest-mvc/api.java.mustache @@ -38,8 +38,8 @@ public class ApiRest { {{#task-param-authorize}} @PreAuthorize("hasRole('permission')") {{/task-param-authorize}} - @GetMapping(path = "/path") + @GetMapping(path = "/usecase/path") public String commandName() { - return "Hello World"; + return ""; } } diff --git a/src/main/resources/entry-point/rest-mvc/api.unit.test.java.mustache b/src/main/resources/entry-point/rest-mvc/api.unit.test.java.mustache index 804a7867..a1bf974a 100644 --- a/src/main/resources/entry-point/rest-mvc/api.unit.test.java.mustache +++ b/src/main/resources/entry-point/rest-mvc/api.unit.test.java.mustache @@ -11,6 +11,6 @@ class ApiRestTest { @Test void apiRestTest() { var response = apiRest.commandName(); - assertEquals("Hello World", response); + assertEquals("", response); } } diff --git a/src/main/resources/test/acceptance-test/entry-point/definition.json b/src/main/resources/test/acceptance-test/api-rest/definition.json similarity index 100% rename from src/main/resources/test/acceptance-test/entry-point/definition.json rename to src/main/resources/test/acceptance-test/api-rest/definition.json diff --git a/src/main/resources/test/acceptance-test/entry-point/readme.md.mustache b/src/main/resources/test/acceptance-test/api-rest/readme.md.mustache similarity index 100% rename from src/main/resources/test/acceptance-test/entry-point/readme.md.mustache rename to src/main/resources/test/acceptance-test/api-rest/readme.md.mustache diff --git a/src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache b/src/main/resources/test/acceptance-test/api-rest/resources/karate-config.js.mustache similarity index 100% rename from src/main/resources/test/acceptance-test/entry-point/resources/karate-config.js.mustache rename to src/main/resources/test/acceptance-test/api-rest/resources/karate-config.js.mustache diff --git a/src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache b/src/main/resources/test/acceptance-test/api-rest/resources/myapp.feature.mustache similarity index 100% rename from src/main/resources/test/acceptance-test/entry-point/resources/myapp.feature.mustache rename to src/main/resources/test/acceptance-test/api-rest/resources/myapp.feature.mustache From 9d417608aa2acb97f614ebc92aa18830d84ec315 Mon Sep 17 00:00:00 2001 From: Santiago Calle Gomez Date: Tue, 21 Jan 2025 17:19:46 -0500 Subject: [PATCH 4/4] fix: set api rest acceptance test when module reactive-web or api-rest exist --- .../acceptance/AcceptanceTestKarate.java | 5 ++-- .../task/GenerateAcceptanceTestTask.java | 25 +++++------------ .../acceptance-test/api-rest/definition.json | 6 ++-- .../task/GenerateTestTaskTest.java | 28 +++++++++++-------- 4 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java b/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java index 44f2f9ac..650d6eea 100644 --- a/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java +++ b/src/main/java/co/com/bancolombia/factory/tests/acceptance/AcceptanceTestKarate.java @@ -11,11 +11,10 @@ public class AcceptanceTestKarate implements ModuleFactory { public void buildModule(ModuleBuilder builder) throws IOException, CleanException { String templatePath = "test/acceptance-test"; - if (Boolean.TRUE.equals(builder.getBooleanParam("task-param-to-entry-point"))) { - templatePath += "/entry-point"; + if (Boolean.TRUE.equals(builder.getBooleanParam("task-param-exist-api-rest"))) { + templatePath += "/api-rest"; } builder.setupFromTemplate(templatePath); - } } diff --git a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java index ad16ce4f..2bc02b43 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java @@ -1,11 +1,7 @@ package co.com.bancolombia.task; import co.com.bancolombia.task.annotations.CATask; -import org.gradle.api.tasks.options.Option; -import org.gradle.api.tasks.options.OptionValues; - -import java.util.Arrays; -import java.util.List; +import java.util.ArrayList; @CATask( name = "generateAcceptanceTest", @@ -13,21 +9,14 @@ description = "Generate subproject by karate framework in deployment layer") public class GenerateAcceptanceTestTask extends AbstractResolvableTypeTask { - private BooleanOption toEntryPoint = BooleanOption.FALSE; - - @Option(option = "to-entry-point", description = "Set acceptance test to entry point") - public void setToEntryPoint(BooleanOption toEntryPoint) { - this.toEntryPoint = toEntryPoint; - } - - @OptionValues("to-entry-point") - public List getToEntryPointOptions() { - return Arrays.asList(BooleanOption.values()); - } - @Override protected void prepareParams() { - builder.addParam("task-param-to-entry-point", toEntryPoint == BooleanOption.TRUE); + var modules = new ArrayList<>(getProject().getChildProjects().keySet()); + + builder.addParam( + "task-param-exist-api-rest", + modules.stream() + .anyMatch(value -> value.equals("reactive-web") || value.equals("api-rest"))); builder.addParam("acceptanceTestPath", name); } diff --git a/src/main/resources/test/acceptance-test/api-rest/definition.json b/src/main/resources/test/acceptance-test/api-rest/definition.json index c95456fc..b589a261 100644 --- a/src/main/resources/test/acceptance-test/api-rest/definition.json +++ b/src/main/resources/test/acceptance-test/api-rest/definition.json @@ -4,9 +4,9 @@ ], "files": { "test/acceptance-test/resources/logback-test.xml.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/logback-test.xml", - "test/acceptance-test/entry-point/resources/karate-config.js.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/karate-config.js", - "test/acceptance-test/entry-point/resources/myapp.feature.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/{{packagePath}}/myapp.feature", - "test/acceptance-test/entry-point/readme.md.mustache": "deployment/{{acceptanceTestPath}}/README.md", + "test/acceptance-test/api-rest/resources/karate-config.js.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/karate-config.js", + "test/acceptance-test/api-rest/resources/myapp.feature.mustache": "deployment/{{acceptanceTestPath}}/src/test/resources/{{packagePath}}/myapp.feature", + "test/acceptance-test/api-rest/readme.md.mustache": "deployment/{{acceptanceTestPath}}/README.md", "test/acceptance-test/TestParallel.java.mustache": "deployment/{{acceptanceTestPath}}/src/test/java/{{packagePath}}/TestParallel.java", "test/acceptance-test/utils/validator.test.utils.java.mustache": "deployment/{{acceptanceTestPath}}/src/test/java/{{packagePath}}/utils/ValidatorTestUtils.java", "test/acceptance-test/build.gradle.mustache": "deployment/{{acceptanceTestPath}}/build.gradle", diff --git a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java index 8214dd0c..748b3f3b 100644 --- a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java @@ -21,11 +21,12 @@ class GenerateTestTaskTest { private static final String TEST_DIR = getTestDir(GenerateTestTaskTest.class); private static GenerateAcceptanceTestTask task; + private static Project project; @BeforeAll public static void setup() throws IOException, CleanException { deleteStructure(Path.of(TEST_DIR)); - Project project = setupProject(GenerateTestTaskTest.class, GenerateStructureTask.class); + project = setupProject(GenerateTestTaskTest.class, GenerateStructureTask.class); GenerateStructureTask taskStructure = getTask(project, GenerateStructureTask.class); taskStructure.setType(GenerateStructureTask.ProjectType.REACTIVE); @@ -69,20 +70,25 @@ void generateAcceptanceTest() throws IOException, CleanException { @Test void generateEntryPointAcceptanceTest() throws IOException, CleanException { // Arrange + ProjectBuilder.builder() + .withName("reactive-web") + .withProjectDir(new File(TEST_DIR + "/infrastructure/entry-points/reactive-web")) + .withParent(project) + .build(); + task.setName("acceptance-test"); - task.setToEntryPoint(AbstractCleanArchitectureDefaultTask.BooleanOption.TRUE); // Act task.execute(); // Assert assertFilesExistsInDir( - TEST_DIR + "/deployment/acceptance-test/", - "src/test/java/co/com/bancolombia/TestParallel.java", - "src/test/java/co/com/bancolombia/utils/ValidatorTestUtils.java", - "src/test/resources/logback-test.xml", - "src/test/resources/karate-config.js", - "src/test/resources/co/com/bancolombia/myapp.feature", - "settings.gradle", - "build.gradle", - "README.md"); + TEST_DIR + "/deployment/acceptance-test/", + "src/test/java/co/com/bancolombia/TestParallel.java", + "src/test/java/co/com/bancolombia/utils/ValidatorTestUtils.java", + "src/test/resources/logback-test.xml", + "src/test/resources/karate-config.js", + "src/test/resources/co/com/bancolombia/myapp.feature", + "settings.gradle", + "build.gradle", + "README.md"); } }