From e09537eeeb9043ec5dce5d7b9714827cb12be4af Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Mon, 19 Jun 2023 16:29:05 -0700 Subject: [PATCH] Fixes #11883 - A user can resolve a task created by him (#11998) * Fixes #11883 - A user can resolve a task created by him * Test failure fixes --- .../exception/CatalogExceptionMessage.java | 4 + .../decorators/MessageDecorator.java | 2 + .../service/jdbi3/FeedRepository.java | 85 ++- .../service/resources/feeds/FeedResource.java | 4 +- .../resources/feeds/FeedResourceTest.java | 570 +++++++++--------- .../secrets/ExternalSecretsManagerTest.java | 4 - 6 files changed, 330 insertions(+), 339 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/exception/CatalogExceptionMessage.java b/openmetadata-service/src/main/java/org/openmetadata/service/exception/CatalogExceptionMessage.java index f71475ba231..b33cae7168c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/exception/CatalogExceptionMessage.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/exception/CatalogExceptionMessage.java @@ -151,6 +151,10 @@ public final class CatalogExceptionMessage { return String.format("Principal: CatalogPrincipal{name='%s'} operations %s not allowed", user, operations); } + public static String taskOperationNotAllowed(String user, String operations) { + return String.format("Principal: CatalogPrincipal{name='%s'} operations %s not allowed", user, operations); + } + public static String entityIsNotEmpty(String entityType) { return String.format("%s is not empty", entityType); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java index ad296149301..fd4b4ca26e0 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java @@ -14,6 +14,7 @@ package org.openmetadata.service.formatter.decorators; import java.util.LinkedList; +import org.apache.commons.lang3.StringUtils; import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; import org.openmetadata.schema.type.ChangeEvent; @@ -44,6 +45,7 @@ public interface MessageDecorator { default String getPlaintextDiff(String oldValue, String newValue) { // create a configured DiffRowGenerator + oldValue = oldValue == null ? StringUtils.EMPTY : oldValue; String addMarker = this.httpAddMarker(); String removeMarker = this.httpRemoveMarker(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java index 4c0d7254c92..e170126e0b6 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java @@ -25,7 +25,6 @@ import static org.openmetadata.service.exception.CatalogExceptionMessage.ANNOUNC import static org.openmetadata.service.exception.CatalogExceptionMessage.ANNOUNCEMENT_OVERLAP; import static org.openmetadata.service.exception.CatalogExceptionMessage.entityNotFound; import static org.openmetadata.service.util.EntityUtil.compareEntityReference; -import static org.openmetadata.service.util.EntityUtil.populateEntityReferences; import static org.openmetadata.service.util.RestUtil.DELETED_TEAM_DISPLAY; import static org.openmetadata.service.util.RestUtil.DELETED_TEAM_NAME; import static org.openmetadata.service.util.RestUtil.DELETED_USER_DISPLAY; @@ -72,6 +71,7 @@ import org.openmetadata.schema.type.ThreadType; import org.openmetadata.schema.utils.EntityInterfaceUtil; import org.openmetadata.service.Entity; import org.openmetadata.service.ResourceRegistry; +import org.openmetadata.service.exception.CatalogExceptionMessage; import org.openmetadata.service.exception.EntityNotFoundException; import org.openmetadata.service.formatter.decorators.FeedMessageDecorator; import org.openmetadata.service.formatter.decorators.MessageDecorator; @@ -80,7 +80,7 @@ import org.openmetadata.service.resources.feeds.FeedResource; import org.openmetadata.service.resources.feeds.FeedUtil; import org.openmetadata.service.resources.feeds.MessageParser; import org.openmetadata.service.resources.feeds.MessageParser.EntityLink; -import org.openmetadata.service.security.Authorizer; +import org.openmetadata.service.security.AuthorizationException; import org.openmetadata.service.security.policyevaluator.SubjectCache; import org.openmetadata.service.util.EntityUtil; import org.openmetadata.service.util.FullyQualifiedName; @@ -173,6 +173,7 @@ public class FeedRepository { // Add mentions to field relationship table storeMentions(thread, thread.getMessage()); + populateAssignees(thread); return thread; } @@ -226,23 +227,17 @@ public class FeedRepository { // Add a default message to the Task thread with updated description/tag TaskDetails task = thread.getTask(); TaskType type = task.getType(); - String oldValue = StringUtils.EMPTY; - if (List.of(TaskType.RequestDescription, TaskType.UpdateDescription).contains(type)) { - if (task.getOldValue() != null) { - oldValue = task.getOldValue(); - } + if (EntityUtil.isDescriptionTask(type)) { message = String.format( "Resolved the Task with Description - %s", - feedMessageFormatter.getPlaintextDiff(oldValue, task.getNewValue())); - } else if (List.of(TaskType.RequestTag, TaskType.UpdateTag).contains(type)) { - List tags; - if (task.getOldValue() != null) { - tags = JsonUtils.readObjects(task.getOldValue(), TagLabel.class); - oldValue = getTagFQNs(tags); - } - tags = JsonUtils.readObjects(task.getNewValue(), TagLabel.class); - String newValue = getTagFQNs(tags); + feedMessageFormatter.getPlaintextDiff(task.getOldValue(), task.getNewValue())); + } else if (EntityUtil.isTagTask(type)) { + String oldValue = + task.getOldValue() != null + ? getTagFQNs(JsonUtils.readObjects(task.getOldValue(), TagLabel.class)) + : StringUtils.EMPTY; + String newValue = getTagFQNs(JsonUtils.readObjects(task.getNewValue(), TagLabel.class)); message = String.format( "Resolved the Task with Tag(s) - %s", feedMessageFormatter.getPlaintextDiff(oldValue, newValue)); @@ -600,39 +595,39 @@ public class FeedRepository { return new PatchResponse<>(Status.OK, updatedHref, change); } - public void checkPermissionsForResolveTask(Thread thread, SecurityContext securityContext, Authorizer authorizer) + public void checkPermissionsForResolveTask(Thread thread, boolean closeTask, SecurityContext securityContext) throws IOException { - if (!thread.getType().equals(ThreadType.Task)) { - return; // Nothing to resolve - } + String userName = securityContext.getUserPrincipal().getName(); + User user = SubjectCache.getInstance().getUser(userName); EntityLink about = EntityLink.parse(thread.getAbout()); EntityReference aboutRef = EntityUtil.validateEntityLink(about); - - // Get owner for the addressed to Entity - EntityReference owner = Entity.getOwner(aboutRef); - - String userName = securityContext.getUserPrincipal().getName(); - User loggedInUser = SubjectCache.getInstance().getUser(userName); - List teams = - populateEntityReferences( - dao.relationshipDAO() - .findFrom(loggedInUser.getId().toString(), Entity.USER, Relationship.HAS.ordinal(), Entity.TEAM), - Entity.TEAM); - List teamNames = teams.stream().map(EntityReference::getName).collect(Collectors.toList()); - - // check if logged-in user satisfies any of the following - // - Creator of the task - // - logged-in user or the teams they belong to were assigned the task - // - logged-in user or the teams they belong to, owns the entity that the task is about - List assignees = thread.getTask().getAssignees(); - if (!thread.getCreatedBy().equals(userName) - && assignees.stream().noneMatch(assignee -> assignee.getName().equals(userName)) - && assignees.stream().noneMatch(assignee -> teamNames.contains(assignee.getName())) - && !owner.getName().equals(userName) - && !teamNames.contains(owner.getName())) { - // Only admins or bots can close or resolve task other than the above-mentioned users - authorizer.authorizeAdmin(securityContext); + if (Boolean.TRUE.equals(user.getIsAdmin())) { + return; // Allow admin resolve/close task } + + // Allow if user is an assignee of the resolve/close task + // Allow if user is the owner of the resource for which task is created to resolve/close task + // Allow if user created the task to close task (and not resolve task) + EntityReference owner = Entity.getOwner(aboutRef); + List assignees = thread.getTask().getAssignees(); + if (assignees.stream().anyMatch(assignee -> assignee.getName().equals(userName)) + || owner.getName().equals(userName) + || closeTask && thread.getCreatedBy().equals(userName)) { + return; + } + + // Allow if user belongs to a team that has task assigned to it + // Allow if user belongs to a team if owner of the resource against which task is created + List teams = user.getTeams(); + List teamNames = teams.stream().map(EntityReference::getName).collect(Collectors.toList()); + if (assignees.stream().anyMatch(assignee -> teamNames.contains(assignee.getName())) + && teamNames.contains(owner.getName())) { + return; + } + + // Finally, operation is not allowed - throw exception + throw new AuthorizationException( + CatalogExceptionMessage.taskOperationNotAllowed(userName, closeTask ? "closeTask" : "resolveTask")); } private void validateAnnouncement(AnnouncementDetails announcementDetails) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedResource.java index c028fc1090e..0348016cee5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedResource.java @@ -265,7 +265,7 @@ public class FeedResource { @Valid ResolveTask resolveTask) throws IOException { Thread task = dao.getTask(Integer.parseInt(id)); - dao.checkPermissionsForResolveTask(task, securityContext, authorizer); + dao.checkPermissionsForResolveTask(task, false, securityContext); return dao.resolveTask(uriInfo, task, securityContext.getUserPrincipal().getName(), resolveTask).toResponse(); } @@ -289,7 +289,7 @@ public class FeedResource { @Valid CloseTask closeTask) throws IOException { Thread task = dao.getTask(Integer.parseInt(id)); - dao.checkPermissionsForResolveTask(task, securityContext, authorizer); + dao.checkPermissionsForResolveTask(task, true, securityContext); return dao.closeTask(uriInfo, task, securityContext.getUserPrincipal().getName(), closeTask).toResponse(); } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/FeedResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/FeedResourceTest.java index 10fd98f3483..6a9918f2939 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/FeedResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/FeedResourceTest.java @@ -25,6 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; 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.schema.type.TaskType.RequestDescription; +import static org.openmetadata.schema.type.TaskType.RequestTag; import static org.openmetadata.service.Entity.ADMIN_USER_NAME; import static org.openmetadata.service.exception.CatalogExceptionMessage.ANNOUNCEMENT_INVALID_START_TIME; import static org.openmetadata.service.exception.CatalogExceptionMessage.ANNOUNCEMENT_OVERLAP; @@ -100,8 +102,10 @@ import org.openmetadata.schema.type.TaskType; import org.openmetadata.schema.type.ThreadType; import org.openmetadata.service.Entity; import org.openmetadata.service.OpenMetadataApplicationTest; +import org.openmetadata.service.exception.CatalogExceptionMessage; import org.openmetadata.service.formatter.decorators.FeedMessageDecorator; import org.openmetadata.service.formatter.decorators.MessageDecorator; +import org.openmetadata.service.formatter.util.FeedMessage; import org.openmetadata.service.jdbi3.FeedRepository.FilterType; import org.openmetadata.service.resources.databases.TableResourceTest; import org.openmetadata.service.resources.feeds.FeedResource.PostList; @@ -123,13 +127,14 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { public static String TABLE_DESCRIPTION_LINK; public static List COLUMNS; public static User USER; - public static User USER2; public static String USER_LINK; + public static Map USER_AUTH_HEADERS; + public static User USER2; + public static Map USER2_AUTH_HEADERS; public static Team TEAM; public static Team TEAM2; public static String TEAM_LINK; public static Thread THREAD; - public static Map AUTH_HEADERS; public static TableResourceTest TABLE_RESOURCE_TEST; public static final Comparator REACTION_COMPARATOR = (o1, o2) -> @@ -137,18 +142,22 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { ? 0 : 1; - private static MessageDecorator feedMessageFormatter = new FeedMessageDecorator(); + private static final MessageDecorator feedMessageFormatter = new FeedMessageDecorator(); @BeforeAll public void setup(TestInfo test) throws IOException, URISyntaxException { TABLE_RESOURCE_TEST = new TableResourceTest(); TABLE_RESOURCE_TEST.setup(test); // Initialize TableResourceTest for using helper methods - UserResourceTest userResourceTest = new UserResourceTest(); - USER2 = userResourceTest.createEntity(userResourceTest.createRequest(test, 4), TEST_AUTH_HEADERS); + USER = TableResourceTest.USER1; + USER_LINK = String.format("<#E::user::%s>", USER.getName()); + USER_AUTH_HEADERS = authHeaders(USER.getName()); - CreateTable createTable = TABLE_RESOURCE_TEST.createRequest(test); - createTable.withOwner(TableResourceTest.USER1_REF); + UserResourceTest userResourceTest = new UserResourceTest(); + USER2 = userResourceTest.createEntity(userResourceTest.createRequest(test, 4), ADMIN_AUTH_HEADERS); + USER2_AUTH_HEADERS = authHeaders(USER2.getName()); + + CreateTable createTable = TABLE_RESOURCE_TEST.createRequest(test).withOwner(TableResourceTest.USER1_REF); TABLE = TABLE_RESOURCE_TEST.createAndCheckEntity(createTable, ADMIN_AUTH_HEADERS); TeamResourceTest teamResourceTest = new TeamResourceTest(); @@ -179,15 +188,13 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { CreateThread createThread = create(); THREAD = createAndCheck(createThread, ADMIN_AUTH_HEADERS); - - AUTH_HEADERS = authHeaders(USER.getEmail()); } @Test void post_feedWithoutAbout_4xx() { // Create thread without addressed to entity in the request CreateThread create = create().withFrom(USER.getName()).withAbout(null); - assertResponse(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, "[about must not be null]"); + assertResponse(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, "[about must not be null]"); } @Test @@ -196,42 +203,42 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { CreateThread create = create().withFrom(USER.getName()).withAbout("<>"); // Invalid EntityLink String failureReason = "[about must match \"^(?U)<#E::\\w+::[\\w'\\- .&/:+\"\\\\()$#]+>$\"]"; - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, failureReason); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, failureReason); create.withAbout("<#E::>"); // Invalid EntityLink - missing entityType and entityId - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, failureReason); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, failureReason); create.withAbout("<#E::table::>"); // Invalid EntityLink - missing entityId - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, failureReason); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, failureReason); create.withAbout("<#E::table::tableName"); // Invalid EntityLink - missing closing bracket ">" - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, failureReason); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, failureReason); } @Test void post_feedWithoutMessage_4xx() { CreateThread create = create().withFrom(USER.getName()).withMessage(null); - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, "[message must not be null]"); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, "[message must not be null]"); } @Test void post_feedWithoutFrom_4xx() { CreateThread create = create().withFrom(null); - assertResponseContains(() -> createThread(create, AUTH_HEADERS), BAD_REQUEST, "[from must not be null]"); + assertResponseContains(() -> createThread(create, USER_AUTH_HEADERS), BAD_REQUEST, "[from must not be null]"); } @Test void post_feedWithNonExistentFrom_404() { CreateThread create = create().withFrom(NON_EXISTENT_ENTITY.toString()); assertResponse( - () -> createThread(create, AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.USER, NON_EXISTENT_ENTITY)); + () -> createThread(create, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.USER, NON_EXISTENT_ENTITY)); } @Test void post_feedWithNonExistentAbout_404() { CreateThread create = create().withAbout("<#E::table::invalidTableName>"); assertResponse( - () -> createThread(create, AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.TABLE, "invalidTableName")); + () -> createThread(create, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.TABLE, "invalidTableName")); } @Test @@ -244,179 +251,139 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { int tableColumnDescriptionThreadCount = listThreads(TABLE_COLUMN_LINK, null, ADMIN_AUTH_HEADERS).getPaging().getTotal(); - CreateThread create = - create() - .withMessage( - String.format( - "%s mentions user %s team %s, table %s, description %s, and column description %s", - test.getDisplayName(), - USER_LINK, - TEAM_LINK, - TABLE_LINK, - TABLE_DESCRIPTION_LINK, - TABLE_COLUMN_LINK)); + String message = + String.format( + "%s mentions user %s team %s, table %s, description %s, and column description %s", + test.getDisplayName(), USER_LINK, TEAM_LINK, TABLE_LINK, TABLE_DESCRIPTION_LINK, TABLE_COLUMN_LINK); + CreateThread create = create().withMessage(message); // Create 10 threads - Map userAuthHeaders = authHeaders(USER.getEmail()); for (int i = 0; i < 10; i++) { - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // List all the threads and make sure the number of threads increased by 1 assertEquals( - ++userThreadCount, listThreads(USER_LINK, null, userAuthHeaders).getPaging().getTotal()); // Mentioned user + ++userThreadCount, listThreads(USER_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Mentioned user assertEquals( - ++tableThreadCount, listThreads(TABLE_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE + ++tableThreadCount, listThreads(TABLE_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // About TABLE assertEquals( - ++totalThreadCount, listThreads(null, null, userAuthHeaders).getPaging().getTotal()); // Overall threads + ++totalThreadCount, listThreads(null, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Overall threads } // List threads should not include mentioned entities // It should only include threads which are about the entity link assertEquals( tableDescriptionThreadCount, - listThreads(TABLE_DESCRIPTION_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE Description + listThreads(TABLE_DESCRIPTION_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // About TABLE Description assertEquals( tableColumnDescriptionThreadCount, - listThreads(TABLE_COLUMN_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE Column Description + listThreads(TABLE_COLUMN_LINK, null, USER_AUTH_HEADERS) + .getPaging() + .getTotal()); // About TABLE Column Description create.withAbout(TABLE_DESCRIPTION_LINK); for (int i = 0; i < 10; i++) { - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // List all the threads and make sure the number of threads increased by 1 assertEquals( - ++userThreadCount, listThreads(USER_LINK, null, userAuthHeaders).getPaging().getTotal()); // Mentioned user + ++userThreadCount, listThreads(USER_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Mentioned user assertEquals( - ++tableThreadCount, listThreads(TABLE_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE + ++tableThreadCount, listThreads(TABLE_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // About TABLE assertEquals( ++tableDescriptionThreadCount, - listThreads(TABLE_DESCRIPTION_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE Description + listThreads(TABLE_DESCRIPTION_LINK, null, USER_AUTH_HEADERS) + .getPaging() + .getTotal()); // About TABLE Description assertEquals( - ++totalThreadCount, listThreads(null, null, userAuthHeaders).getPaging().getTotal()); // Overall threads + ++totalThreadCount, listThreads(null, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Overall threads } create.withAbout(TABLE_COLUMN_LINK); for (int i = 0; i < 10; i++) { - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // List all the threads and make sure the number of threads increased by 1 assertEquals( - ++userThreadCount, listThreads(USER_LINK, null, userAuthHeaders).getPaging().getTotal()); // Mentioned user + ++userThreadCount, listThreads(USER_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Mentioned user assertEquals( - ++tableThreadCount, listThreads(TABLE_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE + ++tableThreadCount, listThreads(TABLE_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // About TABLE assertEquals( ++tableColumnDescriptionThreadCount, - listThreads(TABLE_COLUMN_LINK, null, userAuthHeaders).getPaging().getTotal()); // About TABLE Description + listThreads(TABLE_COLUMN_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); // About TABLE Description assertEquals( - ++totalThreadCount, listThreads(null, null, userAuthHeaders).getPaging().getTotal()); // Overall threads + ++totalThreadCount, listThreads(null, null, USER_AUTH_HEADERS).getPaging().getTotal()); // Overall threads } // Test the /api/v1/feed/count API - assertEquals(userThreadCount, listThreads(USER_LINK, null, userAuthHeaders).getPaging().getTotal()); - assertEquals(userThreadCount, listThreadsCount(USER_LINK, userAuthHeaders).getTotalCount()); - assertEquals(tableDescriptionThreadCount, getThreadCount(TABLE_DESCRIPTION_LINK, userAuthHeaders)); - assertEquals(tableColumnDescriptionThreadCount, getThreadCount(TABLE_COLUMN_LINK, userAuthHeaders)); + assertEquals(userThreadCount, listThreads(USER_LINK, null, USER_AUTH_HEADERS).getPaging().getTotal()); + assertEquals(userThreadCount, listThreadsCount(USER_LINK, USER_AUTH_HEADERS).getTotalCount()); + assertEquals(tableDescriptionThreadCount, getThreadCount(TABLE_DESCRIPTION_LINK, USER_AUTH_HEADERS)); + assertEquals(tableColumnDescriptionThreadCount, getThreadCount(TABLE_COLUMN_LINK, USER_AUTH_HEADERS)); } @Test void post_validTaskAndList_200() throws IOException { int totalTaskCount = listTasks(null, null, null, null, null, ADMIN_AUTH_HEADERS).getPaging().getTotal(); int assignedByCount = - listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_BY.toString(), null, null, ADMIN_AUTH_HEADERS) + listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_BY, null, null, ADMIN_AUTH_HEADERS) .getPaging() .getTotal(); int assignedToCount = - listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_TO.toString(), null, null, ADMIN_AUTH_HEADERS) + listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_TO, null, null, ADMIN_AUTH_HEADERS) .getPaging() .getTotal(); - CreateTaskDetails taskDetails = - new CreateTaskDetails() - .withOldValue("old description") - .withAssignees(List.of(USER2.getEntityReference())) - .withType(TaskType.RequestDescription) - .withSuggestion("new description"); - CreateThread create = - create().withMessage("Request Description for column").withTaskDetails(taskDetails).withType(ThreadType.Task); - Map userAuthHeaders = authHeaders(USER.getEmail()); - createAndCheck(create, userAuthHeaders); - ThreadList tasks = listTasks(null, null, null, null, null, userAuthHeaders); + // User creates task1 assigned to User2 on TABLE + String about = String.format("<#E::%s::%s>", Entity.TABLE, TABLE.getFullyQualifiedName()); + Thread taskThread = + createTaskThread(USER.getName(), about, USER2, "old", "new", RequestDescription, USER_AUTH_HEADERS); + TaskDetails task1 = taskThread.getTask(); + + // List task and validate + ThreadList tasks = listTasks(null, null, null, null, null, USER_AUTH_HEADERS); TaskDetails task = tasks.getData().get(0).getTask(); - assertNotNull(task.getId()); - int task1Id = task.getId(); - assertEquals(1, task.getAssignees().size()); - assertEquals(USER2.getEntityReference().getId(), task.getAssignees().get(0).getId()); - assertEquals("new description", task.getSuggestion()); - assertEquals(totalTaskCount + 1, tasks.getPaging().getTotal()); - assertEquals(totalTaskCount + 1, tasks.getData().size()); + validateTaskList(USER2.getId(), "new", TaskStatus.Open, totalTaskCount + 1, tasks); - Thread taskThread = getTask(task.getId(), userAuthHeaders); + // Get task and validate + taskThread = getTask(task.getId(), USER_AUTH_HEADERS); + validateTask(task1, taskThread.getTask()); + + // User2 creates a task2 assigned to User on TABLE2 + about = String.format("<#E::%s::%s::columns::%s::description>", Entity.TABLE, TABLE2.getFullyQualifiedName(), C1); + taskThread = createTaskThread(USER2.getName(), about, USER, "old", "new2", RequestDescription, USER2_AUTH_HEADERS); TaskDetails task2 = taskThread.getTask(); - assertEquals(task.getId(), task2.getId()); - assertEquals(task.getAssignees(), task2.getAssignees()); - assertEquals(task.getSuggestion(), task2.getSuggestion()); - assertEquals(TaskStatus.Open, task2.getStatus()); + tasks = listTasks(null, null, null, null, null, USER2_AUTH_HEADERS); + validateTaskList(USER.getId(), "new2", TaskStatus.Open, totalTaskCount + 2, tasks); - // Now User2 creates a task for user on TABLE2 - userAuthHeaders = authHeaders(USER2.getEmail()); - String about = String.format("<#E::%s::%s>", Entity.TABLE, TABLE2.getFullyQualifiedName()); - taskDetails = - new CreateTaskDetails() - .withOldValue("old value") - .withAssignees(List.of(USER.getEntityReference())) - .withType(TaskType.RequestDescription) - .withSuggestion("new description2"); - about = about.substring(0, about.length() - 1) + "::columns::" + C1 + "::description>"; - create = - new CreateThread() - .withAbout(about) - .withFrom(USER2.getName()) - .withType(ThreadType.Task) - .withMessage("Request Description for " + TABLE2.getName()) - .withTaskDetails(taskDetails); - createAndCheck(create, userAuthHeaders); - tasks = listTasks(null, null, null, null, null, userAuthHeaders); + // List tasks assigned by USER + tasks = listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_BY, null, null, USER2_AUTH_HEADERS); task = tasks.getData().get(0).getTask(); - assertNotNull(task.getId()); - int task2Id = task.getId(); - assertEquals(1, task.getAssignees().size()); - assertEquals(USER.getId(), task.getAssignees().get(0).getId()); - assertEquals("new description2", task.getSuggestion()); - assertEquals("old value", task.getOldValue()); - assertEquals(totalTaskCount + 2, tasks.getPaging().getTotal()); - assertEquals(totalTaskCount + 2, tasks.getData().size()); + validateTask(task1, task); + validateTaskList(USER2.getId(), "new", TaskStatus.Open, assignedByCount + 1, tasks); - // try to list tasks with filters - tasks = listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_BY.toString(), null, null, userAuthHeaders); + // List tasks assigned to USER + tasks = listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_TO, null, null, USER2_AUTH_HEADERS); task = tasks.getData().get(0).getTask(); - assertEquals(task1Id, task.getId()); - assertEquals("new description", task.getSuggestion()); - assertEquals(assignedByCount + 1, tasks.getPaging().getTotal()); - assertEquals(assignedByCount + 1, tasks.getData().size()); - - tasks = listTasks(null, USER.getId().toString(), FilterType.ASSIGNED_TO.toString(), null, null, userAuthHeaders); - task = tasks.getData().get(0).getTask(); - assertEquals(task2Id, task.getId()); - assertEquals(USER.getFullyQualifiedName(), task.getAssignees().get(0).getFullyQualifiedName()); - assertEquals("new description2", task.getSuggestion()); - assertEquals(assignedToCount + 1, tasks.getPaging().getTotal()); - assertEquals(assignedToCount + 1, tasks.getData().size()); + validateTask(task2, task); + validateTaskList(USER.getId(), "new2", TaskStatus.Open, assignedToCount + 1, tasks); + // List all the tasks for a user tasks = listTasks(null, USER.getId().toString(), null, null, null, ADMIN_AUTH_HEADERS); assertEquals(assignedToCount + assignedByCount + 2, tasks.getPaging().getTotal()); assertEquals(assignedToCount + assignedByCount + 2, tasks.getData().size()); - ThreadCount count = listTasksCount(null, TaskStatus.Open, userAuthHeaders); + ThreadCount count = listTasksCount(null, TaskStatus.Open, USER2_AUTH_HEADERS); int totalOpenTaskCount = count.getTotalCount(); - count = listTasksCount(null, TaskStatus.Closed, userAuthHeaders); + count = listTasksCount(null, TaskStatus.Closed, USER2_AUTH_HEADERS); int totalClosedTaskCount = count.getTotalCount(); // close a task and test the task status filter ResolveTask resolveTask = new ResolveTask().withNewValue("accepted description"); - resolveTask(task2Id, resolveTask, userAuthHeaders); + resolveTask(task2.getId(), resolveTask, USER_AUTH_HEADERS); - tasks = listTasks(null, null, null, TaskStatus.Open, null, userAuthHeaders); - assertFalse(tasks.getData().stream().anyMatch(t -> t.getTask().getId().equals(task2Id))); + tasks = listTasks(null, null, null, TaskStatus.Open, null, USER2_AUTH_HEADERS); + assertFalse(tasks.getData().stream().anyMatch(t -> t.getTask().getId().equals(task2.getId()))); assertEquals(totalOpenTaskCount - 1, tasks.getPaging().getTotal()); - tasks = listTasks(null, null, null, TaskStatus.Closed, null, userAuthHeaders); - assertEquals(task2Id, tasks.getData().get(0).getTask().getId()); + tasks = listTasks(null, null, null, TaskStatus.Closed, null, USER2_AUTH_HEADERS); + assertEquals(task2.getId(), tasks.getData().get(0).getTask().getId()); assertEquals(totalClosedTaskCount + 1, tasks.getPaging().getTotal()); assertEquals(totalClosedTaskCount + 1, tasks.getData().size()); } @@ -437,8 +404,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement One") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - Map userAuthHeaders = authHeaders(USER.getEmail()); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); announcementDetails .withStartTime(now.plusDays(12L).toEpochSecond(ZoneOffset.UTC)) @@ -448,7 +414,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement Two") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // create one expired announcement announcementDetails @@ -459,7 +425,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement Three") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // create one active announcement announcementDetails @@ -471,7 +437,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement Four") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); ThreadList announcements = listAnnouncements(null, null, null, ADMIN_AUTH_HEADERS); int announcementCount = announcements.getPaging().getTotal(); @@ -518,8 +484,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement One") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - Map userAuthHeaders = authHeaders(USER.getEmail()); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); CreateThread create2 = create() @@ -528,122 +493,100 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withAnnouncementDetails(announcementDetails); // create announcement with same start and end time - assertResponse(() -> createThread(create2, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + assertResponse(() -> createThread(create2, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); // create announcement with start time > end time announcementDetails .withStartTime(now.plusDays(3L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(2L).toEpochSecond(ZoneOffset.UTC)); CreateThread create3 = create2.withAnnouncementDetails(announcementDetails); - assertResponse(() -> createThread(create3, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_INVALID_START_TIME); + assertResponse(() -> createThread(create3, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_INVALID_START_TIME); // create announcement with overlaps announcementDetails .withStartTime(now.plusDays(2L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(6L).toEpochSecond(ZoneOffset.UTC)); CreateThread create4 = create2.withAnnouncementDetails(announcementDetails); - assertResponse(() -> createThread(create4, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + assertResponse(() -> createThread(create4, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(3L).plusHours(2L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(4L).toEpochSecond(ZoneOffset.UTC)); CreateThread create5 = create2.withAnnouncementDetails(announcementDetails); - assertResponse(() -> createThread(create5, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + assertResponse(() -> createThread(create5, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(2L).plusHours(12L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(4L).toEpochSecond(ZoneOffset.UTC)); CreateThread create6 = create2.withAnnouncementDetails(announcementDetails); - assertResponse(() -> createThread(create6, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + assertResponse(() -> createThread(create6, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(4L).plusHours(12L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(6L).toEpochSecond(ZoneOffset.UTC)); CreateThread create7 = create2.withAnnouncementDetails(announcementDetails); - assertResponse(() -> createThread(create7, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + assertResponse(() -> createThread(create7, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); } @Test void put_resolveTask_description_200() throws IOException { - CreateTaskDetails taskDetails = - new CreateTaskDetails() - .withOldValue("old description") - .withAssignees(List.of(USER2.getEntityReference())) - .withType(TaskType.RequestDescription) - .withSuggestion("new description"); + // Create a task from User to User2 + String about = + String.format("<#E::%s::%s::columns::%s::description>", Entity.TABLE, TABLE.getFullyQualifiedName(), C1); + Thread taskThread = + createTaskThread(USER.getName(), about, USER2, "old", "new", RequestDescription, USER_AUTH_HEADERS); - String about = create().getAbout(); - about = about.substring(0, about.length() - 1) + "::columns::" + C1 + "::description>"; - CreateThread create = - create() - .withMessage("Request Description for column") - .withTaskDetails(taskDetails) - .withType(ThreadType.Task) - .withAbout(about); + assertNotNull(taskThread.getTask().getId()); + int taskId = taskThread.getTask().getId(); - Map userAuthHeaders = authHeaders(USER.getEmail()); - createAndCheck(create, userAuthHeaders); + ResolveTask resolveTask = new ResolveTask().withNewValue("accepted"); - ThreadList tasks = listTasks(null, null, null, null, null, userAuthHeaders); - TaskDetails task = tasks.getData().get(0).getTask(); - assertNotNull(task.getId()); - int taskId = task.getId(); + // User who created the task can't resolve the task + assertResponse( + () -> resolveTask(taskId, resolveTask, USER_AUTH_HEADERS), + FORBIDDEN, + CatalogExceptionMessage.taskOperationNotAllowed(USER.getName(), "resolveTask")); - ResolveTask resolveTask = new ResolveTask().withNewValue("accepted description"); - resolveTask(taskId, resolveTask, userAuthHeaders); - Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, userAuthHeaders); - assertEquals("accepted description", EntityUtil.getColumn(table, (C1)).getDescription()); + // User2 who created the task can resolve the task + resolveTask(taskId, resolveTask, USER2_AUTH_HEADERS); + Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, USER_AUTH_HEADERS); + assertEquals("accepted", EntityUtil.getColumn(table, (C1)).getDescription()); - Thread taskThread = getTask(taskId, userAuthHeaders); - task = taskThread.getTask(); - assertEquals(taskId, task.getId()); - assertEquals("accepted description", task.getNewValue()); - assertEquals(TaskStatus.Closed, task.getStatus()); + taskThread = getTask(taskId, USER_AUTH_HEADERS); + assertEquals(taskId, taskThread.getTask().getId()); + assertEquals("accepted", taskThread.getTask().getNewValue()); + assertEquals(TaskStatus.Closed, taskThread.getTask().getStatus()); assertEquals(1, taskThread.getPostsCount()); assertEquals(1, taskThread.getPosts().size()); - String diff = feedMessageFormatter.getPlaintextDiff("old description", "accepted description"); + String diff = feedMessageFormatter.getPlaintextDiff("old", "accepted"); String expectedMessage = String.format("Resolved the Task with Description - %s", diff); assertEquals(expectedMessage, taskThread.getPosts().get(0).getMessage()); } @Test void put_closeTask_200() throws IOException { - CreateTaskDetails taskDetails = - new CreateTaskDetails() - .withOldValue("old description") - .withAssignees(List.of(USER2.getEntityReference())) - .withType(TaskType.RequestDescription) - .withSuggestion("new description"); + // User created a task for USER2 + String about = + String.format("<#E::%s::%s::columns::%s::description>", Entity.TABLE, TABLE.getFullyQualifiedName(), C1); + Thread threadTask = + createTaskThread( + USER.getName(), about, USER2, "old description", "new description", RequestDescription, USER_AUTH_HEADERS); + assertNotNull(threadTask.getTask().getId()); + int taskId = threadTask.getTask().getId(); - String about = create().getAbout(); - about = about.substring(0, about.length() - 1) + "::columns::" + C1 + "::description>"; - CreateThread create = - create() - .withMessage("Request Description for column") - .withTaskDetails(taskDetails) - .withType(ThreadType.Task) - .withAbout(about); - - Map userAuthHeaders = authHeaders(USER.getEmail()); - Thread threadTask = createAndCheck(create, userAuthHeaders); - TaskDetails task = threadTask.getTask(); - assertNotNull(task.getId()); - int taskId = task.getId(); - - Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, userAuthHeaders); + Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, USER_AUTH_HEADERS); String oldDescription = EntityUtil.getColumn(table, C1).getDescription(); - closeTask(taskId, "closing comment", userAuthHeaders); + closeTask(taskId, "closing comment", USER_AUTH_HEADERS); // closing the task should not affect description of the table - table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, userAuthHeaders); + table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), null, USER_AUTH_HEADERS); assertEquals(oldDescription, EntityUtil.getColumn(table, C1).getDescription()); - Thread taskThread = getTask(taskId, userAuthHeaders); - task = taskThread.getTask(); - assertEquals(taskId, task.getId()); - assertNull(task.getNewValue()); - assertEquals(TaskStatus.Closed, task.getStatus()); + Thread taskThread = getTask(taskId, USER_AUTH_HEADERS); + assertEquals(taskId, taskThread.getTask().getId()); + assertNull(taskThread.getTask().getNewValue()); + assertEquals(TaskStatus.Closed, taskThread.getTask().getStatus()); assertEquals(1, taskThread.getPostsCount()); assertEquals(1, taskThread.getPosts().size()); assertEquals("Closed the Task with comment - closing comment", taskThread.getPosts().get(0).getMessage()); @@ -651,42 +594,32 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void put_resolveTask_tags_200() throws IOException { + // Test user creates a task for TABLE (owned by USER) and assigns it to User2 + String about = String.format("<#E::%s::%s::columns::%s::tags>", Entity.TABLE, TABLE.getFullyQualifiedName(), C1); String newValue = "[" + JsonUtils.pojoToJson(USER_ADDRESS_TAG_LABEL) + "]"; - CreateTaskDetails taskDetails = - new CreateTaskDetails() - .withOldValue(null) - .withAssignees(List.of(USER2.getEntityReference())) - .withType(TaskType.RequestTag) - .withSuggestion(newValue); - String about = create().getAbout(); - about = about.substring(0, about.length() - 1) + "::columns::" + C1 + "::tags>"; - CreateThread create = - create() - .withMessage("Request Tags for column") - .withTaskDetails(taskDetails) - .withType(ThreadType.Task) - .withAbout(about); - - Map userAuthHeaders = authHeaders(USER.getEmail()); - createAndCheck(create, userAuthHeaders); - - ThreadList tasks = listTasks(null, null, null, null, null, userAuthHeaders); - TaskDetails task = tasks.getData().get(0).getTask(); - assertNotNull(task.getId()); - int taskId = task.getId(); + Thread taskThread = createTaskThread(TEST_USER_NAME, about, USER2, null, newValue, RequestTag, TEST_AUTH_HEADERS); + int taskId = taskThread.getTask().getId(); ResolveTask resolveTask = new ResolveTask().withNewValue(newValue); - resolveTask(taskId, resolveTask, userAuthHeaders); - Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), "tags", userAuthHeaders); + + // Task can't be resolved by Test user who crated the task + assertResponse( + () -> resolveTask(taskId, resolveTask, TEST_AUTH_HEADERS), + FORBIDDEN, + CatalogExceptionMessage.taskOperationNotAllowed(TEST_USER_NAME, "resolveTask")); + + // Task can be resolved by the User2 to whom the task is assigned + resolveTask(taskId, resolveTask, USER2_AUTH_HEADERS); + + Table table = TABLE_RESOURCE_TEST.getEntity(TABLE.getId(), "tags", USER_AUTH_HEADERS); List tags = EntityUtil.getColumn(table, C1).getTags(); assertEquals(USER_ADDRESS_TAG_LABEL.getTagFQN(), tags.get(0).getTagFQN()); - Thread taskThread = getTask(taskId, userAuthHeaders); - task = taskThread.getTask(); - assertEquals(taskId, task.getId()); - assertEquals(newValue, task.getNewValue()); - assertEquals(TaskStatus.Closed, task.getStatus()); + taskThread = getTask(taskId, USER_AUTH_HEADERS); + assertEquals(taskId, taskThread.getTask().getId()); + assertEquals(newValue, taskThread.getTask().getNewValue()); + assertEquals(TaskStatus.Closed, taskThread.getTask().getStatus()); assertEquals(1, taskThread.getPostsCount()); assertEquals(1, taskThread.getPosts().size()); String diff = feedMessageFormatter.getPlaintextDiff("", USER_ADDRESS_TAG_LABEL.getTagFQN()); @@ -706,12 +639,11 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { void get_listThreadsWithPagination(String entityLink) throws HttpResponseException { // Create 10 threads int totalThreadCount = listThreads(entityLink, null, ADMIN_AUTH_HEADERS).getPaging().getTotal(); - Map userAuthHeaders = authHeaders(USER.getEmail()); for (int i = 1; i <= 10; i++) { CreateThread create = create().withMessage("Thread " + i); - createAndCheck(create, userAuthHeaders); + createAndCheck(create, USER_AUTH_HEADERS); // List all the threads and make sure the number of threads increased by 1 - assertEquals(++totalThreadCount, listThreads(entityLink, null, userAuthHeaders).getPaging().getTotal()); + assertEquals(++totalThreadCount, listThreads(entityLink, null, USER_AUTH_HEADERS).getPaging().getTotal()); } // Now test if there are n number of pages with limit set to 5. (n = totalThreadCount / 5) int limit = 5; @@ -729,7 +661,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { listThreads( entityLink, null, - userAuthHeaders, + USER_AUTH_HEADERS, null, null, null, @@ -752,7 +684,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { listThreads( entityLink, null, - userAuthHeaders, + USER_AUTH_HEADERS, null, null, null, @@ -775,7 +707,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { listThreads( entityLink, null, - userAuthHeaders, + USER_AUTH_HEADERS, null, null, null, @@ -792,7 +724,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { listThreads( entityLink, null, - userAuthHeaders, + USER_AUTH_HEADERS, null, null, null, @@ -813,7 +745,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { CreatePost createPost = createPost(null).withMessage(null); assertResponseContains( - () -> addPost(THREAD.getId(), createPost, AUTH_HEADERS), BAD_REQUEST, "[message must not be null]"); + () -> addPost(THREAD.getId(), createPost, USER_AUTH_HEADERS), BAD_REQUEST, "[message must not be null]"); } @Test @@ -822,7 +754,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { CreatePost createPost = createPost(null).withFrom(null); assertResponseContains( - () -> addPost(THREAD.getId(), createPost, AUTH_HEADERS), BAD_REQUEST, "[from must not be null]"); + () -> addPost(THREAD.getId(), createPost, USER_AUTH_HEADERS), BAD_REQUEST, "[from must not be null]"); } @Test @@ -831,23 +763,23 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { CreatePost createPost = createPost(null).withFrom(NON_EXISTENT_ENTITY.toString()); assertResponse( - () -> addPost(THREAD.getId(), createPost, AUTH_HEADERS), + () -> addPost(THREAD.getId(), createPost, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.USER, NON_EXISTENT_ENTITY)); } @Test void post_validAddPost_200() throws HttpResponseException { - Thread thread = createAndCheck(create(), AUTH_HEADERS); + Thread thread = createAndCheck(create(), USER_AUTH_HEADERS); // Add 10 posts and validate int POST_COUNT = 10; for (int i = 0; i < POST_COUNT; i++) { CreatePost createPost = createPost(null); - thread = addPostAndCheck(thread, createPost, AUTH_HEADERS); + thread = addPostAndCheck(thread, createPost, USER_AUTH_HEADERS); } // Check if get posts API returns all the posts - PostList postList = listPosts(thread.getId().toString(), AUTH_HEADERS); + PostList postList = listPosts(thread.getId().toString(), USER_AUTH_HEADERS); assertEquals(POST_COUNT, postList.getData().size()); } @@ -895,8 +827,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement One") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - Map userAuthHeaders = authHeaders(USER.getEmail()); - Thread thread = createAndCheck(create, userAuthHeaders); + Thread thread = createAndCheck(create, USER_AUTH_HEADERS); String originalJson = JsonUtils.pojoToJson(thread); @@ -940,8 +871,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement One") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - Map userAuthHeaders = authHeaders(USER.getEmail()); - Thread thread1 = createAndCheck(create, userAuthHeaders); + Thread thread1 = createAndCheck(create, USER_AUTH_HEADERS); announcementDetails .withStartTime(now.plusDays(57L).toEpochSecond(ZoneOffset.UTC)) @@ -951,7 +881,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withMessage("Announcement Two") .withType(ThreadType.Announcement) .withAnnouncementDetails(announcementDetails); - Thread thread2 = createAndCheck(create2, userAuthHeaders); + Thread thread2 = createAndCheck(create2, USER_AUTH_HEADERS); String originalJson = JsonUtils.pojoToJson(thread2); @@ -959,7 +889,9 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { Thread updated = thread2.withAnnouncement(thread1.getAnnouncement()); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + () -> patchThread(thread2.getId(), originalJson, updated, USER_AUTH_HEADERS), + BAD_REQUEST, + ANNOUNCEMENT_OVERLAP); // create announcement with start time > end time announcementDetails @@ -967,7 +899,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withEndTime(now.plusDays(57L).toEpochSecond(ZoneOffset.UTC)); Thread updated2 = thread2.withAnnouncement(announcementDetails); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated2, userAuthHeaders), + () -> patchThread(thread2.getId(), originalJson, updated2, USER_AUTH_HEADERS), BAD_REQUEST, ANNOUNCEMENT_INVALID_START_TIME); @@ -977,28 +909,36 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .withEndTime(now.plusDays(56L).toEpochSecond(ZoneOffset.UTC)); Thread updated3 = thread2.withAnnouncement(announcementDetails); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated3, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + () -> patchThread(thread2.getId(), originalJson, updated3, USER_AUTH_HEADERS), + BAD_REQUEST, + ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(53L).plusHours(2L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(54L).toEpochSecond(ZoneOffset.UTC)); Thread updated4 = thread2.withAnnouncement(announcementDetails); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated4, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + () -> patchThread(thread2.getId(), originalJson, updated4, USER_AUTH_HEADERS), + BAD_REQUEST, + ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(52L).plusHours(12L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(54L).toEpochSecond(ZoneOffset.UTC)); Thread updated5 = thread2.withAnnouncement(announcementDetails); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated5, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + () -> patchThread(thread2.getId(), originalJson, updated5, USER_AUTH_HEADERS), + BAD_REQUEST, + ANNOUNCEMENT_OVERLAP); announcementDetails .withStartTime(now.plusDays(54L).plusHours(12L).toEpochSecond(ZoneOffset.UTC)) .withEndTime(now.plusDays(56L).toEpochSecond(ZoneOffset.UTC)); Thread updated6 = thread2.withAnnouncement(announcementDetails); assertResponse( - () -> patchThread(thread2.getId(), originalJson, updated6, userAuthHeaders), BAD_REQUEST, ANNOUNCEMENT_OVERLAP); + () -> patchThread(thread2.getId(), originalJson, updated6, USER_AUTH_HEADERS), + BAD_REQUEST, + ANNOUNCEMENT_OVERLAP); } @Test @@ -1021,15 +961,15 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void list_threadsWithPostsLimit() throws HttpResponseException { - Thread thread = createAndCheck(create(), AUTH_HEADERS); + Thread thread = createAndCheck(create(), USER_AUTH_HEADERS); // Add 10 posts and validate int POST_COUNT = 10; for (int i = 0; i < POST_COUNT; i++) { CreatePost createPost = createPost("message" + i); - thread = addPostAndCheck(thread, createPost, AUTH_HEADERS); + thread = addPostAndCheck(thread, createPost, USER_AUTH_HEADERS); } - ThreadList threads = listThreads(null, 5, AUTH_HEADERS); + ThreadList threads = listThreads(null, 5, USER_AUTH_HEADERS); thread = threads.getData().get(0); assertEquals(5, thread.getPosts().size()); assertEquals(POST_COUNT, thread.getPostsCount()); @@ -1041,18 +981,18 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { } // when posts limit is null, it should return 3 posts which is the default - threads = listThreads(null, null, AUTH_HEADERS); + threads = listThreads(null, null, USER_AUTH_HEADERS); thread = threads.getData().get(0); assertEquals(3, thread.getPosts().size()); // limit <0 is not supported and should throw an exception assertResponse( - () -> listThreads(null, -1, AUTH_HEADERS), + () -> listThreads(null, -1, USER_AUTH_HEADERS), BAD_REQUEST, "[query param limitPosts must be greater than or equal to 0]"); // limit greater than total number of posts should return correct response - threads = listThreads(null, 100, AUTH_HEADERS); + threads = listThreads(null, 100, USER_AUTH_HEADERS); thread = threads.getData().get(0); assertEquals(10, thread.getPosts().size()); } @@ -1064,9 +1004,9 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { String ownerId = TABLE.getOwner().getId().toString(); assertNotNull(ownerId); int user1ThreadCount = - listThreadsWithFilter(ownerId, FilterType.OWNER.toString(), AUTH_HEADERS).getPaging().getTotal(); + listThreadsWithFilter(ownerId, FilterType.OWNER.toString(), USER_AUTH_HEADERS).getPaging().getTotal(); int user2ThreadCount = - listThreadsWithFilter(USER2.getId().toString(), FilterType.OWNER.toString(), AUTH_HEADERS) + listThreadsWithFilter(USER2.getId().toString(), FilterType.OWNER.toString(), USER_AUTH_HEADERS) .getPaging() .getTotal(); @@ -1078,22 +1018,22 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { ADMIN_AUTH_HEADERS); assertNotEquals(ownerId, ownerId2); - ThreadList threads = listThreadsWithFilter(ownerId, FilterType.OWNER.toString(), AUTH_HEADERS); + ThreadList threads = listThreadsWithFilter(ownerId, FilterType.OWNER.toString(), USER_AUTH_HEADERS); assertEquals(user1ThreadCount, threads.getPaging().getTotal()); // This should return error since the table is owned by a team // and for the filter we are passing team id instead of user id assertResponse( - () -> listThreadsWithFilter(ownerId2, FilterType.OWNER.toString(), AUTH_HEADERS), + () -> listThreadsWithFilter(ownerId2, FilterType.OWNER.toString(), USER_AUTH_HEADERS), NOT_FOUND, entityNotFound(Entity.USER, ownerId2)); // Now, test the filter with user who is part of the team - threads = listThreadsWithFilter(USER2.getId().toString(), FilterType.OWNER.toString(), AUTH_HEADERS); + threads = listThreadsWithFilter(USER2.getId().toString(), FilterType.OWNER.toString(), USER_AUTH_HEADERS); assertEquals(user2ThreadCount + 1, threads.getPaging().getTotal()); // Test if no user id filter returns all threads - threads = listThreadsWithFilter(null, FilterType.OWNER.toString(), AUTH_HEADERS); + threads = listThreadsWithFilter(null, FilterType.OWNER.toString(), USER_AUTH_HEADERS); assertEquals(totalThreadCount + 1, threads.getPaging().getTotal()); } @@ -1116,7 +1056,8 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { ADMIN_AUTH_HEADERS); addPostAndCheck(thread, createPost, ADMIN_AUTH_HEADERS); - ThreadList threads = listThreadsWithFilter(USER.getId().toString(), FilterType.MENTIONS.toString(), AUTH_HEADERS); + ThreadList threads = + listThreadsWithFilter(USER.getId().toString(), FilterType.MENTIONS.toString(), USER_AUTH_HEADERS); assertEquals(2, threads.getPaging().getTotal()); } @@ -1124,7 +1065,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { void list_threadsWithFollowsFilter() throws HttpResponseException { // Get the initial thread count of TABLE2 String entityLink = String.format("<#E::table::%s>", TABLE2.getFullyQualifiedName()); - int initialThreadCount = listThreads(entityLink, null, AUTH_HEADERS).getPaging().getTotal(); + int initialThreadCount = listThreads(entityLink, null, USER_AUTH_HEADERS).getPaging().getTotal(); // Create threads createAndCheck(create().withMessage("Message 1").withAbout(entityLink), ADMIN_AUTH_HEADERS); @@ -1132,7 +1073,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { createAndCheck(create().withMessage("Message 2").withAbout(entityLink), ADMIN_AUTH_HEADERS); // Make the USER follow TABLE2 - followTable(TABLE2.getId(), USER.getId(), AUTH_HEADERS); + followTable(TABLE2.getId(), USER.getId(), USER_AUTH_HEADERS); // Following the table will create a thread saying // User started following this table @@ -1142,10 +1083,11 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { .until( () -> { ThreadList threads = - listThreadsWithFilter(USER.getId().toString(), FilterType.FOLLOWS.toString(), AUTH_HEADERS); + listThreadsWithFilter(USER.getId().toString(), FilterType.FOLLOWS.toString(), USER_AUTH_HEADERS); return threads.getPaging().getTotal().equals(initialThreadCount + 3); }); - ThreadList threads = listThreadsWithFilter(USER.getId().toString(), FilterType.FOLLOWS.toString(), AUTH_HEADERS); + ThreadList threads = + listThreadsWithFilter(USER.getId().toString(), FilterType.FOLLOWS.toString(), USER_AUTH_HEADERS); assertEquals(initialThreadCount + 3, threads.getPaging().getTotal()); assertEquals(initialThreadCount + 3, threads.getData().size()); assertEquals( @@ -1154,7 +1096,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { assertEquals("Message 2", threads.getData().get(1).getMessage()); // Filter by follows for another user should return 0 threads - threads = listThreadsWithFilter(USER2.getId().toString(), FilterType.FOLLOWS.toString(), AUTH_HEADERS); + threads = listThreadsWithFilter(USER2.getId().toString(), FilterType.FOLLOWS.toString(), USER_AUTH_HEADERS); assertEquals(0, threads.getPaging().getTotal()); assertEquals(0, threads.getData().size()); } @@ -1162,7 +1104,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void list_threadsWithInvalidFilter() { assertResponse( - () -> listThreadsWithFilter(USER.getId().toString(), "Invalid", AUTH_HEADERS), + () -> listThreadsWithFilter(USER.getId().toString(), "Invalid", USER_AUTH_HEADERS), BAD_REQUEST, String.format("query param filterType must be one of %s", Arrays.toString(FilterType.values()))); } @@ -1170,7 +1112,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void get_listPosts_404() { assertResponse( - () -> listPosts(NON_EXISTENT_ENTITY.toString(), AUTH_HEADERS), + () -> listPosts(NON_EXISTENT_ENTITY.toString(), USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", NON_EXISTENT_ENTITY)); } @@ -1179,13 +1121,13 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { void delete_post_404() { // Test with an invalid thread id assertResponse( - () -> deletePost(NON_EXISTENT_ENTITY, NON_EXISTENT_ENTITY, AUTH_HEADERS), + () -> deletePost(NON_EXISTENT_ENTITY, NON_EXISTENT_ENTITY, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", NON_EXISTENT_ENTITY)); // Test with an invalid post id assertResponse( - () -> deletePost(THREAD.getId(), NON_EXISTENT_ENTITY, AUTH_HEADERS), + () -> deletePost(THREAD.getId(), NON_EXISTENT_ENTITY, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Post", NON_EXISTENT_ENTITY)); } @@ -1194,7 +1136,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { void delete_thread_404() { // Test with an invalid thread id assertResponse( - () -> deleteThread(NON_EXISTENT_ENTITY, AUTH_HEADERS), + () -> deleteThread(NON_EXISTENT_ENTITY, USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", NON_EXISTENT_ENTITY)); } @@ -1202,37 +1144,38 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void delete_post_200() throws HttpResponseException { // Create a thread and add a post - Thread thread = createAndCheck(create(), AUTH_HEADERS); + Thread thread = createAndCheck(create(), USER_AUTH_HEADERS); CreatePost createPost = createPost(null); - thread = addPostAndCheck(thread, createPost, AUTH_HEADERS); + thread = addPostAndCheck(thread, createPost, USER_AUTH_HEADERS); assertEquals(1, thread.getPosts().size()); // delete the post Post post = thread.getPosts().get(0); - Post deletedPost = deletePost(thread.getId(), post.getId(), AUTH_HEADERS); + Post deletedPost = deletePost(thread.getId(), post.getId(), USER_AUTH_HEADERS); assertEquals(post.getId(), deletedPost.getId()); // Check if get posts API returns the post - PostList postList = listPosts(thread.getId().toString(), AUTH_HEADERS); + PostList postList = listPosts(thread.getId().toString(), USER_AUTH_HEADERS); assertTrue(postList.getData().isEmpty()); // validate posts count - Thread getThread = getThread(thread.getId(), AUTH_HEADERS); + Thread getThread = getThread(thread.getId(), USER_AUTH_HEADERS); assertEquals(0, getThread.getPostsCount()); } @Test void delete_thread_200() throws HttpResponseException { // Create a thread - Thread thread = createAndCheck(create(), AUTH_HEADERS); + Thread thread = createAndCheck(create(), USER_AUTH_HEADERS); assertNotNull(thread); // delete the thread - Thread deletedThread = deleteThread(thread.getId(), AUTH_HEADERS); + Thread deletedThread = deleteThread(thread.getId(), USER_AUTH_HEADERS); assertEquals(thread.getId(), deletedThread.getId()); // Check if thread is not found - assertResponse(() -> getThread(thread.getId(), AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", thread.getId())); + assertResponse( + () -> getThread(thread.getId(), USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", thread.getId())); } @Test @@ -1249,7 +1192,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { UUID threadId = thread.getId(); UUID postId = post.getId(); assertResponse( - () -> deletePost(threadId, postId, AUTH_HEADERS), + () -> deletePost(threadId, postId, USER_AUTH_HEADERS), FORBIDDEN, permissionNotAllowed(USER.getName(), List.of(MetadataOperation.DELETE))); } @@ -1265,7 +1208,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { // Here thread author is ADMIN, and we try to delete as USER UUID threadId = thread.getId(); assertResponse( - () -> deleteThread(threadId, AUTH_HEADERS), + () -> deleteThread(threadId, USER_AUTH_HEADERS), FORBIDDEN, permissionNotAllowed(USER.getName(), List.of(MetadataOperation.DELETE))); } @@ -1273,9 +1216,9 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { @Test void patch_post_reactions_200() throws IOException { // Create a thread and add a post - Thread thread = createAndCheck(create(), AUTH_HEADERS); + Thread thread = createAndCheck(create(), USER_AUTH_HEADERS); CreatePost createPost = createPost("reply 1"); - thread = addPostAndCheck(thread, createPost, AUTH_HEADERS); + thread = addPostAndCheck(thread, createPost, USER_AUTH_HEADERS); assertEquals(1, thread.getPosts().size()); // patch the post @@ -1286,7 +1229,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { post.withReactions(List.of(reaction1, reaction2)); Post updatedPost = patchPostAndCheck(thread.getId(), post, originalJson, TEST_AUTH_HEADERS); assertTrue(containsAll(updatedPost.getReactions(), List.of(reaction1, reaction2))); - ThreadList threads = listThreads(null, 5, AUTH_HEADERS); + ThreadList threads = listThreads(null, 5, USER_AUTH_HEADERS); thread = threads.getData().get(0); assertEquals(TEST_USER_NAME, thread.getUpdatedBy()); } @@ -1295,13 +1238,13 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { void patch_post_404() { // Test with an invalid thread id assertResponse( - () -> patchPost(NON_EXISTENT_ENTITY, NON_EXISTENT_ENTITY, "{}", new Post(), AUTH_HEADERS), + () -> patchPost(NON_EXISTENT_ENTITY, NON_EXISTENT_ENTITY, "{}", new Post(), USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Thread", NON_EXISTENT_ENTITY)); // Test with an invalid post id assertResponse( - () -> patchPost(THREAD.getId(), NON_EXISTENT_ENTITY, "{}", new Post(), AUTH_HEADERS), + () -> patchPost(THREAD.getId(), NON_EXISTENT_ENTITY, "{}", new Post(), USER_AUTH_HEADERS), NOT_FOUND, entityNotFound("Post", NON_EXISTENT_ENTITY)); } @@ -1396,7 +1339,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { public ThreadList listTasks( String entityLink, String userId, - String filterType, + FilterType filterType, TaskStatus taskStatus, Integer limitPosts, Map authHeaders) @@ -1406,7 +1349,7 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { limitPosts, authHeaders, userId, - filterType, + filterType != null ? filterType.toString() : null, taskStatus, ThreadType.Task.toString(), null, @@ -1590,4 +1533,55 @@ public class FeedResourceTest extends OpenMetadataApplicationTest { } return true; } + + private Thread createTaskThread( + String fromUser, + String about, + User assignee, + String oldValue, + String newValue, + TaskType taskType, + Map authHeaders) + throws HttpResponseException { + CreateTaskDetails taskDetails = + new CreateTaskDetails() + .withOldValue(oldValue) + .withAssignees(List.of(assignee.getEntityReference())) + .withType(taskType) + .withSuggestion(newValue); + CreateThread create = + new CreateThread() + .withFrom(fromUser) + .withAbout(about) + .withMessage("Message") + .withTaskDetails(taskDetails) + .withType(ThreadType.Task); + return createAndCheck(create, authHeaders); + } + + public void validateTaskList( + UUID expectedAssignee, + String expectedSuggestion, + TaskStatus expectedTaskStatus, + int expectedCount, + ThreadList tasks) { + validateTask(expectedAssignee, expectedSuggestion, expectedTaskStatus, tasks.getData().get(0).getTask()); + assertEquals(expectedCount, tasks.getPaging().getTotal()); + assertEquals(expectedCount, tasks.getData().size()); + } + + public void validateTask( + UUID expectedAssignee, String expectedSuggestion, TaskStatus expectedTaskStatus, TaskDetails task) { + assertNotNull(task.getId()); + assertEquals(expectedAssignee, task.getAssignees().get(0).getId()); + assertEquals(expectedSuggestion, task.getSuggestion()); + assertEquals(expectedTaskStatus, task.getStatus()); + } + + public void validateTask(TaskDetails expected, TaskDetails actual) { + assertEquals(expected.getId(), actual.getId()); + assertEquals(expected.getAssignees(), actual.getAssignees()); + assertEquals(expected.getSuggestion(), actual.getSuggestion()); + assertEquals(expected.getStatus(), actual.getStatus()); + } } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/secrets/ExternalSecretsManagerTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/secrets/ExternalSecretsManagerTest.java index 9f9c60d08b2..93bf8f43610 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/secrets/ExternalSecretsManagerTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/secrets/ExternalSecretsManagerTest.java @@ -101,11 +101,9 @@ public abstract class ExternalSecretsManagerTest { // Encrypt private key and ensure it is indeed encrypted secretsManager.encryptAuthenticationMechanism("bot", actualAuthMechanism); assertNotEquals(privateKey, getPrivateKey(actualAuthMechanism)); - System.out.println("XXX privateKey encrypted is " + getPrivateKey(actualAuthMechanism)); // Decrypt private key and ensure it is decrypted secretsManager.decryptAuthenticationMechanism("bot", actualAuthMechanism); - System.out.println("XXX privateKey decrypted is " + getPrivateKey(actualAuthMechanism)); assertEquals(privateKey, getPrivateKey(actualAuthMechanism)); } @@ -130,12 +128,10 @@ public abstract class ExternalSecretsManagerTest { // Encrypt the pipeline and make sure it is secret key encrypted secretsManager.encryptIngestionPipeline(actualIngestionPipeline); - System.out.println("XXX encrypted aws secret access key is " + getAwsSecretAccessKey(actualIngestionPipeline)); assertNotEquals(secretKey, getAwsSecretAccessKey(actualIngestionPipeline)); // Decrypt the pipeline and make sure the secret key is decrypted secretsManager.decryptIngestionPipeline(actualIngestionPipeline); - System.out.println("XXX decrypted aws secret access key is " + getAwsSecretAccessKey(actualIngestionPipeline)); assertEquals(secretKey, getAwsSecretAccessKey(actualIngestionPipeline)); assertEquals(expectedIngestionPipeline, actualIngestionPipeline); }