From 3cdbe1f3795d48da5037b48e1042f7b3852a7d9a Mon Sep 17 00:00:00 2001 From: inpyu <91025314+inpyu@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:55:35 +0900 Subject: [PATCH] Add methods about invitations in auth-server in Litmus (#29) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add invite Client (#7) Signed-off-by: 잉퓨 * test: add invite Client Test (#7) Signed-off-by: 잉퓨 * docs: add invite Client Docs (#7) Signed-off-by: 잉퓨 * fix: remove Project (#4) Signed-off-by: 잉퓨 * fix: update Builder pattern (#4) Signed-off-by: 잉퓨 --------- Signed-off-by: 잉퓨 --- docs/invitation.md | 103 +++++++++ .../java/io/litmuschaos/LitmusClient.java | 27 +++ .../request/AcceptInvitationRequest.java | 38 ++++ .../request/DeclineInvitationRequest.java | 39 ++++ .../request/InviteUsersRequest.java | 47 ++++ .../request/ListInvitationRequest.java | 46 ++++ .../request/RemoveInvitationRequest.java | 46 ++++ .../request/SendInvitationRequest.java | 58 +++++ .../response/InviteUsersResponse.java | 92 ++++++++ .../response/ListInvitationResponse.java | 70 ++++++ .../response/SendInvitationResponse.java | 56 +++++ src/test/java/InviteTest.java | 211 ++++++++++++++++++ 12 files changed, 833 insertions(+) create mode 100644 docs/invitation.md create mode 100644 src/main/java/io/litmuschaos/request/AcceptInvitationRequest.java create mode 100644 src/main/java/io/litmuschaos/request/DeclineInvitationRequest.java create mode 100644 src/main/java/io/litmuschaos/request/InviteUsersRequest.java create mode 100644 src/main/java/io/litmuschaos/request/ListInvitationRequest.java create mode 100644 src/main/java/io/litmuschaos/request/RemoveInvitationRequest.java create mode 100644 src/main/java/io/litmuschaos/request/SendInvitationRequest.java create mode 100644 src/main/java/io/litmuschaos/response/InviteUsersResponse.java create mode 100644 src/main/java/io/litmuschaos/response/ListInvitationResponse.java create mode 100644 src/main/java/io/litmuschaos/response/SendInvitationResponse.java create mode 100644 src/test/java/InviteTest.java diff --git a/docs/invitation.md b/docs/invitation.md new file mode 100644 index 0000000..a52fc6d --- /dev/null +++ b/docs/invitation.md @@ -0,0 +1,103 @@ + +# Invitation Request + +```mermaid +classDiagram + class AcceptInvitationRequest { + -String projectId + -String userId + +AcceptInvitationRequest(String projectId, String userId) + } +``` +```mermaid +classDiagram + class DeclineInvitationRequest { + -String projectId + -String userId + +DeclineInvitationRequest(String projectId, String userId) + } +``` +```mermaid +classDiagram + class InviteUsersRequest { + -String projectId + -String userId + +InviteUsersRequest(String projectId, String userId) + } +``` +```mermaid +classDiagram + class ListInvitationRequest { + -String projectId + -String userId + +ListInvitationRequest(String projectId, String userId) + } +``` +```mermaid +classDiagram + class RemoveInvitationRequest { + -String projectId + -String userId + +RemoveInvitationRequest(String projectId, String userId) + } +``` +```mermaid +classDiagram + class SendInvitationRequest { + -String projectId + -String userId + -String role + +SendInvitationRequest(String projectId, String userId, String role) + } +``` + +# Invitation Response +```mermaid +classDiagram + + class InviteUsersResponse { + -long updatedAt + -long createdAt + -UserInfo createdBy + -UserInfo updatedBy + -boolean isRemoved + -String userID + -String username + -String salt + -String email + -String name + -String role + -boolean isInitialLogin + +InviteUsersResponse(long updatedAt, long createdAt, UserInfo createdBy, UserInfo updatedBy, boolean isRemoved, String userID, String username, String salt, String email, String name, String role, boolean isInitialLogin) + } + + class UserInfo { + -String userID + -String username + -String email + +UserInfo(String userID, String username, String email) + } + InviteUsersResponse --> UserInfo +``` +```mermaid +classDiagram + class ListInvitationResponse { + -String projectID + -String projectName + -ProjectUser projectOwner + -String invitationRole + +ListInvitationResponse(String projectID, String projectName, ProjectUser projectOwner, String invitationRole) + } + + class ProjectUser { + -String userID + -String username + -String email + -String name + -String role + -String invitation + -long joinedAt + +ProjectUser(String userID, String username, String email, String name, String role, String invitation, long joinedAt) + } + ListInvitationResponse --> ProjectUser +``` diff --git a/src/main/java/io/litmuschaos/LitmusClient.java b/src/main/java/io/litmuschaos/LitmusClient.java index 36d243b..8b7cd47 100644 --- a/src/main/java/io/litmuschaos/LitmusClient.java +++ b/src/main/java/io/litmuschaos/LitmusClient.java @@ -166,4 +166,31 @@ public CommonResponse deleteProject(String projectID) throws IOException, Litmus return httpClient.post("/delete_project/" + projectID, token, CommonResponse.class); } + + public SendInvitationResponse sendInvitation(SendInvitationRequest request) throws IOException, LitmusApiException { + return httpClient.post("/send_invitation", token, request, SendInvitationResponse.class); + } + + public CommonResponse acceptInvitation(AcceptInvitationRequest request) throws IOException, LitmusApiException { + return httpClient.post("/accept_invitation", token, request, CommonResponse.class); + } + + public CommonResponse declineInvitation(DeclineInvitationRequest request) throws IOException, LitmusApiException { + return httpClient.post("/decline_invitation", token, request, CommonResponse.class); + } + + public CommonResponse removeInvitation(RemoveInvitationRequest request) throws IOException, LitmusApiException { + return httpClient.post("/remove_invitation", token, request, CommonResponse.class); + } + + public List listInvitation(String status) + throws IOException, LitmusApiException { + return httpClient.get("/list_invitations_with_filters/" + status, token, List.class); + } + + public List inviteUsers(String projectId) + throws IOException, LitmusApiException { + return httpClient.get("/invite_users/" + projectId, token, List.class); + } + } diff --git a/src/main/java/io/litmuschaos/request/AcceptInvitationRequest.java b/src/main/java/io/litmuschaos/request/AcceptInvitationRequest.java new file mode 100644 index 0000000..7e0dd00 --- /dev/null +++ b/src/main/java/io/litmuschaos/request/AcceptInvitationRequest.java @@ -0,0 +1,38 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class AcceptInvitationRequest { + + private final String projectId; + private final String userId; + + private AcceptInvitationRequest(AcceptInvitationRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + } + + public static AcceptInvitationRequestBuilder builder() { + return new AcceptInvitationRequestBuilder(); + } + + public static class AcceptInvitationRequestBuilder implements Builder { + private String projectId; + private String userId; + + public AcceptInvitationRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public AcceptInvitationRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + @Override + public AcceptInvitationRequest build() { + return new AcceptInvitationRequest(this); + } + } +} diff --git a/src/main/java/io/litmuschaos/request/DeclineInvitationRequest.java b/src/main/java/io/litmuschaos/request/DeclineInvitationRequest.java new file mode 100644 index 0000000..69f89ac --- /dev/null +++ b/src/main/java/io/litmuschaos/request/DeclineInvitationRequest.java @@ -0,0 +1,39 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class DeclineInvitationRequest { + + private final String projectId; + private final String userId; + + private DeclineInvitationRequest(DeclineInvitationRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + } + + public static DeclineInvitationRequestBuilder builder() { + return new DeclineInvitationRequestBuilder(); + } + + public static class DeclineInvitationRequestBuilder implements Builder { + private String projectId; + private String userId; + + public DeclineInvitationRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public DeclineInvitationRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + @Override + public DeclineInvitationRequest build() { + return new DeclineInvitationRequest(this); + } + } + +} diff --git a/src/main/java/io/litmuschaos/request/InviteUsersRequest.java b/src/main/java/io/litmuschaos/request/InviteUsersRequest.java new file mode 100644 index 0000000..28804bd --- /dev/null +++ b/src/main/java/io/litmuschaos/request/InviteUsersRequest.java @@ -0,0 +1,47 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class InviteUsersRequest { + + private final String projectId; + private final String userId; + + private InviteUsersRequest(InviteUsersRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + } + + public String getProjectId() { + return projectId; + } + + public String getUserId() { + return userId; + } + + public static InviteUsersRequestBuilder builder() { + return new InviteUsersRequestBuilder(); + } + + public static class InviteUsersRequestBuilder implements Builder { + + private String projectId; + private String userId; + + public InviteUsersRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public InviteUsersRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + @Override + public InviteUsersRequest build() { + return new InviteUsersRequest(this); + } + } +} diff --git a/src/main/java/io/litmuschaos/request/ListInvitationRequest.java b/src/main/java/io/litmuschaos/request/ListInvitationRequest.java new file mode 100644 index 0000000..ad55f71 --- /dev/null +++ b/src/main/java/io/litmuschaos/request/ListInvitationRequest.java @@ -0,0 +1,46 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class ListInvitationRequest { + + private final String projectId; + private final String userId; + + private ListInvitationRequest(ListInvitationRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + } + + public String getProjectId() { + return projectId; + } + + public String getUserId() { + return userId; + } + + public static ListInvitationRequestBuilder builder() { + return new ListInvitationRequestBuilder(); + } + + public static class ListInvitationRequestBuilder implements Builder { + private String projectId; + private String userId; + + public ListInvitationRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public ListInvitationRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + @Override + public ListInvitationRequest build() { + return new ListInvitationRequest(this); + } + } +} diff --git a/src/main/java/io/litmuschaos/request/RemoveInvitationRequest.java b/src/main/java/io/litmuschaos/request/RemoveInvitationRequest.java new file mode 100644 index 0000000..05c1aa8 --- /dev/null +++ b/src/main/java/io/litmuschaos/request/RemoveInvitationRequest.java @@ -0,0 +1,46 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class RemoveInvitationRequest { + + private final String projectId; + private final String userId; + + private RemoveInvitationRequest(RemoveInvitationRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + } + + public String getProjectId() { + return projectId; + } + + public String getUserId() { + return userId; + } + + public static RemoveInvitationRequestBuilder builder() { + return new RemoveInvitationRequestBuilder(); + } + + public static class RemoveInvitationRequestBuilder implements Builder { + private String projectId; + private String userId; + + public RemoveInvitationRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public RemoveInvitationRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + @Override + public RemoveInvitationRequest build() { + return new RemoveInvitationRequest(this); + } + } +} diff --git a/src/main/java/io/litmuschaos/request/SendInvitationRequest.java b/src/main/java/io/litmuschaos/request/SendInvitationRequest.java new file mode 100644 index 0000000..356631e --- /dev/null +++ b/src/main/java/io/litmuschaos/request/SendInvitationRequest.java @@ -0,0 +1,58 @@ +package io.litmuschaos.request; + +import io.litmuschaos.util.Builder; + +public class SendInvitationRequest { + + private final String projectId; + private final String userId; + private final String role; + + private SendInvitationRequest(SendInvitationRequestBuilder builder) { + this.projectId = builder.projectId; + this.userId = builder.userId; + this.role = builder.role; + } + + public String getProjectId() { + return projectId; + } + + public String getUserId() { + return userId; + } + + public String getRole() { + return role; + } + + public static SendInvitationRequestBuilder builder() { + return new SendInvitationRequestBuilder(); + } + + public static class SendInvitationRequestBuilder implements Builder { + private String projectId; + private String userId; + private String role; + + public SendInvitationRequestBuilder projectId(String projectId) { + this.projectId = projectId; + return this; + } + + public SendInvitationRequestBuilder userId(String userId) { + this.userId = userId; + return this; + } + + public SendInvitationRequestBuilder role(String role) { + this.role = role; + return this; + } + + @Override + public SendInvitationRequest build() { + return new SendInvitationRequest(this); + } + } +} diff --git a/src/main/java/io/litmuschaos/response/InviteUsersResponse.java b/src/main/java/io/litmuschaos/response/InviteUsersResponse.java new file mode 100644 index 0000000..3ad59e5 --- /dev/null +++ b/src/main/java/io/litmuschaos/response/InviteUsersResponse.java @@ -0,0 +1,92 @@ +package io.litmuschaos.response; + +public class InviteUsersResponse { + + private long updatedAt; + private long createdAt; + private UserInfo createdBy; + private UserInfo updatedBy; + private boolean isRemoved; + private String userID; + private String username; + private String salt; + private String email; + private String name; + private String role; + private boolean isInitialLogin; + + public class UserInfo { + private String userID; + private String username; + private String email; + + public UserInfo(String userID, String username, String email) { + this.userID = userID; + this.username = username; + this.email = email; + } + } + + public InviteUsersResponse(long updatedAt, long createdAt, UserInfo createdBy, UserInfo updatedBy, boolean isRemoved, String userID, String username, String salt, String email, String name, String role, boolean isInitialLogin) { + this.updatedAt = updatedAt; + this.createdAt = createdAt; + this.createdBy = createdBy; + this.updatedBy = updatedBy; + this.isRemoved = isRemoved; + this.userID = userID; + this.username = username; + this.salt = salt; + this.email = email; + this.name = name; + this.role = role; + this.isInitialLogin = isInitialLogin; + } + + public long getUpdatedAt() { + return updatedAt; + } + + public long getCreatedAt() { + return createdAt; + } + + public UserInfo getCreatedBy() { + return createdBy; + } + + public UserInfo getUpdatedBy() { + return updatedBy; + } + + public boolean getIsRemoved() { + return isRemoved; + } + + public String getUserID() { + return userID; + } + + public String getUsername() { + return username; + } + + public String getSalt() { + return salt; + } + + public String getEmail() { + return email; + } + + public String getName() { + return name; + } + + public String getRole() { + return role; + } + + public boolean getIsInitialLogin() { + return isInitialLogin; + } +} diff --git a/src/main/java/io/litmuschaos/response/ListInvitationResponse.java b/src/main/java/io/litmuschaos/response/ListInvitationResponse.java new file mode 100644 index 0000000..84e3dcd --- /dev/null +++ b/src/main/java/io/litmuschaos/response/ListInvitationResponse.java @@ -0,0 +1,70 @@ +package io.litmuschaos.response; + +public class ListInvitationResponse { + + private String projectID; + private String projectName; + private ProjectUser projectOwner; + private String invitationRole; + + public ListInvitationResponse(String projectID, String projectName, ProjectUser projectOwner, String invitationRole) { + this.projectID = projectID; + this.projectName = projectName; + this.projectOwner = projectOwner; + this.invitationRole = invitationRole; + } + + public static class ProjectUser { + private String userID; + private String username; + private String email; + private String name; + private String role; + private String invitation; + private long joinedAt; + + public ProjectUser(String userID, String username, String email, String name, String role, String invitation, long joinedAt) { + this.userID = userID; + this.username = username; + this.email = email; + this.name = name; + this.role = role; + this.invitation = invitation; + this.joinedAt = joinedAt; + } + + } + + public String getProjectID() { + return projectID; + } + + public String getProjectName() { + return projectName; + } + + public ProjectUser getProjectOwner() { + return projectOwner; + } + + public String getInvitationRole() { + return invitationRole; + } + + public void setProjectID(String projectID) { + this.projectID = projectID; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void setProjectOwner(ProjectUser projectOwner) { + this.projectOwner = projectOwner; + } + + public void setInvitationRole(String invitationRole) { + this.invitationRole = invitationRole; + } + +} diff --git a/src/main/java/io/litmuschaos/response/SendInvitationResponse.java b/src/main/java/io/litmuschaos/response/SendInvitationResponse.java new file mode 100644 index 0000000..0fad189 --- /dev/null +++ b/src/main/java/io/litmuschaos/response/SendInvitationResponse.java @@ -0,0 +1,56 @@ +package io.litmuschaos.response; + +public class SendInvitationResponse { + + private String userID; + private String userName; + private String name; + private String role; + private String email; + private String invitation; + private String joinedAt; + private String deactivatedAt; + + public SendInvitationResponse(String userID, String userName, String name, String role, String email, String invitation, String joinedAt, String deactivatedAt) { + this.userID = userID; + this.userName = userName; + this.name = name; + this.role = role; + this.email = email; + this.invitation = invitation; + this.joinedAt = joinedAt; + this.deactivatedAt = deactivatedAt; + } + + public String getUserID() { + return userID; + } + + public String getUserName() { + return userName; + } + + public String getName() { + return name; + } + + public String getRole() { + return role; + } + + public String getEmail() { + return email; + } + + public String getInvitation() { + return invitation; + } + + public String getJoinedAt() { + return joinedAt; + } + + public String getDeactivatedAt() { + return deactivatedAt; + } +} diff --git a/src/test/java/InviteTest.java b/src/test/java/InviteTest.java new file mode 100644 index 0000000..85ac74a --- /dev/null +++ b/src/test/java/InviteTest.java @@ -0,0 +1,211 @@ +import static org.assertj.core.api.Assertions.assertThat; + +import io.litmuschaos.LitmusClient; +import io.litmuschaos.exception.LitmusApiException; +import io.litmuschaos.request.AcceptInvitationRequest; +import io.litmuschaos.request.CreateProjectRequest; +import io.litmuschaos.request.DeclineInvitationRequest; +import io.litmuschaos.request.LoginRequest; +import io.litmuschaos.request.PasswordUpdateRequest; +import io.litmuschaos.request.RemoveInvitationRequest; +import io.litmuschaos.request.SendInvitationRequest; +import io.litmuschaos.request.UserCreateRequest; +import io.litmuschaos.response.CommonResponse; +import io.litmuschaos.response.InviteUsersResponse; +import io.litmuschaos.response.ListInvitationResponse; +import io.litmuschaos.response.ProjectResponse; +import io.litmuschaos.response.SendInvitationResponse; +import io.litmuschaos.response.UserResponse; +import java.io.IOException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class InviteTest { + + private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final SecureRandom RANDOM = new SecureRandom(); + private static final String hostUrl = "http://localhost:3000"; + private static final String username = "admin"; + private static final String password = "Litmus1234!"; + private static final String oldPassword = "Litmus12345!"; + + private static final String TEST_USER_ROLE = "admin"; + private static final String TEST_USER_EMAIL = "test@test.com"; + private static final String TEST_USER_NAME = "userTestName"; + + private static LitmusClient litmusClient; + private static UserResponse user; + private static String projectId; + private static String userId; + private static String invitee; + + @BeforeAll + public static void setupClient() throws IOException, LitmusApiException { + litmusClient = new LitmusClient(hostUrl, username, password); + projectId = createProjectAndGetId(); + String userTestName = generateRandomUsername(); + user = createPasswordUpdatedTestUser(userTestName, oldPassword, TEST_USER_ROLE, TEST_USER_EMAIL, TEST_USER_NAME, password); + userId = user.getUserID(); + invitee = user.getUsername(); + } + + public static String generateRandomUsername() { + StringBuilder sb = new StringBuilder(6); + for (int i = 0; i < 6; i++) { + sb.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length()))); + } + return sb.toString(); + } + + private static String generateUniqueProjectName(String baseName) { + return baseName + "-" + UUID.randomUUID().toString(); + } + + private static UserResponse createPasswordUpdatedTestUser(String username, String password, String role, + String email, String name, String newPassword) throws LitmusApiException, IOException { + + UserResponse user = createTestUser(username, password, role, email, name); + litmusClient.authenticate(LoginRequest.builder().username(username).password(password).build()); + PasswordUpdateRequest passwordUpdateRequest = PasswordUpdateRequest.builder() + .username(username) + .oldPassword(password) + .newPassword(newPassword) + .build(); + litmusClient.updatePassword(passwordUpdateRequest); + return litmusClient.getUser(user.getUserID()); + } + + private static UserResponse createTestUser( + String username, String password, String role, String email, String name + ) throws LitmusApiException, IOException + { + UserCreateRequest request = UserCreateRequest.builder(). + username(username) + .password(password) + .role(role) + .email(email) + .name(name).build(); + return litmusClient.createUser(request); + } + + private static String createProjectAndGetId() throws IOException, LitmusApiException { + String projectName = generateUniqueProjectName("Temporary Project"); + String description = "This is a temporary project."; + List tags = Arrays.asList("tag1", "tag2"); + + CreateProjectRequest request = CreateProjectRequest.builder() + .projectName(projectName) + .description(description) + .tags(tags) + .build(); + + ProjectResponse response = litmusClient.createProject(request); + return response.getProjectID(); + } + + public static SendInvitationResponse createInvite(String project, String user) throws IOException, LitmusApiException { + litmusClient.authenticate(LoginRequest.builder().username(username).password(password).build()); + SendInvitationRequest request = SendInvitationRequest.builder() + .projectId(project) + .userId(user) + .role("Viewer") + .build(); + + return litmusClient.sendInvitation(request); + } + + @Test + public void testCreateInvite() throws IOException, LitmusApiException { + SendInvitationResponse response = createInvite(projectId, userId); + assertThat(response.getUserID()).isEqualTo(userId); + } + + @Test + public void testAcceptInvitation() throws IOException, LitmusApiException { + createInvite(projectId, userId); + AcceptInvitationRequest request = AcceptInvitationRequest.builder() + .projectId(projectId) + .userId(userId) + .build(); + + litmusClient.authenticate(LoginRequest.builder().username(invitee).password(password).build()); + CommonResponse response = litmusClient.acceptInvitation(request); + assertThat(response.getMessage()).isEqualTo("Successful"); + } + + @Test + public void testDeclineInvitation() throws IOException, LitmusApiException { + createInvite(projectId, userId); + + DeclineInvitationRequest request = DeclineInvitationRequest.builder() + .projectId(projectId) + .userId(userId) + .build(); + + litmusClient.authenticate(LoginRequest.builder().username(invitee).password(password).build()); + CommonResponse response = litmusClient.declineInvitation(request); + assertThat(response.getMessage()).isEqualTo("Successful"); + } + + @Test + public void testRemoveInvitation() throws IOException, LitmusApiException { + String userTestName = generateRandomUsername(); + user = createPasswordUpdatedTestUser(userTestName, oldPassword, TEST_USER_ROLE, TEST_USER_EMAIL, TEST_USER_NAME, password); + userId = user.getUserID(); + invitee = user.getUsername(); + createInvite(projectId, userId); + RemoveInvitationRequest request = RemoveInvitationRequest.builder() + .projectId(projectId) + .userId(userId) + .build(); + + litmusClient.authenticate(LoginRequest.builder().username(username).password(password).build()); + CommonResponse response = litmusClient.removeInvitation(request); + assertThat(response.getMessage()).isEqualTo("Successful"); + } + + @Test + public void testListInvitation() throws IOException, LitmusApiException { + String userTestName = generateRandomUsername(); + user = createPasswordUpdatedTestUser(userTestName, oldPassword, TEST_USER_ROLE, TEST_USER_EMAIL, TEST_USER_NAME, password); + userId = user.getUserID(); + invitee = user.getUsername(); + createInvite(projectId, userId); + + litmusClient.authenticate(LoginRequest.builder().username(invitee).password(password).build()); + List response = litmusClient.listInvitation("Pending"); + assertThat(response.size()).isEqualTo(1); + } + + @Test + public void testInviteUsers() throws IOException, LitmusApiException { + litmusClient.authenticate(LoginRequest.builder().username(username).password(password).build()); + + List tags = Arrays.asList("tag1", "tag2"); + String projectName = generateUniqueProjectName("Temporary Project"); + CreateProjectRequest projectRequest = CreateProjectRequest.builder() + .projectName(projectName) + .description("testDescription") + .tags(tags) + .build(); + + ProjectResponse projectResponse = litmusClient.createProject(projectRequest); + List response1 = litmusClient.inviteUsers(projectResponse.getProjectID()); + + String userTestName = generateRandomUsername(); + createPasswordUpdatedTestUser(userTestName, oldPassword, TEST_USER_ROLE, TEST_USER_EMAIL, TEST_USER_NAME, password); + + litmusClient.authenticate(LoginRequest.builder().username(username).password(password).build()); + List response2 = litmusClient.inviteUsers(projectResponse.getProjectID()); + + litmusClient.deleteProject(projectId); + + assertThat(response2.size()).isEqualTo(response1.size() + 1); + } + +}