add automate exception message for invalid enum value as api request parameter (#12400)

* add exception Message for invalid enum value

when enum value is incorrect in api call, this method generates the exactly message as we expect. for example the Include.java in databaseServiceResource.java list() api.

* add an example for invalid enum value as unit test for databaseServiceResource class.

A unit test example that shows how to use invalidEnumValue() method instead of traditional way i.e. writing plain string.

* apply google-formatter

* Merge branch 'EsmaeilChitgar-AddExceptionMessageForInvalidEnumValue' of https://github.com/EsmaeilChitgar/OpenMetadata into EsmaeilChitgar-AddExceptionMessageForInvalidEnumValue

* fix reported issues in pull request

---------

Co-authored-by: Sriharsha Chintalapani <harshach@users.noreply.github.com>
This commit is contained in:
Esmaeil Chitgar 2023-08-02 09:22:48 +03:30 committed by GitHub
parent c32ec25ebe
commit 744a3d403f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -14,8 +14,10 @@
package org.openmetadata.service.exception;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import org.openmetadata.schema.api.events.CreateEventSubscription;
import org.openmetadata.schema.api.teams.CreateTeam.TeamType;
import org.openmetadata.schema.entity.teams.Team;
@ -234,4 +236,17 @@ public final class CatalogExceptionMessage {
public static String invalidFieldForTask(String fieldName, TaskType type) {
return String.format("The field name %s is not supported for %s task.", fieldName, type);
}
public static String invalidEnumValue(Class<? extends Enum<?>> enumClass) {
String className = enumClass.getSimpleName();
String classNameWithLowercaseFirstLetter = className.substring(0, 1).toLowerCase() + className.substring(1);
return invalidEnumValue(enumClass, classNameWithLowercaseFirstLetter);
}
public static String invalidEnumValue(Class<? extends Enum<?>> enumClass, String key) {
String enumValues =
Arrays.stream(enumClass.getEnumConstants()).map(Object::toString).collect(Collectors.joining(", "));
return "query param " + key + " must be one of [" + enumValues + "]";
}
}

View File

@ -19,14 +19,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.openmetadata.service.exception.CatalogExceptionMessage.invalidEnumValue;
import static org.openmetadata.service.util.EntityUtil.fieldAdded;
import static org.openmetadata.service.util.EntityUtil.fieldUpdated;
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.INGESTION_BOT_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.TEST_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.UpdateType;
import static org.openmetadata.service.util.TestUtils.assertResponse;
import static org.openmetadata.service.util.TestUtils.assertResponseContains;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -54,6 +58,7 @@ import org.openmetadata.schema.services.connections.database.RedshiftConnection;
import org.openmetadata.schema.services.connections.database.SnowflakeConnection;
import org.openmetadata.schema.services.connections.database.common.basicAuth;
import org.openmetadata.schema.type.ChangeDescription;
import org.openmetadata.schema.type.Include;
import org.openmetadata.schema.type.Schedule;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.EntityResourceTest;
@ -62,7 +67,6 @@ import org.openmetadata.service.resources.services.ingestionpipelines.IngestionP
import org.openmetadata.service.secrets.masker.PasswordEntityMasker;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.TestUtils;
import org.openmetadata.service.util.TestUtils.UpdateType;
@Slf4j
public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseService, CreateDatabaseService> {
@ -269,6 +273,17 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
assertEquals(stored.getConnection(), service.getConnection());
}
@Test
void get_listDatabaseServicesWithInvalidEnumValue_400(TestInfo test) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("include", "invalid-enum-value");
assertResponse(
() -> listEntities(queryParams, ADMIN_AUTH_HEADERS), BAD_REQUEST, invalidEnumValue(Include.class, "include"));
assertResponse(() -> listEntities(queryParams, ADMIN_AUTH_HEADERS), BAD_REQUEST, invalidEnumValue(Include.class));
}
public DatabaseService putTestConnectionResult(
UUID serviceId, TestConnectionResult testConnectionResult, Map<String, String> authHeaders)
throws HttpResponseException {