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..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 @@ -9,6 +9,12 @@ 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-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 12d1f35e..2bc02b43 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java @@ -1,6 +1,7 @@ package co.com.bancolombia.task; import co.com.bancolombia.task.annotations.CATask; +import java.util.ArrayList; @CATask( name = "generateAcceptanceTest", @@ -10,6 +11,12 @@ public class GenerateAcceptanceTestTask extends AbstractResolvableTypeTask { @Override protected void prepareParams() { + 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/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/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", diff --git a/src/main/resources/test/acceptance-test/api-rest/definition.json b/src/main/resources/test/acceptance-test/api-rest/definition.json new file mode 100644 index 00000000..b589a261 --- /dev/null +++ b/src/main/resources/test/acceptance-test/api-rest/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/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", + "test/acceptance-test/settings.gradle.mustache": "deployment/{{acceptanceTestPath}}/settings.gradle" + } +} diff --git a/src/main/resources/test/acceptance-test/api-rest/readme.md.mustache b/src/main/resources/test/acceptance-test/api-rest/readme.md.mustache new file mode 100644 index 00000000..c879b74e --- /dev/null +++ b/src/main/resources/test/acceptance-test/api-rest/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/api-rest/resources/karate-config.js.mustache b/src/main/resources/test/acceptance-test/api-rest/resources/karate-config.js.mustache new file mode 100644 index 00000000..57f6fccd --- /dev/null +++ b/src/main/resources/test/acceptance-test/api-rest/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/api-rest/resources/myapp.feature.mustache b/src/main/resources/test/acceptance-test/api-rest/resources/myapp.feature.mustache new file mode 100644 index 00000000..0e90d021 --- /dev/null +++ b/src/main/resources/test/acceptance-test/api-rest/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..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); @@ -65,4 +66,29 @@ void generateAcceptanceTest() throws IOException, CleanException { "build.gradle", "README.md"); } + + @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"); + // 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"); + } }