Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
groupId=ru.tinkoff.kora
koraVersion=1.2.4
koraVersion=1.2.5


##### GRADLE #####
Expand Down
2 changes: 1 addition & 1 deletion kora-java-camunda-engine/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ dependencies {
implementation "ru.tinkoff.kora.experimental:camunda-engine-bpmn"
implementation "ru.tinkoff.kora.experimental:camunda-rest-undertow"
implementation "ru.tinkoff.kora:json-module"
implementation "org.postgresql:postgresql:42.6.0"
implementation "org.postgresql:postgresql:42.7.7"
implementation "ru.tinkoff.kora:database-jdbc"

implementation "ru.tinkoff.kora:logging-logback"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package ru.tinkoff.kora.example.submodule.app;

import java.util.List;
import ru.tinkoff.kora.common.Component;
import ru.tinkoff.kora.common.KoraApp;
import ru.tinkoff.kora.common.Tag;
import ru.tinkoff.kora.common.annotation.Root;
import ru.tinkoff.kora.database.common.annotation.Query;
import ru.tinkoff.kora.database.common.annotation.Repository;
Expand Down Expand Up @@ -33,6 +33,8 @@
@KoraApp
public interface TestApplication extends Application {

@Root
@Component
@Repository
interface TestPetRepository extends JdbcRepository {

Expand All @@ -43,6 +45,8 @@ interface TestPetRepository extends JdbcRepository {
void deleteAll();
}

@Root
@Component
@Repository
interface TestCategoryRepository extends JdbcRepository {

Expand All @@ -52,11 +56,4 @@ interface TestCategoryRepository extends JdbcRepository {
@Query("DELETE FROM categories")
void deleteAll();
}

// Need any fake root to require components to include them in graph
@Tag(TestApplication.class)
@Root
default String testRoot(TestPetRepository petRepository, TestCategoryRepository categoryRepository) {
return "root";
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package ru.tinkoff.kora.example.crud;

import java.util.List;
import ru.tinkoff.kora.common.Component;
import ru.tinkoff.kora.common.KoraApp;
import ru.tinkoff.kora.common.Tag;
import ru.tinkoff.kora.common.annotation.Root;
import ru.tinkoff.kora.database.common.annotation.Query;
import ru.tinkoff.kora.database.common.annotation.Repository;
Expand Down Expand Up @@ -33,6 +33,8 @@
@KoraApp
public interface TestApplication extends Application {

@Root
@Component
@Repository
interface TestPetRepository extends JdbcRepository {

Expand All @@ -43,6 +45,8 @@ interface TestPetRepository extends JdbcRepository {
void deleteAll();
}

@Root
@Component
@Repository
interface TestCategoryRepository extends JdbcRepository {

Expand All @@ -52,11 +56,4 @@ interface TestCategoryRepository extends JdbcRepository {
@Query("DELETE FROM categories")
void deleteAll();
}

// Need any fake root to require components to include them in graph
@Tag(TestApplication.class)
@Root
default String testRoot(TestPetRepository petRepository, TestCategoryRepository categoryRepository) {
return "root";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
@HttpController
public final class HelloWorldController {

@Json
public record HelloWorldResponse(String greeting) {}

@Json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
@HttpClient(configPath = "httpClient.default")
public interface JsonHttpClient {

@Json
record JsonRequest(String id) {}

@Json
record JsonResponse(String name, int value) {}

@HttpRoute(method = HttpMethod.POST, path = "/json")
Expand Down
6 changes: 6 additions & 0 deletions kora-java-http-server/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ dependencies {
implementation "ru.tinkoff.kora:logging-logback"
implementation "ru.tinkoff.kora:config-hocon"

testAnnotationProcessor "ru.tinkoff.kora:annotation-processors"

testImplementation "ru.tinkoff.kora:test-junit5"
testImplementation "ru.tinkoff.kora:http-client-jdk"
testImplementation "org.skyscreamer:jsonassert:1.5.1"
testImplementation "com.squareup.okhttp:okhttp:2.7.5"
testImplementation "org.testcontainers:junit-jupiter:1.19.8"
Expand Down Expand Up @@ -78,6 +81,9 @@ compileJava {
options.encoding("UTF-8")
options.incremental(true)
options.fork = false
options.compilerArgs += [
"-Akora.app.submodule.enabled=true", // Only for integration tests
]
}

check.dependsOn jacocoTestReport
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import ru.tinkoff.kora.common.Component;
import ru.tinkoff.kora.http.common.HttpMethod;
import ru.tinkoff.kora.http.common.annotation.HttpRoute;
import ru.tinkoff.kora.http.common.body.HttpBody;
import ru.tinkoff.kora.http.server.common.HttpServerResponse;
import ru.tinkoff.kora.http.server.common.annotation.HttpController;
import ru.tinkoff.kora.json.common.annotation.Json;

Expand All @@ -16,10 +14,15 @@
@HttpController
public final class JsonPostController {

public record Request(String name) {}
@Json
public record JsonRequest(String id) {}

@Json
public record JsonResponse(String name, int value) {}

@HttpRoute(method = HttpMethod.POST, path = "/json")
public HttpServerResponse post(@Json Request request) {
return HttpServerResponse.of(200, HttpBody.plaintext("Hello world: " + request.name()));
@Json
public JsonResponse post(@Json JsonRequest request) {
return new JsonResponse("Ivan", 100);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ru.tinkoff.kora.example.httpserver;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import ru.tinkoff.kora.example.http.server.JsonPostController;
import ru.tinkoff.kora.test.extension.junit5.KoraAppTest;
import ru.tinkoff.kora.test.extension.junit5.KoraAppTestConfigModifier;
import ru.tinkoff.kora.test.extension.junit5.KoraConfigModification;
import ru.tinkoff.kora.test.extension.junit5.TestComponent;

@KoraAppTest(TestApplication.class)
@Testcontainers
class JsonPostControllerIntegrationTests implements KoraAppTestConfigModifier {

@Container
private static final AppContainer container = AppContainer.build();

@TestComponent
private TestApplication.JsonHttpClient jsonHttpClient;

@Override
public @NotNull KoraConfigModification config() {
return KoraConfigModification.ofString("""
testHttpClient {
url = ${HTTP_CLIENT_URL}
requestTimeout = 10s
telemetry.logging.enabled = true
}
""")
.withSystemProperty("HTTP_CLIENT_URL", container.getURI().toString());
}

@Test
void jsonPostControllerViaClient() {
var response = jsonHttpClient.post(new JsonPostController.JsonRequest("1"));
assertEquals("Ivan", response.name());
assertEquals(100, response.value());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import java.net.http.HttpResponse;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

Expand All @@ -23,13 +25,15 @@ void jsonPostController() throws Exception {

// then
var request = HttpRequest.newBuilder()
.POST(HttpRequest.BodyPublishers.ofString("{\"name\":\"Ivan\"}"))
.POST(HttpRequest.BodyPublishers.ofString("{\"id\":\"1\"}"))
.uri(container.getURI().resolve("/json"))
.timeout(Duration.ofSeconds(5))
.build();

var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
assertEquals(200, response.statusCode(), response.body());
assertEquals("Hello world: Ivan", response.body(), response.body());
JSONAssert.assertEquals(
"""
{"name":"Ivan","value":100}""", response.body(), JSONCompareMode.STRICT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package ru.tinkoff.kora.example.httpserver;

import ru.tinkoff.kora.common.Component;
import ru.tinkoff.kora.common.KoraApp;
import ru.tinkoff.kora.common.annotation.Root;
import ru.tinkoff.kora.example.http.server.Application;
import ru.tinkoff.kora.example.http.server.JsonPostController;
import ru.tinkoff.kora.http.client.common.annotation.HttpClient;
import ru.tinkoff.kora.http.client.jdk.JdkHttpClientModule;
import ru.tinkoff.kora.http.common.HttpMethod;
import ru.tinkoff.kora.http.common.annotation.HttpRoute;
import ru.tinkoff.kora.json.common.annotation.Json;

/**
* Тестовый контейнер приложение, который расширяет основное приложение и например добавляет
* некоторые компоненты
* из общих модулей, которые не используются в данном приложении, которые могут быть например
* использованы в других подобных приложениях.
* Например, когда у вас есть разные приложения READ API и WRITE API.
* Либо, вам нужны некоторые функции сохранения/удаления/обновления только для тестирования в
* качестве быстрой тестовой утилиты.
* <p>
* Но мы НАСТОЯТЕЛЬНО РЕКОМЕНДУЕМ ТЕСТИРОВАТЬ приложения как черный ящик в качестве основного
* подхода.
* -------
* Test Application than extends Real Application and may be adds some components
* from common modules that are not used in Real App, but may be used in other similar apps.
* Like when you have different READ API application and WRITE API application
* or may be, you need some save/delete/update methods only for testing as fast test utils.
* <p>
* But we STRONGLY ENCOURAGE AND RECOMMEND TO USE black box testing as a primary source of truth for
* tests.
*/
@KoraApp
public interface TestApplication extends Application, JdkHttpClientModule {

@Root
@Component
@HttpClient(configPath = "testHttpClient")
interface JsonHttpClient {

@HttpRoute(method = HttpMethod.POST, path = "/json")
@Json
JsonPostController.JsonResponse post(@Json JsonPostController.JsonRequest body);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ru.tinkoff.kora.kotlin.example.crud

import ru.tinkoff.kora.common.Component
import ru.tinkoff.kora.common.KoraApp
import ru.tinkoff.kora.common.Tag
import ru.tinkoff.kora.common.annotation.Root
Expand Down Expand Up @@ -27,6 +28,8 @@ import ru.tinkoff.kora.kotlin.example.crud.model.PetCategory
@KoraApp
interface TestApplication : Application {

@Root
@Component
@Repository
interface TestPetRepository : JdbcRepository {
@Query("SELECT %{return#selects} FROM %{return#table}")
Expand All @@ -36,6 +39,8 @@ interface TestApplication : Application {
fun deleteAll()
}

@Root
@Component
@Repository
interface TestCategoryRepository : JdbcRepository {
@Query("SELECT %{return#selects} FROM %{return#table}")
Expand All @@ -44,12 +49,4 @@ interface TestApplication : Application {
@Query("DELETE FROM categories")
fun deleteAll()
}

// Need any fake root to require components to include them in graph
@Root
@Tag(TestApplication::class)
fun testRoot(
petRepository: TestPetRepository,
categoryRepository: TestCategoryRepository
): String = "root"
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import ru.tinkoff.kora.json.common.annotation.Json
@HttpController
class HelloWorldController {

@Json
data class HelloWorldResponse(val greeting: String)

@Json
Expand Down
Loading