diff --git a/pom.xml b/pom.xml index d1ff7ea..f5fc115 100644 --- a/pom.xml +++ b/pom.xml @@ -29,19 +29,14 @@ 1.0.1 - wtf.g4s8 - matchers-json - 1.4.0 + jakarta.json + jakarta.json-api + 2.1.3 - javax.json - javax.json-api - 1.1.4 - - - org.glassfish - javax.json - 1.1.4 + org.eclipse.parsson + parsson + 1.1.7 org.jdbi @@ -75,7 +70,6 @@ org.hamcrest hamcrest-all 1.3 - test @@ -243,7 +237,10 @@ dependencies:org.hamcrest:hamcrest:jar:2.2:test - dependencies:org.hamcrest:hamcrest:jar:2.2:compile + dependencies:org.hamcrest:hamcrest-all:jar:1.3:compile + + + dependencies:org.eclipse.parsson:parsson:jar:1.1.7:compile dependencies:org.cactoos:cactoos:jar:0.56.1:compile diff --git a/src/io/github/artemget/prbot/bot/match/JsonHas.java b/src/io/github/artemget/prbot/bot/match/JsonHas.java new file mode 100644 index 0000000..dcf7fa3 --- /dev/null +++ b/src/io/github/artemget/prbot/bot/match/JsonHas.java @@ -0,0 +1,117 @@ +/* + * MIT License + * + * Copyright (c) 2024-2025. Artem Getmanskii + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package io.github.artemget.prbot.bot.match; + +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +/** + * Matches json object fields. + * + * @since 0.1 + * @todo #20:15 remove {@link JsonHas}, + * {@link io.github.artemget.prbot.bot.match.JsonValueIs} + * and {@link io.github.artemget.prbot.bot.match.StringIsJson} from this project when + * matchers-json jakarta issue + * would be closed. Add matchers-json dependency and fix used imports through the project. + */ +@SuppressWarnings("PMD.AvoidDuplicateLiterals") +public final class JsonHas extends TypeSafeMatcher { + + /** + * Field name. + */ + private final String field; + + /** + * Value matcher. + */ + private final Matcher matcher; + + /** + * JSON has a string value for field. + * @param field Name + * @param value Expected string + */ + public JsonHas(final String field, final String value) { + this(field, new JsonValueIs(value)); + } + + /** + * JSON has a number value for field. + * @param field Name + * @param value Expected string + */ + public JsonHas(final String field, final Number value) { + this(field, new JsonValueIs(value)); + } + + /** + * JSON has a boolean value for field. + * @param field Name + * @param value Expected string + */ + public JsonHas(final String field, final boolean value) { + this(field, new JsonValueIs(value)); + } + + /** + * Ctor. + * + * @param field Field name + * @param matcher Value matcher + */ + public JsonHas(final String field, + final Matcher matcher) { + super(); + this.field = field; + this.matcher = matcher; + } + + @Override + public void describeTo(final Description description) { + description.appendText("field ") + .appendValue(this.field) + .appendText(" with ") + .appendDescriptionOf(this.matcher); + } + + @Override + public boolean matchesSafely(final JsonObject item) { + return this.matcher.matches(item.get(this.field)); + } + + @Override + public void describeMismatchSafely(final JsonObject item, + final Description desc) { + desc.appendText("field ") + .appendValue(this.field) + .appendText(" "); + this.matcher.describeMismatch(item.get(this.field), desc); + } +} diff --git a/src/io/github/artemget/prbot/bot/match/JsonValueIs.java b/src/io/github/artemget/prbot/bot/match/JsonValueIs.java new file mode 100644 index 0000000..89cfeb8 --- /dev/null +++ b/src/io/github/artemget/prbot/bot/match/JsonValueIs.java @@ -0,0 +1,174 @@ +/* + * MIT License + * + * Copyright (c) 2024-2025. Artem Getmanskii + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package io.github.artemget.prbot.bot.match; + +import jakarta.json.JsonValue; +import java.util.Locale; +import org.hamcrest.CoreMatchers; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +/** + * Matches json values. + * + * @since 0.1 + */ +@SuppressWarnings("PMD.AvoidDuplicateLiterals") +public final class JsonValueIs extends TypeSafeMatcher { + + /** + * Matcher for json-null. + */ + public static final TypeSafeMatcher NULL = + new JsonValueIs( + CoreMatchers.equalTo(JsonValue.ValueType.NULL), + CoreMatchers.any(String.class) + ); + + /** + * Json type. + */ + private final Matcher type; + + /** + * Json value matcher. + */ + private final Matcher value; + + /** + * Ctor for boolean. + * + * @param bool Boolean value + */ + public JsonValueIs(final boolean bool) { + this( + CoreMatchers.equalTo( + JsonValue.ValueType.valueOf(Boolean.toString(bool) + .toUpperCase(Locale.US) + ) + ), + CoreMatchers.equalTo(Boolean.toString(bool)) + ); + } + + /** + * Ctor for number. + * + * @param number Expected number + */ + public JsonValueIs(final Number number) { + this( + CoreMatchers.equalTo(JsonValue.ValueType.NUMBER), + CoreMatchers.equalTo(number.toString()) + ); + } + + /** + * Ctor for string. + * + * @param value Expected value + */ + public JsonValueIs(final String value) { + this( + CoreMatchers.equalTo(JsonValue.ValueType.STRING), + CoreMatchers.equalTo(value) + ); + } + + /** + * Ctor for string. + * + * @param value Json value. + */ + public JsonValueIs(final Matcher value) { + this(CoreMatchers.equalTo(JsonValue.ValueType.STRING), value); + } + + /** + * Ctor. + * + * @param type Value type + * @param matcher Value matcher + */ + public JsonValueIs(final JsonValue.ValueType type, + final Matcher matcher) { + this(CoreMatchers.equalTo(type), matcher); + } + + /** + * Ctor. + * + * @param type Json type. + * @param value Json value. + */ + public JsonValueIs(final Matcher type, + final Matcher value) { + super(); + this.type = type; + this.value = value; + } + + @Override + public void describeTo(final Description desc) { + desc.appendText("value ") + .appendDescriptionOf(this.value) + .appendText(" of type ") + .appendDescriptionOf(this.type); + } + + @Override + public boolean matchesSafely(final JsonValue item) { + return item != null + && this.type.matches(item.getValueType()) + && this.value.matches(JsonValueIs.escaped(item)); + } + + @Override + public void describeMismatchSafely(final JsonValue item, + final Description desc) { + desc.appendText("value ") + .appendValue(JsonValueIs.escaped(item)) + .appendText(" of type ") + .appendValue(item.getValueType()); + } + + /** + * Escaped string. + * + * @param value Json value + * @return Escaped string + */ + private static String escaped(final JsonValue value) { + final String esc; + final String src = value.toString(); + if (value.getValueType().equals(JsonValue.ValueType.STRING)) { + esc = src.substring(1).substring(0, src.length() - 2); + } else { + esc = src; + } + return esc; + } +} diff --git a/src/io/github/artemget/prbot/bot/match/MatchJsonVal.java b/src/io/github/artemget/prbot/bot/match/MatchJsonVal.java index 1c1975c..66ecd0f 100644 --- a/src/io/github/artemget/prbot/bot/match/MatchJsonVal.java +++ b/src/io/github/artemget/prbot/bot/match/MatchJsonVal.java @@ -28,8 +28,6 @@ import java.util.function.Predicate; import org.hamcrest.TypeSafeMatcher; import org.telegram.telegrambots.meta.api.objects.Update; -import wtf.g4s8.hamcrest.json.JsonHas; -import wtf.g4s8.hamcrest.json.StringIsJson; /** * Wraps {@link MatchJson}. diff --git a/src/io/github/artemget/prbot/bot/match/StringIsJson.java b/src/io/github/artemget/prbot/bot/match/StringIsJson.java new file mode 100644 index 0000000..a571f93 --- /dev/null +++ b/src/io/github/artemget/prbot/bot/match/StringIsJson.java @@ -0,0 +1,140 @@ +/* + * MIT License + * + * Copyright (c) 2024-2025. Artem Getmanskii + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package io.github.artemget.prbot.bot.match; + +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonValue; +import jakarta.json.stream.JsonParsingException; +import java.io.StringReader; +import java.util.function.Function; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +/** + * Match a string against json matcher. + * + * @since 0.2 + */ +@SuppressWarnings("PMD.MissingStaticMethodInNonInstantiatableClass") +public abstract class StringIsJson extends TypeSafeMatcher { + + /** + * Json matcher. + */ + private final Matcher matcher; + + /** + * Parsing of json. + */ + private final Function parsing; + + /** + * Ctor. + * + * @param matcher Json matcher + * @param parsing Json parsing + */ + private StringIsJson( + final Matcher matcher, + final Function parsing + ) { + super(); + this.matcher = matcher; + this.parsing = parsing; + } + + @Override + public void describeTo(final Description description) { + description.appendText("string ") + .appendDescriptionOf(this.matcher); + } + + @Override + public void describeMismatchSafely( + final String item, + final Description description + ) { + description.appendText("string: '") + .appendValue(item) + .appendText("' "); + try { + this.matcher.describeMismatch( + this.parsing.apply(Json.createReader(new StringReader(item))), + description + ); + } catch (final JsonParsingException err) { + description.appendText("is not a valid json: ") + .appendText(err.getMessage()); + } + } + + @Override + public boolean matchesSafely(final String item) { + boolean success; + try { + success = this.matcher.matches( + this.parsing.apply(Json.createReader(new StringReader(item))) + ); + } catch (final JsonParsingException ignored) { + success = false; + } + return success; + } + + /** + * Json object as string. + * @since 0.2 + */ + public static final class Object extends StringIsJson { + + /** + * String is JSON object. + * + * @param matcher Object matcher + */ + public Object(final Matcher matcher) { + super(matcher, JsonReader::readObject); + } + } + + /** + * Json array as string. + * @since 0.2 + */ + public static final class Array extends StringIsJson { + + /** + * String is JSON array. + * @param matcher Array matcher + */ + public Array(final Matcher matcher) { + super(matcher, JsonReader::readArray); + } + } +} diff --git a/src/io/github/artemget/prbot/bot/route/RouteHkGitlab.java b/src/io/github/artemget/prbot/bot/route/RouteHkGitlab.java index fa69521..71f7379 100644 --- a/src/io/github/artemget/prbot/bot/route/RouteHkGitlab.java +++ b/src/io/github/artemget/prbot/bot/route/RouteHkGitlab.java @@ -29,7 +29,9 @@ import io.github.artemget.prbot.bot.command.CmdPrMerge; import io.github.artemget.prbot.bot.command.CmdPrOpen; import io.github.artemget.prbot.bot.command.CmdPrReject; +import io.github.artemget.prbot.bot.match.JsonHas; import io.github.artemget.prbot.bot.match.MatchJsonVal; +import io.github.artemget.prbot.bot.match.StringIsJson; import io.github.artemget.prbot.config.EProp; import io.github.artemget.prbot.config.Entry; import io.github.artemget.prbot.config.EntryException; @@ -39,8 +41,6 @@ import io.github.artemget.teleroute.route.RouteFork; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.bots.AbsSender; -import wtf.g4s8.hamcrest.json.JsonHas; -import wtf.g4s8.hamcrest.json.StringIsJson; /** * Routes for gitlab merge request webhook. diff --git a/src/io/github/artemget/prbot/config/EJsonArr.java b/src/io/github/artemget/prbot/config/EJsonArr.java index 894e8d2..01b4c5c 100644 --- a/src/io/github/artemget/prbot/config/EJsonArr.java +++ b/src/io/github/artemget/prbot/config/EJsonArr.java @@ -24,8 +24,8 @@ package io.github.artemget.prbot.config; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.cactoos.Scalar; /** diff --git a/src/io/github/artemget/prbot/config/EJsonObj.java b/src/io/github/artemget/prbot/config/EJsonObj.java index fa322a5..11158f3 100644 --- a/src/io/github/artemget/prbot/config/EJsonObj.java +++ b/src/io/github/artemget/prbot/config/EJsonObj.java @@ -24,7 +24,7 @@ package io.github.artemget.prbot.config; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.cactoos.Scalar; /** diff --git a/src/io/github/artemget/prbot/config/EJsonStr.java b/src/io/github/artemget/prbot/config/EJsonStr.java index 60f63ed..f77544f 100644 --- a/src/io/github/artemget/prbot/config/EJsonStr.java +++ b/src/io/github/artemget/prbot/config/EJsonStr.java @@ -24,7 +24,7 @@ package io.github.artemget.prbot.config; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.cactoos.Scalar; /** diff --git a/src/io/github/artemget/prbot/domain/pr/AccJson.java b/src/io/github/artemget/prbot/domain/pr/AccJson.java index 4d0a77d..703bf59 100644 --- a/src/io/github/artemget/prbot/domain/pr/AccJson.java +++ b/src/io/github/artemget/prbot/domain/pr/AccJson.java @@ -26,7 +26,7 @@ import io.github.artemget.prbot.config.EJsonStr; import io.github.artemget.prbot.config.EntryException; -import javax.json.JsonObject; +import jakarta.json.JsonObject; /** * User's account from json source. diff --git a/src/io/github/artemget/prbot/domain/pr/BrJson.java b/src/io/github/artemget/prbot/domain/pr/BrJson.java index 12f38fc..bb6991a 100644 --- a/src/io/github/artemget/prbot/domain/pr/BrJson.java +++ b/src/io/github/artemget/prbot/domain/pr/BrJson.java @@ -26,7 +26,7 @@ import io.github.artemget.prbot.config.EJsonStr; import io.github.artemget.prbot.config.EntryException; -import javax.json.JsonObject; +import jakarta.json.JsonObject; /** * Git branch from json source. diff --git a/src/io/github/artemget/prbot/domain/pr/PrJsonStrict.java b/src/io/github/artemget/prbot/domain/pr/PrJsonStrict.java index 0fe1f9f..ce31f2d 100644 --- a/src/io/github/artemget/prbot/domain/pr/PrJsonStrict.java +++ b/src/io/github/artemget/prbot/domain/pr/PrJsonStrict.java @@ -28,13 +28,13 @@ import io.github.artemget.prbot.config.EJsonObj; import io.github.artemget.prbot.config.EJsonStr; import io.github.artemget.prbot.config.EntryException; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import java.io.StringReader; import java.util.List; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; /** * Pull request from source strict json. diff --git a/src/io/github/artemget/prbot/domain/pr/ProjJson.java b/src/io/github/artemget/prbot/domain/pr/ProjJson.java index be414a7..36cc92d 100644 --- a/src/io/github/artemget/prbot/domain/pr/ProjJson.java +++ b/src/io/github/artemget/prbot/domain/pr/ProjJson.java @@ -24,19 +24,17 @@ package io.github.artemget.prbot.domain.pr; -import javax.json.JsonObject; +import jakarta.json.JsonObject; /** * Git project from json source. * * @since 0.0.1 - * @todo #20:90 {@link io.github.artemget.prbot.domain.pr.ProjJson} + * @todo #20:45 {@link io.github.artemget.prbot.domain.pr.ProjJson} * and {@link io.github.artemget.prbot.domain.pr.PrJsonStrict} * is not covered by tests. Lets cover it's methods. I suggest using * joshka/junit-json-params * with it's @JsonSource annotation, test sources is placed under resources dir. - * Note that using of junit-json-params requires to switch javax.json to - * jakarta.json. */ public final class ProjJson implements Project { /** diff --git a/src/io/github/artemget/prbot/domain/pr/ReqHkGitlab.java b/src/io/github/artemget/prbot/domain/pr/ReqHkGitlab.java index 8b2c067..8ee9f2f 100644 --- a/src/io/github/artemget/prbot/domain/pr/ReqHkGitlab.java +++ b/src/io/github/artemget/prbot/domain/pr/ReqHkGitlab.java @@ -26,10 +26,10 @@ import io.github.artemget.prbot.config.EJsonObj; import io.github.artemget.prbot.config.EntryException; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import java.io.StringReader; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; /** * Gitlab webhook request. @@ -54,7 +54,7 @@ public final class ReqHkGitlab implements RequestWebhook { private final JsonObject json; /** - * Wraps json string in to {@link javax.json.JsonObject}. + * Wraps json string in to {@link JsonObject}. * * @param json String * @throws EntryException If fails diff --git a/test/io/github/artemget/prbot/config/EJsonArrTest.java b/test/io/github/artemget/prbot/config/EJsonArrTest.java index 3fc7f49..042b280 100644 --- a/test/io/github/artemget/prbot/config/EJsonArrTest.java +++ b/test/io/github/artemget/prbot/config/EJsonArrTest.java @@ -1,7 +1,7 @@ package io.github.artemget.prbot.config; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; diff --git a/test/io/github/artemget/prbot/config/EJsonObjTest.java b/test/io/github/artemget/prbot/config/EJsonObjTest.java index f547735..ca3f962 100644 --- a/test/io/github/artemget/prbot/config/EJsonObjTest.java +++ b/test/io/github/artemget/prbot/config/EJsonObjTest.java @@ -24,8 +24,8 @@ package io.github.artemget.prbot.config; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; diff --git a/test/io/github/artemget/prbot/config/EJsonStrTest.java b/test/io/github/artemget/prbot/config/EJsonStrTest.java index 77c70e4..80ac9a7 100644 --- a/test/io/github/artemget/prbot/config/EJsonStrTest.java +++ b/test/io/github/artemget/prbot/config/EJsonStrTest.java @@ -24,7 +24,7 @@ package io.github.artemget.prbot.config; -import javax.json.Json; +import jakarta.json.Json; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; diff --git a/test/io/github/artemget/prbot/domain/pr/AccJsonTest.java b/test/io/github/artemget/prbot/domain/pr/AccJsonTest.java index 32019da..2dfdc86 100644 --- a/test/io/github/artemget/prbot/domain/pr/AccJsonTest.java +++ b/test/io/github/artemget/prbot/domain/pr/AccJsonTest.java @@ -24,7 +24,7 @@ package io.github.artemget.prbot.domain.pr; -import javax.json.Json; +import jakarta.json.Json; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; diff --git a/test/io/github/artemget/prbot/domain/pr/BrJsonTest.java b/test/io/github/artemget/prbot/domain/pr/BrJsonTest.java index 293ab84..a9be908 100644 --- a/test/io/github/artemget/prbot/domain/pr/BrJsonTest.java +++ b/test/io/github/artemget/prbot/domain/pr/BrJsonTest.java @@ -24,7 +24,7 @@ package io.github.artemget.prbot.domain.pr; -import javax.json.Json; +import jakarta.json.Json; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; diff --git a/test/io/github/artemget/prbot/webhook/TkHookGitlabTest.java b/test/io/github/artemget/prbot/webhook/TkHookGitlabTest.java index 12eb6af..e937e6c 100644 --- a/test/io/github/artemget/prbot/webhook/TkHookGitlabTest.java +++ b/test/io/github/artemget/prbot/webhook/TkHookGitlabTest.java @@ -29,7 +29,6 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; import org.takes.rq.RqFake; import org.takes.rq.RqWithBody; import org.telegram.telegrambots.meta.api.objects.User;