diff --git a/src/main/java/com/savvato/tribeapp/controllers/ConnectAPIController.java b/src/main/java/com/savvato/tribeapp/controllers/ConnectAPIController.java index 2e65ae6b..863b5500 100644 --- a/src/main/java/com/savvato/tribeapp/controllers/ConnectAPIController.java +++ b/src/main/java/com/savvato/tribeapp/controllers/ConnectAPIController.java @@ -1,12 +1,9 @@ package com.savvato.tribeapp.controllers; -import com.savvato.tribeapp.config.principal.UserPrincipal; import com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController.*; import com.savvato.tribeapp.controllers.dto.ConnectRequest; import com.savvato.tribeapp.controllers.dto.CosignRequest; -import com.savvato.tribeapp.dto.ConnectIncomingMessageDTO; -import com.savvato.tribeapp.dto.ConnectOutgoingMessageDTO; -import com.savvato.tribeapp.dto.CosignDTO; +import com.savvato.tribeapp.dto.*; import com.savvato.tribeapp.services.ConnectService; import com.savvato.tribeapp.services.CosignService; import io.swagger.v3.oas.annotations.Parameter; @@ -106,4 +103,23 @@ public ResponseEntity deleteCosign(@RequestBody @Valid CosignRequest cosignReque return ResponseEntity.status(HttpStatus.OK).build(); } + + @GetCosignersForUserAttribute + @GetMapping("cosign/{userIdReceiving}/{phraseId}") + public ResponseEntity> getCosignersForUserAttribute(@PathVariable Long userIdReceiving, @PathVariable Long phraseId) { + + List list = cosignService.getCosignersForUserAttribute(userIdReceiving,phraseId); + + return ResponseEntity.status(HttpStatus.OK).body(list); + } + + @GetAllCosignsForUser + @GetMapping("cosign/{userIdReceiving}/all") + public ResponseEntity> getAllCosignsForUser(@PathVariable Long userIdReceiving) { + + List list = cosignService.getAllCosignsForUser(userIdReceiving); + + return ResponseEntity.status(HttpStatus.OK).body(list); + } + } diff --git a/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetAllCosignsForUser.java b/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetAllCosignsForUser.java new file mode 100644 index 00000000..0354f637 --- /dev/null +++ b/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetAllCosignsForUser.java @@ -0,0 +1,18 @@ +package com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController; + +import com.savvato.tribeapp.controllers.annotations.responses.BadRequest; +import com.savvato.tribeapp.controllers.annotations.responses.Success; +import io.swagger.v3.oas.annotations.Operation; + +import java.lang.annotation.*; + +/** Documentation for getting all cosigns for a user */ +@Target({ElementType.METHOD, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Operation( + summary = "Get all cosigners of attributes for a given attribute for a user", + description = "Provided a user ID, get cosigns and attribute ids for that user. ") +@Success(description = "", example = "") +@BadRequest(description = "", noContent = true) +public @interface GetAllCosignsForUser {} diff --git a/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetCosignersForUserAttribute.java b/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetCosignersForUserAttribute.java new file mode 100644 index 00000000..a6d958fe --- /dev/null +++ b/src/main/java/com/savvato/tribeapp/controllers/annotations/controllers/ConnectAPIController/GetCosignersForUserAttribute.java @@ -0,0 +1,17 @@ +package com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController; + +import com.savvato.tribeapp.controllers.annotations.responses.BadRequest; +import com.savvato.tribeapp.controllers.annotations.responses.Success; +import io.swagger.v3.oas.annotations.Operation; +import java.lang.annotation.*; + +/** Documentation for getting cosigns for a user attribute */ +@Target({ElementType.METHOD, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Operation( + summary = "Get all cosigners for a given attribute for a user", + description = "Provided a user ID and attribute ID, get cosigns for that user and attribute. ") +@Success(description = "", example = "") +@BadRequest(description = "", noContent = true) +public @interface GetCosignersForUserAttribute {} diff --git a/src/main/java/com/savvato/tribeapp/dto/CosignDTO.java b/src/main/java/com/savvato/tribeapp/dto/CosignDTO.java index c332d1a4..2523df67 100644 --- a/src/main/java/com/savvato/tribeapp/dto/CosignDTO.java +++ b/src/main/java/com/savvato/tribeapp/dto/CosignDTO.java @@ -6,7 +6,13 @@ @Schema(description = "A Cosign DTO") @Builder public class CosignDTO { + + @Schema(example = "1") public Long userIdIssuing; + + @Schema(example = "2") public Long userIdReceiving; + + @Schema(example = "1") public Long phraseId; } diff --git a/src/main/java/com/savvato/tribeapp/dto/CosignsForUserDTO.java b/src/main/java/com/savvato/tribeapp/dto/CosignsForUserDTO.java new file mode 100644 index 00000000..77220d1b --- /dev/null +++ b/src/main/java/com/savvato/tribeapp/dto/CosignsForUserDTO.java @@ -0,0 +1,17 @@ +package com.savvato.tribeapp.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +@Schema(description = "All Cosigns for user DTO") +@Builder +public class CosignsForUserDTO { + + @Schema(example = "1") + public long phraseId; + + @Schema(example = "[{\"userId\": 1, \"username\": \"testuser\"}]") + public List listOfCosigners; +} diff --git a/src/main/java/com/savvato/tribeapp/dto/UsernameDTO.java b/src/main/java/com/savvato/tribeapp/dto/UsernameDTO.java new file mode 100644 index 00000000..01d2ed1e --- /dev/null +++ b/src/main/java/com/savvato/tribeapp/dto/UsernameDTO.java @@ -0,0 +1,14 @@ +package com.savvato.tribeapp.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +public class UsernameDTO { + @Schema(example = "1") + public Long userId; + + @Schema(example = "John Doe") + public String username; + +} diff --git a/src/main/java/com/savvato/tribeapp/repositories/CosignRepository.java b/src/main/java/com/savvato/tribeapp/repositories/CosignRepository.java index 13c02cfc..923e5dbf 100644 --- a/src/main/java/com/savvato/tribeapp/repositories/CosignRepository.java +++ b/src/main/java/com/savvato/tribeapp/repositories/CosignRepository.java @@ -2,10 +2,17 @@ import com.savvato.tribeapp.entities.Cosign; import com.savvato.tribeapp.entities.CosignId; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface CosignRepository extends CrudRepository { + @Query(nativeQuery = true, value = "select user_id_issuing from cosign where user_id_receiving = ?1 and phrase_id = ?2") + List findCosignersByUserIdReceivingAndPhraseId(Long userIdReceiving, Long phraseId); + @Query(nativeQuery = true, value = "select * from cosign where user_id_receiving = ?") + List findAllByUserIdReceiving(Long userIdReceiving); } diff --git a/src/main/java/com/savvato/tribeapp/services/CosignService.java b/src/main/java/com/savvato/tribeapp/services/CosignService.java index 072ba7a0..f6000992 100644 --- a/src/main/java/com/savvato/tribeapp/services/CosignService.java +++ b/src/main/java/com/savvato/tribeapp/services/CosignService.java @@ -1,11 +1,17 @@ package com.savvato.tribeapp.services; import com.savvato.tribeapp.dto.CosignDTO; +import com.savvato.tribeapp.dto.CosignsForUserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; -import java.util.Optional; +import java.util.List; public interface CosignService { CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId); boolean deleteCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId); + + List getCosignersForUserAttribute(Long userReceivingId, Long phraseId); + + List getAllCosignsForUser(Long userIdReceiving); } diff --git a/src/main/java/com/savvato/tribeapp/services/CosignServiceImpl.java b/src/main/java/com/savvato/tribeapp/services/CosignServiceImpl.java index 3a727b36..aefe3ae7 100644 --- a/src/main/java/com/savvato/tribeapp/services/CosignServiceImpl.java +++ b/src/main/java/com/savvato/tribeapp/services/CosignServiceImpl.java @@ -1,14 +1,15 @@ package com.savvato.tribeapp.services; -import com.savvato.tribeapp.controllers.dto.CosignRequest; import com.savvato.tribeapp.dto.CosignDTO; +import com.savvato.tribeapp.dto.CosignsForUserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.Cosign; import com.savvato.tribeapp.repositories.CosignRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; +import java.util.*; @Service @Slf4j @@ -17,6 +18,9 @@ public class CosignServiceImpl implements CosignService { @Autowired CosignRepository cosignRepository; + @Autowired + UserService userService; + @Override public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) { @@ -42,4 +46,54 @@ public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phras public boolean deleteCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) { return false; } + + @Override + public List getCosignersForUserAttribute(Long userIdReceiving, Long phraseId) { + + List list = new ArrayList<>(); + List cosignerIds = cosignRepository.findCosignersByUserIdReceivingAndPhraseId(userIdReceiving, phraseId); + + for(Long id : cosignerIds) { + list.add(userService.getUsernameDTO(id)); + } + + return list; + } + + @Override + public List getAllCosignsForUser(Long userIdReceiving) { + + List cosignsForUserDTOs = new ArrayList<>(); + + List allCosignsByUserIdReceiving = cosignRepository.findAllByUserIdReceiving(userIdReceiving); + Map> mapOfPhrasesAndUserIdsIssuing = new HashMap<>(); + Map mapOfUsernameDTOs = new HashMap<>(); + + for(Cosign cosign : allCosignsByUserIdReceiving) { + Long userIdIssuing = cosign.getUserIdIssuing(); + Long phraseId = cosign.getPhraseId(); + + if(!mapOfUsernameDTOs.containsKey(userIdIssuing)) { + mapOfUsernameDTOs.put(userIdIssuing,userService.getUsernameDTO(userIdIssuing)); + } + + if(mapOfPhrasesAndUserIdsIssuing.containsKey(phraseId)){ + mapOfPhrasesAndUserIdsIssuing.get(phraseId).add(mapOfUsernameDTOs.get(userIdIssuing)); + } else { + List list = new ArrayList<>(); + list.add(mapOfUsernameDTOs.get(userIdIssuing)); + mapOfPhrasesAndUserIdsIssuing.put(phraseId,list); + } + } + + mapOfPhrasesAndUserIdsIssuing.forEach((k,v) -> { + CosignsForUserDTO cosignsForUserDTO = CosignsForUserDTO.builder() + .phraseId(k) + .listOfCosigners(v) + .build(); + cosignsForUserDTOs.add(cosignsForUserDTO); + }); + + return cosignsForUserDTOs; + } } diff --git a/src/main/java/com/savvato/tribeapp/services/UserService.java b/src/main/java/com/savvato/tribeapp/services/UserService.java index 932881d0..c3b7f5ec 100644 --- a/src/main/java/com/savvato/tribeapp/services/UserService.java +++ b/src/main/java/com/savvato/tribeapp/services/UserService.java @@ -2,6 +2,7 @@ import com.savvato.tribeapp.controllers.dto.UserRequest; import com.savvato.tribeapp.dto.UserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.User; import java.util.List; @@ -17,4 +18,6 @@ public interface UserService { UserDTO changePassword(String pw, String phoneNumber, String challengeCode); List getAllUsers(); + + UsernameDTO getUsernameDTO(Long userId); } diff --git a/src/main/java/com/savvato/tribeapp/services/UserServiceImpl.java b/src/main/java/com/savvato/tribeapp/services/UserServiceImpl.java index e670f7b3..b7f54c89 100644 --- a/src/main/java/com/savvato/tribeapp/services/UserServiceImpl.java +++ b/src/main/java/com/savvato/tribeapp/services/UserServiceImpl.java @@ -4,6 +4,7 @@ import com.savvato.tribeapp.controllers.dto.UserRequest; import com.savvato.tribeapp.dto.UserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.User; import com.savvato.tribeapp.entities.UserRole; import com.savvato.tribeapp.repositories.UserRepository; @@ -168,4 +169,12 @@ private UserDTO getUserDTO(User user) { return userDTO; } + @Override + public UsernameDTO getUsernameDTO(Long userId) { + UsernameDTO usernameDTO = UsernameDTO.builder() + .userId(userId) + .username(userRepo.findById(userId).get().getName()) + .build(); + return usernameDTO; + } } diff --git a/src/test/java/com/savvato/tribeapp/controllers/ConnectAPITest.java b/src/test/java/com/savvato/tribeapp/controllers/ConnectAPITest.java index f2ed3618..3aeaeda0 100644 --- a/src/test/java/com/savvato/tribeapp/controllers/ConnectAPITest.java +++ b/src/test/java/com/savvato/tribeapp/controllers/ConnectAPITest.java @@ -9,6 +9,8 @@ import com.savvato.tribeapp.controllers.dto.CosignRequest; import com.savvato.tribeapp.dto.ConnectOutgoingMessageDTO; import com.savvato.tribeapp.dto.CosignDTO; +import com.savvato.tribeapp.dto.CosignsForUserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.User; import com.savvato.tribeapp.entities.UserRole; import com.savvato.tribeapp.repositories.CosignRepository; @@ -370,4 +372,145 @@ public void testGetConnectionsSadPath() throws Exception { .andReturn(); } + + @Test + public void testGetCosignersForUserAttribute() throws Exception { + when(userPrincipalService.getUserPrincipalByEmail(Mockito.anyString())) + .thenReturn(new UserPrincipal(user)); + String auth = AuthServiceImpl.generateAccessToken(user); + + // test data + Long testUserIdIssuing = 1L; + String testUsernameIssuing = "test"; + Long testUserIdReceiving = 2L; + Long testPhraseId = 1L; + + // mock return data + UsernameDTO mockUsernameDTO = UsernameDTO.builder() + .userId(testUserIdIssuing) + .username(testUsernameIssuing) + .build(); + + List mockUsernameDTOList = new ArrayList<>(); + mockUsernameDTOList.add(mockUsernameDTO); + + // mock returns + when(cosignService.getCosignersForUserAttribute(anyLong(),anyLong())).thenReturn(mockUsernameDTOList); + + // test + this.mockMvc + .perform( + get("/api/connect/cosign/{userIdReceiving}/{phraseId}",testUserIdReceiving,testPhraseId) + .header("Authorization", "Bearer " + auth) + .characterEncoding("utf-8")) + .andExpect(status().isOk()) + .andExpect(content().json("[{\"userId\":1,\"username\":\"test\"}]")); + } + + @Test + public void testGetAllCosignsForUser() throws Exception { + when(userPrincipalService.getUserPrincipalByEmail(Mockito.anyString())) + .thenReturn(new UserPrincipal(user)); + String auth = AuthServiceImpl.generateAccessToken(user); + + // test data + Long testUserIdIssuing1 = 1L; + Long testUserIdIssuing2 = 2L; + Long testUserIdIssuing3 = 3L; + String testUsernameIssuing1 = "test1"; + String testUsernameIssuing2 = "test2"; + String testUsernameIssuing3 = "test3"; + Long testPhraseId1 = 1L; + Long testPhraseId2 = 2L; + Long testPhraseId3 = 3L; + Long testUserIdReceiving = 4L; + + // mock return data + UsernameDTO mockUsernameDTO1 = UsernameDTO.builder() + .userId(testUserIdIssuing1) + .username(testUsernameIssuing1) + .build(); + + UsernameDTO mockUsernameDTO2 = UsernameDTO.builder() + .userId(testUserIdIssuing2) + .username(testUsernameIssuing2) + .build(); + + UsernameDTO mockUsernameDTO3 = UsernameDTO.builder() + .userId(testUserIdIssuing3) + .username(testUsernameIssuing3) + .build(); + + + List mockUsernameDTOSList1 = new ArrayList<>(); + mockUsernameDTOSList1.add(mockUsernameDTO1); + mockUsernameDTOSList1.add(mockUsernameDTO2); + mockUsernameDTOSList1.add(mockUsernameDTO3); + + List mockUsernameDTOSList2 = new ArrayList<>(); + mockUsernameDTOSList2.add(mockUsernameDTO1); + mockUsernameDTOSList2.add(mockUsernameDTO2); + mockUsernameDTOSList2.add(mockUsernameDTO3); + + List mockUsernameDTOSList3 = new ArrayList<>(); + mockUsernameDTOSList3.add(mockUsernameDTO1); + mockUsernameDTOSList3.add(mockUsernameDTO2); + mockUsernameDTOSList3.add(mockUsernameDTO3); + + + CosignsForUserDTO mockCosignsForUserDTO1 = CosignsForUserDTO.builder() + .phraseId(testPhraseId1) + .listOfCosigners(mockUsernameDTOSList1) + .build(); + + CosignsForUserDTO mockCosignsForUserDTO2 = CosignsForUserDTO.builder() + .phraseId(testPhraseId2) + .listOfCosigners(mockUsernameDTOSList2) + .build(); + + CosignsForUserDTO mockCosignsForUserDTO3 = CosignsForUserDTO.builder() + .phraseId(testPhraseId3) + .listOfCosigners(mockUsernameDTOSList3) + .build(); + + + List mockCosignsForUserDTOList = new ArrayList<>(); + mockCosignsForUserDTOList.add(mockCosignsForUserDTO1); + mockCosignsForUserDTOList.add(mockCosignsForUserDTO2); + mockCosignsForUserDTOList.add(mockCosignsForUserDTO3); + + // mock returns + when(cosignService.getAllCosignsForUser(anyLong())).thenReturn(mockCosignsForUserDTOList); + + // test + this.mockMvc + .perform( + get("/api/connect/cosign/{userIdReceiving}/all",testUserIdReceiving) + .header("Authorization", "Bearer " + auth) + .characterEncoding("utf-8")) + .andExpect(status().isOk()) + .andExpect(content().json( + "[" + + "{\"phraseId\":1,\"listOfCosigners\":" + + "[" + + "{\"userId\":1,\"username\":\"test1\"}," + + "{\"userId\":2,\"username\":\"test2\"}," + + "{\"userId\":3,\"username\":\"test3\"}" + + "]" + + "}," + + "{\"phraseId\":2,\"listOfCosigners\":" + + "[" + + "{\"userId\":1,\"username\":\"test1\"}," + + "{\"userId\":2,\"username\":\"test2\"}," + + "{\"userId\":3,\"username\":\"test3\"}" + + "]" + + "}," + + "{\"phraseId\":3,\"listOfCosigners\":" + + "[" + + "{\"userId\":1,\"username\":\"test1\"}," + + "{\"userId\":2,\"username\":\"test2\"}," + + "{\"userId\":3,\"username\":\"test3\"}" + + "]" + + "}]")); + } } diff --git a/src/test/java/com/savvato/tribeapp/services/CosignServiceImplTest.java b/src/test/java/com/savvato/tribeapp/services/CosignServiceImplTest.java index 9f8e2487..5087f8e4 100644 --- a/src/test/java/com/savvato/tribeapp/services/CosignServiceImplTest.java +++ b/src/test/java/com/savvato/tribeapp/services/CosignServiceImplTest.java @@ -1,6 +1,8 @@ package com.savvato.tribeapp.services; import com.savvato.tribeapp.dto.CosignDTO; +import com.savvato.tribeapp.dto.CosignsForUserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.Cosign; import com.savvato.tribeapp.repositories.CosignRepository; import org.junit.jupiter.api.Test; @@ -12,7 +14,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static net.bytebuddy.matcher.ElementMatchers.any; +import java.util.ArrayList; +import java.util.List; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; @@ -35,6 +39,9 @@ public CosignService cosignService() { @MockBean CosignRepository cosignRepository; + @MockBean + UserService userService; + @Test public void saveCosign() { Long userIdIssuing = 1L; @@ -91,4 +98,240 @@ public void saveCosignAlreadyExisting() { assertEquals(cosignDTO.userIdReceiving, expectedCosignDTORepeat.userIdReceiving); assertEquals(cosignDTO.phraseId, expectedCosignDTORepeat.phraseId); } + + @Test + public void testGetCosignersForUser(){ + // test data + Long testUserIdIssuing = 1L; + String testUsernameIssuing = "test"; + Long testUserIdReceiving = 2L; + Long testPhraseId = 1L; + + // mock return data + UsernameDTO mockUsernameDTO = UsernameDTO.builder() + .userId(testUserIdIssuing) + .username(testUsernameIssuing) + .build(); + + List mockCosignerIds = new ArrayList<>(); + mockCosignerIds.add(testUserIdIssuing); + + // mock returns + when(cosignRepository.findCosignersByUserIdReceivingAndPhraseId(anyLong(),anyLong())).thenReturn(mockCosignerIds); + when(userService.getUsernameDTO(anyLong())).thenReturn(mockUsernameDTO); + + // expected results + List expectedListUsernameDTO = new ArrayList<>(); + expectedListUsernameDTO.add(mockUsernameDTO); + + // test + List usernameDTOS = cosignService.getCosignersForUserAttribute(testUserIdReceiving,testPhraseId); + + for(UsernameDTO user : usernameDTOS){ + assertEquals(user.userId, expectedListUsernameDTO.get(0).userId); + assertEquals(user.username, expectedListUsernameDTO.get(0).username); + } + } + + @Test + public void testGetCosignersForUserWithThreeCosigners(){ + // test data + Long testUserIdIssuing1 = 1L; + Long testUserIdIssuing2 = 2L; + Long testUserIdIssuing3 = 3L; + String testUsernameIssuing1 = "test1"; + String testUsernameIssuing2 = "test2"; + String testUsernameIssuing3 = "test3"; + Long testUserIdReceiving = 4L; + Long testPhraseId = 1L; + + // mock return data + UsernameDTO mockUsernameDTO1 = UsernameDTO.builder() + .userId(testUserIdIssuing1) + .username(testUsernameIssuing1) + .build(); + + UsernameDTO mockUsernameDTO2 = UsernameDTO.builder() + .userId(testUserIdIssuing2) + .username(testUsernameIssuing2) + .build(); + + UsernameDTO mockUsernameDTO3 = UsernameDTO.builder() + .userId(testUserIdIssuing3) + .username(testUsernameIssuing3) + .build(); + + List mockCosignerIds = new ArrayList<>(); + mockCosignerIds.add(testUserIdIssuing1); + mockCosignerIds.add(testUserIdIssuing2); + mockCosignerIds.add(testUserIdIssuing3); + + // mock returns + when(cosignRepository.findCosignersByUserIdReceivingAndPhraseId(anyLong(),anyLong())).thenReturn(mockCosignerIds); + when(userService.getUsernameDTO(anyLong())).thenReturn(mockUsernameDTO1).thenReturn(mockUsernameDTO2).thenReturn(mockUsernameDTO3); + + // expected results + List expectedListUsernameDTO = new ArrayList<>(); + expectedListUsernameDTO.add(mockUsernameDTO1); + expectedListUsernameDTO.add(mockUsernameDTO2); + expectedListUsernameDTO.add(mockUsernameDTO3); + + // test + List usernameDTOS = cosignService.getCosignersForUserAttribute(testUserIdReceiving,testPhraseId); + + for(int i=0; i mockAllCosignsByUserIdReceivingList = new ArrayList<>(); + mockAllCosignsByUserIdReceivingList.add(mockCosign); + + UsernameDTO mockUsernameDTO = UsernameDTO.builder() + .userId(testUserIdIssuing) + .username(testUsernameIssuing) + .build(); + + List mockUsernameDTOSList = new ArrayList<>(); + mockUsernameDTOSList.add(mockUsernameDTO); + + CosignsForUserDTO mockCosignsForUserDTO = CosignsForUserDTO.builder() + .phraseId(testPhraseId) + .listOfCosigners(mockUsernameDTOSList) + .build(); + + // mock returns + when(cosignRepository.findAllByUserIdReceiving(anyLong())).thenReturn(mockAllCosignsByUserIdReceivingList); + when(userService.getUsernameDTO(anyLong())).thenReturn(mockUsernameDTO); + + // expected results + List expectedCosignsForUserDTOSList = new ArrayList<>(); + expectedCosignsForUserDTOSList.add(mockCosignsForUserDTO); + + // test + List testCosignsForUserDTOs = cosignService.getAllCosignsForUser(testUserIdReceiving); + + for(CosignsForUserDTO testCosignsForUserDTO : testCosignsForUserDTOs) { + assertEquals(testCosignsForUserDTO.phraseId,expectedCosignsForUserDTOSList.get(0).phraseId); + for(UsernameDTO testUsernameDTO : testCosignsForUserDTO.listOfCosigners){ + assertEquals(testUsernameDTO.userId, expectedCosignsForUserDTOSList.get(0).listOfCosigners.get(0).userId); + assertEquals(testUsernameDTO.username,expectedCosignsForUserDTOSList.get(0).listOfCosigners.get(0).username); + } + } + } + + @Test + public void testGetAllCosignsForUserWithThreeCosignsForThreePhrases() { + // test data + Long testUserIdIssuing1 = 1L; + Long testUserIdIssuing2 = 2L; + Long testUserIdIssuing3 = 3L; + String testUsernameIssuing1 = "test1"; + String testUsernameIssuing2 = "test2"; + String testUsernameIssuing3 = "test3"; + Long testPhraseId1 = 1L; + Long testPhraseId2 = 2L; + Long testPhraseId3 = 3L; + Long testUserIdReceiving = 4L; + + // mock return data + List mockAllCosignsByUserIdReceivingList = listBuilderCosignForUser(3,3); // See helper method listBuilderCosignForUser below + + UsernameDTO mockUsernameDTO1 = UsernameDTO.builder() + .userId(testUserIdIssuing1) + .username(testUsernameIssuing1) + .build(); + + UsernameDTO mockUsernameDTO2 = UsernameDTO.builder() + .userId(testUserIdIssuing2) + .username(testUsernameIssuing2) + .build(); + + UsernameDTO mockUsernameDTO3 = UsernameDTO.builder() + .userId(testUserIdIssuing3) + .username(testUsernameIssuing3) + .build(); + + List mockUsernameDTOSList1 = new ArrayList<>(); + mockUsernameDTOSList1.add(mockUsernameDTO1); + mockUsernameDTOSList1.add(mockUsernameDTO2); + mockUsernameDTOSList1.add(mockUsernameDTO3); + + List mockUsernameDTOSList2 = new ArrayList<>(); + mockUsernameDTOSList2.add(mockUsernameDTO1); + mockUsernameDTOSList2.add(mockUsernameDTO2); + mockUsernameDTOSList2.add(mockUsernameDTO3); + + List mockUsernameDTOSList3 = new ArrayList<>(); + mockUsernameDTOSList3.add(mockUsernameDTO1); + mockUsernameDTOSList3.add(mockUsernameDTO2); + mockUsernameDTOSList3.add(mockUsernameDTO3); + + CosignsForUserDTO mockCosignsForUserDTO1 = CosignsForUserDTO.builder() + .phraseId(testPhraseId1) + .listOfCosigners(mockUsernameDTOSList1) + .build(); + + CosignsForUserDTO mockCosignsForUserDTO2 = CosignsForUserDTO.builder() + .phraseId(testPhraseId2) + .listOfCosigners(mockUsernameDTOSList2) + .build(); + + CosignsForUserDTO mockCosignsForUserDTO3 = CosignsForUserDTO.builder() + .phraseId(testPhraseId3) + .listOfCosigners(mockUsernameDTOSList3) + .build(); + + // mock returns + when(cosignRepository.findAllByUserIdReceiving(anyLong())).thenReturn(mockAllCosignsByUserIdReceivingList); + when(userService.getUsernameDTO(anyLong())).thenReturn(mockUsernameDTO1).thenReturn(mockUsernameDTO2).thenReturn(mockUsernameDTO3); + + // expected results + List expectedCosignsForUserDTOSList = new ArrayList<>(); + expectedCosignsForUserDTOSList.add(mockCosignsForUserDTO1); + expectedCosignsForUserDTOSList.add(mockCosignsForUserDTO2); + expectedCosignsForUserDTOSList.add(mockCosignsForUserDTO3); + + // test + List testCosignsForUserDTOs = cosignService.getAllCosignsForUser(testUserIdReceiving); + + for(int i=0; i listBuilderCosignForUser (int phraseCount, int userPerPhraseCount) { + List list = new ArrayList<>(); + Long userIdReceiving = userPerPhraseCount + 1L; + + for(int i=1; i<=phraseCount; i++) { + Cosign cosign = new Cosign(); + cosign.setPhraseId((long)i); + for(int j=1; j<=userPerPhraseCount; j++) + cosign.setUserIdIssuing((long)j); + cosign.setUserIdReceiving(userIdReceiving); + list.add(cosign); + } + return list; + } } diff --git a/src/test/java/com/savvato/tribeapp/services/UserServiceImplTest.java b/src/test/java/com/savvato/tribeapp/services/UserServiceImplTest.java index f87d22c3..8b9d1f6f 100644 --- a/src/test/java/com/savvato/tribeapp/services/UserServiceImplTest.java +++ b/src/test/java/com/savvato/tribeapp/services/UserServiceImplTest.java @@ -2,6 +2,7 @@ import com.savvato.tribeapp.controllers.dto.UserRequest; import com.savvato.tribeapp.dto.UserDTO; +import com.savvato.tribeapp.dto.UsernameDTO; import com.savvato.tribeapp.entities.User; import com.savvato.tribeapp.entities.UserRole; import com.savvato.tribeapp.repositories.UserRepository; @@ -24,8 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @@ -387,4 +387,24 @@ private UserDTO getUserDTO(User user) { return userDTO; } + @Test + public void getUserNameDTOHappyPath(){ + Long testId = 1L; + + User user = new User(); + user.setId(testId); + user.setName("Marge"); + + UsernameDTO expectedUsernameDTO = UsernameDTO.builder() + .userId(testId) + .username("Marge") + .build(); + + when(userRepository.findById(anyLong())).thenReturn(Optional.of(user)); + + UsernameDTO usernameDTO = userService.getUsernameDTO(testId); + assertEquals(usernameDTO.userId, expectedUsernameDTO.userId); + assertEquals(usernameDTO.username, expectedUsernameDTO.username); + } + }